Bug 1641826 - P2 - GTest cases added for PartiallySeekableInputStream to test AsyncWait/AsyncLengthWait behaviour when stream closed r=baku,necko-reviewers,mayhemer

Differential Revision: https://phabricator.services.mozilla.com/D77539
This commit is contained in:
ssengupta 2020-06-02 19:04:20 +00:00
parent d95870593b
commit 8a32b935f4

View File

@ -365,3 +365,136 @@ TEST(TestPartiallySeekableInputStream, AbortLengthCallback)
ASSERT_TRUE(!callback1->Called());
ASSERT_EQ(-1, callback2->Size());
}
TEST(TestPartiallySeekableInputStream, AsyncWaitAfterConsumed)
{
nsCString buf{"The Quick Brown Fox Jumps over the Lazy Dog"};
const size_t bufsize = 44;
auto stream = MakeRefPtr<testing::AsyncStringStream>(buf);
nsCOMPtr<nsIAsyncInputStream> psis =
new PartiallySeekableInputStream(stream.forget(), bufsize);
ASSERT_TRUE(psis);
auto callback = MakeRefPtr<testing::InputStreamCallback>();
nsresult rv =
psis->AsyncWait(callback, 0, 0, GetCurrentThreadSerialEventTarget());
ASSERT_EQ(NS_OK, rv);
MOZ_ALWAYS_TRUE(SpinEventLoopUntil([&]() { return callback->Called(); }));
char rdbuf[bufsize] = {'\0'};
uint32_t count;
ASSERT_EQ(NS_OK, psis->Read(rdbuf, sizeof(rdbuf), &count));
ASSERT_STREQ(rdbuf, buf.Data());
callback = MakeRefPtr<testing::InputStreamCallback>();
rv = psis->AsyncWait(callback, 0, 0, GetCurrentThreadSerialEventTarget());
ASSERT_EQ(NS_OK, rv);
MOZ_ALWAYS_TRUE(SpinEventLoopUntil([&]() { return callback->Called(); }));
memset(rdbuf, 0x0, bufsize);
ASSERT_EQ(NS_OK, psis->Read(rdbuf, sizeof(rdbuf), &count));
ASSERT_EQ(0U, count);
}
TEST(TestPartiallySeekableInputStream, AsyncWaitAfterClosed)
{
nsCString buf{"The Quick Brown Fox Jumps over the Lazy Dog"};
const size_t bufsize = 44;
auto stream = MakeRefPtr<testing::AsyncStringStream>(buf);
nsCOMPtr<nsIAsyncInputStream> psis =
new PartiallySeekableInputStream(stream.forget(), bufsize);
ASSERT_TRUE(psis);
auto callback = MakeRefPtr<testing::InputStreamCallback>();
nsresult rv =
psis->AsyncWait(callback, 0, 0, GetCurrentThreadSerialEventTarget());
ASSERT_EQ(NS_OK, rv);
MOZ_ALWAYS_TRUE(SpinEventLoopUntil([&]() { return callback->Called(); }));
ASSERT_EQ(NS_OK, psis->Close());
callback = MakeRefPtr<testing::InputStreamCallback>();
rv = psis->AsyncWait(callback, 0, 0, GetCurrentThreadSerialEventTarget());
ASSERT_EQ(NS_OK, rv);
MOZ_ALWAYS_TRUE(SpinEventLoopUntil([&]() { return callback->Called(); }));
}
TEST(TestPartiallySeekableInputStream, AsyncLengthWaitAfterClosed)
{
nsCString buf{"The Quick Brown Fox Jumps over the Lazy Dog"};
auto stream = MakeRefPtr<testing::LengthInputStream>(buf, false, true);
nsCOMPtr<nsIInputStream> psis =
new PartiallySeekableInputStream(stream.forget());
nsCOMPtr<nsIAsyncInputStreamLength> qi = do_QueryInterface(psis);
ASSERT_TRUE(qi);
auto callback = MakeRefPtr<testing::LengthCallback>();
nsresult rv =
qi->AsyncLengthWait(callback, GetCurrentThreadSerialEventTarget());
ASSERT_EQ(NS_OK, rv);
MOZ_ALWAYS_TRUE(SpinEventLoopUntil([&]() { return callback->Called(); }));
ASSERT_EQ(buf.Length(), callback->Size());
ASSERT_EQ(NS_OK, psis->Close());
callback = MakeRefPtr<testing::LengthCallback>();
rv = qi->AsyncLengthWait(callback, GetCurrentThreadSerialEventTarget());
ASSERT_EQ(NS_OK, rv);
MOZ_ALWAYS_TRUE(SpinEventLoopUntil([&]() { return callback->Called(); }));
ASSERT_EQ(-1, callback->Size());
}
TEST(TestPartiallySeekableInputStream, AsyncLengthWaitAfterConsumed)
{
nsCString buf{"The Quick Brown Fox Jumps over the Lazy Dog"};
const size_t bufsize = 44;
auto stream = MakeRefPtr<testing::LengthInputStream>(buf, false, true);
nsCOMPtr<nsIInputStream> psis =
new PartiallySeekableInputStream(stream.forget());
nsCOMPtr<nsIAsyncInputStreamLength> qi = do_QueryInterface(psis);
ASSERT_TRUE(qi);
auto callback = MakeRefPtr<testing::LengthCallback>();
nsresult rv =
qi->AsyncLengthWait(callback, GetCurrentThreadSerialEventTarget());
ASSERT_EQ(NS_OK, rv);
MOZ_ALWAYS_TRUE(SpinEventLoopUntil([&]() { return callback->Called(); }));
ASSERT_EQ(buf.Length(), callback->Size());
char rdbuf[bufsize] = {'\0'};
uint32_t count;
ASSERT_EQ(NS_OK, psis->Read(rdbuf, sizeof(rdbuf), &count));
ASSERT_STREQ(rdbuf, buf.Data());
callback = MakeRefPtr<testing::LengthCallback>();
rv = qi->AsyncLengthWait(callback, GetCurrentThreadSerialEventTarget());
ASSERT_EQ(NS_OK, rv);
MOZ_ALWAYS_TRUE(SpinEventLoopUntil([&]() { return callback->Called(); }));
ASSERT_EQ(0U, callback->Size());
memset(rdbuf, 0x0, bufsize);
ASSERT_EQ(NS_OK, psis->Read(rdbuf, sizeof(rdbuf), &count));
ASSERT_EQ(0U, count);
}