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

Side by Side Diff: third_party/WebKit/Source/modules/fetch/ReadableStreamDataConsumerHandleTest.cpp

Issue 2365853002: Implement ReadableStreamBytesConsumer (Closed)
Patch Set: git cl format Created 4 years, 2 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
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "modules/fetch/ReadableStreamDataConsumerHandle.h"
6
7 #include "bindings/core/v8/ScriptState.h"
8 #include "bindings/core/v8/V8BindingMacros.h"
9 #include "bindings/core/v8/V8GCController.h"
10 #include "core/dom/Document.h"
11 #include "core/streams/ReadableStreamOperations.h"
12 #include "core/testing/DummyPageHolder.h"
13 #include "modules/fetch/DataConsumerHandleTestUtil.h"
14 #include "platform/heap/Handle.h"
15 #include "platform/testing/UnitTestHelpers.h"
16 #include "public/platform/WebDataConsumerHandle.h"
17 #include "testing/gmock/include/gmock/gmock.h"
18 #include "testing/gtest/include/gtest/gtest.h"
19 #include <memory>
20 #include <v8.h>
21
22 // TODO(yhirano): Add cross-thread tests once the handle gets thread-safe.
23 namespace blink {
24
25 namespace {
26
27 using ::testing::InSequence;
28 using ::testing::StrictMock;
29 using Checkpoint = StrictMock<::testing::MockFunction<void(int)>>;
30 using Result = WebDataConsumerHandle::Result;
31 const Result kOk = WebDataConsumerHandle::Ok;
32 const Result kShouldWait = WebDataConsumerHandle::ShouldWait;
33 const Result kUnexpectedError = WebDataConsumerHandle::UnexpectedError;
34 const Result kDone = WebDataConsumerHandle::Done;
35 using Flags = WebDataConsumerHandle::Flags;
36 const Flags kNone = WebDataConsumerHandle::FlagNone;
37
38 class MockClient : public GarbageCollectedFinalized<MockClient>,
39 public WebDataConsumerHandle::Client {
40 public:
41 static StrictMock<MockClient>* create() {
42 return new StrictMock<MockClient>();
43 }
44 MOCK_METHOD0(didGetReadable, void());
45
46 DEFINE_INLINE_TRACE() {}
47
48 protected:
49 MockClient() = default;
50 };
51
52 class ReadableStreamDataConsumerHandleTest : public ::testing::Test {
53 public:
54 ReadableStreamDataConsumerHandleTest() : m_page(DummyPageHolder::create()) {}
55
56 ScriptState* getScriptState() {
57 return ScriptState::forMainWorld(m_page->document().frame());
58 }
59 v8::Isolate* isolate() { return getScriptState()->isolate(); }
60
61 v8::MaybeLocal<v8::Value> eval(const char* s) {
62 v8::Local<v8::String> source;
63 v8::Local<v8::Script> script;
64 v8::MicrotasksScope microtasks(isolate(),
65 v8::MicrotasksScope::kDoNotRunMicrotasks);
66 if (!v8Call(
67 v8::String::NewFromUtf8(isolate(), s, v8::NewStringType::kNormal),
68 source)) {
69 ADD_FAILURE();
70 return v8::MaybeLocal<v8::Value>();
71 }
72 if (!v8Call(v8::Script::Compile(getScriptState()->context(), source),
73 script)) {
74 ADD_FAILURE() << "Compilation fails";
75 return v8::MaybeLocal<v8::Value>();
76 }
77 return script->Run(getScriptState()->context());
78 }
79 v8::MaybeLocal<v8::Value> evalWithPrintingError(const char* s) {
80 v8::TryCatch block(isolate());
81 v8::MaybeLocal<v8::Value> r = eval(s);
82 if (block.HasCaught()) {
83 ADD_FAILURE()
84 << toCoreString(block.Exception()->ToString(isolate())).utf8().data();
85 block.ReThrow();
86 }
87 return r;
88 }
89
90 std::unique_ptr<ReadableStreamDataConsumerHandle> createHandle(
91 ScriptValue stream) {
92 NonThrowableExceptionState es;
93 ScriptValue reader =
94 ReadableStreamOperations::getReader(getScriptState(), stream, es);
95 ASSERT(!reader.isEmpty());
96 ASSERT(reader.v8Value()->IsObject());
97 return ReadableStreamDataConsumerHandle::create(getScriptState(), reader);
98 }
99
100 void gc() { V8GCController::collectAllGarbageForTesting(isolate()); }
101
102 private:
103 std::unique_ptr<DummyPageHolder> m_page;
104 };
105
106 TEST_F(ReadableStreamDataConsumerHandleTest, Create) {
107 ScriptState::Scope scope(getScriptState());
108 ScriptValue stream(getScriptState(),
109 evalWithPrintingError("new ReadableStream"));
110 ASSERT_FALSE(stream.isEmpty());
111 std::unique_ptr<ReadableStreamDataConsumerHandle> handle =
112 createHandle(stream);
113 ASSERT_TRUE(handle);
114 Persistent<MockClient> client = MockClient::create();
115 Checkpoint checkpoint;
116
117 InSequence s;
118 EXPECT_CALL(checkpoint, Call(1));
119 EXPECT_CALL(*client, didGetReadable());
120 EXPECT_CALL(checkpoint, Call(2));
121
122 std::unique_ptr<FetchDataConsumerHandle::Reader> reader =
123 handle->obtainFetchDataReader(client);
124 ASSERT_TRUE(reader);
125 checkpoint.Call(1);
126 testing::runPendingTasks();
127 checkpoint.Call(2);
128 }
129
130 TEST_F(ReadableStreamDataConsumerHandleTest, EmptyStream) {
131 ScriptState::Scope scope(getScriptState());
132 ScriptValue stream(
133 getScriptState(),
134 evalWithPrintingError("new ReadableStream({start: c => c.close()})"));
135 ASSERT_FALSE(stream.isEmpty());
136 std::unique_ptr<ReadableStreamDataConsumerHandle> handle =
137 createHandle(stream);
138 ASSERT_TRUE(handle);
139 Persistent<MockClient> client = MockClient::create();
140 Checkpoint checkpoint;
141
142 InSequence s;
143 EXPECT_CALL(checkpoint, Call(1));
144 EXPECT_CALL(*client, didGetReadable());
145 EXPECT_CALL(checkpoint, Call(2));
146 EXPECT_CALL(*client, didGetReadable());
147 EXPECT_CALL(checkpoint, Call(3));
148
149 char c;
150 size_t readBytes;
151 std::unique_ptr<FetchDataConsumerHandle::Reader> reader =
152 handle->obtainFetchDataReader(client);
153 ASSERT_TRUE(reader);
154 checkpoint.Call(1);
155 testing::runPendingTasks();
156 checkpoint.Call(2);
157 EXPECT_EQ(kShouldWait, reader->read(&c, 1, kNone, &readBytes));
158 testing::runPendingTasks();
159 checkpoint.Call(3);
160 EXPECT_EQ(kDone, reader->read(&c, 1, kNone, &readBytes));
161 }
162
163 TEST_F(ReadableStreamDataConsumerHandleTest, ErroredStream) {
164 ScriptState::Scope scope(getScriptState());
165 ScriptValue stream(
166 getScriptState(),
167 evalWithPrintingError("new ReadableStream({start: c => c.error()})"));
168 ASSERT_FALSE(stream.isEmpty());
169 std::unique_ptr<ReadableStreamDataConsumerHandle> handle =
170 createHandle(stream);
171 ASSERT_TRUE(handle);
172 Persistent<MockClient> client = MockClient::create();
173 Checkpoint checkpoint;
174
175 InSequence s;
176 EXPECT_CALL(checkpoint, Call(1));
177 EXPECT_CALL(*client, didGetReadable());
178 EXPECT_CALL(checkpoint, Call(2));
179 EXPECT_CALL(*client, didGetReadable());
180 EXPECT_CALL(checkpoint, Call(3));
181
182 char c;
183 size_t readBytes;
184 std::unique_ptr<FetchDataConsumerHandle::Reader> reader =
185 handle->obtainFetchDataReader(client);
186 ASSERT_TRUE(reader);
187 checkpoint.Call(1);
188 testing::runPendingTasks();
189 checkpoint.Call(2);
190 EXPECT_EQ(kShouldWait, reader->read(&c, 1, kNone, &readBytes));
191 testing::runPendingTasks();
192 checkpoint.Call(3);
193 EXPECT_EQ(kUnexpectedError, reader->read(&c, 1, kNone, &readBytes));
194 }
195
196 TEST_F(ReadableStreamDataConsumerHandleTest, Read) {
197 ScriptState::Scope scope(getScriptState());
198 ScriptValue stream(
199 getScriptState(),
200 evalWithPrintingError(
201 "var controller;"
202 "var stream = new ReadableStream({start: c => controller = c});"
203 "controller.enqueue(new Uint8Array());"
204 "controller.enqueue(new Uint8Array([0x43, 0x44, 0x45, 0x46]));"
205 "controller.enqueue(new Uint8Array([0x47, 0x48, 0x49, 0x4a]));"
206 "controller.close();"
207 "stream"));
208 ASSERT_FALSE(stream.isEmpty());
209 std::unique_ptr<ReadableStreamDataConsumerHandle> handle =
210 createHandle(stream);
211 ASSERT_TRUE(handle);
212 Persistent<MockClient> client = MockClient::create();
213 Checkpoint checkpoint;
214
215 InSequence s;
216 EXPECT_CALL(checkpoint, Call(1));
217 EXPECT_CALL(*client, didGetReadable());
218 EXPECT_CALL(checkpoint, Call(2));
219 EXPECT_CALL(*client, didGetReadable());
220 EXPECT_CALL(checkpoint, Call(3));
221 EXPECT_CALL(*client, didGetReadable());
222 EXPECT_CALL(checkpoint, Call(4));
223 EXPECT_CALL(*client, didGetReadable());
224 EXPECT_CALL(checkpoint, Call(5));
225 EXPECT_CALL(*client, didGetReadable());
226 EXPECT_CALL(checkpoint, Call(6));
227
228 char buffer[3];
229 size_t readBytes;
230 std::unique_ptr<FetchDataConsumerHandle::Reader> reader =
231 handle->obtainFetchDataReader(client);
232 ASSERT_TRUE(reader);
233 checkpoint.Call(1);
234 testing::runPendingTasks();
235 checkpoint.Call(2);
236 EXPECT_EQ(kShouldWait, reader->read(buffer, 3, kNone, &readBytes));
237 testing::runPendingTasks();
238 checkpoint.Call(3);
239 EXPECT_EQ(kShouldWait, reader->read(buffer, 3, kNone, &readBytes));
240 testing::runPendingTasks();
241 checkpoint.Call(4);
242 EXPECT_EQ(kOk, reader->read(buffer, 3, kNone, &readBytes));
243 EXPECT_EQ(3u, readBytes);
244 EXPECT_EQ(0x43, buffer[0]);
245 EXPECT_EQ(0x44, buffer[1]);
246 EXPECT_EQ(0x45, buffer[2]);
247 EXPECT_EQ(kOk, reader->read(buffer, 3, kNone, &readBytes));
248 EXPECT_EQ(1u, readBytes);
249 EXPECT_EQ(0x46, buffer[0]);
250 EXPECT_EQ(kShouldWait, reader->read(buffer, 3, kNone, &readBytes));
251 testing::runPendingTasks();
252 checkpoint.Call(5);
253 EXPECT_EQ(kOk, reader->read(buffer, 3, kNone, &readBytes));
254 EXPECT_EQ(3u, readBytes);
255 EXPECT_EQ(0x47, buffer[0]);
256 EXPECT_EQ(0x48, buffer[1]);
257 EXPECT_EQ(0x49, buffer[2]);
258 EXPECT_EQ(kOk, reader->read(buffer, 3, kNone, &readBytes));
259 EXPECT_EQ(1u, readBytes);
260 EXPECT_EQ(0x4a, buffer[0]);
261 EXPECT_EQ(kShouldWait, reader->read(buffer, 3, kNone, &readBytes));
262 testing::runPendingTasks();
263 checkpoint.Call(6);
264 EXPECT_EQ(kDone, reader->read(buffer, 3, kNone, &readBytes));
265 }
266
267 TEST_F(ReadableStreamDataConsumerHandleTest, TwoPhaseRead) {
268 ScriptState::Scope scope(getScriptState());
269 ScriptValue stream(
270 getScriptState(),
271 evalWithPrintingError(
272 "var controller;"
273 "var stream = new ReadableStream({start: c => controller = c});"
274 "controller.enqueue(new Uint8Array());"
275 "controller.enqueue(new Uint8Array([0x43, 0x44, 0x45, 0x46]));"
276 "controller.enqueue(new Uint8Array([0x47, 0x48, 0x49, 0x4a]));"
277 "controller.close();"
278 "stream"));
279 ASSERT_FALSE(stream.isEmpty());
280 std::unique_ptr<ReadableStreamDataConsumerHandle> handle =
281 createHandle(stream);
282 ASSERT_TRUE(handle);
283 Persistent<MockClient> client = MockClient::create();
284 Checkpoint checkpoint;
285
286 InSequence s;
287 EXPECT_CALL(checkpoint, Call(1));
288 EXPECT_CALL(*client, didGetReadable());
289 EXPECT_CALL(checkpoint, Call(2));
290 EXPECT_CALL(*client, didGetReadable());
291 EXPECT_CALL(checkpoint, Call(3));
292 EXPECT_CALL(*client, didGetReadable());
293 EXPECT_CALL(checkpoint, Call(4));
294 EXPECT_CALL(*client, didGetReadable());
295 EXPECT_CALL(checkpoint, Call(5));
296 EXPECT_CALL(*client, didGetReadable());
297 EXPECT_CALL(checkpoint, Call(6));
298
299 const void* buffer;
300 size_t available;
301 std::unique_ptr<FetchDataConsumerHandle::Reader> reader =
302 handle->obtainFetchDataReader(client);
303 ASSERT_TRUE(reader);
304 checkpoint.Call(1);
305 testing::runPendingTasks();
306 checkpoint.Call(2);
307 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available));
308 testing::runPendingTasks();
309 checkpoint.Call(3);
310 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available));
311 testing::runPendingTasks();
312 checkpoint.Call(4);
313 EXPECT_EQ(kOk, reader->beginRead(&buffer, kNone, &available));
314 EXPECT_EQ(4u, available);
315 EXPECT_EQ(0x43, static_cast<const char*>(buffer)[0]);
316 EXPECT_EQ(0x44, static_cast<const char*>(buffer)[1]);
317 EXPECT_EQ(0x45, static_cast<const char*>(buffer)[2]);
318 EXPECT_EQ(0x46, static_cast<const char*>(buffer)[3]);
319 EXPECT_EQ(kOk, reader->endRead(0));
320 EXPECT_EQ(kOk, reader->beginRead(&buffer, kNone, &available));
321 EXPECT_EQ(4u, available);
322 EXPECT_EQ(0x43, static_cast<const char*>(buffer)[0]);
323 EXPECT_EQ(0x44, static_cast<const char*>(buffer)[1]);
324 EXPECT_EQ(0x45, static_cast<const char*>(buffer)[2]);
325 EXPECT_EQ(0x46, static_cast<const char*>(buffer)[3]);
326 EXPECT_EQ(kOk, reader->endRead(1));
327 EXPECT_EQ(kOk, reader->beginRead(&buffer, kNone, &available));
328 EXPECT_EQ(3u, available);
329 EXPECT_EQ(0x44, static_cast<const char*>(buffer)[0]);
330 EXPECT_EQ(0x45, static_cast<const char*>(buffer)[1]);
331 EXPECT_EQ(0x46, static_cast<const char*>(buffer)[2]);
332 EXPECT_EQ(kOk, reader->endRead(3));
333 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available));
334 testing::runPendingTasks();
335 checkpoint.Call(5);
336 EXPECT_EQ(kOk, reader->beginRead(&buffer, kNone, &available));
337 EXPECT_EQ(4u, available);
338 EXPECT_EQ(0x47, static_cast<const char*>(buffer)[0]);
339 EXPECT_EQ(0x48, static_cast<const char*>(buffer)[1]);
340 EXPECT_EQ(0x49, static_cast<const char*>(buffer)[2]);
341 EXPECT_EQ(0x4a, static_cast<const char*>(buffer)[3]);
342 EXPECT_EQ(kOk, reader->endRead(4));
343 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available));
344 testing::runPendingTasks();
345 checkpoint.Call(6);
346 EXPECT_EQ(kDone, reader->beginRead(&buffer, kNone, &available));
347 }
348
349 TEST_F(ReadableStreamDataConsumerHandleTest, EnqueueUndefined) {
350 ScriptState::Scope scope(getScriptState());
351 ScriptValue stream(
352 getScriptState(),
353 evalWithPrintingError(
354 "var controller;"
355 "var stream = new ReadableStream({start: c => controller = c});"
356 "controller.enqueue(undefined);"
357 "controller.close();"
358 "stream"));
359 ASSERT_FALSE(stream.isEmpty());
360 std::unique_ptr<ReadableStreamDataConsumerHandle> handle =
361 createHandle(stream);
362 ASSERT_TRUE(handle);
363 Persistent<MockClient> client = MockClient::create();
364 Checkpoint checkpoint;
365
366 InSequence s;
367 EXPECT_CALL(checkpoint, Call(1));
368 EXPECT_CALL(*client, didGetReadable());
369 EXPECT_CALL(checkpoint, Call(2));
370 EXPECT_CALL(*client, didGetReadable());
371 EXPECT_CALL(checkpoint, Call(3));
372
373 const void* buffer;
374 size_t available;
375 std::unique_ptr<FetchDataConsumerHandle::Reader> reader =
376 handle->obtainFetchDataReader(client);
377 ASSERT_TRUE(reader);
378 checkpoint.Call(1);
379 testing::runPendingTasks();
380 checkpoint.Call(2);
381 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available));
382 testing::runPendingTasks();
383 checkpoint.Call(3);
384 EXPECT_EQ(kUnexpectedError, reader->beginRead(&buffer, kNone, &available));
385 }
386
387 TEST_F(ReadableStreamDataConsumerHandleTest, EnqueueNull) {
388 ScriptState::Scope scope(getScriptState());
389 ScriptValue stream(
390 getScriptState(),
391 evalWithPrintingError(
392 "var controller;"
393 "var stream = new ReadableStream({start: c => controller = c});"
394 "controller.enqueue(null);"
395 "controller.close();"
396 "stream"));
397 ASSERT_FALSE(stream.isEmpty());
398 std::unique_ptr<ReadableStreamDataConsumerHandle> handle =
399 createHandle(stream);
400 ASSERT_TRUE(handle);
401 Persistent<MockClient> client = MockClient::create();
402 Checkpoint checkpoint;
403
404 InSequence s;
405 EXPECT_CALL(checkpoint, Call(1));
406 EXPECT_CALL(*client, didGetReadable());
407 EXPECT_CALL(checkpoint, Call(2));
408 EXPECT_CALL(*client, didGetReadable());
409 EXPECT_CALL(checkpoint, Call(3));
410
411 const void* buffer;
412 size_t available;
413 std::unique_ptr<FetchDataConsumerHandle::Reader> reader =
414 handle->obtainFetchDataReader(client);
415 ASSERT_TRUE(reader);
416 checkpoint.Call(1);
417 testing::runPendingTasks();
418 checkpoint.Call(2);
419 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available));
420 testing::runPendingTasks();
421 checkpoint.Call(3);
422 EXPECT_EQ(kUnexpectedError, reader->beginRead(&buffer, kNone, &available));
423 }
424
425 TEST_F(ReadableStreamDataConsumerHandleTest, EnqueueString) {
426 ScriptState::Scope scope(getScriptState());
427 ScriptValue stream(
428 getScriptState(),
429 evalWithPrintingError(
430 "var controller;"
431 "var stream = new ReadableStream({start: c => controller = c});"
432 "controller.enqueue('hello');"
433 "controller.close();"
434 "stream"));
435 ASSERT_FALSE(stream.isEmpty());
436 std::unique_ptr<ReadableStreamDataConsumerHandle> handle =
437 createHandle(stream);
438 ASSERT_TRUE(handle);
439 Persistent<MockClient> client = MockClient::create();
440 Checkpoint checkpoint;
441
442 InSequence s;
443 EXPECT_CALL(checkpoint, Call(1));
444 EXPECT_CALL(*client, didGetReadable());
445 EXPECT_CALL(checkpoint, Call(2));
446 EXPECT_CALL(*client, didGetReadable());
447 EXPECT_CALL(checkpoint, Call(3));
448
449 const void* buffer;
450 size_t available;
451 std::unique_ptr<FetchDataConsumerHandle::Reader> reader =
452 handle->obtainFetchDataReader(client);
453 ASSERT_TRUE(reader);
454 checkpoint.Call(1);
455 testing::runPendingTasks();
456 checkpoint.Call(2);
457 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available));
458 testing::runPendingTasks();
459 checkpoint.Call(3);
460 EXPECT_EQ(kUnexpectedError, reader->beginRead(&buffer, kNone, &available));
461 }
462
463 TEST_F(ReadableStreamDataConsumerHandleTest, StreamReaderShouldBeWeak) {
464 std::unique_ptr<FetchDataConsumerHandle::Reader> reader;
465 Checkpoint checkpoint;
466 Persistent<MockClient> client = MockClient::create();
467 ScriptValue stream;
468
469 InSequence s;
470 EXPECT_CALL(checkpoint, Call(1));
471 EXPECT_CALL(*client, didGetReadable());
472 EXPECT_CALL(checkpoint, Call(2));
473 EXPECT_CALL(checkpoint, Call(3));
474 EXPECT_CALL(*client, didGetReadable());
475 EXPECT_CALL(checkpoint, Call(4));
476
477 {
478 // We need this scope to collect local handles.
479 ScriptState::Scope scope(getScriptState());
480 stream = ScriptValue(getScriptState(),
481 evalWithPrintingError("new ReadableStream()"));
482 ASSERT_FALSE(stream.isEmpty());
483 std::unique_ptr<ReadableStreamDataConsumerHandle> handle =
484 createHandle(stream);
485 ASSERT_TRUE(handle);
486
487 reader = handle->obtainFetchDataReader(client);
488 ASSERT_TRUE(reader);
489 }
490
491 checkpoint.Call(1);
492 testing::runPendingTasks();
493 checkpoint.Call(2);
494 stream.clear();
495 gc();
496 checkpoint.Call(3);
497 testing::runPendingTasks();
498
499 checkpoint.Call(4);
500 const void* buffer;
501 size_t available;
502 EXPECT_EQ(kUnexpectedError, reader->beginRead(&buffer, kNone, &available));
503 }
504
505 TEST_F(ReadableStreamDataConsumerHandleTest,
506 StreamReaderShouldBeWeakWhenReading) {
507 std::unique_ptr<FetchDataConsumerHandle::Reader> reader;
508 Checkpoint checkpoint;
509 Persistent<MockClient> client = MockClient::create();
510 ScriptValue stream;
511
512 InSequence s;
513 EXPECT_CALL(checkpoint, Call(1));
514 EXPECT_CALL(*client, didGetReadable());
515 EXPECT_CALL(checkpoint, Call(2));
516 EXPECT_CALL(checkpoint, Call(3));
517 EXPECT_CALL(checkpoint, Call(4));
518 EXPECT_CALL(*client, didGetReadable());
519 EXPECT_CALL(checkpoint, Call(5));
520
521 {
522 // We need this scope to collect local handles.
523 ScriptState::Scope scope(getScriptState());
524 stream = ScriptValue(getScriptState(),
525 evalWithPrintingError("new ReadableStream()"));
526 ASSERT_FALSE(stream.isEmpty());
527 std::unique_ptr<ReadableStreamDataConsumerHandle> handle =
528 createHandle(stream);
529 ASSERT_TRUE(handle);
530
531 reader = handle->obtainFetchDataReader(client);
532 ASSERT_TRUE(reader);
533 }
534
535 const void* buffer;
536 size_t available;
537 checkpoint.Call(1);
538 testing::runPendingTasks();
539 checkpoint.Call(2);
540 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available));
541
542 testing::runPendingTasks();
543 checkpoint.Call(3);
544 stream.clear();
545 gc();
546 checkpoint.Call(4);
547 testing::runPendingTasks();
548
549 checkpoint.Call(5);
550 EXPECT_EQ(kUnexpectedError, reader->beginRead(&buffer, kNone, &available));
551 }
552
553 } // namespace
554
555 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698