From 95fd40defdd1db417b26b0300e1a64d8f1f51e13 Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Thu, 24 May 2018 07:52:31 +0200 Subject: [PATCH] Bug 1460561 - nsMultiplexInputStream should behave correctly when NS_InputStreamIsBuffered() is used - gtests, r=froydnj --- netwerk/base/nsBufferedStreams.cpp | 2 +- .../tests/gtest/TestMultiplexInputStream.cpp | 91 ++++++++++++++++++- 2 files changed, 88 insertions(+), 5 deletions(-) diff --git a/netwerk/base/nsBufferedStreams.cpp b/netwerk/base/nsBufferedStreams.cpp index 2d1417563a45..863e8b9ae569 100644 --- a/netwerk/base/nsBufferedStreams.cpp +++ b/netwerk/base/nsBufferedStreams.cpp @@ -140,7 +140,7 @@ nsBufferedStream::Seek(int32_t whence, int64_t offset) nsCOMPtr ras = do_QueryInterface(mStream, &rv); if (NS_FAILED(rv)) { #ifdef DEBUG - NS_ERROR("mStream doesn't QI to nsISeekableStream"); + NS_WARNING("mStream doesn't QI to nsISeekableStream"); #endif return rv; } diff --git a/xpcom/tests/gtest/TestMultiplexInputStream.cpp b/xpcom/tests/gtest/TestMultiplexInputStream.cpp index 8593d9d4ceb9..cf3a8181a3e5 100644 --- a/xpcom/tests/gtest/TestMultiplexInputStream.cpp +++ b/xpcom/tests/gtest/TestMultiplexInputStream.cpp @@ -10,6 +10,7 @@ #include "nsIInputStream.h" #include "nsIMultiplexInputStream.h" #include "nsISeekableStream.h" +#include "nsStreamUtils.h" #include "nsThreadUtils.h" #include "Helpers.h" @@ -230,8 +231,7 @@ public: ReadSegments(nsWriteSegmentFun aWriter, void* aClosure, uint32_t aCount, uint32_t *aResult) override { - MOZ_CRASH("This should not be called!"); - return NS_OK; + return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHOD @@ -281,8 +281,7 @@ public: ReadSegments(nsWriteSegmentFun aWriter, void* aClosure, uint32_t aCount, uint32_t *aResult) override { - MOZ_CRASH("This should not be called!"); - return NS_OK; + return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHOD @@ -387,6 +386,90 @@ TEST(TestMultiplexInputStream, Available) { ASSERT_EQ(buffer.Length(), length); } +class NonBufferableStringStream final : public nsIInputStream +{ + nsCOMPtr mStream; + +public: + NS_DECL_THREADSAFE_ISUPPORTS + + explicit NonBufferableStringStream(const nsACString& aBuffer) + { + NS_NewCStringInputStream(getter_AddRefs(mStream), aBuffer); + } + + NS_IMETHOD + Available(uint64_t* aLength) override + { + return mStream->Available(aLength); + } + + NS_IMETHOD + Read(char* aBuffer, uint32_t aCount, uint32_t* aReadCount) override + { + return mStream->Read(aBuffer, aCount, aReadCount); + } + + NS_IMETHOD + ReadSegments(nsWriteSegmentFun aWriter, void* aClosure, + uint32_t aCount, uint32_t *aResult) override + { + return NS_ERROR_NOT_IMPLEMENTED; + } + + NS_IMETHOD + Close() override + { + return mStream->Close(); + } + + NS_IMETHOD + IsNonBlocking(bool* aNonBlocking) override + { + return mStream->IsNonBlocking(aNonBlocking); + } + +private: + ~NonBufferableStringStream() = default; +}; + +NS_IMPL_ISUPPORTS(NonBufferableStringStream, nsIInputStream) + +TEST(TestMultiplexInputStream, Bufferable) { + nsCOMPtr multiplexStream = + do_CreateInstance("@mozilla.org/io/multiplex-input-stream;1"); + + nsCOMPtr s = do_QueryInterface(multiplexStream); + ASSERT_TRUE(!!s); + + nsCString buf1; + buf1.AssignLiteral("Hello "); + nsCOMPtr inputStream1; + nsresult rv = NS_NewCStringInputStream(getter_AddRefs(inputStream1), buf1); + ASSERT_TRUE(NS_SUCCEEDED(rv)); + + nsCString buf2; + buf2.AssignLiteral("world"); + nsCOMPtr inputStream2 = new NonBufferableStringStream(buf2); + + rv = multiplexStream->AppendStream(inputStream1); + ASSERT_TRUE(NS_SUCCEEDED(rv)); + + rv = multiplexStream->AppendStream(inputStream2); + ASSERT_TRUE(NS_SUCCEEDED(rv)); + + nsCOMPtr stream(do_QueryInterface(multiplexStream)); + ASSERT_TRUE(!!stream); + + char buf3[1024]; + uint32_t size = 0; + rv = stream->ReadSegments(NS_CopySegmentToBuffer, buf3, sizeof(buf3), &size); + ASSERT_TRUE(NS_SUCCEEDED(rv)); + + ASSERT_EQ(size, buf1.Length() + buf2.Length()); + ASSERT_TRUE(!strncmp(buf3, "Hello world", size)); +} + TEST(TestMultiplexInputStream, QILengthInputStream) { nsCString buf; buf.AssignLiteral("Hello world");