| OLD | NEW |
| 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" |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 ScriptState* scriptState() { return ScriptState::forMainWorld(m_page->docume
nt().frame()); } | 98 ScriptState* scriptState() { return ScriptState::forMainWorld(m_page->docume
nt().frame()); } |
| 99 v8::Isolate* isolate() { return scriptState()->isolate(); } | 99 v8::Isolate* isolate() { return scriptState()->isolate(); } |
| 100 | 100 |
| 101 v8::Handle<v8::Function> createCaptor(String* value) | 101 v8::Handle<v8::Function> createCaptor(String* value) |
| 102 { | 102 { |
| 103 return StringCapturingFunction::createFunction(scriptState(), value); | 103 return StringCapturingFunction::createFunction(scriptState(), value); |
| 104 } | 104 } |
| 105 | 105 |
| 106 StringStream* construct() | 106 StringStream* construct() |
| 107 { | 107 { |
| 108 Checkpoint checkpoint; |
| 109 { |
| 110 InSequence s; |
| 111 EXPECT_CALL(checkpoint, Call(0)); |
| 112 EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); |
| 113 EXPECT_CALL(checkpoint, Call(1)); |
| 114 } |
| 108 StringStream* stream = new StringStream(scriptState()->executionContext(
), m_underlyingSource); | 115 StringStream* stream = new StringStream(scriptState()->executionContext(
), m_underlyingSource); |
| 116 checkpoint.Call(0); |
| 109 stream->didSourceStart(); | 117 stream->didSourceStart(); |
| 118 checkpoint.Call(1); |
| 110 return stream; | 119 return stream; |
| 111 } | 120 } |
| 112 | 121 |
| 113 OwnPtr<DummyPageHolder> m_page; | 122 OwnPtr<DummyPageHolder> m_page; |
| 114 ScriptState::Scope m_scope; | 123 ScriptState::Scope m_scope; |
| 115 Persistent<MockUnderlyingSource> m_underlyingSource; | 124 Persistent<MockUnderlyingSource> m_underlyingSource; |
| 116 ExceptionState m_exceptionState; | 125 ExceptionState m_exceptionState; |
| 117 }; | 126 }; |
| 118 | 127 |
| 119 TEST_F(ReadableStreamTest, Start) | 128 TEST_F(ReadableStreamTest, Start) |
| 120 { | 129 { |
| 130 Checkpoint checkpoint; |
| 131 { |
| 132 InSequence s; |
| 133 EXPECT_CALL(checkpoint, Call(0)); |
| 134 EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); |
| 135 EXPECT_CALL(checkpoint, Call(1)); |
| 136 } |
| 137 |
| 121 StringStream* stream = new StringStream(scriptState()->executionContext(), m
_underlyingSource); | 138 StringStream* stream = new StringStream(scriptState()->executionContext(), m
_underlyingSource); |
| 122 EXPECT_FALSE(m_exceptionState.hadException()); | 139 EXPECT_FALSE(m_exceptionState.hadException()); |
| 123 EXPECT_FALSE(stream->isStarted()); | 140 EXPECT_FALSE(stream->isStarted()); |
| 124 EXPECT_FALSE(stream->isDraining()); | 141 EXPECT_FALSE(stream->isDraining()); |
| 125 EXPECT_FALSE(stream->isPulling()); | 142 EXPECT_FALSE(stream->isPulling()); |
| 126 EXPECT_EQ(stream->state(), ReadableStream::Waiting); | 143 EXPECT_EQ(stream->state(), ReadableStream::Waiting); |
| 127 | 144 |
| 145 checkpoint.Call(0); |
| 128 stream->didSourceStart(); | 146 stream->didSourceStart(); |
| 147 checkpoint.Call(1); |
| 129 | 148 |
| 130 EXPECT_TRUE(stream->isStarted()); | 149 EXPECT_TRUE(stream->isStarted()); |
| 131 EXPECT_FALSE(stream->isDraining()); | 150 EXPECT_FALSE(stream->isDraining()); |
| 132 EXPECT_FALSE(stream->isPulling()); | 151 EXPECT_TRUE(stream->isPulling()); |
| 133 EXPECT_EQ(stream->state(), ReadableStream::Waiting); | 152 EXPECT_EQ(stream->state(), ReadableStream::Waiting); |
| 134 } | 153 } |
| 135 | 154 |
| 136 TEST_F(ReadableStreamTest, StartFail) | 155 TEST_F(ReadableStreamTest, StartFail) |
| 137 { | 156 { |
| 138 StringStream* stream = new StringStream(scriptState()->executionContext(), m
_underlyingSource); | 157 StringStream* stream = new StringStream(scriptState()->executionContext(), m
_underlyingSource); |
| 139 EXPECT_FALSE(m_exceptionState.hadException()); | 158 EXPECT_FALSE(m_exceptionState.hadException()); |
| 140 EXPECT_FALSE(stream->isStarted()); | 159 EXPECT_FALSE(stream->isStarted()); |
| 141 EXPECT_FALSE(stream->isDraining()); | 160 EXPECT_FALSE(stream->isDraining()); |
| 142 EXPECT_FALSE(stream->isPulling()); | 161 EXPECT_FALSE(stream->isPulling()); |
| 143 EXPECT_EQ(stream->state(), ReadableStream::Waiting); | 162 EXPECT_EQ(stream->state(), ReadableStream::Waiting); |
| 144 | 163 |
| 145 stream->error(DOMException::create(NotFoundError)); | 164 stream->error(DOMException::create(NotFoundError)); |
| 146 | 165 |
| 147 EXPECT_FALSE(stream->isStarted()); | 166 EXPECT_FALSE(stream->isStarted()); |
| 148 EXPECT_FALSE(stream->isDraining()); | 167 EXPECT_FALSE(stream->isDraining()); |
| 149 EXPECT_FALSE(stream->isPulling()); | 168 EXPECT_FALSE(stream->isPulling()); |
| 150 EXPECT_EQ(stream->state(), ReadableStream::Errored); | 169 EXPECT_EQ(stream->state(), ReadableStream::Errored); |
| 151 } | 170 } |
| 152 | 171 |
| 153 TEST_F(ReadableStreamTest, WaitOnWaiting) | 172 TEST_F(ReadableStreamTest, WaitOnWaiting) |
| 154 { | 173 { |
| 155 StringStream* stream = construct(); | 174 StringStream* stream = construct(); |
| 156 Checkpoint checkpoint; | 175 Checkpoint checkpoint; |
| 157 | 176 |
| 158 EXPECT_EQ(ReadableStream::Waiting, stream->state()); | 177 EXPECT_EQ(ReadableStream::Waiting, stream->state()); |
| 159 EXPECT_TRUE(stream->isStarted()); | 178 EXPECT_TRUE(stream->isStarted()); |
| 160 EXPECT_FALSE(stream->isPulling()); | 179 EXPECT_TRUE(stream->isPulling()); |
| 161 | 180 |
| 162 { | |
| 163 InSequence s; | |
| 164 EXPECT_CALL(checkpoint, Call(0)); | |
| 165 EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); | |
| 166 EXPECT_CALL(checkpoint, Call(1)); | |
| 167 } | |
| 168 | |
| 169 checkpoint.Call(0); | |
| 170 ScriptPromise p = stream->wait(scriptState()); | 181 ScriptPromise p = stream->wait(scriptState()); |
| 171 ScriptPromise q = stream->wait(scriptState()); | 182 ScriptPromise q = stream->wait(scriptState()); |
| 172 checkpoint.Call(1); | |
| 173 | 183 |
| 174 EXPECT_EQ(ReadableStream::Waiting, stream->state()); | 184 EXPECT_EQ(ReadableStream::Waiting, stream->state()); |
| 175 EXPECT_TRUE(stream->isPulling()); | |
| 176 EXPECT_EQ(q, p); | 185 EXPECT_EQ(q, p); |
| 177 } | 186 } |
| 178 | 187 |
| 179 TEST_F(ReadableStreamTest, WaitDuringStarting) | 188 TEST_F(ReadableStreamTest, WaitDuringStarting) |
| 180 { | 189 { |
| 181 StringStream* stream = new StringStream(scriptState()->executionContext(), m
_underlyingSource); | 190 StringStream* stream = new StringStream(scriptState()->executionContext(), m
_underlyingSource); |
| 182 Checkpoint checkpoint; | 191 Checkpoint checkpoint; |
| 183 | 192 |
| 184 EXPECT_EQ(ReadableStream::Waiting, stream->state()); | 193 EXPECT_EQ(ReadableStream::Waiting, stream->state()); |
| 185 EXPECT_FALSE(stream->isStarted()); | 194 EXPECT_FALSE(stream->isStarted()); |
| 186 EXPECT_FALSE(stream->isPulling()); | 195 EXPECT_FALSE(stream->isPulling()); |
| 187 | 196 |
| 188 { | 197 { |
| 189 InSequence s; | 198 InSequence s; |
| 190 EXPECT_CALL(checkpoint, Call(0)); | 199 EXPECT_CALL(checkpoint, Call(0)); |
| 200 EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); |
| 191 EXPECT_CALL(checkpoint, Call(1)); | 201 EXPECT_CALL(checkpoint, Call(1)); |
| 192 EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); | |
| 193 } | 202 } |
| 194 | 203 |
| 204 stream->wait(scriptState()); |
| 195 checkpoint.Call(0); | 205 checkpoint.Call(0); |
| 196 stream->wait(scriptState()); | 206 stream->didSourceStart(); |
| 197 checkpoint.Call(1); | 207 checkpoint.Call(1); |
| 198 | 208 |
| 199 EXPECT_TRUE(stream->isPulling()); | |
| 200 | |
| 201 stream->didSourceStart(); | |
| 202 | |
| 203 EXPECT_EQ(ReadableStream::Waiting, stream->state()); | 209 EXPECT_EQ(ReadableStream::Waiting, stream->state()); |
| 210 EXPECT_TRUE(stream->isStarted()); |
| 204 EXPECT_TRUE(stream->isPulling()); | 211 EXPECT_TRUE(stream->isPulling()); |
| 205 } | 212 } |
| 206 | 213 |
| 207 TEST_F(ReadableStreamTest, WaitAndError) | 214 TEST_F(ReadableStreamTest, WaitAndError) |
| 208 { | 215 { |
| 209 StringStream* stream = construct(); | 216 StringStream* stream = construct(); |
| 210 String onFulfilled, onRejected; | 217 String onFulfilled, onRejected; |
| 211 | 218 |
| 212 { | |
| 213 InSequence s; | |
| 214 EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); | |
| 215 } | |
| 216 | |
| 217 ScriptPromise promise = stream->wait(scriptState()); | 219 ScriptPromise promise = stream->wait(scriptState()); |
| 218 promise.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); | 220 promise.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); |
| 219 EXPECT_EQ(ReadableStream::Waiting, stream->state()); | 221 EXPECT_EQ(ReadableStream::Waiting, stream->state()); |
| 220 EXPECT_TRUE(stream->isPulling()); | 222 EXPECT_TRUE(stream->isPulling()); |
| 221 stream->error(DOMException::create(NotFoundError, "hello, error")); | 223 stream->error(DOMException::create(NotFoundError, "hello, error")); |
| 222 EXPECT_EQ(ReadableStream::Errored, stream->state()); | 224 EXPECT_EQ(ReadableStream::Errored, stream->state()); |
| 223 EXPECT_TRUE(stream->isPulling()); | 225 EXPECT_TRUE(stream->isPulling()); |
| 224 EXPECT_TRUE(onFulfilled.isNull()); | 226 EXPECT_TRUE(onFulfilled.isNull()); |
| 225 EXPECT_TRUE(onRejected.isNull()); | 227 EXPECT_TRUE(onRejected.isNull()); |
| 226 | 228 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 EXPECT_EQ("undefined", onFulfilled); | 278 EXPECT_EQ("undefined", onFulfilled); |
| 277 EXPECT_TRUE(onRejected.isNull()); | 279 EXPECT_TRUE(onRejected.isNull()); |
| 278 } | 280 } |
| 279 | 281 |
| 280 TEST_F(ReadableStreamTest, WaitAndEnqueue) | 282 TEST_F(ReadableStreamTest, WaitAndEnqueue) |
| 281 { | 283 { |
| 282 StringStream* stream = construct(); | 284 StringStream* stream = construct(); |
| 283 String onFulfilled, onRejected; | 285 String onFulfilled, onRejected; |
| 284 EXPECT_EQ(ReadableStream::Waiting, stream->state()); | 286 EXPECT_EQ(ReadableStream::Waiting, stream->state()); |
| 285 | 287 |
| 286 { | |
| 287 InSequence s; | |
| 288 EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); | |
| 289 } | |
| 290 | |
| 291 stream->wait(scriptState()).then(createCaptor(&onFulfilled), createCaptor(&o
nRejected)); | 288 stream->wait(scriptState()).then(createCaptor(&onFulfilled), createCaptor(&o
nRejected)); |
| 292 isolate()->RunMicrotasks(); | 289 isolate()->RunMicrotasks(); |
| 293 | 290 |
| 294 EXPECT_EQ(ReadableStream::Waiting, stream->state()); | 291 EXPECT_EQ(ReadableStream::Waiting, stream->state()); |
| 295 EXPECT_TRUE(stream->isPulling()); | 292 EXPECT_TRUE(stream->isPulling()); |
| 296 EXPECT_TRUE(onFulfilled.isNull()); | 293 EXPECT_TRUE(onFulfilled.isNull()); |
| 297 EXPECT_TRUE(onRejected.isNull()); | 294 EXPECT_TRUE(onRejected.isNull()); |
| 298 | 295 |
| 299 bool result = stream->enqueue("hello"); | 296 bool result = stream->enqueue("hello"); |
| 300 EXPECT_TRUE(result); | 297 EXPECT_TRUE(result); |
| 301 EXPECT_EQ(ReadableStream::Readable, stream->state()); | 298 EXPECT_EQ(ReadableStream::Readable, stream->state()); |
| 302 EXPECT_FALSE(stream->isPulling()); | 299 EXPECT_FALSE(stream->isPulling()); |
| 303 EXPECT_TRUE(onFulfilled.isNull()); | 300 EXPECT_TRUE(onFulfilled.isNull()); |
| 304 EXPECT_TRUE(onRejected.isNull()); | 301 EXPECT_TRUE(onRejected.isNull()); |
| 305 | 302 |
| 306 isolate()->RunMicrotasks(); | 303 isolate()->RunMicrotasks(); |
| 307 EXPECT_EQ("undefined", onFulfilled); | 304 EXPECT_EQ("undefined", onFulfilled); |
| 308 EXPECT_TRUE(onRejected.isNull()); | 305 EXPECT_TRUE(onRejected.isNull()); |
| 309 } | 306 } |
| 310 | 307 |
| 311 TEST_F(ReadableStreamTest, WaitAndEnqueueAndError) | 308 TEST_F(ReadableStreamTest, WaitAndEnqueueAndError) |
| 312 { | 309 { |
| 313 StringStream* stream = construct(); | 310 StringStream* stream = construct(); |
| 314 String onFulfilled, onRejected; | 311 String onFulfilled, onRejected; |
| 315 EXPECT_EQ(ReadableStream::Waiting, stream->state()); | 312 EXPECT_EQ(ReadableStream::Waiting, stream->state()); |
| 316 | 313 |
| 317 { | |
| 318 InSequence s; | |
| 319 EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); | |
| 320 } | |
| 321 | |
| 322 ScriptPromise promise = stream->wait(scriptState()); | 314 ScriptPromise promise = stream->wait(scriptState()); |
| 323 promise.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); | 315 promise.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); |
| 324 isolate()->RunMicrotasks(); | 316 isolate()->RunMicrotasks(); |
| 325 | 317 |
| 326 EXPECT_EQ(ReadableStream::Waiting, stream->state()); | 318 EXPECT_EQ(ReadableStream::Waiting, stream->state()); |
| 327 EXPECT_TRUE(stream->isPulling()); | 319 EXPECT_TRUE(stream->isPulling()); |
| 328 EXPECT_TRUE(onFulfilled.isNull()); | 320 EXPECT_TRUE(onFulfilled.isNull()); |
| 329 EXPECT_TRUE(onRejected.isNull()); | 321 EXPECT_TRUE(onRejected.isNull()); |
| 330 | 322 |
| 331 bool result = stream->enqueue("hello"); | 323 bool result = stream->enqueue("hello"); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 345 EXPECT_NE(promise, stream->wait(scriptState())); | 337 EXPECT_NE(promise, stream->wait(scriptState())); |
| 346 } | 338 } |
| 347 | 339 |
| 348 TEST_F(ReadableStreamTest, CloseWhenWaiting) | 340 TEST_F(ReadableStreamTest, CloseWhenWaiting) |
| 349 { | 341 { |
| 350 String onWaitFulfilled, onWaitRejected; | 342 String onWaitFulfilled, onWaitRejected; |
| 351 String onClosedFulfilled, onClosedRejected; | 343 String onClosedFulfilled, onClosedRejected; |
| 352 | 344 |
| 353 StringStream* stream = construct(); | 345 StringStream* stream = construct(); |
| 354 | 346 |
| 355 { | |
| 356 InSequence s; | |
| 357 EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); | |
| 358 } | |
| 359 | |
| 360 EXPECT_EQ(ReadableStream::Waiting, stream->state()); | 347 EXPECT_EQ(ReadableStream::Waiting, stream->state()); |
| 361 stream->wait(scriptState()).then(createCaptor(&onWaitFulfilled), createCapto
r(&onWaitRejected)); | 348 stream->wait(scriptState()).then(createCaptor(&onWaitFulfilled), createCapto
r(&onWaitRejected)); |
| 362 stream->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createC
aptor(&onClosedRejected)); | 349 stream->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createC
aptor(&onClosedRejected)); |
| 363 | 350 |
| 364 isolate()->RunMicrotasks(); | 351 isolate()->RunMicrotasks(); |
| 365 EXPECT_TRUE(onWaitFulfilled.isNull()); | 352 EXPECT_TRUE(onWaitFulfilled.isNull()); |
| 366 EXPECT_TRUE(onWaitRejected.isNull()); | 353 EXPECT_TRUE(onWaitRejected.isNull()); |
| 367 EXPECT_TRUE(onClosedFulfilled.isNull()); | 354 EXPECT_TRUE(onClosedFulfilled.isNull()); |
| 368 EXPECT_TRUE(onClosedRejected.isNull()); | 355 EXPECT_TRUE(onClosedRejected.isNull()); |
| 369 | 356 |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 468 EXPECT_FALSE(stream->isDraining()); | 455 EXPECT_FALSE(stream->isDraining()); |
| 469 | 456 |
| 470 ScriptPromise newPromise = stream->wait(scriptState()); | 457 ScriptPromise newPromise = stream->wait(scriptState()); |
| 471 newPromise.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); | 458 newPromise.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); |
| 472 isolate()->RunMicrotasks(); | 459 isolate()->RunMicrotasks(); |
| 473 EXPECT_NE(promise, newPromise); | 460 EXPECT_NE(promise, newPromise); |
| 474 EXPECT_TRUE(onFulfilled.isNull()); | 461 EXPECT_TRUE(onFulfilled.isNull()); |
| 475 EXPECT_TRUE(onRejected.isNull()); | 462 EXPECT_TRUE(onRejected.isNull()); |
| 476 } | 463 } |
| 477 | 464 |
| 478 TEST_F(ReadableStreamTest, EnqueTwiceAndRead) | 465 TEST_F(ReadableStreamTest, EnqueueTwiceAndRead) |
| 479 { | 466 { |
| 480 StringStream* stream = construct(); | 467 StringStream* stream = construct(); |
| 481 Checkpoint checkpoint; | 468 Checkpoint checkpoint; |
| 482 | 469 |
| 483 { | 470 { |
| 484 InSequence s; | 471 InSequence s; |
| 485 EXPECT_CALL(checkpoint, Call(0)); | 472 EXPECT_CALL(checkpoint, Call(0)); |
| 473 EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); |
| 486 EXPECT_CALL(checkpoint, Call(1)); | 474 EXPECT_CALL(checkpoint, Call(1)); |
| 487 } | 475 } |
| 488 | 476 |
| 489 EXPECT_TRUE(stream->enqueue("hello")); | 477 EXPECT_TRUE(stream->enqueue("hello")); |
| 490 EXPECT_TRUE(stream->enqueue("bye")); | 478 EXPECT_TRUE(stream->enqueue("bye")); |
| 491 ScriptPromise promise = stream->wait(scriptState()); | 479 ScriptPromise promise = stream->wait(scriptState()); |
| 492 EXPECT_EQ(ReadableStream::Readable, stream->state()); | 480 EXPECT_EQ(ReadableStream::Readable, stream->state()); |
| 493 EXPECT_FALSE(stream->isPulling()); | 481 EXPECT_FALSE(stream->isPulling()); |
| 494 | 482 |
| 483 String chunk; |
| 495 checkpoint.Call(0); | 484 checkpoint.Call(0); |
| 496 String chunk; | |
| 497 EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk)); | 485 EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk)); |
| 498 checkpoint.Call(1); | 486 checkpoint.Call(1); |
| 499 EXPECT_FALSE(m_exceptionState.hadException()); | 487 EXPECT_FALSE(m_exceptionState.hadException()); |
| 500 EXPECT_EQ("hello", chunk); | 488 EXPECT_EQ("hello", chunk); |
| 501 EXPECT_EQ(ReadableStream::Readable, stream->state()); | 489 EXPECT_EQ(ReadableStream::Readable, stream->state()); |
| 502 EXPECT_FALSE(stream->isPulling()); | 490 EXPECT_TRUE(stream->isPulling()); |
| 503 EXPECT_FALSE(stream->isDraining()); | 491 EXPECT_FALSE(stream->isDraining()); |
| 504 | 492 |
| 505 ScriptPromise newPromise = stream->wait(scriptState()); | 493 ScriptPromise newPromise = stream->wait(scriptState()); |
| 506 EXPECT_EQ(promise, newPromise); | 494 EXPECT_EQ(promise, newPromise); |
| 507 } | 495 } |
| 508 | 496 |
| 509 TEST_F(ReadableStreamTest, CloseWhenReadable) | 497 TEST_F(ReadableStreamTest, CloseWhenReadable) |
| 510 { | 498 { |
| 511 StringStream* stream = construct(); | 499 StringStream* stream = construct(); |
| 512 String onWaitFulfilled, onWaitRejected; | |
| 513 String onClosedFulfilled, onClosedRejected; | 500 String onClosedFulfilled, onClosedRejected; |
| 514 | 501 |
| 515 stream->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createC
aptor(&onClosedRejected)); | 502 stream->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createC
aptor(&onClosedRejected)); |
| 516 EXPECT_TRUE(stream->enqueue("hello")); | 503 EXPECT_TRUE(stream->enqueue("hello")); |
| 517 EXPECT_TRUE(stream->enqueue("bye")); | 504 EXPECT_TRUE(stream->enqueue("bye")); |
| 518 stream->close(); | 505 stream->close(); |
| 519 EXPECT_FALSE(stream->enqueue("should be ignored")); | 506 EXPECT_FALSE(stream->enqueue("should be ignored")); |
| 520 | 507 |
| 521 ScriptPromise promise = stream->wait(scriptState()); | 508 ScriptPromise promise = stream->wait(scriptState()); |
| 522 EXPECT_EQ(ReadableStream::Readable, stream->state()); | 509 EXPECT_EQ(ReadableStream::Readable, stream->state()); |
| 523 EXPECT_FALSE(stream->isPulling()); | 510 EXPECT_FALSE(stream->isPulling()); |
| 524 EXPECT_TRUE(stream->isDraining()); | 511 EXPECT_TRUE(stream->isDraining()); |
| 525 | 512 |
| 526 String chunk; | 513 String chunk; |
| 527 EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk)); | 514 EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk)); |
| 528 EXPECT_EQ("hello", chunk); | 515 EXPECT_EQ("hello", chunk); |
| 529 EXPECT_EQ(promise, stream->wait(scriptState())); | 516 EXPECT_EQ(promise, stream->wait(scriptState())); |
| 530 | 517 |
| 531 isolate()->RunMicrotasks(); | 518 isolate()->RunMicrotasks(); |
| 532 | 519 |
| 533 EXPECT_EQ(ReadableStream::Readable, stream->state()); | 520 EXPECT_EQ(ReadableStream::Readable, stream->state()); |
| 534 EXPECT_FALSE(stream->isPulling()); | 521 EXPECT_FALSE(stream->isPulling()); |
| 535 EXPECT_TRUE(stream->isDraining()); | 522 EXPECT_TRUE(stream->isDraining()); |
| 536 | 523 |
| 537 EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk)); | 524 EXPECT_TRUE(stream->read(scriptState(), m_exceptionState).toString(chunk)); |
| 538 EXPECT_EQ("bye", chunk); | 525 EXPECT_EQ("bye", chunk); |
| 539 EXPECT_FALSE(m_exceptionState.hadException()); | 526 EXPECT_FALSE(m_exceptionState.hadException()); |
| 540 | 527 |
| 541 EXPECT_NE(promise, stream->wait(scriptState())); | 528 EXPECT_EQ(promise, stream->wait(scriptState())); |
| 542 stream->wait(scriptState()).then(createCaptor(&onWaitFulfilled), createCapto
r(&onWaitRejected)); | |
| 543 | 529 |
| 544 EXPECT_EQ(ReadableStream::Closed, stream->state()); | 530 EXPECT_EQ(ReadableStream::Closed, stream->state()); |
| 545 EXPECT_FALSE(stream->isPulling()); | 531 EXPECT_FALSE(stream->isPulling()); |
| 546 EXPECT_TRUE(stream->isDraining()); | 532 EXPECT_TRUE(stream->isDraining()); |
| 547 | 533 |
| 548 EXPECT_TRUE(onWaitFulfilled.isNull()); | |
| 549 EXPECT_TRUE(onWaitRejected.isNull()); | |
| 550 EXPECT_TRUE(onClosedFulfilled.isNull()); | 534 EXPECT_TRUE(onClosedFulfilled.isNull()); |
| 551 EXPECT_TRUE(onClosedRejected.isNull()); | 535 EXPECT_TRUE(onClosedRejected.isNull()); |
| 552 | 536 |
| 553 isolate()->RunMicrotasks(); | 537 isolate()->RunMicrotasks(); |
| 554 EXPECT_EQ("undefined", onWaitFulfilled); | |
| 555 EXPECT_TRUE(onWaitRejected.isNull()); | |
| 556 EXPECT_EQ("undefined", onClosedFulfilled); | 538 EXPECT_EQ("undefined", onClosedFulfilled); |
| 557 EXPECT_TRUE(onClosedRejected.isNull()); | 539 EXPECT_TRUE(onClosedRejected.isNull()); |
| 558 } | 540 } |
| 559 | 541 |
| 560 TEST_F(ReadableStreamTest, CancelWhenClosed) | 542 TEST_F(ReadableStreamTest, CancelWhenClosed) |
| 561 { | 543 { |
| 562 StringStream* stream = construct(); | 544 StringStream* stream = construct(); |
| 563 String onFulfilled, onRejected; | 545 String onFulfilled, onRejected; |
| 564 stream->close(); | 546 stream->close(); |
| 565 EXPECT_EQ(ReadableStream::Closed, stream->state()); | 547 EXPECT_EQ(ReadableStream::Closed, stream->state()); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 597 | 579 |
| 598 TEST_F(ReadableStreamTest, CancelWhenWaiting) | 580 TEST_F(ReadableStreamTest, CancelWhenWaiting) |
| 599 { | 581 { |
| 600 StringStream* stream = construct(); | 582 StringStream* stream = construct(); |
| 601 String onFulfilled, onRejected; | 583 String onFulfilled, onRejected; |
| 602 ScriptValue reason(scriptState(), v8String(scriptState()->isolate(), "reason
")); | 584 ScriptValue reason(scriptState(), v8String(scriptState()->isolate(), "reason
")); |
| 603 ScriptPromise promise = ScriptPromise::cast(scriptState(), v8String(scriptSt
ate()->isolate(), "hello")); | 585 ScriptPromise promise = ScriptPromise::cast(scriptState(), v8String(scriptSt
ate()->isolate(), "hello")); |
| 604 | 586 |
| 605 { | 587 { |
| 606 InSequence s; | 588 InSequence s; |
| 607 EXPECT_CALL(*m_underlyingSource, pullSource()).Times(1); | |
| 608 EXPECT_CALL(*m_underlyingSource, cancelSource(scriptState(), reason)).Wi
llOnce(Return(promise)); | 589 EXPECT_CALL(*m_underlyingSource, cancelSource(scriptState(), reason)).Wi
llOnce(Return(promise)); |
| 609 } | 590 } |
| 610 | 591 |
| 611 EXPECT_EQ(ReadableStream::Waiting, stream->state()); | 592 EXPECT_EQ(ReadableStream::Waiting, stream->state()); |
| 612 ScriptPromise wait = stream->wait(scriptState()); | 593 ScriptPromise wait = stream->wait(scriptState()); |
| 613 EXPECT_EQ(promise, stream->cancel(scriptState(), reason)); | 594 EXPECT_NE(promise, stream->cancel(scriptState(), reason)); |
| 614 EXPECT_EQ(ReadableStream::Closed, stream->state()); | 595 EXPECT_EQ(ReadableStream::Closed, stream->state()); |
| 615 EXPECT_EQ(stream->wait(scriptState()), wait); | 596 EXPECT_EQ(stream->wait(scriptState()), wait); |
| 616 | 597 |
| 617 wait.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); | 598 wait.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); |
| 618 EXPECT_TRUE(onFulfilled.isNull()); | 599 EXPECT_TRUE(onFulfilled.isNull()); |
| 619 EXPECT_TRUE(onRejected.isNull()); | 600 EXPECT_TRUE(onRejected.isNull()); |
| 620 | 601 |
| 621 isolate()->RunMicrotasks(); | 602 isolate()->RunMicrotasks(); |
| 622 EXPECT_EQ("undefined", onFulfilled); | 603 EXPECT_EQ("undefined", onFulfilled); |
| 623 EXPECT_TRUE(onRejected.isNull()); | 604 EXPECT_TRUE(onRejected.isNull()); |
| 624 } | 605 } |
| 625 | 606 |
| 626 TEST_F(ReadableStreamTest, CancelWhenReadable) | 607 TEST_F(ReadableStreamTest, CancelWhenReadable) |
| 627 { | 608 { |
| 628 StringStream* stream = construct(); | 609 StringStream* stream = construct(); |
| 629 String onFulfilled, onRejected; | 610 String onFulfilled, onRejected; |
| 611 String onCancelFulfilled, onCancelRejected; |
| 630 ScriptValue reason(scriptState(), v8String(scriptState()->isolate(), "reason
")); | 612 ScriptValue reason(scriptState(), v8String(scriptState()->isolate(), "reason
")); |
| 631 ScriptPromise promise = ScriptPromise::cast(scriptState(), v8String(scriptSt
ate()->isolate(), "hello")); | 613 ScriptPromise promise = ScriptPromise::cast(scriptState(), v8String(scriptSt
ate()->isolate(), "hello")); |
| 632 | 614 |
| 633 { | 615 { |
| 634 InSequence s; | 616 InSequence s; |
| 635 EXPECT_CALL(*m_underlyingSource, cancelSource(scriptState(), reason)).Wi
llOnce(Return(promise)); | 617 EXPECT_CALL(*m_underlyingSource, cancelSource(scriptState(), reason)).Wi
llOnce(Return(promise)); |
| 636 } | 618 } |
| 637 | 619 |
| 638 stream->enqueue("hello"); | 620 stream->enqueue("hello"); |
| 639 ScriptPromise wait = stream->wait(scriptState()); | 621 ScriptPromise wait = stream->wait(scriptState()); |
| 640 EXPECT_EQ(ReadableStream::Readable, stream->state()); | 622 EXPECT_EQ(ReadableStream::Readable, stream->state()); |
| 641 EXPECT_EQ(promise, stream->cancel(scriptState(), reason)); | 623 |
| 624 ScriptPromise cancelResult = stream->cancel(scriptState(), reason); |
| 625 cancelResult.then(createCaptor(&onCancelFulfilled), createCaptor(&onCancelRe
jected)); |
| 626 |
| 627 EXPECT_NE(promise, cancelResult); |
| 642 EXPECT_EQ(ReadableStream::Closed, stream->state()); | 628 EXPECT_EQ(ReadableStream::Closed, stream->state()); |
| 643 | 629 |
| 644 EXPECT_NE(stream->wait(scriptState()), wait); | 630 EXPECT_EQ(stream->wait(scriptState()), wait); |
| 645 | 631 |
| 646 stream->wait(scriptState()).then(createCaptor(&onFulfilled), createCaptor(&o
nRejected)); | 632 EXPECT_TRUE(onCancelFulfilled.isNull()); |
| 647 EXPECT_TRUE(onFulfilled.isNull()); | 633 EXPECT_TRUE(onCancelRejected.isNull()); |
| 648 EXPECT_TRUE(onRejected.isNull()); | |
| 649 | 634 |
| 650 isolate()->RunMicrotasks(); | 635 isolate()->RunMicrotasks(); |
| 651 EXPECT_EQ("undefined", onFulfilled); | 636 EXPECT_EQ("undefined", onCancelFulfilled); |
| 652 EXPECT_TRUE(onRejected.isNull()); | 637 EXPECT_TRUE(onCancelRejected.isNull()); |
| 653 } | 638 } |
| 654 | 639 |
| 655 TEST_F(ReadableStreamTest, ReadableArrayBufferCompileTest) | 640 TEST_F(ReadableStreamTest, ReadableArrayBufferCompileTest) |
| 656 { | 641 { |
| 657 // This test tests if ReadableStreamImpl<DOMArrayBuffer> can be instantiated
. | 642 // This test tests if ReadableStreamImpl<DOMArrayBuffer> can be instantiated
. |
| 658 new ReadableStreamImpl<ReadableStreamChunkTypeTraits<DOMArrayBuffer> >(scrip
tState()->executionContext(), m_underlyingSource); | 643 new ReadableStreamImpl<ReadableStreamChunkTypeTraits<DOMArrayBuffer> >(scrip
tState()->executionContext(), m_underlyingSource); |
| 659 } | 644 } |
| 660 | 645 |
| 661 } // namespace blink | 646 } // namespace blink |
| OLD | NEW |