mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1133939 P2 Add tests validating nsPipeOutputStream AsyncWait behavior. r=froydnj
This commit is contained in:
parent
f179b69f0c
commit
944f182366
@ -94,4 +94,22 @@ ConsumeAndValidateStream(nsIInputStream* aStream,
|
||||
ASSERT_TRUE(aExpectedData.Equals(outputData));
|
||||
}
|
||||
|
||||
NS_IMPL_ISUPPORTS(OutputStreamCallback, nsIOutputStreamCallback);
|
||||
|
||||
OutputStreamCallback::OutputStreamCallback()
|
||||
: mCalled(false)
|
||||
{
|
||||
}
|
||||
|
||||
OutputStreamCallback::~OutputStreamCallback()
|
||||
{
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
OutputStreamCallback::OnOutputStreamReady(nsIAsyncOutputStream* aStream)
|
||||
{
|
||||
mCalled = true;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
} // namespace testing
|
||||
|
@ -7,6 +7,7 @@
|
||||
#ifndef __Helpers_h
|
||||
#define __Helpers_h
|
||||
|
||||
#include "nsIAsyncOutputStream.h"
|
||||
#include "nsString.h"
|
||||
#include <stdint.h>
|
||||
|
||||
@ -34,6 +35,22 @@ void
|
||||
ConsumeAndValidateStream(nsIInputStream* aStream,
|
||||
const nsACString& aExpectedData);
|
||||
|
||||
class OutputStreamCallback MOZ_FINAL : public nsIOutputStreamCallback
|
||||
{
|
||||
public:
|
||||
OutputStreamCallback();
|
||||
|
||||
bool Called() const { return mCalled; }
|
||||
|
||||
private:
|
||||
~OutputStreamCallback();
|
||||
|
||||
bool mCalled;
|
||||
public:
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_NSIOUTPUTSTREAMCALLBACK
|
||||
};
|
||||
|
||||
} // namespace testing
|
||||
|
||||
#endif // __Helpers_h
|
||||
|
@ -660,3 +660,127 @@ TEST(Pipes, Clone_DuringWrite_ReadDuringWrite_CloseDuringWrite)
|
||||
2, // num clones to add after each write
|
||||
3); // num streams to read after each write
|
||||
}
|
||||
|
||||
TEST(Pipes, Write_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);
|
||||
|
||||
uint32_t numWritten = 0;
|
||||
rv = writer->Write(inputData.Elements(), inputData.Length(), &numWritten);
|
||||
ASSERT_TRUE(NS_SUCCEEDED(rv));
|
||||
|
||||
rv = writer->Write(inputData.Elements(), inputData.Length(), &numWritten);
|
||||
ASSERT_EQ(NS_BASE_STREAM_WOULD_BLOCK, rv);
|
||||
|
||||
nsRefPtr<testing::OutputStreamCallback> cb =
|
||||
new testing::OutputStreamCallback();
|
||||
|
||||
rv = writer->AsyncWait(cb, 0, 0, nullptr);
|
||||
ASSERT_TRUE(NS_SUCCEEDED(rv));
|
||||
|
||||
ASSERT_FALSE(cb->Called());
|
||||
|
||||
testing::ConsumeAndValidateStream(reader, inputData);
|
||||
|
||||
ASSERT_TRUE(cb->Called());
|
||||
}
|
||||
|
||||
TEST(Pipes, Write_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));
|
||||
|
||||
nsTArray<char> inputData;
|
||||
testing::CreateData(segmentSize, inputData);
|
||||
|
||||
uint32_t numWritten = 0;
|
||||
rv = writer->Write(inputData.Elements(), inputData.Length(), &numWritten);
|
||||
ASSERT_TRUE(NS_SUCCEEDED(rv));
|
||||
|
||||
rv = writer->Write(inputData.Elements(), inputData.Length(), &numWritten);
|
||||
ASSERT_EQ(NS_BASE_STREAM_WOULD_BLOCK, rv);
|
||||
|
||||
nsRefPtr<testing::OutputStreamCallback> cb =
|
||||
new testing::OutputStreamCallback();
|
||||
|
||||
rv = writer->AsyncWait(cb, 0, 0, nullptr);
|
||||
ASSERT_TRUE(NS_SUCCEEDED(rv));
|
||||
|
||||
ASSERT_FALSE(cb->Called());
|
||||
|
||||
testing::ConsumeAndValidateStream(reader, inputData);
|
||||
|
||||
ASSERT_FALSE(cb->Called());
|
||||
|
||||
testing::ConsumeAndValidateStream(clone, inputData);
|
||||
|
||||
ASSERT_TRUE(cb->Called());
|
||||
}
|
||||
|
||||
TEST(Pipes, Write_AsyncWait_Clone_CloseOriginal)
|
||||
{
|
||||
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));
|
||||
|
||||
nsTArray<char> inputData;
|
||||
testing::CreateData(segmentSize, inputData);
|
||||
|
||||
uint32_t numWritten = 0;
|
||||
rv = writer->Write(inputData.Elements(), inputData.Length(), &numWritten);
|
||||
ASSERT_TRUE(NS_SUCCEEDED(rv));
|
||||
|
||||
rv = writer->Write(inputData.Elements(), inputData.Length(), &numWritten);
|
||||
ASSERT_EQ(NS_BASE_STREAM_WOULD_BLOCK, rv);
|
||||
|
||||
nsRefPtr<testing::OutputStreamCallback> cb =
|
||||
new testing::OutputStreamCallback();
|
||||
|
||||
rv = writer->AsyncWait(cb, 0, 0, nullptr);
|
||||
ASSERT_TRUE(NS_SUCCEEDED(rv));
|
||||
|
||||
ASSERT_FALSE(cb->Called());
|
||||
|
||||
testing::ConsumeAndValidateStream(clone, inputData);
|
||||
|
||||
ASSERT_FALSE(cb->Called());
|
||||
|
||||
reader->Close();
|
||||
|
||||
ASSERT_TRUE(cb->Called());
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user