| Index: third_party/WebKit/Source/modules/fetch/ReadableStreamDataConsumerHandleTest.cpp
|
| diff --git a/third_party/WebKit/Source/modules/fetch/ReadableStreamDataConsumerHandleTest.cpp b/third_party/WebKit/Source/modules/fetch/ReadableStreamDataConsumerHandleTest.cpp
|
| index 347519606c5bc74d875fa2a4377fcd9699aeb977..478e01701322b3022faf2fe2d205157a654432e7 100644
|
| --- a/third_party/WebKit/Source/modules/fetch/ReadableStreamDataConsumerHandleTest.cpp
|
| +++ b/third_party/WebKit/Source/modules/fetch/ReadableStreamDataConsumerHandleTest.cpp
|
| @@ -4,8 +4,10 @@
|
|
|
| #include "modules/fetch/ReadableStreamDataConsumerHandle.h"
|
|
|
| +#include "bindings/core/v8/ReadableStreamOperations.h"
|
| #include "bindings/core/v8/ScriptState.h"
|
| #include "bindings/core/v8/V8BindingMacros.h"
|
| +#include "bindings/core/v8/V8GCController.h"
|
| #include "core/dom/Document.h"
|
| #include "core/testing/DummyPageHolder.h"
|
| #include "modules/fetch/DataConsumerHandleTestUtil.h"
|
| @@ -78,6 +80,17 @@ public:
|
| return r;
|
| }
|
|
|
| + PassOwnPtr<ReadableStreamDataConsumerHandle> createHandle(ScriptValue stream)
|
| + {
|
| + NonThrowableExceptionState es;
|
| + ScriptValue reader = ReadableStreamOperations::getReader(scriptState(), stream, es);
|
| + ASSERT(!reader.isEmpty());
|
| + ASSERT(reader.v8Value()->IsObject());
|
| + return ReadableStreamDataConsumerHandle::create(scriptState(), reader);
|
| + }
|
| +
|
| + void gc() { V8GCController::collectAllGarbageForTesting(isolate()); }
|
| +
|
| private:
|
| OwnPtr<DummyPageHolder> m_page;
|
| };
|
| @@ -87,7 +100,7 @@ TEST_F(ReadableStreamDataConsumerHandleTest, Create)
|
| ScriptState::Scope scope(scriptState());
|
| ScriptValue stream(scriptState(), evalWithPrintingError("new ReadableStream"));
|
| ASSERT_FALSE(stream.isEmpty());
|
| - OwnPtr<ReadableStreamDataConsumerHandle> handle = ReadableStreamDataConsumerHandle::create(scriptState(), stream);
|
| + OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream);
|
| ASSERT_TRUE(handle);
|
| MockClient* client = MockClient::create();
|
| Checkpoint checkpoint;
|
| @@ -110,7 +123,7 @@ TEST_F(ReadableStreamDataConsumerHandleTest, EmptyStream)
|
| ScriptValue stream(scriptState(), evalWithPrintingError(
|
| "new ReadableStream({start: c => c.close()})"));
|
| ASSERT_FALSE(stream.isEmpty());
|
| - OwnPtr<ReadableStreamDataConsumerHandle> handle = ReadableStreamDataConsumerHandle::create(scriptState(), stream);
|
| + OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream);
|
| ASSERT_TRUE(handle);
|
| MockClient* client = MockClient::create();
|
| Checkpoint checkpoint;
|
| @@ -141,7 +154,7 @@ TEST_F(ReadableStreamDataConsumerHandleTest, ErroredStream)
|
| ScriptValue stream(scriptState(), evalWithPrintingError(
|
| "new ReadableStream({start: c => c.error()})"));
|
| ASSERT_FALSE(stream.isEmpty());
|
| - OwnPtr<ReadableStreamDataConsumerHandle> handle = ReadableStreamDataConsumerHandle::create(scriptState(), stream);
|
| + OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream);
|
| ASSERT_TRUE(handle);
|
| MockClient* client = MockClient::create();
|
| Checkpoint checkpoint;
|
| @@ -177,7 +190,7 @@ TEST_F(ReadableStreamDataConsumerHandleTest, Read)
|
| "controller.close();"
|
| "stream"));
|
| ASSERT_FALSE(stream.isEmpty());
|
| - OwnPtr<ReadableStreamDataConsumerHandle> handle = ReadableStreamDataConsumerHandle::create(scriptState(), stream);
|
| + OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream);
|
| ASSERT_TRUE(handle);
|
| MockClient* client = MockClient::create();
|
| Checkpoint checkpoint;
|
| @@ -239,7 +252,7 @@ TEST_F(ReadableStreamDataConsumerHandleTest, TwoPhaseRead)
|
| "controller.close();"
|
| "stream"));
|
| ASSERT_FALSE(stream.isEmpty());
|
| - OwnPtr<ReadableStreamDataConsumerHandle> handle = ReadableStreamDataConsumerHandle::create(scriptState(), stream);
|
| + OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream);
|
| ASSERT_TRUE(handle);
|
| MockClient* client = MockClient::create();
|
| Checkpoint checkpoint;
|
| @@ -301,15 +314,17 @@ TEST_F(ReadableStreamDataConsumerHandleTest, TwoPhaseRead)
|
| EXPECT_EQ(kDone, reader->beginRead(&buffer, kNone, &available));
|
| }
|
|
|
| -TEST_F(ReadableStreamDataConsumerHandleTest, LockedStream)
|
| +TEST_F(ReadableStreamDataConsumerHandleTest, EnqueueUndefined)
|
| {
|
| ScriptState::Scope scope(scriptState());
|
| ScriptValue stream(scriptState(), evalWithPrintingError(
|
| - "var stream = new ReadableStream;"
|
| - "stream.getReader();"
|
| + "var controller;"
|
| + "var stream = new ReadableStream({start: c => controller = c});"
|
| + "controller.enqueue(undefined);"
|
| + "controller.close();"
|
| "stream"));
|
| ASSERT_FALSE(stream.isEmpty());
|
| - OwnPtr<ReadableStreamDataConsumerHandle> handle = ReadableStreamDataConsumerHandle::create(scriptState(), stream);
|
| + OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream);
|
| ASSERT_TRUE(handle);
|
| MockClient* client = MockClient::create();
|
| Checkpoint checkpoint;
|
| @@ -318,28 +333,33 @@ TEST_F(ReadableStreamDataConsumerHandleTest, LockedStream)
|
| EXPECT_CALL(checkpoint, Call(1));
|
| EXPECT_CALL(*client, didGetReadable());
|
| EXPECT_CALL(checkpoint, Call(2));
|
| + EXPECT_CALL(*client, didGetReadable());
|
| + EXPECT_CALL(checkpoint, Call(3));
|
|
|
| - char c;
|
| - size_t readBytes;
|
| + const void* buffer;
|
| + size_t available;
|
| OwnPtr<FetchDataConsumerHandle::Reader> reader = handle->obtainReader(client);
|
| ASSERT_TRUE(reader);
|
| checkpoint.Call(1);
|
| testing::runPendingTasks();
|
| checkpoint.Call(2);
|
| - EXPECT_EQ(kUnexpectedError, reader->read(&c, 1, kNone, &readBytes));
|
| + EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available));
|
| + testing::runPendingTasks();
|
| + checkpoint.Call(3);
|
| + EXPECT_EQ(kUnexpectedError, reader->beginRead(&buffer, kNone, &available));
|
| }
|
|
|
| -TEST_F(ReadableStreamDataConsumerHandleTest, EnqueueUndefined)
|
| +TEST_F(ReadableStreamDataConsumerHandleTest, EnqueueNull)
|
| {
|
| ScriptState::Scope scope(scriptState());
|
| ScriptValue stream(scriptState(), evalWithPrintingError(
|
| "var controller;"
|
| "var stream = new ReadableStream({start: c => controller = c});"
|
| - "controller.enqueue(undefined);"
|
| + "controller.enqueue(null);"
|
| "controller.close();"
|
| "stream"));
|
| ASSERT_FALSE(stream.isEmpty());
|
| - OwnPtr<ReadableStreamDataConsumerHandle> handle = ReadableStreamDataConsumerHandle::create(scriptState(), stream);
|
| + OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream);
|
| ASSERT_TRUE(handle);
|
| MockClient* client = MockClient::create();
|
| Checkpoint checkpoint;
|
| @@ -364,17 +384,17 @@ TEST_F(ReadableStreamDataConsumerHandleTest, EnqueueUndefined)
|
| EXPECT_EQ(kUnexpectedError, reader->beginRead(&buffer, kNone, &available));
|
| }
|
|
|
| -TEST_F(ReadableStreamDataConsumerHandleTest, EnqueueNull)
|
| +TEST_F(ReadableStreamDataConsumerHandleTest, EnqueueString)
|
| {
|
| ScriptState::Scope scope(scriptState());
|
| ScriptValue stream(scriptState(), evalWithPrintingError(
|
| "var controller;"
|
| "var stream = new ReadableStream({start: c => controller = c});"
|
| - "controller.enqueue(null);"
|
| + "controller.enqueue('hello');"
|
| "controller.close();"
|
| "stream"));
|
| ASSERT_FALSE(stream.isEmpty());
|
| - OwnPtr<ReadableStreamDataConsumerHandle> handle = ReadableStreamDataConsumerHandle::create(scriptState(), stream);
|
| + OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream);
|
| ASSERT_TRUE(handle);
|
| MockClient* client = MockClient::create();
|
| Checkpoint checkpoint;
|
| @@ -399,38 +419,90 @@ TEST_F(ReadableStreamDataConsumerHandleTest, EnqueueNull)
|
| EXPECT_EQ(kUnexpectedError, reader->beginRead(&buffer, kNone, &available));
|
| }
|
|
|
| -TEST_F(ReadableStreamDataConsumerHandleTest, EnqueueString)
|
| +TEST_F(ReadableStreamDataConsumerHandleTest, StreamReaderShouldBeWeak)
|
| {
|
| - ScriptState::Scope scope(scriptState());
|
| - ScriptValue stream(scriptState(), evalWithPrintingError(
|
| - "var controller;"
|
| - "var stream = new ReadableStream({start: c => controller = c});"
|
| - "controller.enqueue('hello');"
|
| - "controller.close();"
|
| - "stream"));
|
| - ASSERT_FALSE(stream.isEmpty());
|
| - OwnPtr<ReadableStreamDataConsumerHandle> handle = ReadableStreamDataConsumerHandle::create(scriptState(), stream);
|
| - ASSERT_TRUE(handle);
|
| - MockClient* client = MockClient::create();
|
| + OwnPtr<FetchDataConsumerHandle::Reader> reader;
|
| Checkpoint checkpoint;
|
| + Persistent<MockClient> client = MockClient::create();
|
| + ScriptValue stream;
|
|
|
| InSequence s;
|
| EXPECT_CALL(checkpoint, Call(1));
|
| EXPECT_CALL(*client, didGetReadable());
|
| EXPECT_CALL(checkpoint, Call(2));
|
| + EXPECT_CALL(checkpoint, Call(3));
|
| + EXPECT_CALL(*client, didGetReadable());
|
| + EXPECT_CALL(checkpoint, Call(4));
|
| +
|
| + {
|
| + // We need this scope to collect local handles.
|
| + ScriptState::Scope scope(scriptState());
|
| + stream = ScriptValue(scriptState(), evalWithPrintingError("new ReadableStream()"));
|
| + ASSERT_FALSE(stream.isEmpty());
|
| + OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream);
|
| + ASSERT_TRUE(handle);
|
| +
|
| + reader = handle->obtainReader(client);
|
| + ASSERT_TRUE(reader);
|
| + }
|
| +
|
| + checkpoint.Call(1);
|
| + testing::runPendingTasks();
|
| + checkpoint.Call(2);
|
| + stream.clear();
|
| + gc();
|
| + checkpoint.Call(3);
|
| + testing::runPendingTasks();
|
| +
|
| + checkpoint.Call(4);
|
| + const void* buffer;
|
| + size_t available;
|
| + EXPECT_EQ(kUnexpectedError, reader->beginRead(&buffer, kNone, &available));
|
| +}
|
| +
|
| +TEST_F(ReadableStreamDataConsumerHandleTest, StreamReaderShouldBeWeakWhenReading)
|
| +{
|
| + OwnPtr<FetchDataConsumerHandle::Reader> reader;
|
| + Checkpoint checkpoint;
|
| + Persistent<MockClient> client = MockClient::create();
|
| + ScriptValue stream;
|
| +
|
| + InSequence s;
|
| + EXPECT_CALL(checkpoint, Call(1));
|
| EXPECT_CALL(*client, didGetReadable());
|
| + EXPECT_CALL(checkpoint, Call(2));
|
| EXPECT_CALL(checkpoint, Call(3));
|
| + EXPECT_CALL(checkpoint, Call(4));
|
| + EXPECT_CALL(*client, didGetReadable());
|
| + EXPECT_CALL(checkpoint, Call(5));
|
| +
|
| + {
|
| + // We need this scope to collect local handles.
|
| + ScriptState::Scope scope(scriptState());
|
| + stream = ScriptValue(scriptState(), evalWithPrintingError("new ReadableStream()"));
|
| + ASSERT_FALSE(stream.isEmpty());
|
| + OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream);
|
| + ASSERT_TRUE(handle);
|
| +
|
| + reader = handle->obtainReader(client);
|
| + ASSERT_TRUE(reader);
|
| + }
|
|
|
| const void* buffer;
|
| size_t available;
|
| - OwnPtr<FetchDataConsumerHandle::Reader> reader = handle->obtainReader(client);
|
| - ASSERT_TRUE(reader);
|
| checkpoint.Call(1);
|
| testing::runPendingTasks();
|
| checkpoint.Call(2);
|
| EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available));
|
| +
|
| testing::runPendingTasks();
|
| checkpoint.Call(3);
|
| + stream.clear();
|
| + gc();
|
| + checkpoint.Call(4);
|
| + testing::runPendingTasks();
|
| +
|
| + checkpoint.Call(5);
|
| EXPECT_EQ(kUnexpectedError, reader->beginRead(&buffer, kNone, &available));
|
| }
|
|
|
|
|