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

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

Issue 2287323002: Implement BlobBytesConsumer (Closed)
Patch Set: fix Created 4 years, 3 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 2016 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/BlobBytesConsumer.h"
6
7 #include "core/dom/Document.h"
8 #include "core/loader/ThreadableLoader.h"
9 #include "core/testing/DummyPageHolder.h"
10 #include "modules/fetch/BytesConsumerTestUtil.h"
11 #include "modules/fetch/DataConsumerHandleTestUtil.h"
12 #include "platform/blob/BlobData.h"
13 #include "platform/network/EncodedFormData.h"
14 #include "platform/network/ResourceError.h"
15 #include "platform/network/ResourceResponse.h"
16 #include "platform/testing/UnitTestHelpers.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18 #include "wtf/Vector.h"
19 #include "wtf/text/WTFString.h"
20
21 namespace blink {
22
23 namespace {
24
25 using Command = DataConsumerHandleTestUtil::Command;
26 using PublicState = BytesConsumer::PublicState;
27 using ReplayingHandle = DataConsumerHandleTestUtil::ReplayingHandle;
28 using Result = BytesConsumer::Result;
29
30 String toString(const Vector<char>& v)
31 {
32 return String(v.data(), v.size());
33 }
34
35 class TestThreadableLoader : public ThreadableLoader {
36 public:
37 ~TestThreadableLoader() override
38 {
39 EXPECT_FALSE(m_shouldBeCancelled && !m_isCancelled) << "The loader shoul d be cancelled but is not cancelled.";
40 }
41
42 void start(const ResourceRequest& request) override
43 {
44 m_isStarted = true;
45 }
46
47 void overrideTimeout(unsigned long timeoutMilliseconds) override
48 {
49 ADD_FAILURE() << "overrideTimeout should not be called.";
50 }
51
52 void cancel() override
53 {
54 m_isCancelled = true;
55 }
56
57 bool isStarted() const { return m_isStarted; }
58 bool isCancelled() const { return m_isCancelled; }
59 void setShouldBeCancelled() { m_shouldBeCancelled = true; }
60
61 private:
62 bool m_isStarted = false;
63 bool m_isCancelled = false;
64 bool m_shouldBeCancelled = false;
65 };
66
67 class SyncLoadingTestThreadableLoader : public ThreadableLoader {
68 public:
69 ~SyncLoadingTestThreadableLoader() override
70 {
71 DCHECK(!m_handle);
72 }
73
74 void start(const ResourceRequest& request) override
75 {
76 m_isStarted = true;
77 m_client->didReceiveResponse(0, ResourceResponse(), std::move(m_handle)) ;
78 m_client->didFinishLoading(0, 0);
79 }
80
81 void overrideTimeout(unsigned long timeoutMilliseconds) override
82 {
83 ADD_FAILURE() << "overrideTimeout should not be called.";
84 }
85
86 void cancel() override
87 {
88 m_isCancelled = true;
89 }
90
91 bool isStarted() const { return m_isStarted; }
92 bool isCancelled() const { return m_isCancelled; }
93
94 void setClient(ThreadableLoaderClient* client)
95 {
96 m_client = client;
97 }
98
99 void setHandle(std::unique_ptr<WebDataConsumerHandle> handle)
100 {
101 m_handle = std::move(handle);
102 }
103
104 private:
105 bool m_isStarted = false;
106 bool m_isCancelled = false;
107 ThreadableLoaderClient* m_client = nullptr;
108 std::unique_ptr<WebDataConsumerHandle> m_handle;
109 };
110
111 class SyncErrorTestThreadableLoader : public ThreadableLoader {
112 public:
113 ~SyncErrorTestThreadableLoader() override {}
114
115 void start(const ResourceRequest& request) override
116 {
117 m_isStarted = true;
118 m_client->didFail(ResourceError());
119 }
120
121 void overrideTimeout(unsigned long timeoutMilliseconds) override
122 {
123 ADD_FAILURE() << "overrideTimeout should not be called.";
124 }
125
126 void cancel() override
127 {
128 m_isCancelled = true;
129 }
130
131 bool isStarted() const { return m_isStarted; }
132 bool isCancelled() const { return m_isCancelled; }
133
134 void setClient(ThreadableLoaderClient* client)
135 {
136 m_client = client;
137 }
138
139 private:
140 bool m_isStarted = false;
141 bool m_isCancelled = false;
142 ThreadableLoaderClient* m_client = nullptr;
143 };
144
145 class TestClient final : public GarbageCollectedFinalized<TestClient>, public By tesConsumer::Client {
146 USING_GARBAGE_COLLECTED_MIXIN(TestClient);
147 public:
148 void onStateChange() override { ++m_numOnStateChangeCalled; }
149 int numOnStateChangeCalled() const { return m_numOnStateChangeCalled; }
150
151 private:
152 int m_numOnStateChangeCalled = 0;
153 };
154
155 class BlobBytesConsumerTest : public ::testing::Test {
156 public:
157 BlobBytesConsumerTest()
158 : m_dummyPageHolder(DummyPageHolder::create(IntSize(1, 1))) {}
159
160 Document& document() { return m_dummyPageHolder->document(); }
161
162 private:
163 std::unique_ptr<DummyPageHolder> m_dummyPageHolder;
164 };
165
166 TEST_F(BlobBytesConsumerTest, Read)
167 {
168 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(BlobData::cre ate(), 12345);
169 TestThreadableLoader* loader = new TestThreadableLoader();
170 BlobBytesConsumer* consumer = BlobBytesConsumer::createForTesting(&document( ), blobDataHandle, loader);
171 std::unique_ptr<ReplayingHandle> src = ReplayingHandle::create();
172 src->add(Command(Command::Data, "hello, "));
173 src->add(Command(Command::Wait));
174 src->add(Command(Command::Data, "world"));
175 src->add(Command(Command::Done));
176
177 EXPECT_EQ(PublicState::ReadableOrWaiting, consumer->getPublicState());
178 EXPECT_FALSE(loader->isStarted());
179
180 char buffer[3];
181 size_t read = 0;
182 EXPECT_EQ(Result::ShouldWait, consumer->read(buffer, sizeof(buffer), &read)) ;
183 EXPECT_TRUE(loader->isStarted());
184 EXPECT_FALSE(consumer->drainAsBlobDataHandle(BytesConsumer::BlobSizePolicy:: AllowBlobWithInvalidSize));
185 EXPECT_FALSE(consumer->drainAsFormData());
186 EXPECT_EQ(PublicState::ReadableOrWaiting, consumer->getPublicState());
187
188 consumer->didReceiveResponse(0, ResourceResponse(), std::move(src));
189 consumer->didFinishLoading(0, 0);
190
191 auto result = (new BytesConsumerTestUtil::Reader(consumer))->run();
192 EXPECT_EQ(Result::Done, result.first);
193 EXPECT_EQ("hello, world", toString(result.second));
194 }
195
196 TEST_F(BlobBytesConsumerTest, TwoPhaseRead)
197 {
198 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(BlobData::cre ate(), 12345);
199 TestThreadableLoader* loader = new TestThreadableLoader();
200 BlobBytesConsumer* consumer = BlobBytesConsumer::createForTesting(&document( ), blobDataHandle, loader);
201 std::unique_ptr<ReplayingHandle> src = ReplayingHandle::create();
202 src->add(Command(Command::Data, "hello, "));
203 src->add(Command(Command::Wait));
204 src->add(Command(Command::Data, "world"));
205 src->add(Command(Command::Done));
206
207 EXPECT_EQ(PublicState::ReadableOrWaiting, consumer->getPublicState());
208 EXPECT_FALSE(loader->isStarted());
209
210 char buffer[3];
211 size_t read = 0;
212 EXPECT_EQ(Result::ShouldWait, consumer->read(buffer, sizeof(buffer), &read)) ;
213 EXPECT_TRUE(loader->isStarted());
214 EXPECT_FALSE(consumer->drainAsBlobDataHandle(BytesConsumer::BlobSizePolicy:: AllowBlobWithInvalidSize));
215 EXPECT_FALSE(consumer->drainAsFormData());
216 EXPECT_EQ(PublicState::ReadableOrWaiting, consumer->getPublicState());
217
218 consumer->didReceiveResponse(0, ResourceResponse(), std::move(src));
219 consumer->didFinishLoading(0, 0);
220
221 auto result = (new BytesConsumerTestUtil::TwoPhaseReader(consumer))->run();
222 EXPECT_EQ(Result::Done, result.first);
223 EXPECT_EQ("hello, world", toString(result.second));
224 }
225
226 TEST_F(BlobBytesConsumerTest, FailLoading)
227 {
228 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(BlobData::cre ate(), 12345);
229 TestThreadableLoader* loader = new TestThreadableLoader();
230 BlobBytesConsumer* consumer = BlobBytesConsumer::createForTesting(&document( ), blobDataHandle, loader);
231 TestClient* client = new TestClient();
232 consumer->setClient(client);
233
234 char buffer[3];
235 size_t read = 0;
236 EXPECT_EQ(Result::ShouldWait, consumer->read(buffer, sizeof(buffer), &read)) ;
237 EXPECT_TRUE(loader->isStarted());
238 EXPECT_EQ(PublicState::ReadableOrWaiting, consumer->getPublicState());
239
240 int numOnStateChangeCalled = client->numOnStateChangeCalled();
241 consumer->didFail(ResourceError());
242
243 EXPECT_EQ(numOnStateChangeCalled + 1, client->numOnStateChangeCalled());
244 EXPECT_EQ(PublicState::Errored, consumer->getPublicState());
245 EXPECT_EQ(Result::Error, consumer->read(buffer, sizeof(buffer), &read));
246 }
247
248 TEST_F(BlobBytesConsumerTest, FailLoadingAfterResponseReceived)
249 {
250 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(BlobData::cre ate(), 12345);
251 TestThreadableLoader* loader = new TestThreadableLoader();
252 BlobBytesConsumer* consumer = BlobBytesConsumer::createForTesting(&document( ), blobDataHandle, loader);
253 TestClient* client = new TestClient();
254 consumer->setClient(client);
255
256 char buffer[3];
257 size_t read = 0;
258 EXPECT_EQ(Result::ShouldWait, consumer->read(buffer, sizeof(buffer), &read)) ;
259 EXPECT_TRUE(loader->isStarted());
260 EXPECT_EQ(PublicState::ReadableOrWaiting, consumer->getPublicState());
261
262 int numOnStateChangeCalled = client->numOnStateChangeCalled();
263 consumer->didReceiveResponse(0, ResourceResponse(), createWaitingDataConsume rHandle());
264 EXPECT_EQ(numOnStateChangeCalled + 1, client->numOnStateChangeCalled());
265 EXPECT_EQ(Result::ShouldWait, consumer->read(buffer, sizeof(buffer), &read)) ;
266 EXPECT_EQ(PublicState::ReadableOrWaiting, consumer->getPublicState());
267
268 consumer->didFail(ResourceError());
269 EXPECT_EQ(numOnStateChangeCalled + 2, client->numOnStateChangeCalled());
270 EXPECT_EQ(PublicState::Errored, consumer->getPublicState());
271 EXPECT_EQ(Result::Error, consumer->read(buffer, sizeof(buffer), &read));
272 }
273
274 TEST_F(BlobBytesConsumerTest, FailAccessControlCheck)
275 {
276 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(BlobData::cre ate(), 12345);
277 TestThreadableLoader* loader = new TestThreadableLoader();
278 BlobBytesConsumer* consumer = BlobBytesConsumer::createForTesting(&document( ), blobDataHandle, loader);
279 TestClient* client = new TestClient();
280 consumer->setClient(client);
281
282 char buffer[3];
283 size_t read = 0;
284 EXPECT_EQ(Result::ShouldWait, consumer->read(buffer, sizeof(buffer), &read)) ;
285 EXPECT_TRUE(loader->isStarted());
286 EXPECT_EQ(PublicState::ReadableOrWaiting, consumer->getPublicState());
287
288 int numOnStateChangeCalled = client->numOnStateChangeCalled();
289 consumer->didFailAccessControlCheck(ResourceError());
290 EXPECT_EQ(numOnStateChangeCalled + 1, client->numOnStateChangeCalled());
291
292 EXPECT_EQ(PublicState::Errored, consumer->getPublicState());
293 EXPECT_EQ(Result::Error, consumer->read(buffer, sizeof(buffer), &read));
294 }
295
296 TEST_F(BlobBytesConsumerTest, CancelBeforeStarting)
297 {
298 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(BlobData::cre ate(), 12345);
299 TestThreadableLoader* loader = new TestThreadableLoader();
300 BlobBytesConsumer* consumer = BlobBytesConsumer::createForTesting(&document( ), blobDataHandle, loader);
301 TestClient* client = new TestClient();
302 consumer->setClient(client);
303
304 consumer->cancel();
305 // This should be FALSE in production, but TRUE here because we set the
306 // loader before starting loading in tests.
307 EXPECT_TRUE(loader->isCancelled());
308
309 char buffer[3];
310 size_t read = 0;
311 EXPECT_EQ(PublicState::Closed, consumer->getPublicState());
312 EXPECT_EQ(Result::Done, consumer->read(buffer, sizeof(buffer), &read));
313 EXPECT_FALSE(loader->isStarted());
314 EXPECT_EQ(0, client->numOnStateChangeCalled());
315 }
316
317 TEST_F(BlobBytesConsumerTest, CancelAfterStarting)
318 {
319 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(BlobData::cre ate(), 12345);
320 TestThreadableLoader* loader = new TestThreadableLoader();
321 BlobBytesConsumer* consumer = BlobBytesConsumer::createForTesting(&document( ), blobDataHandle, loader);
322 TestClient* client = new TestClient();
323 consumer->setClient(client);
324
325 char buffer[3];
326 size_t read = 0;
327 EXPECT_EQ(PublicState::ReadableOrWaiting, consumer->getPublicState());
328 EXPECT_EQ(Result::ShouldWait, consumer->read(buffer, sizeof(buffer), &read)) ;
329 EXPECT_TRUE(loader->isStarted());
330 EXPECT_EQ(0, client->numOnStateChangeCalled());
331
332 consumer->cancel();
333 EXPECT_TRUE(loader->isCancelled());
334 EXPECT_EQ(PublicState::Closed, consumer->getPublicState());
335 EXPECT_EQ(Result::Done, consumer->read(buffer, sizeof(buffer), &read));
336 EXPECT_EQ(0, client->numOnStateChangeCalled());
337 }
338
339 TEST_F(BlobBytesConsumerTest, ReadLastChunkBeforeDidFinishLoadingArrives)
340 {
341 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(BlobData::cre ate(), 12345);
342 TestThreadableLoader* loader = new TestThreadableLoader();
343 BlobBytesConsumer* consumer = BlobBytesConsumer::createForTesting(&document( ), blobDataHandle, loader);
344 TestClient* client = new TestClient();
345 consumer->setClient(client);
346 std::unique_ptr<ReplayingHandle> src = ReplayingHandle::create();
347 src->add(Command(Command::Data, "hello"));
348 src->add(Command(Command::Done));
349
350 EXPECT_EQ(PublicState::ReadableOrWaiting, consumer->getPublicState());
351 EXPECT_FALSE(loader->isStarted());
352
353 char buffer[128];
354 size_t read = 0;
355 EXPECT_EQ(PublicState::ReadableOrWaiting, consumer->getPublicState());
356 EXPECT_EQ(Result::ShouldWait, consumer->read(buffer, sizeof(buffer), &read)) ;
357 EXPECT_TRUE(loader->isStarted());
358 EXPECT_EQ(0, client->numOnStateChangeCalled());
359
360 consumer->didReceiveResponse(0, ResourceResponse(), std::move(src));
361 EXPECT_EQ(1, client->numOnStateChangeCalled());
362 testing::runPendingTasks();
363 EXPECT_EQ(2, client->numOnStateChangeCalled());
364
365 EXPECT_EQ(PublicState::ReadableOrWaiting, consumer->getPublicState());
366 EXPECT_EQ(Result::Ok, consumer->read(buffer, sizeof(buffer), &read));
367 ASSERT_EQ(5u, read);
368 EXPECT_EQ("hello", String(buffer, read));
369
370 EXPECT_EQ(PublicState::ReadableOrWaiting, consumer->getPublicState());
371 EXPECT_EQ(Result::ShouldWait, consumer->read(buffer, sizeof(buffer), &read)) ;
372 EXPECT_EQ(PublicState::ReadableOrWaiting, consumer->getPublicState());
373
374 consumer->didFinishLoading(0, 0);
375 EXPECT_EQ(3, client->numOnStateChangeCalled());
376 EXPECT_EQ(PublicState::Closed, consumer->getPublicState());
377 EXPECT_EQ(Result::Done, consumer->read(buffer, sizeof(buffer), &read));
378 }
379
380 TEST_F(BlobBytesConsumerTest, ReadLastChunkAfterDidFinishLoadingArrives)
381 {
382 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(BlobData::cre ate(), 12345);
383 TestThreadableLoader* loader = new TestThreadableLoader();
384 BlobBytesConsumer* consumer = BlobBytesConsumer::createForTesting(&document( ), blobDataHandle, loader);
385 TestClient* client = new TestClient();
386 consumer->setClient(client);
387 std::unique_ptr<ReplayingHandle> src = ReplayingHandle::create();
388 src->add(Command(Command::Data, "hello"));
389 src->add(Command(Command::Done));
390
391 EXPECT_EQ(PublicState::ReadableOrWaiting, consumer->getPublicState());
392 EXPECT_FALSE(loader->isStarted());
393
394 char buffer[128];
395 size_t read = 0;
396 EXPECT_EQ(PublicState::ReadableOrWaiting, consumer->getPublicState());
397 EXPECT_EQ(Result::ShouldWait, consumer->read(buffer, sizeof(buffer), &read)) ;
398 EXPECT_TRUE(loader->isStarted());
399 EXPECT_EQ(0, client->numOnStateChangeCalled());
400
401 consumer->didReceiveResponse(0, ResourceResponse(), std::move(src));
402 EXPECT_EQ(1, client->numOnStateChangeCalled());
403 testing::runPendingTasks();
404 EXPECT_EQ(2, client->numOnStateChangeCalled());
405
406 consumer->didFinishLoading(0, 0);
407 testing::runPendingTasks();
408 EXPECT_EQ(2, client->numOnStateChangeCalled());
409
410 EXPECT_EQ(PublicState::ReadableOrWaiting, consumer->getPublicState());
411 EXPECT_EQ(Result::Ok, consumer->read(buffer, sizeof(buffer), &read));
412 ASSERT_EQ(5u, read);
413 EXPECT_EQ("hello", String(buffer, read));
414
415 EXPECT_EQ(PublicState::ReadableOrWaiting, consumer->getPublicState());
416 EXPECT_EQ(Result::Done, consumer->read(buffer, sizeof(buffer), &read));
417 EXPECT_EQ(2, client->numOnStateChangeCalled());
418 }
419
420 TEST_F(BlobBytesConsumerTest, DrainAsBlobDataHandle)
421 {
422 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(BlobData::cre ate(), 12345);
423 TestThreadableLoader* loader = new TestThreadableLoader();
424 BlobBytesConsumer* consumer = BlobBytesConsumer::createForTesting(&document( ), blobDataHandle, loader);
425
426 EXPECT_EQ(PublicState::ReadableOrWaiting, consumer->getPublicState());
427 EXPECT_FALSE(loader->isStarted());
428
429 RefPtr<BlobDataHandle> result = consumer->drainAsBlobDataHandle(BytesConsume r::BlobSizePolicy::DisallowBlobWithInvalidSize);
430 ASSERT_TRUE(result);
431 EXPECT_FALSE(consumer->drainAsBlobDataHandle(BytesConsumer::BlobSizePolicy:: DisallowBlobWithInvalidSize));
432 EXPECT_EQ(12345u, result->size());
433 }
434
435
436 TEST_F(BlobBytesConsumerTest, DrainAsBlobDataHandle_2)
437 {
438 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(BlobData::cre ate(), -1);
439 TestThreadableLoader* loader = new TestThreadableLoader();
440 BlobBytesConsumer* consumer = BlobBytesConsumer::createForTesting(&document( ), blobDataHandle, loader);
441
442 EXPECT_EQ(PublicState::ReadableOrWaiting, consumer->getPublicState());
443 EXPECT_FALSE(loader->isStarted());
444
445 RefPtr<BlobDataHandle> result = consumer->drainAsBlobDataHandle(BytesConsume r::BlobSizePolicy::AllowBlobWithInvalidSize);
446 ASSERT_TRUE(result);
447 EXPECT_FALSE(consumer->drainAsBlobDataHandle(BytesConsumer::BlobSizePolicy:: AllowBlobWithInvalidSize));
448 EXPECT_EQ(UINT64_MAX, result->size());
449 }
450
451 TEST_F(BlobBytesConsumerTest, DrainAsBlobDataHandle_3)
452 {
453 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(BlobData::cre ate(), -1);
454 TestThreadableLoader* loader = new TestThreadableLoader();
455 BlobBytesConsumer* consumer = BlobBytesConsumer::createForTesting(&document( ), blobDataHandle, loader);
456
457 EXPECT_EQ(PublicState::ReadableOrWaiting, consumer->getPublicState());
458 EXPECT_FALSE(loader->isStarted());
459
460 EXPECT_FALSE(consumer->drainAsBlobDataHandle(BytesConsumer::BlobSizePolicy:: DisallowBlobWithInvalidSize));
461 }
462
463 TEST_F(BlobBytesConsumerTest, DrainAsFormData)
464 {
465 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(BlobData::cre ate(), 12345);
466 TestThreadableLoader* loader = new TestThreadableLoader();
467 BlobBytesConsumer* consumer = BlobBytesConsumer::createForTesting(&document( ), blobDataHandle, loader);
468
469 EXPECT_EQ(PublicState::ReadableOrWaiting, consumer->getPublicState());
470 EXPECT_FALSE(loader->isStarted());
471
472 RefPtr<EncodedFormData> result = consumer->drainAsFormData();
473 ASSERT_TRUE(result);
474 ASSERT_EQ(1u, result->elements().size());
475 ASSERT_EQ(FormDataElement::encodedBlob, result->elements()[0].m_type);
476 ASSERT_TRUE(result->elements()[0].m_optionalBlobDataHandle);
477 EXPECT_EQ(12345u, result->elements()[0].m_optionalBlobDataHandle->size());
478 EXPECT_EQ(blobDataHandle->uuid(), result->elements()[0].m_blobUUID);
479 }
480
481 TEST_F(BlobBytesConsumerTest, LoaderShouldBeCancelled)
482 {
483 {
484 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(BlobData: :create(), 12345);
485 TestThreadableLoader* loader = new TestThreadableLoader();
486 BlobBytesConsumer* consumer = BlobBytesConsumer::createForTesting(&docum ent(), blobDataHandle, loader);
487
488 char buffer[3];
489 size_t read = 0;
490 EXPECT_EQ(Result::ShouldWait, consumer->read(buffer, sizeof(buffer), &re ad));
491 EXPECT_TRUE(loader->isStarted());
492 loader->setShouldBeCancelled();
493 }
494 ThreadState::current()->collectAllGarbage();
495 }
496
497 TEST_F(BlobBytesConsumerTest, SyncLoading)
498 {
499 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(BlobData::cre ate(), 12345);
500 SyncErrorTestThreadableLoader* loader = new SyncErrorTestThreadableLoader();
501 BlobBytesConsumer* consumer = BlobBytesConsumer::createForTesting(&document( ), blobDataHandle, loader);
502 loader->setClient(consumer);
503 TestClient* client = new TestClient();
504 consumer->setClient(client);
505
506 char buffer[3];
507 size_t read = 0;
508 EXPECT_EQ(Result::Error, consumer->read(buffer, sizeof(buffer), &read));
509 EXPECT_TRUE(loader->isStarted());
510
511 EXPECT_EQ(0, client->numOnStateChangeCalled());
512 EXPECT_EQ(BytesConsumer::PublicState::Errored, consumer->getPublicState());
513 }
514
515 TEST_F(BlobBytesConsumerTest, SyncErrorDispatch)
516 {
517 RefPtr<BlobDataHandle> blobDataHandle = BlobDataHandle::create(BlobData::cre ate(), 12345);
518 SyncLoadingTestThreadableLoader* loader = new SyncLoadingTestThreadableLoade r();
519 BlobBytesConsumer* consumer = BlobBytesConsumer::createForTesting(&document( ), blobDataHandle, loader);
520 std::unique_ptr<ReplayingHandle> src = ReplayingHandle::create();
521 src->add(Command(Command::Data, "hello, "));
522 src->add(Command(Command::Wait));
523 src->add(Command(Command::Data, "world"));
524 src->add(Command(Command::Done));
525 loader->setClient(consumer);
526 loader->setHandle(std::move(src));
527 TestClient* client = new TestClient();
528 consumer->setClient(client);
529
530 char buffer[3];
531 size_t read = 0;
532 EXPECT_EQ(Result::Ok, consumer->read(buffer, sizeof(buffer), &read));
533 EXPECT_TRUE(loader->isStarted());
534 ASSERT_EQ(3u, read);
535 EXPECT_EQ("hel", String(buffer, read));
536
537 EXPECT_EQ(0, client->numOnStateChangeCalled());
538 EXPECT_EQ(BytesConsumer::PublicState::ReadableOrWaiting, consumer->getPublic State());
539 }
540
541 } // namespace
542
543 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698