Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(534)

Side by Side Diff: Source/core/streams/ExclusiveStreamReaderTest.cpp

Issue 901013002: Revert of Introduce ExclusiveStreamReader. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/core/streams/ExclusiveStreamReader.idl ('k') | Source/core/streams/ReadableStream.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "config.h"
6 #include "core/streams/ExclusiveStreamReader.h"
7
8 #include "bindings/core/v8/ExceptionState.h"
9 #include "bindings/core/v8/ScriptState.h"
10 #include "bindings/core/v8/ToV8.h"
11 #include "bindings/core/v8/V8ThrowException.h"
12 #include "core/dom/DOMException.h"
13 #include "core/dom/Document.h"
14 #include "core/dom/ExceptionCode.h"
15 #include "core/streams/ReadableStream.h"
16 #include "core/streams/ReadableStreamImpl.h"
17 #include "core/streams/UnderlyingSource.h"
18 #include "core/testing/DummyPageHolder.h"
19 #include <gtest/gtest.h>
20
21 namespace blink {
22
23 using StringStream = ReadableStreamImpl<ReadableStreamChunkTypeTraits<String>>;
24
25 namespace {
26
27 class StringCapturingFunction final : public ScriptFunction {
28 public:
29 static v8::Handle<v8::Function> createFunction(ScriptState* scriptState, Str ing* value)
30 {
31 StringCapturingFunction* self = new StringCapturingFunction(scriptState, value);
32 return self->bindToV8Function();
33 }
34
35 private:
36 StringCapturingFunction(ScriptState* scriptState, String* value)
37 : ScriptFunction(scriptState)
38 , m_value(value)
39 {
40 }
41
42 ScriptValue call(ScriptValue value) override
43 {
44 ASSERT(!value.isEmpty());
45 *m_value = toCoreString(value.v8Value()->ToString(scriptState()->isolate ()));
46 return value;
47 }
48
49 String* m_value;
50 };
51
52 class NoopUnderlyingSource final : public GarbageCollectedFinalized<NoopUnderlyi ngSource>, public UnderlyingSource {
53 USING_GARBAGE_COLLECTED_MIXIN(NoopUnderlyingSource);
54 public:
55 ~NoopUnderlyingSource() override { }
56
57 void pullSource() override { }
58 ScriptPromise cancelSource(ScriptState* scriptState, ScriptValue reason) { r eturn ScriptPromise::cast(scriptState, reason); }
59 };
60
61 class PermissiveStrategy final : public StringStream::Strategy {
62 public:
63 bool shouldApplyBackpressure(size_t, ReadableStream*) override { return fals e; }
64 };
65
66 class ExclusiveStreamReaderTest : public ::testing::Test {
67 public:
68 ExclusiveStreamReaderTest()
69 : m_page(DummyPageHolder::create(IntSize(1, 1)))
70 , m_scope(scriptState())
71 , m_exceptionState(ExceptionState::ConstructionContext, "property", "int erface", scriptState()->context()->Global(), isolate())
72 , m_stream(new StringStream(scriptState()->executionContext(), new NoopU nderlyingSource, new PermissiveStrategy))
73 {
74 m_stream->didSourceStart();
75 }
76
77 ~ExclusiveStreamReaderTest()
78 {
79 // We need to call |error| in order to make
80 // ActiveDOMObject::hasPendingActivity return false.
81 m_stream->error(DOMException::create(AbortError, "done"));
82 }
83
84 ScriptState* scriptState() { return ScriptState::forMainWorld(m_page->docume nt().frame()); }
85 v8::Isolate* isolate() { return scriptState()->isolate(); }
86
87 v8::Handle<v8::Function> createCaptor(String* value)
88 {
89 return StringCapturingFunction::createFunction(scriptState(), value);
90 }
91
92 OwnPtr<DummyPageHolder> m_page;
93 ScriptState::Scope m_scope;
94 ExceptionState m_exceptionState;
95 Persistent<StringStream> m_stream;
96 };
97
98 TEST_F(ExclusiveStreamReaderTest, Construct)
99 {
100 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream);
101 EXPECT_TRUE(reader->isActive());
102 }
103
104 TEST_F(ExclusiveStreamReaderTest, Release)
105 {
106 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream);
107 EXPECT_TRUE(reader->isActive());
108 reader->releaseLock();
109 EXPECT_FALSE(reader->isActive());
110
111 ExclusiveStreamReader* another = new ExclusiveStreamReader(m_stream);
112 EXPECT_TRUE(another->isActive());
113 EXPECT_FALSE(reader->isActive());
114 reader->releaseLock();
115 EXPECT_TRUE(another->isActive());
116 EXPECT_FALSE(reader->isActive());
117 }
118
119 TEST_F(ExclusiveStreamReaderTest, MaskState)
120 {
121 m_stream->enqueue("hello");
122 EXPECT_EQ("readable", m_stream->stateString());
123
124 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream);
125 EXPECT_EQ("waiting", m_stream->stateString());
126 EXPECT_EQ("readable", reader->state());
127
128 reader->releaseLock();
129 EXPECT_EQ("readable", m_stream->stateString());
130 EXPECT_EQ("closed", reader->state());
131
132 ExclusiveStreamReader* another = new ExclusiveStreamReader(m_stream);
133 EXPECT_EQ("waiting", m_stream->stateString());
134 EXPECT_EQ("closed", reader->state());
135 EXPECT_EQ("readable", another->state());
136 }
137
138 TEST_F(ExclusiveStreamReaderTest, MaskReady)
139 {
140 m_stream->enqueue("hello");
141 isolate()->RunMicrotasks();
142
143 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream);
144 {
145 String s1, s2;
146 reader->ready(scriptState()).then(createCaptor(&s1));
147 m_stream->ready(scriptState()).then(createCaptor(&s2));
148 isolate()->RunMicrotasks();
149 EXPECT_EQ("undefined", s1);
150 EXPECT_TRUE(s2.isNull());
151
152 reader->releaseLock();
153 isolate()->RunMicrotasks();
154 EXPECT_EQ("undefined", s2);
155 }
156
157 {
158 String s1, s2;
159 reader->ready(scriptState()).then(createCaptor(&s1));
160 m_stream->ready(scriptState()).then(createCaptor(&s2));
161 isolate()->RunMicrotasks();
162 EXPECT_EQ("undefined", s1);
163 EXPECT_EQ("undefined", s2);
164 }
165
166 ExclusiveStreamReader* another = new ExclusiveStreamReader(m_stream);
167 {
168 String s1, s2, s3;
169 reader->ready(scriptState()).then(createCaptor(&s1));
170 m_stream->ready(scriptState()).then(createCaptor(&s2));
171 another->ready(scriptState()).then(createCaptor(&s3));
172 isolate()->RunMicrotasks();
173 EXPECT_EQ("undefined", s1);
174 EXPECT_TRUE(s2.isNull());
175 EXPECT_EQ("undefined", s3);
176
177 // We need to call here to ensure all promises having captors are
178 // resolved or rejected.
179 m_stream->error(DOMException::create(AbortError, "done"));
180 isolate()->RunMicrotasks();
181 }
182 }
183
184 TEST_F(ExclusiveStreamReaderTest, ReaderRead)
185 {
186 m_stream->enqueue("hello");
187 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream);
188
189 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal());
190 ScriptValue value = reader->read(scriptState(), m_exceptionState);
191
192 EXPECT_FALSE(m_exceptionState.hadException());
193 String stringValue;
194 EXPECT_TRUE(value.toString(stringValue));
195 EXPECT_EQ("hello", stringValue);
196 }
197
198 TEST_F(ExclusiveStreamReaderTest, StreamReadShouldFailWhenLocked)
199 {
200 m_stream->enqueue("hello");
201 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream);
202 EXPECT_TRUE(reader->isActive());
203
204 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal());
205 m_stream->read(scriptState(), m_exceptionState);
206
207 EXPECT_TRUE(m_exceptionState.hadException());
208 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal());
209 }
210
211 TEST_F(ExclusiveStreamReaderTest, ReaderReadShouldFailWhenNotLocked)
212 {
213 m_stream->enqueue("hello");
214 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream);
215 reader->releaseLock();
216 EXPECT_FALSE(reader->isActive());
217
218 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal());
219 reader->read(scriptState(), m_exceptionState);
220
221 EXPECT_TRUE(m_exceptionState.hadException());
222 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal());
223 }
224
225 TEST_F(ExclusiveStreamReaderTest, ClosedReader)
226 {
227 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream);
228
229 m_stream->close();
230
231 EXPECT_EQ("closed", m_stream->stateString());
232 EXPECT_EQ("closed", reader->state());
233 EXPECT_FALSE(reader->isActive());
234
235 String onClosedFulfilled, onClosedRejected;
236 String onReadyFulfilled, onReadyRejected;
237 isolate()->RunMicrotasks();
238 reader->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createC aptor(&onClosedRejected));
239 reader->ready(scriptState()).then(createCaptor(&onReadyFulfilled), createCap tor(&onReadyRejected));
240 EXPECT_TRUE(onClosedFulfilled.isNull());
241 EXPECT_TRUE(onClosedRejected.isNull());
242 EXPECT_TRUE(onReadyFulfilled.isNull());
243 EXPECT_TRUE(onReadyRejected.isNull());
244
245 isolate()->RunMicrotasks();
246 EXPECT_EQ("undefined", onClosedFulfilled);
247 EXPECT_TRUE(onClosedRejected.isNull());
248 EXPECT_EQ("undefined", onReadyFulfilled);
249 EXPECT_TRUE(onReadyRejected.isNull());
250 }
251
252 TEST_F(ExclusiveStreamReaderTest, ErroredReader)
253 {
254 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream);
255
256 m_stream->error(DOMException::create(SyntaxError, "some error"));
257
258 EXPECT_EQ("errored", m_stream->stateString());
259 EXPECT_EQ("errored", reader->state());
260 EXPECT_FALSE(reader->isActive());
261
262 String onClosedFulfilled, onClosedRejected;
263 String onReadyFulfilled, onReadyRejected;
264 reader->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createC aptor(&onClosedRejected));
265 reader->ready(scriptState()).then(createCaptor(&onReadyFulfilled), createCap tor(&onReadyRejected));
266 EXPECT_TRUE(onClosedFulfilled.isNull());
267 EXPECT_TRUE(onClosedRejected.isNull());
268 EXPECT_TRUE(onReadyFulfilled.isNull());
269 EXPECT_TRUE(onReadyRejected.isNull());
270
271 isolate()->RunMicrotasks();
272 EXPECT_TRUE(onClosedFulfilled.isNull());
273 EXPECT_EQ("SyntaxError: some error", onClosedRejected);
274 EXPECT_EQ("undefined", onReadyFulfilled);
275 EXPECT_TRUE(onReadyRejected.isNull());
276 }
277
278 TEST_F(ExclusiveStreamReaderTest, ReadyPromiseShouldNotBeResolvedWhenLocked)
279 {
280 String s;
281 ScriptPromise ready = m_stream->ready(scriptState());
282 ready.then(createCaptor(&s));
283 isolate()->RunMicrotasks();
284 EXPECT_TRUE(s.isNull());
285
286 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream);
287 EXPECT_TRUE(reader->isActive());
288 EXPECT_NE(ready, m_stream->ready(scriptState()));
289
290 isolate()->RunMicrotasks();
291 EXPECT_TRUE(s.isNull());
292
293 // We need to call here to ensure all promises having captors are resolved
294 // or rejected.
295 m_stream->error(DOMException::create(AbortError, "done"));
296 isolate()->RunMicrotasks();
297 }
298
299 TEST_F(ExclusiveStreamReaderTest, ReaderShouldBeReleasedWhenClosed)
300 {
301 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream);
302 EXPECT_TRUE(reader->isActive());
303 m_stream->close();
304 EXPECT_FALSE(reader->isActive());
305 }
306
307 TEST_F(ExclusiveStreamReaderTest, ReaderShouldBeReleasedWhenCanceled)
308 {
309 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream);
310 EXPECT_TRUE(reader->isActive());
311 reader->cancel(scriptState(), ScriptValue(scriptState(), v8::Undefined(isola te())));
312 EXPECT_FALSE(reader->isActive());
313 }
314
315 TEST_F(ExclusiveStreamReaderTest, ReaderShouldBeReleasedWhenErrored)
316 {
317 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream);
318 EXPECT_TRUE(reader->isActive());
319 m_stream->error(DOMException::create(SyntaxError, "some error"));
320 EXPECT_FALSE(reader->isActive());
321 }
322
323 TEST_F(ExclusiveStreamReaderTest, StreamCancelShouldFailWhenLocked)
324 {
325 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream);
326 EXPECT_TRUE(reader->isActive());
327 ScriptPromise p = m_stream->cancel(scriptState(), ScriptValue(scriptState(), v8::Undefined(isolate())));
328 EXPECT_EQ(ReadableStream::Waiting, m_stream->stateInternal());
329 String onFulfilled, onRejected;
330 p.then(createCaptor(&onFulfilled), createCaptor(&onRejected));
331
332 EXPECT_TRUE(onFulfilled.isNull());
333 EXPECT_TRUE(onRejected.isNull());
334 isolate()->RunMicrotasks();
335 EXPECT_TRUE(onFulfilled.isNull());
336 EXPECT_EQ("TypeError: this stream is locked to an ExclusiveStreamReader", on Rejected);
337 }
338
339 TEST_F(ExclusiveStreamReaderTest, ReaderCancelShouldNotWorkWhenNotActive)
340 {
341 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream);
342 reader->releaseLock();
343 EXPECT_FALSE(reader->isActive());
344
345 ScriptPromise p = reader->cancel(scriptState(), ScriptValue(scriptState(), v 8::Undefined(isolate())));
346 EXPECT_EQ(ReadableStream::Waiting, m_stream->stateInternal());
347 String onFulfilled, onRejected;
348 p.then(createCaptor(&onFulfilled), createCaptor(&onRejected));
349
350 EXPECT_TRUE(onFulfilled.isNull());
351 EXPECT_TRUE(onRejected.isNull());
352 isolate()->RunMicrotasks();
353 EXPECT_EQ("undefined", onFulfilled);
354 EXPECT_TRUE(onRejected.isNull());
355 }
356
357 TEST_F(ExclusiveStreamReaderTest, ReadyShouldNotBeResolvedWhileLocked)
358 {
359 String onFulfilled;
360 m_stream->ready(scriptState()).then(createCaptor(&onFulfilled));
361
362 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream);
363
364 m_stream->enqueue("hello");
365 m_stream->enqueue("world");
366
367 ASSERT_EQ("readable", reader->state());
368 reader->read(scriptState(), m_exceptionState);
369 ASSERT_EQ("readable", reader->state());
370 reader->read(scriptState(), m_exceptionState);
371 ASSERT_EQ("waiting", reader->state());
372
373 isolate()->RunMicrotasks();
374 EXPECT_TRUE(onFulfilled.isNull());
375
376 // We need to call here to ensure all promises having captors are resolved
377 // or rejected.
378 m_stream->error(DOMException::create(AbortError, "done"));
379 isolate()->RunMicrotasks();
380 }
381
382 TEST_F(ExclusiveStreamReaderTest, ReadyShouldNotBeResolvedWhenReleasedIfNotReady )
383 {
384 String onFulfilled;
385 m_stream->ready(scriptState()).then(createCaptor(&onFulfilled));
386
387 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream);
388
389 m_stream->enqueue("hello");
390 m_stream->enqueue("world");
391
392 ASSERT_EQ("readable", reader->state());
393 reader->read(scriptState(), m_exceptionState);
394 ASSERT_EQ("readable", reader->state());
395 reader->read(scriptState(), m_exceptionState);
396 ASSERT_EQ("waiting", reader->state());
397
398 reader->releaseLock();
399
400 isolate()->RunMicrotasks();
401 EXPECT_TRUE(onFulfilled.isNull());
402
403 // We need to call here to ensure all promises having captors are resolved
404 // or rejected.
405 m_stream->error(DOMException::create(AbortError, "done"));
406 isolate()->RunMicrotasks();
407 }
408
409 TEST_F(ExclusiveStreamReaderTest, ReadyShouldBeResolvedWhenReleasedIfReady)
410 {
411 String onFulfilled;
412 m_stream->ready(scriptState()).then(createCaptor(&onFulfilled));
413
414 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream);
415
416 m_stream->enqueue("hello");
417 m_stream->enqueue("world");
418
419 ASSERT_EQ("readable", reader->state());
420 reader->read(scriptState(), m_exceptionState);
421 ASSERT_EQ("readable", reader->state());
422
423 isolate()->RunMicrotasks();
424 reader->releaseLock();
425 EXPECT_TRUE(onFulfilled.isNull());
426
427 isolate()->RunMicrotasks();
428 EXPECT_EQ("undefined", onFulfilled);
429 }
430
431 } // namespace
432
433 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/streams/ExclusiveStreamReader.idl ('k') | Source/core/streams/ReadableStream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698