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