Bug 1203760 P2 Add gtests for nsPipeInputStream AsyncRead(). r=froydnj

This commit is contained in:
Ben Kelly 2015-09-14 08:49:09 -07:00
parent b0a9dd9ecd
commit bddde1fa43
3 changed files with 117 additions and 0 deletions

View File

@ -112,4 +112,22 @@ OutputStreamCallback::OnOutputStreamReady(nsIAsyncOutputStream* aStream)
return NS_OK;
}
NS_IMPL_ISUPPORTS(InputStreamCallback, nsIInputStreamCallback);
InputStreamCallback::InputStreamCallback()
: mCalled(false)
{
}
InputStreamCallback::~InputStreamCallback()
{
}
NS_IMETHODIMP
InputStreamCallback::OnInputStreamReady(nsIAsyncInputStream* aStream)
{
mCalled = true;
return NS_OK;
}
} // namespace testing

View File

@ -7,6 +7,7 @@
#ifndef __Helpers_h
#define __Helpers_h
#include "nsIAsyncInputStream.h"
#include "nsIAsyncOutputStream.h"
#include "nsString.h"
#include <stdint.h>
@ -51,6 +52,22 @@ public:
NS_DECL_NSIOUTPUTSTREAMCALLBACK
};
class InputStreamCallback final : public nsIInputStreamCallback
{
public:
InputStreamCallback();
bool Called() const { return mCalled; }
private:
~InputStreamCallback();
bool mCalled;
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIINPUTSTREAMCALLBACK
};
} // namespace testing
#endif // __Helpers_h

View File

@ -786,6 +786,88 @@ TEST(Pipes, Write_AsyncWait_Clone_CloseOriginal)
ASSERT_TRUE(cb->Called());
}
TEST(Pipes, Read_AsyncWait)
{
nsCOMPtr<nsIAsyncInputStream> reader;
nsCOMPtr<nsIAsyncOutputStream> writer;
const uint32_t segmentSize = 1024;
const uint32_t numSegments = 1;
nsresult rv = NS_NewPipe2(getter_AddRefs(reader), getter_AddRefs(writer),
true, true, // non-blocking - reader, writer
segmentSize, numSegments);
ASSERT_TRUE(NS_SUCCEEDED(rv));
nsTArray<char> inputData;
testing::CreateData(segmentSize, inputData);
nsRefPtr<testing::InputStreamCallback> cb =
new testing::InputStreamCallback();
rv = reader->AsyncWait(cb, 0, 0, nullptr);
ASSERT_TRUE(NS_SUCCEEDED(rv));
ASSERT_FALSE(cb->Called());
uint32_t numWritten = 0;
rv = writer->Write(inputData.Elements(), inputData.Length(), &numWritten);
ASSERT_TRUE(NS_SUCCEEDED(rv));
ASSERT_TRUE(cb->Called());
testing::ConsumeAndValidateStream(reader, inputData);
}
TEST(Pipes, Read_AsyncWait_Clone)
{
nsCOMPtr<nsIAsyncInputStream> reader;
nsCOMPtr<nsIAsyncOutputStream> writer;
const uint32_t segmentSize = 1024;
const uint32_t numSegments = 1;
nsresult rv = NS_NewPipe2(getter_AddRefs(reader), getter_AddRefs(writer),
true, true, // non-blocking - reader, writer
segmentSize, numSegments);
ASSERT_TRUE(NS_SUCCEEDED(rv));
nsCOMPtr<nsIInputStream> clone;
rv = NS_CloneInputStream(reader, getter_AddRefs(clone));
ASSERT_TRUE(NS_SUCCEEDED(rv));
nsCOMPtr<nsIAsyncInputStream> asyncClone = do_QueryInterface(clone);
ASSERT_TRUE(asyncClone);
nsTArray<char> inputData;
testing::CreateData(segmentSize, inputData);
nsRefPtr<testing::InputStreamCallback> cb =
new testing::InputStreamCallback();
nsRefPtr<testing::InputStreamCallback> cb2 =
new testing::InputStreamCallback();
rv = reader->AsyncWait(cb, 0, 0, nullptr);
ASSERT_TRUE(NS_SUCCEEDED(rv));
ASSERT_FALSE(cb->Called());
rv = asyncClone->AsyncWait(cb2, 0, 0, nullptr);
ASSERT_TRUE(NS_SUCCEEDED(rv));
ASSERT_FALSE(cb2->Called());
uint32_t numWritten = 0;
rv = writer->Write(inputData.Elements(), inputData.Length(), &numWritten);
ASSERT_TRUE(NS_SUCCEEDED(rv));
ASSERT_TRUE(cb->Called());
ASSERT_TRUE(cb2->Called());
testing::ConsumeAndValidateStream(reader, inputData);
}
namespace {
NS_METHOD