Index: Source/core/streams/ReadableStreamTest.cpp |
diff --git a/Source/core/streams/ReadableStreamTest.cpp b/Source/core/streams/ReadableStreamTest.cpp |
index 7221ee4d319bb1ddb1a132480d96b71e3ebfa430..41310805fdc9fd818fcfdb19cc934c6b00000a69 100644 |
--- a/Source/core/streams/ReadableStreamTest.cpp |
+++ b/Source/core/streams/ReadableStreamTest.cpp |
@@ -99,6 +99,8 @@ private: |
} // unnamed namespace |
+// ReadableStream::read and some related functionalities are tested in |
+// ReadableStreamReaderTest. |
class ReadableStreamTest : public ::testing::Test { |
public: |
ReadableStreamTest() |
@@ -173,7 +175,7 @@ TEST_F(ReadableStreamTest, Start) |
EXPECT_FALSE(stream->isStarted()); |
EXPECT_FALSE(stream->isDraining()); |
EXPECT_FALSE(stream->isPulling()); |
- EXPECT_EQ(stream->stateInternal(), ReadableStream::Waiting); |
+ EXPECT_EQ(stream->stateInternal(), ReadableStream::Readable); |
checkpoint.Call(0); |
stream->didSourceStart(); |
@@ -182,7 +184,7 @@ TEST_F(ReadableStreamTest, Start) |
EXPECT_TRUE(stream->isStarted()); |
EXPECT_FALSE(stream->isDraining()); |
EXPECT_TRUE(stream->isPulling()); |
- EXPECT_EQ(stream->stateInternal(), ReadableStream::Waiting); |
+ EXPECT_EQ(stream->stateInternal(), ReadableStream::Readable); |
// We need to call |error| in order to make |
// ActiveDOMObject::hasPendingActivity return false. |
@@ -196,7 +198,7 @@ TEST_F(ReadableStreamTest, StartFail) |
EXPECT_FALSE(stream->isStarted()); |
EXPECT_FALSE(stream->isDraining()); |
EXPECT_FALSE(stream->isPulling()); |
- EXPECT_EQ(stream->stateInternal(), ReadableStream::Waiting); |
+ EXPECT_EQ(stream->stateInternal(), ReadableStream::Readable); |
stream->error(DOMException::create(NotFoundError)); |
@@ -206,68 +208,6 @@ TEST_F(ReadableStreamTest, StartFail) |
EXPECT_EQ(stream->stateInternal(), ReadableStream::Errored); |
} |
-TEST_F(ReadableStreamTest, WaitOnWaiting) |
-{ |
- StringStream* stream = construct(); |
- Checkpoint checkpoint; |
- |
- EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal()); |
- EXPECT_TRUE(stream->isStarted()); |
- EXPECT_TRUE(stream->isPulling()); |
- |
- EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal()); |
- |
- stream->error(DOMException::create(AbortError, "done")); |
-} |
- |
-TEST_F(ReadableStreamTest, WaitDuringStarting) |
-{ |
- StringStream* stream = new StringStream(scriptState()->executionContext(), m_underlyingSource); |
- Checkpoint checkpoint; |
- |
- EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal()); |
- EXPECT_FALSE(stream->isStarted()); |
- EXPECT_FALSE(stream->isPulling()); |
- |
- { |
- InSequence s; |
- EXPECT_CALL(checkpoint, Call(0)); |
- EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); |
- EXPECT_CALL(checkpoint, Call(1)); |
- } |
- |
- stream->ready(scriptState()); |
- checkpoint.Call(0); |
- stream->didSourceStart(); |
- checkpoint.Call(1); |
- |
- EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal()); |
- EXPECT_TRUE(stream->isStarted()); |
- EXPECT_TRUE(stream->isPulling()); |
- |
- stream->error(DOMException::create(AbortError, "done")); |
-} |
- |
-TEST_F(ReadableStreamTest, WaitAndError) |
-{ |
- StringStream* stream = construct(); |
- String onFulfilled, onRejected; |
- |
- ScriptPromise promise = stream->ready(scriptState()); |
- promise.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); |
- EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal()); |
- EXPECT_TRUE(stream->isPulling()); |
- stream->error(DOMException::create(NotFoundError, "hello, error")); |
- EXPECT_EQ(ReadableStream::Errored, stream->stateInternal()); |
- EXPECT_TRUE(stream->isPulling()); |
- EXPECT_TRUE(onFulfilled.isNull()); |
- EXPECT_TRUE(onRejected.isNull()); |
- |
- isolate()->RunMicrotasks(); |
- EXPECT_TRUE(onFulfilled.isNull()); |
- EXPECT_EQ("NotFoundError: hello, error", onRejected); |
-} |
- |
TEST_F(ReadableStreamTest, ErrorAndEnqueue) |
{ |
StringStream* stream = construct(); |
@@ -292,253 +232,15 @@ TEST_F(ReadableStreamTest, CloseAndEnqueue) |
EXPECT_EQ(ReadableStream::Closed, stream->stateInternal()); |
} |
-TEST_F(ReadableStreamTest, EnqueueAndWait) |
-{ |
- StringStream* stream = construct(); |
- String onFulfilled, onRejected; |
- EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal()); |
- |
- bool result = stream->enqueue("hello"); |
- EXPECT_TRUE(result); |
- EXPECT_EQ(ReadableStream::Readable, stream->stateInternal()); |
- |
- stream->ready(scriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); |
- EXPECT_EQ(ReadableStream::Readable, stream->stateInternal()); |
- EXPECT_FALSE(stream->isPulling()); |
- EXPECT_TRUE(onFulfilled.isNull()); |
- EXPECT_TRUE(onRejected.isNull()); |
- |
- isolate()->RunMicrotasks(); |
- EXPECT_EQ(ReadableStream::Readable, stream->stateInternal()); |
- EXPECT_FALSE(stream->isPulling()); |
- EXPECT_EQ("undefined", onFulfilled); |
- EXPECT_TRUE(onRejected.isNull()); |
- |
- stream->error(DOMException::create(AbortError, "done")); |
-} |
- |
-TEST_F(ReadableStreamTest, WaitAndEnqueue) |
-{ |
- StringStream* stream = construct(); |
- String onFulfilled, onRejected; |
- EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal()); |
- |
- stream->ready(scriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); |
- isolate()->RunMicrotasks(); |
- |
- EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal()); |
- EXPECT_TRUE(stream->isPulling()); |
- EXPECT_TRUE(onFulfilled.isNull()); |
- EXPECT_TRUE(onRejected.isNull()); |
- |
- bool result = stream->enqueue("hello"); |
- EXPECT_TRUE(result); |
- EXPECT_EQ(ReadableStream::Readable, stream->stateInternal()); |
- EXPECT_FALSE(stream->isPulling()); |
- EXPECT_TRUE(onFulfilled.isNull()); |
- EXPECT_TRUE(onRejected.isNull()); |
- |
- isolate()->RunMicrotasks(); |
- EXPECT_EQ("undefined", onFulfilled); |
- EXPECT_TRUE(onRejected.isNull()); |
- |
- stream->error(DOMException::create(AbortError, "done")); |
-} |
- |
-TEST_F(ReadableStreamTest, WaitAndEnqueueAndError) |
-{ |
- StringStream* stream = construct(); |
- String onFulfilled, onRejected; |
- EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal()); |
- |
- ScriptPromise promise = stream->ready(scriptState()); |
- promise.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); |
- isolate()->RunMicrotasks(); |
- |
- EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal()); |
- EXPECT_TRUE(stream->isPulling()); |
- EXPECT_TRUE(onFulfilled.isNull()); |
- EXPECT_TRUE(onRejected.isNull()); |
- |
- bool result = stream->enqueue("hello"); |
- EXPECT_TRUE(result); |
- EXPECT_EQ(ReadableStream::Readable, stream->stateInternal()); |
- EXPECT_FALSE(stream->isPulling()); |
- EXPECT_TRUE(onFulfilled.isNull()); |
- EXPECT_TRUE(onRejected.isNull()); |
- |
- isolate()->RunMicrotasks(); |
- EXPECT_EQ("undefined", onFulfilled); |
- EXPECT_TRUE(onRejected.isNull()); |
- |
- stream->error(DOMException::create(NotFoundError, "error")); |
- EXPECT_EQ(ReadableStream::Errored, stream->stateInternal()); |
- |
- EXPECT_NE(promise, stream->ready(scriptState())); |
-} |
- |
-TEST_F(ReadableStreamTest, CloseWhenWaiting) |
-{ |
- String onWaitFulfilled, onWaitRejected; |
- String onClosedFulfilled, onClosedRejected; |
- |
- StringStream* stream = construct(); |
- |
- EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal()); |
- stream->ready(scriptState()).then(createCaptor(&onWaitFulfilled), createCaptor(&onWaitRejected)); |
- stream->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createCaptor(&onClosedRejected)); |
- |
- isolate()->RunMicrotasks(); |
- EXPECT_TRUE(onWaitFulfilled.isNull()); |
- EXPECT_TRUE(onWaitRejected.isNull()); |
- EXPECT_TRUE(onClosedFulfilled.isNull()); |
- EXPECT_TRUE(onClosedRejected.isNull()); |
- |
- stream->close(); |
- EXPECT_EQ(ReadableStream::Closed, stream->stateInternal()); |
- isolate()->RunMicrotasks(); |
- EXPECT_EQ("undefined", onWaitFulfilled); |
- EXPECT_TRUE(onWaitRejected.isNull()); |
- EXPECT_EQ("undefined", onClosedFulfilled); |
- EXPECT_TRUE(onClosedRejected.isNull()); |
-} |
- |
TEST_F(ReadableStreamTest, CloseWhenErrored) |
{ |
- String onFulfilled, onRejected; |
StringStream* stream = construct(); |
- EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal()); |
- stream->closed(scriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); |
+ EXPECT_EQ(ReadableStream::Readable, stream->stateInternal()); |
stream->error(DOMException::create(NotFoundError, "error")); |
stream->close(); |
EXPECT_EQ(ReadableStream::Errored, stream->stateInternal()); |
- isolate()->RunMicrotasks(); |
- |
- EXPECT_TRUE(onFulfilled.isNull()); |
- EXPECT_EQ("NotFoundError: error", onRejected); |
-} |
- |
-TEST_F(ReadableStreamTest, ReadWhenWaiting) |
-{ |
- StringStream* stream = construct(); |
- EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal()); |
- EXPECT_FALSE(m_exceptionState.hadException()); |
- |
- stream->read(scriptState(), m_exceptionState); |
- EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal()); |
- EXPECT_TRUE(m_exceptionState.hadException()); |
- EXPECT_EQ(V8TypeError, m_exceptionState.code()); |
- EXPECT_EQ("read is called while state is waiting", m_exceptionState.message()); |
- |
- stream->error(DOMException::create(AbortError, "done")); |
-} |
- |
-TEST_F(ReadableStreamTest, ReadWhenClosed) |
-{ |
- StringStream* stream = construct(); |
- stream->close(); |
- |
- EXPECT_EQ(ReadableStream::Closed, stream->stateInternal()); |
- EXPECT_FALSE(m_exceptionState.hadException()); |
- |
- stream->read(scriptState(), m_exceptionState); |
- EXPECT_EQ(ReadableStream::Closed, stream->stateInternal()); |
- EXPECT_TRUE(m_exceptionState.hadException()); |
- EXPECT_EQ(V8TypeError, m_exceptionState.code()); |
- EXPECT_EQ("read is called while state is closed", m_exceptionState.message()); |
-} |
- |
-TEST_F(ReadableStreamTest, ReadWhenErrored) |
-{ |
- // DOMException values specified in the spec are different from enum values |
- // defined in ExceptionCode.h. |
- const int notFoundExceptionCode = 8; |
- StringStream* stream = construct(); |
- stream->error(DOMException::create(NotFoundError, "error")); |
- |
- EXPECT_EQ(ReadableStream::Errored, stream->stateInternal()); |
- EXPECT_FALSE(m_exceptionState.hadException()); |
- |
- stream->read(scriptState(), m_exceptionState); |
- EXPECT_EQ(ReadableStream::Errored, stream->stateInternal()); |
- EXPECT_TRUE(m_exceptionState.hadException()); |
- EXPECT_EQ(notFoundExceptionCode, m_exceptionState.code()); |
- EXPECT_EQ("error", m_exceptionState.message()); |
-} |
- |
-TEST_F(ReadableStreamTest, EnqueuedAndRead) |
-{ |
- StringStream* stream = construct(); |
- String onFulfilled, onRejected; |
- Checkpoint checkpoint; |
- |
- { |
- InSequence s; |
- EXPECT_CALL(checkpoint, Call(0)); |
- EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); |
- EXPECT_CALL(checkpoint, Call(1)); |
- } |
- |
- stream->enqueue("hello"); |
- ScriptPromise promise = stream->ready(scriptState()); |
- EXPECT_EQ(ReadableStream::Readable, stream->stateInternal()); |
- EXPECT_FALSE(stream->isPulling()); |
- |
- checkpoint.Call(0); |
- String chunk; |
- EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk)); |
- checkpoint.Call(1); |
- EXPECT_FALSE(m_exceptionState.hadException()); |
- EXPECT_EQ("hello", chunk); |
- EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal()); |
- EXPECT_TRUE(stream->isPulling()); |
- EXPECT_FALSE(stream->isDraining()); |
- |
- ScriptPromise newPromise = stream->ready(scriptState()); |
- newPromise.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); |
- isolate()->RunMicrotasks(); |
- EXPECT_NE(promise, newPromise); |
- EXPECT_TRUE(onFulfilled.isNull()); |
- EXPECT_TRUE(onRejected.isNull()); |
- |
- stream->error(DOMException::create(AbortError, "done")); |
- isolate()->RunMicrotasks(); |
-} |
- |
-TEST_F(ReadableStreamTest, EnqueueTwiceAndRead) |
-{ |
- StringStream* stream = construct(); |
- Checkpoint checkpoint; |
- |
- { |
- InSequence s; |
- EXPECT_CALL(checkpoint, Call(0)); |
- EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); |
- EXPECT_CALL(checkpoint, Call(1)); |
- } |
- |
- EXPECT_TRUE(stream->enqueue("hello")); |
- EXPECT_TRUE(stream->enqueue("bye")); |
- ScriptPromise promise = stream->ready(scriptState()); |
- EXPECT_EQ(ReadableStream::Readable, stream->stateInternal()); |
- EXPECT_FALSE(stream->isPulling()); |
- |
- String chunk; |
- checkpoint.Call(0); |
- EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk)); |
- checkpoint.Call(1); |
- EXPECT_FALSE(m_exceptionState.hadException()); |
- EXPECT_EQ("hello", chunk); |
- EXPECT_EQ(ReadableStream::Readable, stream->stateInternal()); |
- EXPECT_TRUE(stream->isPulling()); |
- EXPECT_FALSE(stream->isDraining()); |
- |
- ScriptPromise newPromise = stream->ready(scriptState()); |
- EXPECT_EQ(promise, newPromise); |
- |
- stream->error(DOMException::create(AbortError, "done")); |
} |
TEST_F(ReadableStreamTest, ReadQueue) |
@@ -560,7 +262,6 @@ TEST_F(ReadableStreamTest, ReadQueue) |
EXPECT_EQ(ReadableStream::Readable, stream->stateInternal()); |
EXPECT_FALSE(stream->isPulling()); |
- String chunk; |
checkpoint.Call(0); |
stream->readInternal(queue); |
checkpoint.Call(1); |
@@ -569,7 +270,7 @@ TEST_F(ReadableStreamTest, ReadQueue) |
EXPECT_EQ(std::make_pair(String("hello"), static_cast<size_t>(5)), queue[0]); |
EXPECT_EQ(std::make_pair(String("bye"), static_cast<size_t>(3)), queue[1]); |
- EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal()); |
+ EXPECT_EQ(ReadableStream::Readable, stream->stateInternal()); |
EXPECT_TRUE(stream->isPulling()); |
EXPECT_FALSE(stream->isDraining()); |
} |
@@ -577,23 +278,17 @@ TEST_F(ReadableStreamTest, ReadQueue) |
TEST_F(ReadableStreamTest, CloseWhenReadable) |
{ |
StringStream* stream = construct(); |
- String onClosedFulfilled, onClosedRejected; |
- stream->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createCaptor(&onClosedRejected)); |
EXPECT_TRUE(stream->enqueue("hello")); |
EXPECT_TRUE(stream->enqueue("bye")); |
stream->close(); |
EXPECT_FALSE(stream->enqueue("should be ignored")); |
- ScriptPromise promise = stream->ready(scriptState()); |
EXPECT_EQ(ReadableStream::Readable, stream->stateInternal()); |
EXPECT_FALSE(stream->isPulling()); |
EXPECT_TRUE(stream->isDraining()); |
- String chunk; |
- EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk)); |
- EXPECT_EQ("hello", chunk); |
- EXPECT_EQ(promise, stream->ready(scriptState())); |
+ stream->read(scriptState()); |
isolate()->RunMicrotasks(); |
@@ -601,22 +296,11 @@ TEST_F(ReadableStreamTest, CloseWhenReadable) |
EXPECT_FALSE(stream->isPulling()); |
EXPECT_TRUE(stream->isDraining()); |
- EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk)); |
- EXPECT_EQ("bye", chunk); |
- EXPECT_FALSE(m_exceptionState.hadException()); |
- |
- EXPECT_EQ(promise, stream->ready(scriptState())); |
+ stream->read(scriptState()); |
EXPECT_EQ(ReadableStream::Closed, stream->stateInternal()); |
EXPECT_FALSE(stream->isPulling()); |
EXPECT_TRUE(stream->isDraining()); |
- |
- EXPECT_TRUE(onClosedFulfilled.isNull()); |
- EXPECT_TRUE(onClosedRejected.isNull()); |
- |
- isolate()->RunMicrotasks(); |
- EXPECT_EQ("undefined", onClosedFulfilled); |
- EXPECT_TRUE(onClosedRejected.isNull()); |
} |
TEST_F(ReadableStreamTest, CancelWhenClosed) |
@@ -657,32 +341,6 @@ TEST_F(ReadableStreamTest, CancelWhenErrored) |
EXPECT_EQ("NotFoundError: error", onRejected); |
} |
-TEST_F(ReadableStreamTest, CancelWhenWaiting) |
-{ |
- StringStream* stream = construct(); |
- String onFulfilled, onRejected; |
- ScriptValue reason(scriptState(), v8String(scriptState()->isolate(), "reason")); |
- ScriptPromise promise = ScriptPromise::cast(scriptState(), v8String(scriptState()->isolate(), "hello")); |
- |
- { |
- InSequence s; |
- EXPECT_CALL(*m_underlyingSource, cancelSource(scriptState(), reason)).WillOnce(Return(promise)); |
- } |
- |
- EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal()); |
- ScriptPromise ready = stream->ready(scriptState()); |
- EXPECT_NE(promise, stream->cancel(scriptState(), reason)); |
- EXPECT_EQ(ReadableStream::Closed, stream->stateInternal()); |
- |
- ready.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); |
- EXPECT_TRUE(onFulfilled.isNull()); |
- EXPECT_TRUE(onRejected.isNull()); |
- |
- isolate()->RunMicrotasks(); |
- EXPECT_EQ("undefined", onFulfilled); |
- EXPECT_TRUE(onRejected.isNull()); |
-} |
- |
TEST_F(ReadableStreamTest, CancelWhenReadable) |
{ |
StringStream* stream = construct(); |
@@ -697,7 +355,6 @@ TEST_F(ReadableStreamTest, CancelWhenReadable) |
} |
stream->enqueue("hello"); |
- ScriptPromise ready = stream->ready(scriptState()); |
EXPECT_EQ(ReadableStream::Readable, stream->stateInternal()); |
ScriptPromise cancelResult = stream->cancel(scriptState(), reason); |
@@ -706,8 +363,6 @@ TEST_F(ReadableStreamTest, CancelWhenReadable) |
EXPECT_NE(promise, cancelResult); |
EXPECT_EQ(ReadableStream::Closed, stream->stateInternal()); |
- EXPECT_EQ(stream->ready(scriptState()), ready); |
- |
EXPECT_TRUE(onCancelFulfilled.isNull()); |
EXPECT_TRUE(onCancelRejected.isNull()); |
@@ -716,6 +371,29 @@ TEST_F(ReadableStreamTest, CancelWhenReadable) |
EXPECT_TRUE(onCancelRejected.isNull()); |
} |
+TEST_F(ReadableStreamTest, CancelWhenLocked) |
+{ |
+ String onFulfilled, onRejected; |
+ StringStream* stream = construct(); |
+ ReadableStreamReader* reader = stream->getReader(m_exceptionState); |
+ |
+ EXPECT_TRUE(reader->isActive()); |
+ EXPECT_FALSE(m_exceptionState.hadException()); |
+ EXPECT_EQ(ReadableStream::Readable, stream->stateInternal()); |
+ |
+ stream->cancel(scriptState(), ScriptValue(scriptState(), v8::Undefined(isolate()))).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); |
+ |
+ EXPECT_TRUE(onFulfilled.isNull()); |
+ EXPECT_TRUE(onRejected.isNull()); |
+ |
+ isolate()->RunMicrotasks(); |
+ |
+ EXPECT_TRUE(onFulfilled.isNull()); |
+ EXPECT_EQ("TypeError: this stream is locked to a ReadableStreamReader", onRejected); |
+ EXPECT_TRUE(reader->isActive()); |
+ EXPECT_EQ(ReadableStream::Readable, stream->stateInternal()); |
+} |
+ |
TEST_F(ReadableStreamTest, ReadableArrayBufferCompileTest) |
{ |
// This test tests if ReadableStreamImpl<DOMArrayBuffer> can be |
@@ -729,7 +407,7 @@ TEST_F(ReadableStreamTest, BackpressureOnEnqueueing) |
Checkpoint checkpoint; |
StringStream* stream = construct(strategy); |
- EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal()); |
+ EXPECT_EQ(ReadableStream::Readable, stream->stateInternal()); |
{ |
InSequence s; |
@@ -761,7 +439,7 @@ TEST_F(ReadableStreamTest, BackpressureOnReading) |
Checkpoint checkpoint; |
StringStream* stream = construct(strategy); |
- EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal()); |
+ EXPECT_EQ(ReadableStream::Readable, stream->stateInternal()); |
{ |
InSequence s; |
@@ -788,19 +466,15 @@ TEST_F(ReadableStreamTest, BackpressureOnReading) |
stream->enqueue("hello"); |
stream->enqueue("world"); |
- String chunk; |
checkpoint.Call(0); |
- EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk)); |
- EXPECT_EQ("hello", chunk); |
+ stream->read(scriptState()); |
checkpoint.Call(1); |
- EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk)); |
- EXPECT_EQ("world", chunk); |
+ stream->read(scriptState()); |
checkpoint.Call(2); |
stream->enqueue("foo"); |
stream->enqueue("bar"); |
checkpoint.Call(3); |
- EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk)); |
- EXPECT_EQ("foo", chunk); |
+ stream->read(scriptState()); |
checkpoint.Call(4); |
stream->error(DOMException::create(AbortError, "done")); |
@@ -824,4 +498,46 @@ TEST_F(ReadableStreamTest, ReadableStreamReader) |
EXPECT_TRUE(stream->isLockedTo(reader)); |
} |
+TEST_F(ReadableStreamTest, GetClosedReader) |
+{ |
+ StringStream* stream = construct(); |
+ stream->close(); |
+ ReadableStreamReader* reader = stream->getReader(m_exceptionState); |
+ |
+ ASSERT_TRUE(reader); |
+ EXPECT_FALSE(m_exceptionState.hadException()); |
+ |
+ String onFulfilled, onRejected; |
+ reader->closed(scriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); |
+ |
+ EXPECT_FALSE(reader->isActive()); |
+ EXPECT_TRUE(onFulfilled.isNull()); |
+ EXPECT_TRUE(onRejected.isNull()); |
+ |
+ isolate()->RunMicrotasks(); |
+ EXPECT_EQ("undefined", onFulfilled); |
+ EXPECT_TRUE(onRejected.isNull()); |
+} |
+ |
+TEST_F(ReadableStreamTest, GetErroredReader) |
+{ |
+ StringStream* stream = construct(); |
+ stream->error(DOMException::create(SyntaxError, "some error")); |
+ ReadableStreamReader* reader = stream->getReader(m_exceptionState); |
+ |
+ ASSERT_TRUE(reader); |
+ EXPECT_FALSE(m_exceptionState.hadException()); |
+ |
+ String onFulfilled, onRejected; |
+ reader->closed(scriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); |
+ |
+ EXPECT_FALSE(reader->isActive()); |
+ EXPECT_TRUE(onFulfilled.isNull()); |
+ EXPECT_TRUE(onRejected.isNull()); |
+ |
+ isolate()->RunMicrotasks(); |
+ EXPECT_TRUE(onFulfilled.isNull()); |
+ EXPECT_EQ("SyntaxError: some error", onRejected); |
+} |
+ |
} // namespace blink |