1c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// found in the LICENSE file. 4c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 5c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "config.h" 6c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/streams/ReadableStream.h" 7c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 8c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "bindings/core/v8/ExceptionState.h" 9c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "bindings/core/v8/ScriptPromiseResolver.h" 10c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "bindings/core/v8/ScriptState.h" 11c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "bindings/core/v8/V8Binding.h" 12c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/dom/DOMException.h" 137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/dom/Document.h" 14c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/dom/ExceptionCode.h" 15e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "core/streams/ReadableStreamImpl.h" 16c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/streams/UnderlyingSource.h" 17c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/testing/DummyPageHolder.h" 18c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include <gmock/gmock.h> 19c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include <gtest/gtest.h> 20c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 21c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 22c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 23c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using ::testing::_; 24c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using ::testing::InSequence; 25c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using ::testing::Invoke; 26c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using ::testing::Return; 27c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 28c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace { 29c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 30c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)typedef ::testing::StrictMock<::testing::MockFunction<void(int)> > Checkpoint; 31e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)typedef ReadableStreamImpl<ReadableStreamChunkTypeTraits<String> > StringStream; 32c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 33c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class StringCapturingFunction : public ScriptFunction { 34c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public: 357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci static v8::Handle<v8::Function> createFunction(ScriptState* scriptState, String* value) 367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { 377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci StringCapturingFunction* self = new StringCapturingFunction(scriptState, value); 387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return self->bindToV8Function(); 397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciprivate: 427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci StringCapturingFunction(ScriptState* scriptState, String* value) 437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci : ScriptFunction(scriptState) 447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci , m_value(value) 45c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 46c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 47c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 48c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) virtual ScriptValue call(ScriptValue value) OVERRIDE 49c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 50c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ASSERT(!value.isEmpty()); 51c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) *m_value = toCoreString(value.v8Value()->ToString()); 52c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return value; 53c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 54c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 55c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) String* m_value; 56c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}; 57c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 589e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)class MockUnderlyingSource : public GarbageCollectedFinalized<MockUnderlyingSource>, public UnderlyingSource { 599e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) USING_GARBAGE_COLLECTED_MIXIN(MockUnderlyingSource); 60c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public: 61c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) virtual ~MockUnderlyingSource() { } 62c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 63c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) MOCK_METHOD0(pullSource, void()); 64c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) MOCK_METHOD2(cancelSource, ScriptPromise(ScriptState*, ScriptValue)); 65c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}; 66c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 67c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class ThrowError { 68c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public: 69c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) explicit ThrowError(const String& message) 70c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) : m_message(message) { } 71c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 72c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) void operator()(ExceptionState* exceptionState) 73c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 74c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) exceptionState->throwTypeError(m_message); 75c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 76c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 77c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private: 78c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) String m_message; 79c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}; 80c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 81c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // unnamed namespace 82c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 83c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class ReadableStreamTest : public ::testing::Test { 84c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public: 85c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ReadableStreamTest() 86c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) : m_page(DummyPageHolder::create(IntSize(1, 1))) 87c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) , m_scope(scriptState()) 88c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) , m_underlyingSource(new ::testing::StrictMock<MockUnderlyingSource>) 89c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) , m_exceptionState(ExceptionState::ConstructionContext, "property", "interface", scriptState()->context()->Global(), isolate()) 90c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 91c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 92c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 93c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) virtual ~ReadableStreamTest() 94c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 95c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 96c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 97c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ScriptState* scriptState() { return ScriptState::forMainWorld(m_page->document().frame()); } 98c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) v8::Isolate* isolate() { return scriptState()->isolate(); } 99c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 1007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci v8::Handle<v8::Function> createCaptor(String* value) 101c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 1027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return StringCapturingFunction::createFunction(scriptState(), value); 103c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 104c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 105e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) StringStream* construct() 106c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 1079e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) StringStream* stream = new StringStream(scriptState()->executionContext(), m_underlyingSource); 1089e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) stream->didSourceStart(); 109c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return stream; 110c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 111c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 112c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) OwnPtr<DummyPageHolder> m_page; 113c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ScriptState::Scope m_scope; 114c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Persistent<MockUnderlyingSource> m_underlyingSource; 115c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ExceptionState m_exceptionState; 116c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}; 117c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 1189e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)TEST_F(ReadableStreamTest, Start) 119c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 1209e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) StringStream* stream = new StringStream(scriptState()->executionContext(), m_underlyingSource); 121c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(m_exceptionState.hadException()); 122c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isStarted()); 123c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isDraining()); 124c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isPulling()); 125c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(stream->state(), ReadableStream::Waiting); 126c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 1279e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) stream->didSourceStart(); 128c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 129c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(stream->isStarted()); 130c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isDraining()); 131c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isPulling()); 132c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(stream->state(), ReadableStream::Waiting); 133c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 134c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 1359e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)TEST_F(ReadableStreamTest, StartFail) 136c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 1379e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) StringStream* stream = new StringStream(scriptState()->executionContext(), m_underlyingSource); 138c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(m_exceptionState.hadException()); 139c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isStarted()); 140c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isDraining()); 141c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isPulling()); 142c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(stream->state(), ReadableStream::Waiting); 143c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 144c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->error(DOMException::create(NotFoundError)); 145c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 146c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isStarted()); 147c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isDraining()); 148c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isPulling()); 149c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(stream->state(), ReadableStream::Errored); 150c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 151c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 152c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(ReadableStreamTest, WaitOnWaiting) 153c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 154e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) StringStream* stream = construct(); 155c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Checkpoint checkpoint; 156c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 157c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Waiting, stream->state()); 158c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(stream->isStarted()); 159c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isPulling()); 160c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 161c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 162c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 163c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(checkpoint, Call(0)); 164c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); 165c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(checkpoint, Call(1)); 166c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 167c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 168c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) checkpoint.Call(0); 169c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ScriptPromise p = stream->wait(scriptState()); 170c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ScriptPromise q = stream->wait(scriptState()); 171c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) checkpoint.Call(1); 172c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 173c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Waiting, stream->state()); 174c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(stream->isPulling()); 175c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(q, p); 176c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 177c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 178c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(ReadableStreamTest, WaitDuringStarting) 179c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 1809e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) StringStream* stream = new StringStream(scriptState()->executionContext(), m_underlyingSource); 181c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Checkpoint checkpoint; 182c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 183c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Waiting, stream->state()); 184c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isStarted()); 185c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isPulling()); 186c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 187c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 188c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 189c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(checkpoint, Call(0)); 190c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(checkpoint, Call(1)); 191c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); 192c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 193c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 194c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) checkpoint.Call(0); 195c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->wait(scriptState()); 196c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) checkpoint.Call(1); 197c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 198c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(stream->isPulling()); 199c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 2009e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) stream->didSourceStart(); 201c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 202c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Waiting, stream->state()); 203c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(stream->isPulling()); 204c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 205c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 206c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(ReadableStreamTest, WaitAndError) 207c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 208e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) StringStream* stream = construct(); 209c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) String onFulfilled, onRejected; 210c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 211c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 212c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 213c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); 214c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 215c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 216c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ScriptPromise promise = stream->wait(scriptState()); 217c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) promise.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); 218c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Waiting, stream->state()); 219c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(stream->isPulling()); 220c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->error(DOMException::create(NotFoundError, "hello, error")); 221c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Errored, stream->state()); 222c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(stream->isPulling()); 223c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onFulfilled.isNull()); 224c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onRejected.isNull()); 225c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 226c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) isolate()->RunMicrotasks(); 227c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onFulfilled.isNull()); 228c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(promise, stream->wait(scriptState())); 229c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ("NotFoundError: hello, error", onRejected); 230c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 231c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 232c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(ReadableStreamTest, ErrorAndEnqueue) 233c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 234e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) StringStream* stream = construct(); 235c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 236c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->error(DOMException::create(NotFoundError, "error")); 237c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Errored, stream->state()); 238c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 239c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) bool result = stream->enqueue("hello"); 240c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(result); 241c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Errored, stream->state()); 242c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 243c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 244c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(ReadableStreamTest, CloseAndEnqueue) 245c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 246e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) StringStream* stream = construct(); 247c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 248c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->close(); 249c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Closed, stream->state()); 250c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 251c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) bool result = stream->enqueue("hello"); 252c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(result); 253c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Closed, stream->state()); 254c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 255c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 256c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(ReadableStreamTest, EnqueueAndWait) 257c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 258e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) StringStream* stream = construct(); 259c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) String onFulfilled, onRejected; 260c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Waiting, stream->state()); 261c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 262c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) bool result = stream->enqueue("hello"); 263c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(result); 264c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Readable, stream->state()); 265c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 266c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->wait(scriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); 267c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Readable, stream->state()); 268c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isPulling()); 269c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onFulfilled.isNull()); 270c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onRejected.isNull()); 271c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 272c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) isolate()->RunMicrotasks(); 273c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Readable, stream->state()); 274c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isPulling()); 275c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ("undefined", onFulfilled); 276c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onRejected.isNull()); 277c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 278c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 279c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(ReadableStreamTest, WaitAndEnqueue) 280c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 281e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) StringStream* stream = construct(); 282c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) String onFulfilled, onRejected; 283c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Waiting, stream->state()); 284c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 285c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 286c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 287c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); 288c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 289c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 290c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->wait(scriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); 291c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) isolate()->RunMicrotasks(); 292c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 293c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Waiting, stream->state()); 294c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(stream->isPulling()); 295c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onFulfilled.isNull()); 296c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onRejected.isNull()); 297c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 298c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) bool result = stream->enqueue("hello"); 299c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(result); 300c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Readable, stream->state()); 301c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isPulling()); 302c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onFulfilled.isNull()); 303c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onRejected.isNull()); 304c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 305c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) isolate()->RunMicrotasks(); 306c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ("undefined", onFulfilled); 307c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onRejected.isNull()); 308c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 309c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 310c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(ReadableStreamTest, WaitAndEnqueueAndError) 311c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 312e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) StringStream* stream = construct(); 313c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) String onFulfilled, onRejected; 314c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Waiting, stream->state()); 315c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 316c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 317c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 318c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); 319c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 320c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 321c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ScriptPromise promise = stream->wait(scriptState()); 322c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) promise.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); 323c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) isolate()->RunMicrotasks(); 324c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 325c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Waiting, stream->state()); 326c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(stream->isPulling()); 327c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onFulfilled.isNull()); 328c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onRejected.isNull()); 329c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 330c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) bool result = stream->enqueue("hello"); 331c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(result); 332c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Readable, stream->state()); 333c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isPulling()); 334c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onFulfilled.isNull()); 335c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onRejected.isNull()); 336c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 337c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) isolate()->RunMicrotasks(); 338c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ("undefined", onFulfilled); 339c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onRejected.isNull()); 340c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 341c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->error(DOMException::create(NotFoundError, "error")); 342c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Errored, stream->state()); 343c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 344e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_NE(promise, stream->wait(scriptState())); 345c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 346c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 347c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(ReadableStreamTest, CloseWhenWaiting) 348c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 349c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) String onWaitFulfilled, onWaitRejected; 350c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) String onClosedFulfilled, onClosedRejected; 351c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 352e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) StringStream* stream = construct(); 353c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 354c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 355c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 356c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); 357c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 358c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 359c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Waiting, stream->state()); 360c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->wait(scriptState()).then(createCaptor(&onWaitFulfilled), createCaptor(&onWaitRejected)); 361c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createCaptor(&onClosedRejected)); 362c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 363c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) isolate()->RunMicrotasks(); 364c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onWaitFulfilled.isNull()); 365c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onWaitRejected.isNull()); 366c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onClosedFulfilled.isNull()); 367c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onClosedRejected.isNull()); 368c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 369c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->close(); 370c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Closed, stream->state()); 371c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) isolate()->RunMicrotasks(); 372c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ("undefined", onWaitFulfilled); 373c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onWaitRejected.isNull()); 374c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ("undefined", onClosedFulfilled); 375c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onClosedRejected.isNull()); 376c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 377c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 378c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(ReadableStreamTest, CloseWhenErrored) 379c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 380c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) String onFulfilled, onRejected; 381e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) StringStream* stream = construct(); 382c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Waiting, stream->state()); 383c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->closed(scriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); 384c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 385c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->error(DOMException::create(NotFoundError, "error")); 386c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->close(); 387c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 388c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Errored, stream->state()); 389c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) isolate()->RunMicrotasks(); 390c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 391c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onFulfilled.isNull()); 392c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ("NotFoundError: error", onRejected); 393c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 394c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 395c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(ReadableStreamTest, ReadWhenWaiting) 396c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 397e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) StringStream* stream = construct(); 398c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Waiting, stream->state()); 399c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(m_exceptionState.hadException()); 400c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 4019e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) stream->read(scriptState(), m_exceptionState); 402c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Waiting, stream->state()); 403c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(m_exceptionState.hadException()); 404c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(V8TypeError, m_exceptionState.code()); 405c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ("read is called while state is waiting", m_exceptionState.message()); 406c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 407c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 408c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(ReadableStreamTest, ReadWhenClosed) 409c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 410e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) StringStream* stream = construct(); 411c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->close(); 412c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 413c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Closed, stream->state()); 414c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(m_exceptionState.hadException()); 415c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 4169e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) stream->read(scriptState(), m_exceptionState); 417c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Closed, stream->state()); 418c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(m_exceptionState.hadException()); 419c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(V8TypeError, m_exceptionState.code()); 420c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ("read is called while state is closed", m_exceptionState.message()); 421c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 422c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 423c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(ReadableStreamTest, ReadWhenErrored) 424c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 425c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // DOMException values specified in the spec are different from enum values 426c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // defined in ExceptionCode.h. 427c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) const int notFoundExceptionCode = 8; 428e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) StringStream* stream = construct(); 429c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->error(DOMException::create(NotFoundError, "error")); 430c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 431c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Errored, stream->state()); 432c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(m_exceptionState.hadException()); 433c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 4349e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) stream->read(scriptState(), m_exceptionState); 435c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Errored, stream->state()); 436c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(m_exceptionState.hadException()); 437c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(notFoundExceptionCode, m_exceptionState.code()); 438c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ("error", m_exceptionState.message()); 439c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 440c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 441c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(ReadableStreamTest, EnqueuedAndRead) 442c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 443e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) StringStream* stream = construct(); 444c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) String onFulfilled, onRejected; 445c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Checkpoint checkpoint; 446c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 447c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 448c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 449c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(checkpoint, Call(0)); 450c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); 451c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(checkpoint, Call(1)); 452c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 453c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 454c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->enqueue("hello"); 455c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ScriptPromise promise = stream->wait(scriptState()); 456c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Readable, stream->state()); 457c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isPulling()); 458c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 459c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) checkpoint.Call(0); 460e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) String chunk; 4619e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk)); 462c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) checkpoint.Call(1); 463c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(m_exceptionState.hadException()); 464c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ("hello", chunk); 465c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Waiting, stream->state()); 466c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(stream->isPulling()); 467c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isDraining()); 468c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 469c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ScriptPromise newPromise = stream->wait(scriptState()); 470c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) newPromise.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); 471c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) isolate()->RunMicrotasks(); 472e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_NE(promise, newPromise); 473e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_TRUE(onFulfilled.isNull()); 474e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_TRUE(onRejected.isNull()); 475c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 476c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 477c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(ReadableStreamTest, EnqueTwiceAndRead) 478c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 479e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) StringStream* stream = construct(); 480c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Checkpoint checkpoint; 481c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 482c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 483c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 484c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(checkpoint, Call(0)); 485c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(checkpoint, Call(1)); 486c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 487c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 488c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(stream->enqueue("hello")); 489c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(stream->enqueue("bye")); 490c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ScriptPromise promise = stream->wait(scriptState()); 491c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Readable, stream->state()); 492c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isPulling()); 493c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 494c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) checkpoint.Call(0); 495e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) String chunk; 4969e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk)); 497c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) checkpoint.Call(1); 498c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(m_exceptionState.hadException()); 499c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ("hello", chunk); 500c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Readable, stream->state()); 501c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isPulling()); 502c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isDraining()); 503c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 504c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ScriptPromise newPromise = stream->wait(scriptState()); 505c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(promise, newPromise); 506c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 507c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 508c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(ReadableStreamTest, CloseWhenReadable) 509c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 510e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) StringStream* stream = construct(); 511c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) String onWaitFulfilled, onWaitRejected; 512c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) String onClosedFulfilled, onClosedRejected; 513c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 514c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createCaptor(&onClosedRejected)); 515c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(stream->enqueue("hello")); 516c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(stream->enqueue("bye")); 517c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->close(); 518c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->enqueue("should be ignored")); 519c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 520c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ScriptPromise promise = stream->wait(scriptState()); 521c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Readable, stream->state()); 522c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isPulling()); 523c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(stream->isDraining()); 524c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 525e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) String chunk; 5269e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk)); 527c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ("hello", chunk); 528c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(promise, stream->wait(scriptState())); 529c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 530c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) isolate()->RunMicrotasks(); 531c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 532c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Readable, stream->state()); 533c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isPulling()); 534c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(stream->isDraining()); 535c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 5369e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk)); 537c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ("bye", chunk); 538c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(m_exceptionState.hadException()); 539c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 540e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_NE(promise, stream->wait(scriptState())); 541c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->wait(scriptState()).then(createCaptor(&onWaitFulfilled), createCaptor(&onWaitRejected)); 542c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 543c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Closed, stream->state()); 544c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_FALSE(stream->isPulling()); 545c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(stream->isDraining()); 546c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 547c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onWaitFulfilled.isNull()); 548c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onWaitRejected.isNull()); 549c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onClosedFulfilled.isNull()); 550c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onClosedRejected.isNull()); 551c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 552c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) isolate()->RunMicrotasks(); 553c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ("undefined", onWaitFulfilled); 554c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onWaitRejected.isNull()); 555c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ("undefined", onClosedFulfilled); 556c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onClosedRejected.isNull()); 557c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 558c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 559c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(ReadableStreamTest, CancelWhenClosed) 560c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 561e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) StringStream* stream = construct(); 562c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) String onFulfilled, onRejected; 563c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->close(); 564c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Closed, stream->state()); 565c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 566c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ScriptPromise promise = stream->cancel(scriptState(), ScriptValue()); 567c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Closed, stream->state()); 568c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 569c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) promise.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); 570c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onFulfilled.isNull()); 571c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onRejected.isNull()); 572c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 573c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) isolate()->RunMicrotasks(); 574c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ("undefined", onFulfilled); 575c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onRejected.isNull()); 576c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 577c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 578c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(ReadableStreamTest, CancelWhenErrored) 579c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 580e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) StringStream* stream = construct(); 581c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) String onFulfilled, onRejected; 582c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->error(DOMException::create(NotFoundError, "error")); 583c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Errored, stream->state()); 584c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 585c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ScriptPromise promise = stream->cancel(scriptState(), ScriptValue()); 586c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Errored, stream->state()); 587c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 588c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) promise.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); 589c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onFulfilled.isNull()); 590c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onRejected.isNull()); 591c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 592c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) isolate()->RunMicrotasks(); 593c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onFulfilled.isNull()); 594c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ("NotFoundError: error", onRejected); 595c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 596c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 597c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(ReadableStreamTest, CancelWhenWaiting) 598c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 599e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) StringStream* stream = construct(); 600c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) String onFulfilled, onRejected; 601c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ScriptValue reason(scriptState(), v8String(scriptState()->isolate(), "reason")); 602c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ScriptPromise promise = ScriptPromise::cast(scriptState(), v8String(scriptState()->isolate(), "hello")); 603c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 604c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 605c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 606c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); 607c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*m_underlyingSource, cancelSource(scriptState(), reason)).WillOnce(Return(promise)); 608c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 609c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 610c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Waiting, stream->state()); 611c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ScriptPromise wait = stream->wait(scriptState()); 612c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(promise, stream->cancel(scriptState(), reason)); 613c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Closed, stream->state()); 614c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(stream->wait(scriptState()), wait); 615c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 616c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) wait.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); 617c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onFulfilled.isNull()); 618c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onRejected.isNull()); 619c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 620c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) isolate()->RunMicrotasks(); 621c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ("undefined", onFulfilled); 622c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onRejected.isNull()); 623c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 624c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 625c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)TEST_F(ReadableStreamTest, CancelWhenReadable) 626c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 627e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) StringStream* stream = construct(); 628c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) String onFulfilled, onRejected; 629c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ScriptValue reason(scriptState(), v8String(scriptState()->isolate(), "reason")); 630c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ScriptPromise promise = ScriptPromise::cast(scriptState(), v8String(scriptState()->isolate(), "hello")); 631c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 632c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 633c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InSequence s; 634c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_CALL(*m_underlyingSource, cancelSource(scriptState(), reason)).WillOnce(Return(promise)); 635c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 636c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 637c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->enqueue("hello"); 638c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ScriptPromise wait = stream->wait(scriptState()); 639c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Readable, stream->state()); 640c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(promise, stream->cancel(scriptState(), reason)); 641c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ(ReadableStream::Closed, stream->state()); 642c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 643e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) EXPECT_NE(stream->wait(scriptState()), wait); 644c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 645c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) stream->wait(scriptState()).then(createCaptor(&onFulfilled), createCaptor(&onRejected)); 646c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onFulfilled.isNull()); 647c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onRejected.isNull()); 648c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 649c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) isolate()->RunMicrotasks(); 650c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_EQ("undefined", onFulfilled); 651c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) EXPECT_TRUE(onRejected.isNull()); 652c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 653c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 654e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)TEST_F(ReadableStreamTest, ReadableArrayBufferCompileTest) 655e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){ 656e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) // This test tests if ReadableStreamImpl<ArrayBuffer> can be instantiated. 6579e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) new ReadableStreamImpl<ReadableStreamChunkTypeTraits<ArrayBuffer> >(scriptState()->executionContext(), m_underlyingSource); 658e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)} 659e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 660c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 661c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 662