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

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

Issue 837673002: 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/ReadableStreamImpl.h ('k') | Source/core/xmlhttprequest/XMLHttpRequest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "core/streams/ReadableStream.h" 6 #include "core/streams/ReadableStream.h"
7 7
8 #include "bindings/core/v8/ExceptionState.h" 8 #include "bindings/core/v8/ExceptionState.h"
9 #include "bindings/core/v8/ScriptPromiseResolver.h" 9 #include "bindings/core/v8/ScriptPromiseResolver.h"
10 #include "bindings/core/v8/ScriptState.h" 10 #include "bindings/core/v8/ScriptState.h"
11 #include "bindings/core/v8/V8Binding.h" 11 #include "bindings/core/v8/V8Binding.h"
12 #include "core/dom/DOMArrayBuffer.h" 12 #include "core/dom/DOMArrayBuffer.h"
13 #include "core/dom/DOMException.h" 13 #include "core/dom/DOMException.h"
14 #include "core/dom/Document.h" 14 #include "core/dom/Document.h"
15 #include "core/dom/ExceptionCode.h" 15 #include "core/dom/ExceptionCode.h"
16 #include "core/streams/ExclusiveStreamReader.h"
16 #include "core/streams/ReadableStreamImpl.h" 17 #include "core/streams/ReadableStreamImpl.h"
17 #include "core/streams/UnderlyingSource.h" 18 #include "core/streams/UnderlyingSource.h"
18 #include "core/testing/DummyPageHolder.h" 19 #include "core/testing/DummyPageHolder.h"
19 #include <gmock/gmock.h> 20 #include <gmock/gmock.h>
20 #include <gtest/gtest.h> 21 #include <gtest/gtest.h>
21 22
22 namespace blink { 23 namespace blink {
23 24
24 using ::testing::_; 25 using ::testing::_;
25 using ::testing::InSequence; 26 using ::testing::InSequence;
26 using ::testing::Invoke; 27 using ::testing::Invoke;
27 using ::testing::Return; 28 using ::testing::Return;
28 29
29 namespace { 30 namespace {
30 31
31 typedef ::testing::StrictMock<::testing::MockFunction<void(int)> > Checkpoint; 32 using Checkpoint = ::testing::StrictMock<::testing::MockFunction<void(int)>>;
32 typedef ReadableStreamImpl<ReadableStreamChunkTypeTraits<String> > StringStream; 33 using StringStream = ReadableStreamImpl<ReadableStreamChunkTypeTraits<String>>;
33 34
34 class StringCapturingFunction : public ScriptFunction { 35 class StringCapturingFunction : public ScriptFunction {
35 public: 36 public:
36 static v8::Handle<v8::Function> createFunction(ScriptState* scriptState, Str ing* value) 37 static v8::Handle<v8::Function> createFunction(ScriptState* scriptState, Str ing* value)
37 { 38 {
38 StringCapturingFunction* self = new StringCapturingFunction(scriptState, value); 39 StringCapturingFunction* self = new StringCapturingFunction(scriptState, value);
39 return self->bindToV8Function(); 40 return self->bindToV8Function();
40 } 41 }
41 42
42 private: 43 private:
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 EXPECT_CALL(checkpoint, Call(0)); 166 EXPECT_CALL(checkpoint, Call(0));
166 EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); 167 EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1);
167 EXPECT_CALL(checkpoint, Call(1)); 168 EXPECT_CALL(checkpoint, Call(1));
168 } 169 }
169 170
170 StringStream* stream = new StringStream(scriptState()->executionContext(), m _underlyingSource); 171 StringStream* stream = new StringStream(scriptState()->executionContext(), m _underlyingSource);
171 EXPECT_FALSE(m_exceptionState.hadException()); 172 EXPECT_FALSE(m_exceptionState.hadException());
172 EXPECT_FALSE(stream->isStarted()); 173 EXPECT_FALSE(stream->isStarted());
173 EXPECT_FALSE(stream->isDraining()); 174 EXPECT_FALSE(stream->isDraining());
174 EXPECT_FALSE(stream->isPulling()); 175 EXPECT_FALSE(stream->isPulling());
175 EXPECT_EQ(stream->state(), ReadableStream::Waiting); 176 EXPECT_EQ(stream->stateInternal(), ReadableStream::Waiting);
176 177
177 checkpoint.Call(0); 178 checkpoint.Call(0);
178 stream->didSourceStart(); 179 stream->didSourceStart();
179 checkpoint.Call(1); 180 checkpoint.Call(1);
180 181
181 EXPECT_TRUE(stream->isStarted()); 182 EXPECT_TRUE(stream->isStarted());
182 EXPECT_FALSE(stream->isDraining()); 183 EXPECT_FALSE(stream->isDraining());
183 EXPECT_TRUE(stream->isPulling()); 184 EXPECT_TRUE(stream->isPulling());
184 EXPECT_EQ(stream->state(), ReadableStream::Waiting); 185 EXPECT_EQ(stream->stateInternal(), ReadableStream::Waiting);
185 186
186 // We need to call |error| in order to make 187 // We need to call |error| in order to make
187 // ActiveDOMObject::hasPendingActivity return false. 188 // ActiveDOMObject::hasPendingActivity return false.
188 stream->error(DOMException::create(AbortError, "done")); 189 stream->error(DOMException::create(AbortError, "done"));
189 } 190 }
190 191
191 TEST_F(ReadableStreamTest, StartFail) 192 TEST_F(ReadableStreamTest, StartFail)
192 { 193 {
193 StringStream* stream = new StringStream(scriptState()->executionContext(), m _underlyingSource); 194 StringStream* stream = new StringStream(scriptState()->executionContext(), m _underlyingSource);
194 EXPECT_FALSE(m_exceptionState.hadException()); 195 EXPECT_FALSE(m_exceptionState.hadException());
195 EXPECT_FALSE(stream->isStarted()); 196 EXPECT_FALSE(stream->isStarted());
196 EXPECT_FALSE(stream->isDraining()); 197 EXPECT_FALSE(stream->isDraining());
197 EXPECT_FALSE(stream->isPulling()); 198 EXPECT_FALSE(stream->isPulling());
198 EXPECT_EQ(stream->state(), ReadableStream::Waiting); 199 EXPECT_EQ(stream->stateInternal(), ReadableStream::Waiting);
199 200
200 stream->error(DOMException::create(NotFoundError)); 201 stream->error(DOMException::create(NotFoundError));
201 202
202 EXPECT_FALSE(stream->isStarted()); 203 EXPECT_FALSE(stream->isStarted());
203 EXPECT_FALSE(stream->isDraining()); 204 EXPECT_FALSE(stream->isDraining());
204 EXPECT_FALSE(stream->isPulling()); 205 EXPECT_FALSE(stream->isPulling());
205 EXPECT_EQ(stream->state(), ReadableStream::Errored); 206 EXPECT_EQ(stream->stateInternal(), ReadableStream::Errored);
206 } 207 }
207 208
208 TEST_F(ReadableStreamTest, WaitOnWaiting) 209 TEST_F(ReadableStreamTest, WaitOnWaiting)
209 { 210 {
210 StringStream* stream = construct(); 211 StringStream* stream = construct();
211 Checkpoint checkpoint; 212 Checkpoint checkpoint;
212 213
213 EXPECT_EQ(ReadableStream::Waiting, stream->state()); 214 EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal());
214 EXPECT_TRUE(stream->isStarted()); 215 EXPECT_TRUE(stream->isStarted());
215 EXPECT_TRUE(stream->isPulling()); 216 EXPECT_TRUE(stream->isPulling());
216 217
217 ScriptPromise p = stream->ready(scriptState()); 218 EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal());
218 ScriptPromise q = stream->ready(scriptState());
219
220 EXPECT_EQ(ReadableStream::Waiting, stream->state());
221 EXPECT_EQ(q, p);
222 219
223 stream->error(DOMException::create(AbortError, "done")); 220 stream->error(DOMException::create(AbortError, "done"));
224 } 221 }
225 222
226 TEST_F(ReadableStreamTest, WaitDuringStarting) 223 TEST_F(ReadableStreamTest, WaitDuringStarting)
227 { 224 {
228 StringStream* stream = new StringStream(scriptState()->executionContext(), m _underlyingSource); 225 StringStream* stream = new StringStream(scriptState()->executionContext(), m _underlyingSource);
229 Checkpoint checkpoint; 226 Checkpoint checkpoint;
230 227
231 EXPECT_EQ(ReadableStream::Waiting, stream->state()); 228 EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal());
232 EXPECT_FALSE(stream->isStarted()); 229 EXPECT_FALSE(stream->isStarted());
233 EXPECT_FALSE(stream->isPulling()); 230 EXPECT_FALSE(stream->isPulling());
234 231
235 { 232 {
236 InSequence s; 233 InSequence s;
237 EXPECT_CALL(checkpoint, Call(0)); 234 EXPECT_CALL(checkpoint, Call(0));
238 EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); 235 EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1);
239 EXPECT_CALL(checkpoint, Call(1)); 236 EXPECT_CALL(checkpoint, Call(1));
240 } 237 }
241 238
242 stream->ready(scriptState()); 239 stream->ready(scriptState());
243 checkpoint.Call(0); 240 checkpoint.Call(0);
244 stream->didSourceStart(); 241 stream->didSourceStart();
245 checkpoint.Call(1); 242 checkpoint.Call(1);
246 243
247 EXPECT_EQ(ReadableStream::Waiting, stream->state()); 244 EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal());
248 EXPECT_TRUE(stream->isStarted()); 245 EXPECT_TRUE(stream->isStarted());
249 EXPECT_TRUE(stream->isPulling()); 246 EXPECT_TRUE(stream->isPulling());
250 247
251 stream->error(DOMException::create(AbortError, "done")); 248 stream->error(DOMException::create(AbortError, "done"));
252 } 249 }
253 250
254 TEST_F(ReadableStreamTest, WaitAndError) 251 TEST_F(ReadableStreamTest, WaitAndError)
255 { 252 {
256 StringStream* stream = construct(); 253 StringStream* stream = construct();
257 String onFulfilled, onRejected; 254 String onFulfilled, onRejected;
258 255
259 ScriptPromise promise = stream->ready(scriptState()); 256 ScriptPromise promise = stream->ready(scriptState());
260 promise.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); 257 promise.then(createCaptor(&onFulfilled), createCaptor(&onRejected));
261 EXPECT_EQ(ReadableStream::Waiting, stream->state()); 258 EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal());
262 EXPECT_TRUE(stream->isPulling()); 259 EXPECT_TRUE(stream->isPulling());
263 stream->error(DOMException::create(NotFoundError, "hello, error")); 260 stream->error(DOMException::create(NotFoundError, "hello, error"));
264 EXPECT_EQ(ReadableStream::Errored, stream->state()); 261 EXPECT_EQ(ReadableStream::Errored, stream->stateInternal());
265 EXPECT_TRUE(stream->isPulling()); 262 EXPECT_TRUE(stream->isPulling());
266 EXPECT_TRUE(onFulfilled.isNull()); 263 EXPECT_TRUE(onFulfilled.isNull());
267 EXPECT_TRUE(onRejected.isNull()); 264 EXPECT_TRUE(onRejected.isNull());
268 265
269 isolate()->RunMicrotasks(); 266 isolate()->RunMicrotasks();
270 EXPECT_TRUE(onFulfilled.isNull()); 267 EXPECT_TRUE(onFulfilled.isNull());
271 EXPECT_EQ(promise, stream->ready(scriptState()));
272 EXPECT_EQ("NotFoundError: hello, error", onRejected); 268 EXPECT_EQ("NotFoundError: hello, error", onRejected);
273 } 269 }
274 270
275 TEST_F(ReadableStreamTest, ErrorAndEnqueue) 271 TEST_F(ReadableStreamTest, ErrorAndEnqueue)
276 { 272 {
277 StringStream* stream = construct(); 273 StringStream* stream = construct();
278 274
279 stream->error(DOMException::create(NotFoundError, "error")); 275 stream->error(DOMException::create(NotFoundError, "error"));
280 EXPECT_EQ(ReadableStream::Errored, stream->state()); 276 EXPECT_EQ(ReadableStream::Errored, stream->stateInternal());
281 277
282 bool result = stream->enqueue("hello"); 278 bool result = stream->enqueue("hello");
283 EXPECT_FALSE(result); 279 EXPECT_FALSE(result);
284 EXPECT_EQ(ReadableStream::Errored, stream->state()); 280 EXPECT_EQ(ReadableStream::Errored, stream->stateInternal());
285 } 281 }
286 282
287 TEST_F(ReadableStreamTest, CloseAndEnqueue) 283 TEST_F(ReadableStreamTest, CloseAndEnqueue)
288 { 284 {
289 StringStream* stream = construct(); 285 StringStream* stream = construct();
290 286
291 stream->close(); 287 stream->close();
292 EXPECT_EQ(ReadableStream::Closed, stream->state()); 288 EXPECT_EQ(ReadableStream::Closed, stream->stateInternal());
293 289
294 bool result = stream->enqueue("hello"); 290 bool result = stream->enqueue("hello");
295 EXPECT_FALSE(result); 291 EXPECT_FALSE(result);
296 EXPECT_EQ(ReadableStream::Closed, stream->state()); 292 EXPECT_EQ(ReadableStream::Closed, stream->stateInternal());
297 } 293 }
298 294
299 TEST_F(ReadableStreamTest, EnqueueAndWait) 295 TEST_F(ReadableStreamTest, EnqueueAndWait)
300 { 296 {
301 StringStream* stream = construct(); 297 StringStream* stream = construct();
302 String onFulfilled, onRejected; 298 String onFulfilled, onRejected;
303 EXPECT_EQ(ReadableStream::Waiting, stream->state()); 299 EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal());
304 300
305 bool result = stream->enqueue("hello"); 301 bool result = stream->enqueue("hello");
306 EXPECT_TRUE(result); 302 EXPECT_TRUE(result);
307 EXPECT_EQ(ReadableStream::Readable, stream->state()); 303 EXPECT_EQ(ReadableStream::Readable, stream->stateInternal());
308 304
309 stream->ready(scriptState()).then(createCaptor(&onFulfilled), createCaptor(& onRejected)); 305 stream->ready(scriptState()).then(createCaptor(&onFulfilled), createCaptor(& onRejected));
310 EXPECT_EQ(ReadableStream::Readable, stream->state()); 306 EXPECT_EQ(ReadableStream::Readable, stream->stateInternal());
311 EXPECT_FALSE(stream->isPulling()); 307 EXPECT_FALSE(stream->isPulling());
312 EXPECT_TRUE(onFulfilled.isNull()); 308 EXPECT_TRUE(onFulfilled.isNull());
313 EXPECT_TRUE(onRejected.isNull()); 309 EXPECT_TRUE(onRejected.isNull());
314 310
315 isolate()->RunMicrotasks(); 311 isolate()->RunMicrotasks();
316 EXPECT_EQ(ReadableStream::Readable, stream->state()); 312 EXPECT_EQ(ReadableStream::Readable, stream->stateInternal());
317 EXPECT_FALSE(stream->isPulling()); 313 EXPECT_FALSE(stream->isPulling());
318 EXPECT_EQ("undefined", onFulfilled); 314 EXPECT_EQ("undefined", onFulfilled);
319 EXPECT_TRUE(onRejected.isNull()); 315 EXPECT_TRUE(onRejected.isNull());
320 316
321 stream->error(DOMException::create(AbortError, "done")); 317 stream->error(DOMException::create(AbortError, "done"));
322 } 318 }
323 319
324 TEST_F(ReadableStreamTest, WaitAndEnqueue) 320 TEST_F(ReadableStreamTest, WaitAndEnqueue)
325 { 321 {
326 StringStream* stream = construct(); 322 StringStream* stream = construct();
327 String onFulfilled, onRejected; 323 String onFulfilled, onRejected;
328 EXPECT_EQ(ReadableStream::Waiting, stream->state()); 324 EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal());
329 325
330 stream->ready(scriptState()).then(createCaptor(&onFulfilled), createCaptor(& onRejected)); 326 stream->ready(scriptState()).then(createCaptor(&onFulfilled), createCaptor(& onRejected));
331 isolate()->RunMicrotasks(); 327 isolate()->RunMicrotasks();
332 328
333 EXPECT_EQ(ReadableStream::Waiting, stream->state()); 329 EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal());
334 EXPECT_TRUE(stream->isPulling()); 330 EXPECT_TRUE(stream->isPulling());
335 EXPECT_TRUE(onFulfilled.isNull()); 331 EXPECT_TRUE(onFulfilled.isNull());
336 EXPECT_TRUE(onRejected.isNull()); 332 EXPECT_TRUE(onRejected.isNull());
337 333
338 bool result = stream->enqueue("hello"); 334 bool result = stream->enqueue("hello");
339 EXPECT_TRUE(result); 335 EXPECT_TRUE(result);
340 EXPECT_EQ(ReadableStream::Readable, stream->state()); 336 EXPECT_EQ(ReadableStream::Readable, stream->stateInternal());
341 EXPECT_FALSE(stream->isPulling()); 337 EXPECT_FALSE(stream->isPulling());
342 EXPECT_TRUE(onFulfilled.isNull()); 338 EXPECT_TRUE(onFulfilled.isNull());
343 EXPECT_TRUE(onRejected.isNull()); 339 EXPECT_TRUE(onRejected.isNull());
344 340
345 isolate()->RunMicrotasks(); 341 isolate()->RunMicrotasks();
346 EXPECT_EQ("undefined", onFulfilled); 342 EXPECT_EQ("undefined", onFulfilled);
347 EXPECT_TRUE(onRejected.isNull()); 343 EXPECT_TRUE(onRejected.isNull());
348 344
349 stream->error(DOMException::create(AbortError, "done")); 345 stream->error(DOMException::create(AbortError, "done"));
350 } 346 }
351 347
352 TEST_F(ReadableStreamTest, WaitAndEnqueueAndError) 348 TEST_F(ReadableStreamTest, WaitAndEnqueueAndError)
353 { 349 {
354 StringStream* stream = construct(); 350 StringStream* stream = construct();
355 String onFulfilled, onRejected; 351 String onFulfilled, onRejected;
356 EXPECT_EQ(ReadableStream::Waiting, stream->state()); 352 EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal());
357 353
358 ScriptPromise promise = stream->ready(scriptState()); 354 ScriptPromise promise = stream->ready(scriptState());
359 promise.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); 355 promise.then(createCaptor(&onFulfilled), createCaptor(&onRejected));
360 isolate()->RunMicrotasks(); 356 isolate()->RunMicrotasks();
361 357
362 EXPECT_EQ(ReadableStream::Waiting, stream->state()); 358 EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal());
363 EXPECT_TRUE(stream->isPulling()); 359 EXPECT_TRUE(stream->isPulling());
364 EXPECT_TRUE(onFulfilled.isNull()); 360 EXPECT_TRUE(onFulfilled.isNull());
365 EXPECT_TRUE(onRejected.isNull()); 361 EXPECT_TRUE(onRejected.isNull());
366 362
367 bool result = stream->enqueue("hello"); 363 bool result = stream->enqueue("hello");
368 EXPECT_TRUE(result); 364 EXPECT_TRUE(result);
369 EXPECT_EQ(ReadableStream::Readable, stream->state()); 365 EXPECT_EQ(ReadableStream::Readable, stream->stateInternal());
370 EXPECT_FALSE(stream->isPulling()); 366 EXPECT_FALSE(stream->isPulling());
371 EXPECT_TRUE(onFulfilled.isNull()); 367 EXPECT_TRUE(onFulfilled.isNull());
372 EXPECT_TRUE(onRejected.isNull()); 368 EXPECT_TRUE(onRejected.isNull());
373 369
374 isolate()->RunMicrotasks(); 370 isolate()->RunMicrotasks();
375 EXPECT_EQ("undefined", onFulfilled); 371 EXPECT_EQ("undefined", onFulfilled);
376 EXPECT_TRUE(onRejected.isNull()); 372 EXPECT_TRUE(onRejected.isNull());
377 373
378 stream->error(DOMException::create(NotFoundError, "error")); 374 stream->error(DOMException::create(NotFoundError, "error"));
379 EXPECT_EQ(ReadableStream::Errored, stream->state()); 375 EXPECT_EQ(ReadableStream::Errored, stream->stateInternal());
380 376
381 EXPECT_NE(promise, stream->ready(scriptState())); 377 EXPECT_NE(promise, stream->ready(scriptState()));
382 } 378 }
383 379
384 TEST_F(ReadableStreamTest, CloseWhenWaiting) 380 TEST_F(ReadableStreamTest, CloseWhenWaiting)
385 { 381 {
386 String onWaitFulfilled, onWaitRejected; 382 String onWaitFulfilled, onWaitRejected;
387 String onClosedFulfilled, onClosedRejected; 383 String onClosedFulfilled, onClosedRejected;
388 384
389 StringStream* stream = construct(); 385 StringStream* stream = construct();
390 386
391 EXPECT_EQ(ReadableStream::Waiting, stream->state()); 387 EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal());
392 stream->ready(scriptState()).then(createCaptor(&onWaitFulfilled), createCapt or(&onWaitRejected)); 388 stream->ready(scriptState()).then(createCaptor(&onWaitFulfilled), createCapt or(&onWaitRejected));
393 stream->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createC aptor(&onClosedRejected)); 389 stream->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createC aptor(&onClosedRejected));
394 390
395 isolate()->RunMicrotasks(); 391 isolate()->RunMicrotasks();
396 EXPECT_TRUE(onWaitFulfilled.isNull()); 392 EXPECT_TRUE(onWaitFulfilled.isNull());
397 EXPECT_TRUE(onWaitRejected.isNull()); 393 EXPECT_TRUE(onWaitRejected.isNull());
398 EXPECT_TRUE(onClosedFulfilled.isNull()); 394 EXPECT_TRUE(onClosedFulfilled.isNull());
399 EXPECT_TRUE(onClosedRejected.isNull()); 395 EXPECT_TRUE(onClosedRejected.isNull());
400 396
401 stream->close(); 397 stream->close();
402 EXPECT_EQ(ReadableStream::Closed, stream->state()); 398 EXPECT_EQ(ReadableStream::Closed, stream->stateInternal());
403 isolate()->RunMicrotasks(); 399 isolate()->RunMicrotasks();
404 EXPECT_EQ("undefined", onWaitFulfilled); 400 EXPECT_EQ("undefined", onWaitFulfilled);
405 EXPECT_TRUE(onWaitRejected.isNull()); 401 EXPECT_TRUE(onWaitRejected.isNull());
406 EXPECT_EQ("undefined", onClosedFulfilled); 402 EXPECT_EQ("undefined", onClosedFulfilled);
407 EXPECT_TRUE(onClosedRejected.isNull()); 403 EXPECT_TRUE(onClosedRejected.isNull());
408 } 404 }
409 405
410 TEST_F(ReadableStreamTest, CloseWhenErrored) 406 TEST_F(ReadableStreamTest, CloseWhenErrored)
411 { 407 {
412 String onFulfilled, onRejected; 408 String onFulfilled, onRejected;
413 StringStream* stream = construct(); 409 StringStream* stream = construct();
414 EXPECT_EQ(ReadableStream::Waiting, stream->state()); 410 EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal());
415 stream->closed(scriptState()).then(createCaptor(&onFulfilled), createCaptor( &onRejected)); 411 stream->closed(scriptState()).then(createCaptor(&onFulfilled), createCaptor( &onRejected));
416 412
417 stream->error(DOMException::create(NotFoundError, "error")); 413 stream->error(DOMException::create(NotFoundError, "error"));
418 stream->close(); 414 stream->close();
419 415
420 EXPECT_EQ(ReadableStream::Errored, stream->state()); 416 EXPECT_EQ(ReadableStream::Errored, stream->stateInternal());
421 isolate()->RunMicrotasks(); 417 isolate()->RunMicrotasks();
422 418
423 EXPECT_TRUE(onFulfilled.isNull()); 419 EXPECT_TRUE(onFulfilled.isNull());
424 EXPECT_EQ("NotFoundError: error", onRejected); 420 EXPECT_EQ("NotFoundError: error", onRejected);
425 } 421 }
426 422
427 TEST_F(ReadableStreamTest, ReadWhenWaiting) 423 TEST_F(ReadableStreamTest, ReadWhenWaiting)
428 { 424 {
429 StringStream* stream = construct(); 425 StringStream* stream = construct();
430 EXPECT_EQ(ReadableStream::Waiting, stream->state()); 426 EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal());
431 EXPECT_FALSE(m_exceptionState.hadException()); 427 EXPECT_FALSE(m_exceptionState.hadException());
432 428
433 stream->read(scriptState(), m_exceptionState); 429 stream->read(scriptState(), m_exceptionState);
434 EXPECT_EQ(ReadableStream::Waiting, stream->state()); 430 EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal());
435 EXPECT_TRUE(m_exceptionState.hadException()); 431 EXPECT_TRUE(m_exceptionState.hadException());
436 EXPECT_EQ(V8TypeError, m_exceptionState.code()); 432 EXPECT_EQ(V8TypeError, m_exceptionState.code());
437 EXPECT_EQ("read is called while state is waiting", m_exceptionState.message( )); 433 EXPECT_EQ("read is called while state is waiting", m_exceptionState.message( ));
438 434
439 stream->error(DOMException::create(AbortError, "done")); 435 stream->error(DOMException::create(AbortError, "done"));
440 } 436 }
441 437
442 TEST_F(ReadableStreamTest, ReadWhenClosed) 438 TEST_F(ReadableStreamTest, ReadWhenClosed)
443 { 439 {
444 StringStream* stream = construct(); 440 StringStream* stream = construct();
445 stream->close(); 441 stream->close();
446 442
447 EXPECT_EQ(ReadableStream::Closed, stream->state()); 443 EXPECT_EQ(ReadableStream::Closed, stream->stateInternal());
448 EXPECT_FALSE(m_exceptionState.hadException()); 444 EXPECT_FALSE(m_exceptionState.hadException());
449 445
450 stream->read(scriptState(), m_exceptionState); 446 stream->read(scriptState(), m_exceptionState);
451 EXPECT_EQ(ReadableStream::Closed, stream->state()); 447 EXPECT_EQ(ReadableStream::Closed, stream->stateInternal());
452 EXPECT_TRUE(m_exceptionState.hadException()); 448 EXPECT_TRUE(m_exceptionState.hadException());
453 EXPECT_EQ(V8TypeError, m_exceptionState.code()); 449 EXPECT_EQ(V8TypeError, m_exceptionState.code());
454 EXPECT_EQ("read is called while state is closed", m_exceptionState.message() ); 450 EXPECT_EQ("read is called while state is closed", m_exceptionState.message() );
455 } 451 }
456 452
457 TEST_F(ReadableStreamTest, ReadWhenErrored) 453 TEST_F(ReadableStreamTest, ReadWhenErrored)
458 { 454 {
459 // DOMException values specified in the spec are different from enum values 455 // DOMException values specified in the spec are different from enum values
460 // defined in ExceptionCode.h. 456 // defined in ExceptionCode.h.
461 const int notFoundExceptionCode = 8; 457 const int notFoundExceptionCode = 8;
462 StringStream* stream = construct(); 458 StringStream* stream = construct();
463 stream->error(DOMException::create(NotFoundError, "error")); 459 stream->error(DOMException::create(NotFoundError, "error"));
464 460
465 EXPECT_EQ(ReadableStream::Errored, stream->state()); 461 EXPECT_EQ(ReadableStream::Errored, stream->stateInternal());
466 EXPECT_FALSE(m_exceptionState.hadException()); 462 EXPECT_FALSE(m_exceptionState.hadException());
467 463
468 stream->read(scriptState(), m_exceptionState); 464 stream->read(scriptState(), m_exceptionState);
469 EXPECT_EQ(ReadableStream::Errored, stream->state()); 465 EXPECT_EQ(ReadableStream::Errored, stream->stateInternal());
470 EXPECT_TRUE(m_exceptionState.hadException()); 466 EXPECT_TRUE(m_exceptionState.hadException());
471 EXPECT_EQ(notFoundExceptionCode, m_exceptionState.code()); 467 EXPECT_EQ(notFoundExceptionCode, m_exceptionState.code());
472 EXPECT_EQ("error", m_exceptionState.message()); 468 EXPECT_EQ("error", m_exceptionState.message());
473 } 469 }
474 470
475 TEST_F(ReadableStreamTest, EnqueuedAndRead) 471 TEST_F(ReadableStreamTest, EnqueuedAndRead)
476 { 472 {
477 StringStream* stream = construct(); 473 StringStream* stream = construct();
478 String onFulfilled, onRejected; 474 String onFulfilled, onRejected;
479 Checkpoint checkpoint; 475 Checkpoint checkpoint;
480 476
481 { 477 {
482 InSequence s; 478 InSequence s;
483 EXPECT_CALL(checkpoint, Call(0)); 479 EXPECT_CALL(checkpoint, Call(0));
484 EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); 480 EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1);
485 EXPECT_CALL(checkpoint, Call(1)); 481 EXPECT_CALL(checkpoint, Call(1));
486 } 482 }
487 483
488 stream->enqueue("hello"); 484 stream->enqueue("hello");
489 ScriptPromise promise = stream->ready(scriptState()); 485 ScriptPromise promise = stream->ready(scriptState());
490 EXPECT_EQ(ReadableStream::Readable, stream->state()); 486 EXPECT_EQ(ReadableStream::Readable, stream->stateInternal());
491 EXPECT_FALSE(stream->isPulling()); 487 EXPECT_FALSE(stream->isPulling());
492 488
493 checkpoint.Call(0); 489 checkpoint.Call(0);
494 String chunk; 490 String chunk;
495 EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk)); 491 EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk));
496 checkpoint.Call(1); 492 checkpoint.Call(1);
497 EXPECT_FALSE(m_exceptionState.hadException()); 493 EXPECT_FALSE(m_exceptionState.hadException());
498 EXPECT_EQ("hello", chunk); 494 EXPECT_EQ("hello", chunk);
499 EXPECT_EQ(ReadableStream::Waiting, stream->state()); 495 EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal());
500 EXPECT_TRUE(stream->isPulling()); 496 EXPECT_TRUE(stream->isPulling());
501 EXPECT_FALSE(stream->isDraining()); 497 EXPECT_FALSE(stream->isDraining());
502 498
503 ScriptPromise newPromise = stream->ready(scriptState()); 499 ScriptPromise newPromise = stream->ready(scriptState());
504 newPromise.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); 500 newPromise.then(createCaptor(&onFulfilled), createCaptor(&onRejected));
505 isolate()->RunMicrotasks(); 501 isolate()->RunMicrotasks();
506 EXPECT_NE(promise, newPromise); 502 EXPECT_NE(promise, newPromise);
507 EXPECT_TRUE(onFulfilled.isNull()); 503 EXPECT_TRUE(onFulfilled.isNull());
508 EXPECT_TRUE(onRejected.isNull()); 504 EXPECT_TRUE(onRejected.isNull());
509 505
510 stream->error(DOMException::create(AbortError, "done")); 506 stream->error(DOMException::create(AbortError, "done"));
511 isolate()->RunMicrotasks(); 507 isolate()->RunMicrotasks();
512 } 508 }
513 509
514 TEST_F(ReadableStreamTest, EnqueueTwiceAndRead) 510 TEST_F(ReadableStreamTest, EnqueueTwiceAndRead)
515 { 511 {
516 StringStream* stream = construct(); 512 StringStream* stream = construct();
517 Checkpoint checkpoint; 513 Checkpoint checkpoint;
518 514
519 { 515 {
520 InSequence s; 516 InSequence s;
521 EXPECT_CALL(checkpoint, Call(0)); 517 EXPECT_CALL(checkpoint, Call(0));
522 EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); 518 EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1);
523 EXPECT_CALL(checkpoint, Call(1)); 519 EXPECT_CALL(checkpoint, Call(1));
524 } 520 }
525 521
526 EXPECT_TRUE(stream->enqueue("hello")); 522 EXPECT_TRUE(stream->enqueue("hello"));
527 EXPECT_TRUE(stream->enqueue("bye")); 523 EXPECT_TRUE(stream->enqueue("bye"));
528 ScriptPromise promise = stream->ready(scriptState()); 524 ScriptPromise promise = stream->ready(scriptState());
529 EXPECT_EQ(ReadableStream::Readable, stream->state()); 525 EXPECT_EQ(ReadableStream::Readable, stream->stateInternal());
530 EXPECT_FALSE(stream->isPulling()); 526 EXPECT_FALSE(stream->isPulling());
531 527
532 String chunk; 528 String chunk;
533 checkpoint.Call(0); 529 checkpoint.Call(0);
534 EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk)); 530 EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk));
535 checkpoint.Call(1); 531 checkpoint.Call(1);
536 EXPECT_FALSE(m_exceptionState.hadException()); 532 EXPECT_FALSE(m_exceptionState.hadException());
537 EXPECT_EQ("hello", chunk); 533 EXPECT_EQ("hello", chunk);
538 EXPECT_EQ(ReadableStream::Readable, stream->state()); 534 EXPECT_EQ(ReadableStream::Readable, stream->stateInternal());
539 EXPECT_TRUE(stream->isPulling()); 535 EXPECT_TRUE(stream->isPulling());
540 EXPECT_FALSE(stream->isDraining()); 536 EXPECT_FALSE(stream->isDraining());
541 537
542 ScriptPromise newPromise = stream->ready(scriptState()); 538 ScriptPromise newPromise = stream->ready(scriptState());
543 EXPECT_EQ(promise, newPromise); 539 EXPECT_EQ(promise, newPromise);
544 540
545 stream->error(DOMException::create(AbortError, "done")); 541 stream->error(DOMException::create(AbortError, "done"));
546 } 542 }
547 543
548 TEST_F(ReadableStreamTest, InternalRead) 544 TEST_F(ReadableStreamTest, ReadQueue)
549 { 545 {
550 StringStream* stream = construct(); 546 StringStream* stream = construct();
551 Checkpoint checkpoint; 547 Checkpoint checkpoint;
552 548
553 { 549 {
554 InSequence s; 550 InSequence s;
555 EXPECT_CALL(checkpoint, Call(0)); 551 EXPECT_CALL(checkpoint, Call(0));
556 EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); 552 EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1);
557 EXPECT_CALL(checkpoint, Call(1)); 553 EXPECT_CALL(checkpoint, Call(1));
558 } 554 }
559 555
560 Deque<std::pair<String, size_t>> queue; 556 Deque<std::pair<String, size_t>> queue;
561 557
562 EXPECT_TRUE(stream->enqueue("hello")); 558 EXPECT_TRUE(stream->enqueue("hello"));
563 EXPECT_TRUE(stream->enqueue("bye")); 559 EXPECT_TRUE(stream->enqueue("bye"));
564 EXPECT_EQ(ReadableStream::Readable, stream->state()); 560 EXPECT_EQ(ReadableStream::Readable, stream->stateInternal());
565 EXPECT_FALSE(stream->isPulling()); 561 EXPECT_FALSE(stream->isPulling());
566 562
567 String chunk; 563 String chunk;
568 checkpoint.Call(0); 564 checkpoint.Call(0);
569 stream->read(queue); 565 stream->readInternal(queue);
570 checkpoint.Call(1); 566 checkpoint.Call(1);
571 ASSERT_EQ(2u, queue.size()); 567 ASSERT_EQ(2u, queue.size());
572 568
573 EXPECT_EQ(std::make_pair(String("hello"), static_cast<size_t>(5)), queue[0]) ; 569 EXPECT_EQ(std::make_pair(String("hello"), static_cast<size_t>(5)), queue[0]) ;
574 EXPECT_EQ(std::make_pair(String("bye"), static_cast<size_t>(3)), queue[1]); 570 EXPECT_EQ(std::make_pair(String("bye"), static_cast<size_t>(3)), queue[1]);
575 571
576 EXPECT_EQ(ReadableStream::Waiting, stream->state()); 572 EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal());
577 EXPECT_TRUE(stream->isPulling()); 573 EXPECT_TRUE(stream->isPulling());
578 EXPECT_FALSE(stream->isDraining()); 574 EXPECT_FALSE(stream->isDraining());
579 } 575 }
580 576
581 TEST_F(ReadableStreamTest, CloseWhenReadable) 577 TEST_F(ReadableStreamTest, CloseWhenReadable)
582 { 578 {
583 StringStream* stream = construct(); 579 StringStream* stream = construct();
584 String onClosedFulfilled, onClosedRejected; 580 String onClosedFulfilled, onClosedRejected;
585 581
586 stream->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createC aptor(&onClosedRejected)); 582 stream->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createC aptor(&onClosedRejected));
587 EXPECT_TRUE(stream->enqueue("hello")); 583 EXPECT_TRUE(stream->enqueue("hello"));
588 EXPECT_TRUE(stream->enqueue("bye")); 584 EXPECT_TRUE(stream->enqueue("bye"));
589 stream->close(); 585 stream->close();
590 EXPECT_FALSE(stream->enqueue("should be ignored")); 586 EXPECT_FALSE(stream->enqueue("should be ignored"));
591 587
592 ScriptPromise promise = stream->ready(scriptState()); 588 ScriptPromise promise = stream->ready(scriptState());
593 EXPECT_EQ(ReadableStream::Readable, stream->state()); 589 EXPECT_EQ(ReadableStream::Readable, stream->stateInternal());
594 EXPECT_FALSE(stream->isPulling()); 590 EXPECT_FALSE(stream->isPulling());
595 EXPECT_TRUE(stream->isDraining()); 591 EXPECT_TRUE(stream->isDraining());
596 592
597 String chunk; 593 String chunk;
598 EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk)); 594 EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk));
599 EXPECT_EQ("hello", chunk); 595 EXPECT_EQ("hello", chunk);
600 EXPECT_EQ(promise, stream->ready(scriptState())); 596 EXPECT_EQ(promise, stream->ready(scriptState()));
601 597
602 isolate()->RunMicrotasks(); 598 isolate()->RunMicrotasks();
603 599
604 EXPECT_EQ(ReadableStream::Readable, stream->state()); 600 EXPECT_EQ(ReadableStream::Readable, stream->stateInternal());
605 EXPECT_FALSE(stream->isPulling()); 601 EXPECT_FALSE(stream->isPulling());
606 EXPECT_TRUE(stream->isDraining()); 602 EXPECT_TRUE(stream->isDraining());
607 603
608 EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk)); 604 EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk));
609 EXPECT_EQ("bye", chunk); 605 EXPECT_EQ("bye", chunk);
610 EXPECT_FALSE(m_exceptionState.hadException()); 606 EXPECT_FALSE(m_exceptionState.hadException());
611 607
612 EXPECT_EQ(promise, stream->ready(scriptState())); 608 EXPECT_EQ(promise, stream->ready(scriptState()));
613 609
614 EXPECT_EQ(ReadableStream::Closed, stream->state()); 610 EXPECT_EQ(ReadableStream::Closed, stream->stateInternal());
615 EXPECT_FALSE(stream->isPulling()); 611 EXPECT_FALSE(stream->isPulling());
616 EXPECT_TRUE(stream->isDraining()); 612 EXPECT_TRUE(stream->isDraining());
617 613
618 EXPECT_TRUE(onClosedFulfilled.isNull()); 614 EXPECT_TRUE(onClosedFulfilled.isNull());
619 EXPECT_TRUE(onClosedRejected.isNull()); 615 EXPECT_TRUE(onClosedRejected.isNull());
620 616
621 isolate()->RunMicrotasks(); 617 isolate()->RunMicrotasks();
622 EXPECT_EQ("undefined", onClosedFulfilled); 618 EXPECT_EQ("undefined", onClosedFulfilled);
623 EXPECT_TRUE(onClosedRejected.isNull()); 619 EXPECT_TRUE(onClosedRejected.isNull());
624 } 620 }
625 621
626 TEST_F(ReadableStreamTest, CancelWhenClosed) 622 TEST_F(ReadableStreamTest, CancelWhenClosed)
627 { 623 {
628 StringStream* stream = construct(); 624 StringStream* stream = construct();
629 String onFulfilled, onRejected; 625 String onFulfilled, onRejected;
630 stream->close(); 626 stream->close();
631 EXPECT_EQ(ReadableStream::Closed, stream->state()); 627 EXPECT_EQ(ReadableStream::Closed, stream->stateInternal());
632 628
633 ScriptPromise promise = stream->cancel(scriptState(), ScriptValue()); 629 ScriptPromise promise = stream->cancel(scriptState(), ScriptValue());
634 EXPECT_EQ(ReadableStream::Closed, stream->state()); 630 EXPECT_EQ(ReadableStream::Closed, stream->stateInternal());
635 631
636 promise.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); 632 promise.then(createCaptor(&onFulfilled), createCaptor(&onRejected));
637 EXPECT_TRUE(onFulfilled.isNull()); 633 EXPECT_TRUE(onFulfilled.isNull());
638 EXPECT_TRUE(onRejected.isNull()); 634 EXPECT_TRUE(onRejected.isNull());
639 635
640 isolate()->RunMicrotasks(); 636 isolate()->RunMicrotasks();
641 EXPECT_EQ("undefined", onFulfilled); 637 EXPECT_EQ("undefined", onFulfilled);
642 EXPECT_TRUE(onRejected.isNull()); 638 EXPECT_TRUE(onRejected.isNull());
643 } 639 }
644 640
645 TEST_F(ReadableStreamTest, CancelWhenErrored) 641 TEST_F(ReadableStreamTest, CancelWhenErrored)
646 { 642 {
647 StringStream* stream = construct(); 643 StringStream* stream = construct();
648 String onFulfilled, onRejected; 644 String onFulfilled, onRejected;
649 stream->error(DOMException::create(NotFoundError, "error")); 645 stream->error(DOMException::create(NotFoundError, "error"));
650 EXPECT_EQ(ReadableStream::Errored, stream->state()); 646 EXPECT_EQ(ReadableStream::Errored, stream->stateInternal());
651 647
652 ScriptPromise promise = stream->cancel(scriptState(), ScriptValue()); 648 ScriptPromise promise = stream->cancel(scriptState(), ScriptValue());
653 EXPECT_EQ(ReadableStream::Errored, stream->state()); 649 EXPECT_EQ(ReadableStream::Errored, stream->stateInternal());
654 650
655 promise.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); 651 promise.then(createCaptor(&onFulfilled), createCaptor(&onRejected));
656 EXPECT_TRUE(onFulfilled.isNull()); 652 EXPECT_TRUE(onFulfilled.isNull());
657 EXPECT_TRUE(onRejected.isNull()); 653 EXPECT_TRUE(onRejected.isNull());
658 654
659 isolate()->RunMicrotasks(); 655 isolate()->RunMicrotasks();
660 EXPECT_TRUE(onFulfilled.isNull()); 656 EXPECT_TRUE(onFulfilled.isNull());
661 EXPECT_EQ("NotFoundError: error", onRejected); 657 EXPECT_EQ("NotFoundError: error", onRejected);
662 } 658 }
663 659
664 TEST_F(ReadableStreamTest, CancelWhenWaiting) 660 TEST_F(ReadableStreamTest, CancelWhenWaiting)
665 { 661 {
666 StringStream* stream = construct(); 662 StringStream* stream = construct();
667 String onFulfilled, onRejected; 663 String onFulfilled, onRejected;
668 ScriptValue reason(scriptState(), v8String(scriptState()->isolate(), "reason ")); 664 ScriptValue reason(scriptState(), v8String(scriptState()->isolate(), "reason "));
669 ScriptPromise promise = ScriptPromise::cast(scriptState(), v8String(scriptSt ate()->isolate(), "hello")); 665 ScriptPromise promise = ScriptPromise::cast(scriptState(), v8String(scriptSt ate()->isolate(), "hello"));
670 666
671 { 667 {
672 InSequence s; 668 InSequence s;
673 EXPECT_CALL(*m_underlyingSource, cancelSource(scriptState(), reason)).Wi llOnce(Return(promise)); 669 EXPECT_CALL(*m_underlyingSource, cancelSource(scriptState(), reason)).Wi llOnce(Return(promise));
674 } 670 }
675 671
676 EXPECT_EQ(ReadableStream::Waiting, stream->state()); 672 EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal());
677 ScriptPromise ready = stream->ready(scriptState()); 673 ScriptPromise ready = stream->ready(scriptState());
678 EXPECT_NE(promise, stream->cancel(scriptState(), reason)); 674 EXPECT_NE(promise, stream->cancel(scriptState(), reason));
679 EXPECT_EQ(ReadableStream::Closed, stream->state()); 675 EXPECT_EQ(ReadableStream::Closed, stream->stateInternal());
680 EXPECT_EQ(stream->ready(scriptState()), ready);
681 676
682 ready.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); 677 ready.then(createCaptor(&onFulfilled), createCaptor(&onRejected));
683 EXPECT_TRUE(onFulfilled.isNull()); 678 EXPECT_TRUE(onFulfilled.isNull());
684 EXPECT_TRUE(onRejected.isNull()); 679 EXPECT_TRUE(onRejected.isNull());
685 680
686 isolate()->RunMicrotasks(); 681 isolate()->RunMicrotasks();
687 EXPECT_EQ("undefined", onFulfilled); 682 EXPECT_EQ("undefined", onFulfilled);
688 EXPECT_TRUE(onRejected.isNull()); 683 EXPECT_TRUE(onRejected.isNull());
689 } 684 }
690 685
691 TEST_F(ReadableStreamTest, CancelWhenReadable) 686 TEST_F(ReadableStreamTest, CancelWhenReadable)
692 { 687 {
693 StringStream* stream = construct(); 688 StringStream* stream = construct();
694 String onFulfilled, onRejected; 689 String onFulfilled, onRejected;
695 String onCancelFulfilled, onCancelRejected; 690 String onCancelFulfilled, onCancelRejected;
696 ScriptValue reason(scriptState(), v8String(scriptState()->isolate(), "reason ")); 691 ScriptValue reason(scriptState(), v8String(scriptState()->isolate(), "reason "));
697 ScriptPromise promise = ScriptPromise::cast(scriptState(), v8String(scriptSt ate()->isolate(), "hello")); 692 ScriptPromise promise = ScriptPromise::cast(scriptState(), v8String(scriptSt ate()->isolate(), "hello"));
698 693
699 { 694 {
700 InSequence s; 695 InSequence s;
701 EXPECT_CALL(*m_underlyingSource, cancelSource(scriptState(), reason)).Wi llOnce(Return(promise)); 696 EXPECT_CALL(*m_underlyingSource, cancelSource(scriptState(), reason)).Wi llOnce(Return(promise));
702 } 697 }
703 698
704 stream->enqueue("hello"); 699 stream->enqueue("hello");
705 ScriptPromise ready = stream->ready(scriptState()); 700 ScriptPromise ready = stream->ready(scriptState());
706 EXPECT_EQ(ReadableStream::Readable, stream->state()); 701 EXPECT_EQ(ReadableStream::Readable, stream->stateInternal());
707 702
708 ScriptPromise cancelResult = stream->cancel(scriptState(), reason); 703 ScriptPromise cancelResult = stream->cancel(scriptState(), reason);
709 cancelResult.then(createCaptor(&onCancelFulfilled), createCaptor(&onCancelRe jected)); 704 cancelResult.then(createCaptor(&onCancelFulfilled), createCaptor(&onCancelRe jected));
710 705
711 EXPECT_NE(promise, cancelResult); 706 EXPECT_NE(promise, cancelResult);
712 EXPECT_EQ(ReadableStream::Closed, stream->state()); 707 EXPECT_EQ(ReadableStream::Closed, stream->stateInternal());
713 708
714 EXPECT_EQ(stream->ready(scriptState()), ready); 709 EXPECT_EQ(stream->ready(scriptState()), ready);
715 710
716 EXPECT_TRUE(onCancelFulfilled.isNull()); 711 EXPECT_TRUE(onCancelFulfilled.isNull());
717 EXPECT_TRUE(onCancelRejected.isNull()); 712 EXPECT_TRUE(onCancelRejected.isNull());
718 713
719 isolate()->RunMicrotasks(); 714 isolate()->RunMicrotasks();
720 EXPECT_EQ("undefined", onCancelFulfilled); 715 EXPECT_EQ("undefined", onCancelFulfilled);
721 EXPECT_TRUE(onCancelRejected.isNull()); 716 EXPECT_TRUE(onCancelRejected.isNull());
722 } 717 }
723 718
724 TEST_F(ReadableStreamTest, ReadableArrayBufferCompileTest) 719 TEST_F(ReadableStreamTest, ReadableArrayBufferCompileTest)
725 { 720 {
726 // This test tests if ReadableStreamImpl<DOMArrayBuffer> can be 721 // This test tests if ReadableStreamImpl<DOMArrayBuffer> can be
727 // instantiated. 722 // instantiated.
728 new ReadableStreamImpl<ReadableStreamChunkTypeTraits<DOMArrayBuffer>>(script State()->executionContext(), m_underlyingSource); 723 new ReadableStreamImpl<ReadableStreamChunkTypeTraits<DOMArrayBuffer>>(script State()->executionContext(), m_underlyingSource);
729 } 724 }
730 725
731 TEST_F(ReadableStreamTest, BackpressureOnEnqueueing) 726 TEST_F(ReadableStreamTest, BackpressureOnEnqueueing)
732 { 727 {
733 auto strategy = MockStrategy::create(); 728 auto strategy = MockStrategy::create();
734 Checkpoint checkpoint; 729 Checkpoint checkpoint;
735 730
736 StringStream* stream = construct(strategy); 731 StringStream* stream = construct(strategy);
737 EXPECT_EQ(ReadableStream::Waiting, stream->state()); 732 EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal());
738 733
739 { 734 {
740 InSequence s; 735 InSequence s;
741 EXPECT_CALL(checkpoint, Call(0)); 736 EXPECT_CALL(checkpoint, Call(0));
742 EXPECT_CALL(*strategy, size(String("hello"), stream)).WillOnce(Return(1) ); 737 EXPECT_CALL(*strategy, size(String("hello"), stream)).WillOnce(Return(1) );
743 EXPECT_CALL(*strategy, shouldApplyBackpressure(1, stream)).WillOnce(Retu rn(false)); 738 EXPECT_CALL(*strategy, shouldApplyBackpressure(1, stream)).WillOnce(Retu rn(false));
744 EXPECT_CALL(checkpoint, Call(1)); 739 EXPECT_CALL(checkpoint, Call(1));
745 EXPECT_CALL(checkpoint, Call(2)); 740 EXPECT_CALL(checkpoint, Call(2));
746 EXPECT_CALL(*strategy, size(String("world"), stream)).WillOnce(Return(2) ); 741 EXPECT_CALL(*strategy, size(String("world"), stream)).WillOnce(Return(2) );
747 EXPECT_CALL(*strategy, shouldApplyBackpressure(3, stream)).WillOnce(Retu rn(true)); 742 EXPECT_CALL(*strategy, shouldApplyBackpressure(3, stream)).WillOnce(Retu rn(true));
(...skipping 11 matching lines...) Expand all
759 754
760 stream->error(DOMException::create(AbortError, "done")); 755 stream->error(DOMException::create(AbortError, "done"));
761 } 756 }
762 757
763 TEST_F(ReadableStreamTest, BackpressureOnReading) 758 TEST_F(ReadableStreamTest, BackpressureOnReading)
764 { 759 {
765 auto strategy = MockStrategy::create(); 760 auto strategy = MockStrategy::create();
766 Checkpoint checkpoint; 761 Checkpoint checkpoint;
767 762
768 StringStream* stream = construct(strategy); 763 StringStream* stream = construct(strategy);
769 EXPECT_EQ(ReadableStream::Waiting, stream->state()); 764 EXPECT_EQ(ReadableStream::Waiting, stream->stateInternal());
770 765
771 { 766 {
772 InSequence s; 767 InSequence s;
773 EXPECT_CALL(*strategy, size(String("hello"), stream)).WillOnce(Return(2) ); 768 EXPECT_CALL(*strategy, size(String("hello"), stream)).WillOnce(Return(2) );
774 EXPECT_CALL(*strategy, shouldApplyBackpressure(2, stream)).WillOnce(Retu rn(false)); 769 EXPECT_CALL(*strategy, shouldApplyBackpressure(2, stream)).WillOnce(Retu rn(false));
775 EXPECT_CALL(*strategy, size(String("world"), stream)).WillOnce(Return(3) ); 770 EXPECT_CALL(*strategy, size(String("world"), stream)).WillOnce(Return(3) );
776 EXPECT_CALL(*strategy, shouldApplyBackpressure(5, stream)).WillOnce(Retu rn(false)); 771 EXPECT_CALL(*strategy, shouldApplyBackpressure(5, stream)).WillOnce(Retu rn(false));
777 772
778 EXPECT_CALL(checkpoint, Call(0)); 773 EXPECT_CALL(checkpoint, Call(0));
779 EXPECT_CALL(*strategy, shouldApplyBackpressure(3, stream)).WillOnce(Retu rn(false)); 774 EXPECT_CALL(*strategy, shouldApplyBackpressure(3, stream)).WillOnce(Retu rn(false));
(...skipping 24 matching lines...) Expand all
804 stream->enqueue("foo"); 799 stream->enqueue("foo");
805 stream->enqueue("bar"); 800 stream->enqueue("bar");
806 checkpoint.Call(3); 801 checkpoint.Call(3);
807 EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk)); 802 EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk));
808 EXPECT_EQ("foo", chunk); 803 EXPECT_EQ("foo", chunk);
809 checkpoint.Call(4); 804 checkpoint.Call(4);
810 805
811 stream->error(DOMException::create(AbortError, "done")); 806 stream->error(DOMException::create(AbortError, "done"));
812 } 807 }
813 808
809 // Note: Detailed tests are on ExclusiveStreamReaderTest.
810 TEST_F(ReadableStreamTest, ExclusiveStreamReader)
811 {
812 StringStream* stream = construct();
813 ExclusiveStreamReader* reader = stream->getReader(m_exceptionState);
814
815 ASSERT_TRUE(reader);
816 EXPECT_FALSE(m_exceptionState.hadException());
817 EXPECT_TRUE(reader->isActive());
818 EXPECT_TRUE(stream->isLockedTo(reader));
819
820 ExclusiveStreamReader* another = stream->getReader(m_exceptionState);
821 ASSERT_EQ(nullptr, another);
822 EXPECT_TRUE(m_exceptionState.hadException());
823 EXPECT_TRUE(reader->isActive());
824 EXPECT_TRUE(stream->isLockedTo(reader));
825 }
826
814 } // namespace blink 827 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/streams/ReadableStreamImpl.h ('k') | Source/core/xmlhttprequest/XMLHttpRequest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698