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