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

Side by Side Diff: third_party/WebKit/Source/core/loader/ThreadableLoaderTest.cpp

Issue 1257343003: [LoaderTest] Add unit tests for Document/WorkerThreadableLoader (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase, Created 4 years, 9 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 "core/loader/ThreadableLoader.h"
6
7 #include "core/dom/CrossThreadTask.h"
8 #include "core/fetch/ResourceLoaderOptions.h"
9 #include "core/loader/DocumentThreadableLoader.h"
10 #include "core/loader/ThreadableLoaderClient.h"
tyoshino (SeeGerritForStatus) 2016/03/03 14:43:19 also include ThreadableLoader.h
hiroshige 2016/03/08 23:40:59 It is included in Line 5.
tyoshino (SeeGerritForStatus) 2016/03/09 06:26:12 ahh, sorry.
11 #include "core/loader/WorkerThreadableLoader.h"
12 #include "core/testing/DummyPageHolder.h"
13 #include "core/workers/WorkerThreadTestHelper.h"
14 #include "platform/ThreadSafeFunctional.h"
15 #include "platform/WaitableEvent.h"
16 #include "platform/network/ResourceError.h"
17 #include "platform/network/ResourceRequest.h"
18 #include "platform/network/ResourceResponse.h"
19 #include "platform/network/ResourceTimingInfo.h"
20 #include "platform/testing/URLTestHelpers.h"
21 #include "platform/testing/UnitTestHelpers.h"
22 #include "platform/weborigin/KURL.h"
23 #include "public/platform/Platform.h"
24 #include "public/platform/WebURLLoadTiming.h"
25 #include "public/platform/WebURLResponse.h"
26 #include "public/platform/WebUnitTestSupport.h"
27 #include "testing/gtest/include/gtest/gtest.h"
tyoshino (SeeGerritForStatus) 2016/03/03 14:43:19 Add PassOwnPtr.h WorkerLoaderProxy.h OwnPtr.h Ref
hiroshige 2016/03/08 23:40:59 Added:
tyoshino (SeeGerritForStatus) 2016/03/09 06:26:12 looks good
28
29 namespace blink {
30
31 namespace {
32
33 using ::testing::_;
34 using ::testing::AtMost;
35 using ::testing::InSequence;
36 using ::testing::InvokeWithoutArgs;
37 using ::testing::StrEq;
38 using ::testing::Truly;
39 using Checkpoint = ::testing::StrictMock<::testing::MockFunction<void(int)>>;
40
41 class MockThreadableLoaderClient : public ThreadableLoaderClient {
42 public:
43 static PassOwnPtr<MockThreadableLoaderClient> create()
44 {
45 return adoptPtr(new ::testing::StrictMock<MockThreadableLoaderClient>);
46 }
47 MOCK_METHOD2(didSendData, void(unsigned long long, unsigned long long));
48 MOCK_METHOD3(didReceiveResponse, void(unsigned long, const ResourceResponse& , PassOwnPtr<WebDataConsumerHandle>));
49 MOCK_METHOD2(didReceiveData, void(const char*, unsigned));
50 MOCK_METHOD2(didReceiveCachedMetadata, void(const char*, int));
51 MOCK_METHOD2(didFinishLoading, void(unsigned long, double));
52 MOCK_METHOD1(didFail, void(const ResourceError&));
53 MOCK_METHOD1(didFailAccessControlCheck, void(const ResourceError&));
54 MOCK_METHOD0(didFailRedirectCheck, void());
55 MOCK_METHOD1(didReceiveResourceTiming, void(const ResourceTimingInfo&));
56 MOCK_METHOD1(didDownloadData, void(int));
57
58 protected:
59 MockThreadableLoaderClient() = default;
60 };
61
62 bool isCancellation(const ResourceError& error)
63 {
64 return error.isCancellation();
65 }
66
67 bool isNotCancellation(const ResourceError& error)
68 {
69 return !error.isCancellation();
70 }
71
72 KURL successURL() { return KURL(KURL(), "http://example.com/success"); }
73 KURL errorURL() { return KURL(KURL(), "http://example.com/error"); }
74 KURL redirectURL() { return KURL(KURL(), "http://example.com/redirect"); }
75 KURL redirectLoopURL() { return KURL(KURL(), "http://example.com/loop"); }
76
77 enum ThreadableLoaderToTest {
78 DocumentThreadableLoaderTest,
79 WorkerThreadableLoaderTest
80 };
81
82 class ThreadableLoaderTestHelper {
83 public:
84 virtual ~ThreadableLoaderTestHelper() { }
85
86 virtual void createLoader(ThreadableLoaderClient*, CrossOriginRequestPolicy) = 0;
87 virtual void startLoader(const ResourceRequest&) = 0;
88 virtual void cancelLoader() = 0;
89 virtual void clearLoader() = 0;
90 virtual Checkpoint& checkpoint() = 0;
91 virtual void callCheckpoint(int) = 0;
92 virtual void onSetUp() = 0;
93 virtual void onServeRequests() = 0;
94 virtual void onTearDown() = 0;
95 };
96
97 class DocumentThreadableLoaderTestHelper : public ThreadableLoaderTestHelper {
98 public:
99 DocumentThreadableLoaderTestHelper()
100 : m_dummyPageHolder(DummyPageHolder::create(IntSize(1, 1)))
101 {
102 }
103
104 void createLoader(ThreadableLoaderClient* client, CrossOriginRequestPolicy c rossOriginRequestPolicy) override
105 {
106 ThreadableLoaderOptions options;
107 options.crossOriginRequestPolicy = crossOriginRequestPolicy;
108 ResourceLoaderOptions resourceLoaderOptions;
109 m_loader = DocumentThreadableLoader::create(document(), client, options, resourceLoaderOptions);
110 }
111
112 void startLoader(const ResourceRequest& request) override
113 {
114 m_loader->start(request);
115 }
116
117 void cancelLoader() override { m_loader->cancel(); }
118 void clearLoader() override { m_loader.clear(); }
119 Checkpoint& checkpoint() override { return m_checkpoint; }
120 void callCheckpoint(int n) override { m_checkpoint.Call(n); }
121
122 void onSetUp() override
123 {
124 }
125
126 void onServeRequests() override
127 {
128 }
129
130 void onTearDown() override
131 {
132 m_loader.clear();
133 }
134
135 private:
136 Document& document() { return m_dummyPageHolder->document(); }
137
138 OwnPtr<DummyPageHolder> m_dummyPageHolder;
139 Checkpoint m_checkpoint;
140 OwnPtr<DocumentThreadableLoader> m_loader;
141 };
142
143 class WorkerThreadableLoaderTestHelper : public ThreadableLoaderTestHelper, publ ic WorkerLoaderProxyProvider {
144 public:
145 WorkerThreadableLoaderTestHelper()
146 : m_dummyPageHolder(DummyPageHolder::create(IntSize(1, 1)))
147 {
148 }
149
150 void createLoader(ThreadableLoaderClient* client, CrossOriginRequestPolicy c rossOriginRequestPolicy) override
151 {
152 OwnPtr<WaitableEvent> completionEvent = adoptPtr(new WaitableEvent());
153 postTaskToWorkerGlobalScope(createCrossThreadTask(
154 &WorkerThreadableLoaderTestHelper::workerCreateLoader,
155 AllowCrossThreadAccess(this),
156 AllowCrossThreadAccess(client),
157 AllowCrossThreadAccess(completionEvent.get()),
158 crossOriginRequestPolicy));
159 completionEvent->wait();
160 }
161
162 void startLoader(const ResourceRequest& request) override
163 {
164 OwnPtr<WaitableEvent> completionEvent = adoptPtr(new WaitableEvent());
165 postTaskToWorkerGlobalScope(createCrossThreadTask(
166 &WorkerThreadableLoaderTestHelper::workerStartLoader,
167 AllowCrossThreadAccess(this),
168 AllowCrossThreadAccess(completionEvent.get()),
169 request));
170 completionEvent->wait();
171 }
172
173 // Must be called on the worker thread.
174 void cancelLoader() override
175 {
176 ASSERT(m_workerThread);
177 ASSERT(m_workerThread->isCurrentThread());
178 m_loader->cancel();
179 }
180
181 // Must be called on the worker thread.
182 void clearLoader() override
183 {
184 ASSERT(m_workerThread);
185 ASSERT(m_workerThread->isCurrentThread());
186 m_loader.clear();
187 }
188
189 Checkpoint& checkpoint() override
190 {
191 return m_checkpoint;
192 }
193
194 void callCheckpoint(int n) override
195 {
196 testing::runPendingTasks();
197
198 OwnPtr<WaitableEvent> completionEvent = adoptPtr(new WaitableEvent());
199 postTaskToWorkerGlobalScope(createCrossThreadTask(
200 &WorkerThreadableLoaderTestHelper::workerCallCheckpoint,
201 AllowCrossThreadAccess(this),
202 AllowCrossThreadAccess(completionEvent.get()),
203 n));
204 completionEvent->wait();
205 }
206
207 void onSetUp() override
208 {
209 m_mockWorkerReportingProxy = adoptPtr(new MockWorkerReportingProxy());
210 m_securityOrigin = document().securityOrigin();
211 m_workerThread = adoptRef(new WorkerThreadForTest(
212 this,
213 *m_mockWorkerReportingProxy));
214
215 expectWorkerLifetimeReportingCalls();
216 startWorkerThread();
217 waitForInitWorkerThread();
218 }
219
220 void onServeRequests() override
221 {
222 testing::runPendingTasks();
223 }
224
225 void onTearDown() override
226 {
227 postTaskToWorkerGlobalScope(createCrossThreadTask(&WorkerThreadableLoade rTestHelper::clearLoader, AllowCrossThreadAccess(this)));
228 m_workerThread->terminateAndWait();
229
230 // Needed to clean up the things on the main thread side and
231 // avoid Resource leaks.
232 testing::runPendingTasks();
233
234 m_workerThread->workerLoaderProxy()->detachProvider(this);
235 }
236
237 private:
238 Document& document() { return m_dummyPageHolder->document(); }
239
240 void expectWorkerLifetimeReportingCalls()
241 {
242 EXPECT_CALL(*m_mockWorkerReportingProxy, workerGlobalScopeStarted(_)).Ti mes(1);
243 EXPECT_CALL(*m_mockWorkerReportingProxy, didEvaluateWorkerScript(true)). Times(1);
244 EXPECT_CALL(*m_mockWorkerReportingProxy, workerThreadTerminated()).Times (1);
245 EXPECT_CALL(*m_mockWorkerReportingProxy, willDestroyWorkerGlobalScope()) .Times(1);
246 }
247
248 void startWorkerThread()
249 {
250 OwnPtr<Vector<CSPHeaderAndType>> headers = adoptPtr(new Vector<CSPHeader AndType>());
251 CSPHeaderAndType headerAndType("contentSecurityPolicy", ContentSecurityP olicyHeaderTypeReport);
252 headers->append(headerAndType);
253
254 OwnPtrWillBeRawPtr<WorkerClients> clients = nullptr;
255
256 m_workerThread->start(WorkerThreadStartupData::create(
257 KURL(ParsedURLString, "http://fake.url/"),
258 "fake user agent",
259 "//fake source code",
260 nullptr,
261 DontPauseWorkerGlobalScopeOnStart,
262 headers.release(),
263 m_securityOrigin.get(),
264 clients.release(),
265 V8CacheOptionsDefault));
266 }
267
268 void waitForInitWorkerThread()
269 {
270 OwnPtr<WaitableEvent> completionEvent = adoptPtr(new WaitableEvent());
271 m_workerThread->backingThread().postTask(BLINK_FROM_HERE, threadSafeBind (&WaitableEvent::signal, AllowCrossThreadAccess(completionEvent.get())));
272 completionEvent->wait();
273 }
274
275 void workerCreateLoader(ThreadableLoaderClient* client, WaitableEvent* event , CrossOriginRequestPolicy crossOriginRequestPolicy)
276 {
277 ASSERT(m_workerThread);
278 ASSERT(m_workerThread->isCurrentThread());
279
280 ThreadableLoaderOptions options;
281 options.crossOriginRequestPolicy = crossOriginRequestPolicy;
282 ResourceLoaderOptions resourceLoaderOptions;
283 ASSERT(m_workerThread->workerGlobalScope()->isWorkerGlobalScope());
tyoshino (SeeGerritForStatus) 2016/03/03 14:43:20 OK, but wonder what kind of mistake we want to cat
hiroshige 2016/03/08 23:40:59 I think I added this ASSERT() from https://code.go
tyoshino (SeeGerritForStatus) 2016/03/09 06:26:12 Ah, I see. I understood the motivation. But this w
hiroshige 2016/03/11 19:52:14 Done.
284 m_loader = ThreadableLoader::create(*m_workerThread->workerGlobalScope() , client, options, resourceLoaderOptions);
285 ASSERT(m_loader);
286 event->signal();
287 }
288
289 void workerStartLoader(WaitableEvent* event, PassOwnPtr<CrossThreadResourceR equestData> requestData)
290 {
291 ASSERT(m_workerThread);
292 ASSERT(m_workerThread->isCurrentThread());
293
294 ResourceRequest request(requestData.get());
295 m_loader->start(request);
296 event->signal();
297 }
298
299 void workerCallCheckpoint(WaitableEvent* event, int n)
300 {
301 ASSERT(m_workerThread);
302 ASSERT(m_workerThread->isCurrentThread());
303 m_checkpoint.Call(n);
304 event->signal();
305 }
306
307 // WorkerLoaderProxyProvider methods.
308 void postTaskToLoader(PassOwnPtr<ExecutionContextTask> task) override
309 {
310 ASSERT(m_workerThread);
311 ASSERT(m_workerThread->isCurrentThread());
312 document().postTask(BLINK_FROM_HERE, task);
313 }
314
315 bool postTaskToWorkerGlobalScope(PassOwnPtr<ExecutionContextTask> task) over ride
316 {
317 ASSERT(m_workerThread);
318 m_workerThread->postTask(BLINK_FROM_HERE, task);
319 return true;
320 }
321
322 RefPtr<SecurityOrigin> m_securityOrigin;
323 OwnPtr<MockWorkerReportingProxy> m_mockWorkerReportingProxy;
324 RefPtr<WorkerThreadForTest> m_workerThread;
325
326 OwnPtr<DummyPageHolder> m_dummyPageHolder;
327 Checkpoint m_checkpoint;
328 // |m_loader| must be touched only from the worker thread only.
329 OwnPtr<ThreadableLoader> m_loader;
330 };
331
332 class ThreadableLoaderTest : public ::testing::TestWithParam<ThreadableLoaderToT est> {
333 public:
334 ThreadableLoaderTest()
335 {
336 switch (GetParam()) {
337 case DocumentThreadableLoaderTest:
338 m_helper = adoptPtr(new DocumentThreadableLoaderTestHelper);
339 break;
340 case WorkerThreadableLoaderTest:
341 m_helper = adoptPtr(new WorkerThreadableLoaderTestHelper);
342 break;
343 }
344 }
345
346 void startLoader(const KURL& url)
347 {
348 ResourceRequest request(url);
349 request.setRequestContext(WebURLRequest::RequestContextInternal);
350 m_helper->startLoader(request);
351 }
352
353 void cancelLoader() { m_helper->cancelLoader(); }
354 void clearLoader() { m_helper->clearLoader(); }
355 Checkpoint& checkpoint() { return m_helper->checkpoint(); }
356 void callCheckpoint(int n) { m_helper->callCheckpoint(n); }
357
358 void serveRequests()
359 {
360 m_helper->onServeRequests();
361 Platform::current()->unitTestSupport()->serveAsynchronousMockedRequests( );
362 }
363
364 void createLoader(CrossOriginRequestPolicy crossOriginRequestPolicy = AllowC rossOriginRequests)
365 {
366 m_helper->createLoader(client(), crossOriginRequestPolicy);
367 }
368
369 MockThreadableLoaderClient* client() const { return m_client.get(); }
370
371 private:
372 void SetUp() override
373 {
374 setUpSuccessURL();
375 setUpErrorURL();
376 setUpRedirectURL();
377 setUpRedirectLoopURL();
378
379 m_client = MockThreadableLoaderClient::create();
380 m_helper->onSetUp();
381 }
382
383 void TearDown() override
384 {
385 m_helper->onTearDown();
386 Platform::current()->unitTestSupport()->unregisterAllMockedURLs();
387 m_client.clear();
388 }
389
390 void setUpSuccessURL()
391 {
392 URLTestHelpers::registerMockedURLLoad(successURL(), "fox-null-terminated .html", "text/html");
393 }
394
395 void setUpErrorURL()
396 {
397 URLTestHelpers::registerMockedErrorURLLoad(errorURL());
398 }
399
400 void setUpRedirectURL()
401 {
402 KURL url = redirectURL();
403
404 WebURLLoadTiming timing;
405 timing.initialize();
406
407 WebURLResponse response;
408 response.initialize();
409 response.setURL(url);
410 response.setHTTPStatusCode(301);
411 response.setLoadTiming(timing);
412 response.addHTTPHeaderField("Location", successURL().string());
413 response.addHTTPHeaderField("Access-Control-Allow-Origin", "null");
414
415 URLTestHelpers::registerMockedURLLoadWithCustomResponse(url, "fox-null-t erminated.html", "", response);
416 }
417
418 void setUpRedirectLoopURL()
419 {
420 KURL url = redirectLoopURL();
421
422 WebURLLoadTiming timing;
423 timing.initialize();
424
425 WebURLResponse response;
426 response.initialize();
427 response.setURL(url);
428 response.setHTTPStatusCode(301);
429 response.setLoadTiming(timing);
430 response.addHTTPHeaderField("Location", redirectLoopURL().string());
431 response.addHTTPHeaderField("Access-Control-Allow-Origin", "null");
432
433 URLTestHelpers::registerMockedURLLoadWithCustomResponse(url, "fox-null-t erminated.html", "", response);
434 }
435
436 OwnPtr<MockThreadableLoaderClient> m_client;
437 OwnPtr<ThreadableLoaderTestHelper> m_helper;
438 };
439
440 INSTANTIATE_TEST_CASE_P(Document,
441 ThreadableLoaderTest,
442 ::testing::Values(DocumentThreadableLoaderTest));
443
444 INSTANTIATE_TEST_CASE_P(Worker,
445 ThreadableLoaderTest,
446 ::testing::Values(WorkerThreadableLoaderTest));
447
448 TEST_P(ThreadableLoaderTest, StartAndStop)
449 {
450 }
451
452 TEST_P(ThreadableLoaderTest, CancelAfterStart)
453 {
454 InSequence s;
455 EXPECT_CALL(checkpoint(), Call(1));
456 createLoader();
457 callCheckpoint(1);
tyoshino (SeeGerritForStatus) 2016/03/03 14:43:19 is this checkpoint for ensuring that the following
hiroshige 2016/03/08 23:40:59 Yes, i.e. not synchronously in createLoader().
458
459 EXPECT_CALL(checkpoint(), Call(2)).WillOnce(InvokeWithoutArgs(this, &Threada bleLoaderTest::cancelLoader));
460 EXPECT_CALL(*client(), didFail(Truly(isCancellation)));
461 EXPECT_CALL(checkpoint(), Call(3));
462
463 startLoader(successURL());
464 callCheckpoint(2);
465 callCheckpoint(3);
466 serveRequests();
467 }
468
469 TEST_P(ThreadableLoaderTest, ClearAfterStart)
470 {
471 InSequence s;
472 EXPECT_CALL(checkpoint(), Call(1));
473 createLoader();
474 callCheckpoint(1);
475
476 EXPECT_CALL(checkpoint(), Call(2)).WillOnce(InvokeWithoutArgs(this, &Threada bleLoaderTest::clearLoader));
477 EXPECT_CALL(checkpoint(), Call(3));
478
479 startLoader(successURL());
480 callCheckpoint(2);
481 callCheckpoint(3);
482 serveRequests();
483 }
484
485 TEST_P(ThreadableLoaderTest, CancelInDidReceiveResponse)
486 {
487 InSequence s;
488 EXPECT_CALL(checkpoint(), Call(1));
489 createLoader();
490 callCheckpoint(1);
491
492 EXPECT_CALL(checkpoint(), Call(2));
493 EXPECT_CALL(*client(), didReceiveResponse(_, _, _)).WillOnce(InvokeWithoutAr gs(this, &ThreadableLoaderTest::cancelLoader));
494 EXPECT_CALL(*client(), didFail(Truly(isCancellation)));
495
496 startLoader(successURL());
497 callCheckpoint(2);
498 serveRequests();
499 }
500
501 TEST_P(ThreadableLoaderTest, ClearInDidReceiveResponse)
502 {
503 InSequence s;
504 EXPECT_CALL(checkpoint(), Call(1));
505 createLoader();
506 callCheckpoint(1);
507
508 EXPECT_CALL(checkpoint(), Call(2));
509 EXPECT_CALL(*client(), didReceiveResponse(_, _, _)).WillOnce(InvokeWithoutAr gs(this, &ThreadableLoaderTest::clearLoader));
510
511 startLoader(successURL());
512 callCheckpoint(2);
513 serveRequests();
514 }
515
516 TEST_P(ThreadableLoaderTest, CancelIndidReceiveData)
tyoshino (SeeGerritForStatus) 2016/03/03 14:43:19 did -> Did
hiroshige 2016/03/08 23:40:59 Done.
517 {
518 InSequence s;
519 EXPECT_CALL(checkpoint(), Call(1));
520 createLoader();
521 callCheckpoint(1);
522
523 EXPECT_CALL(checkpoint(), Call(2));
524 EXPECT_CALL(*client(), didReceiveResponse(_, _, _));
525 EXPECT_CALL(*client(), didReceiveData(_, _)).WillOnce(InvokeWithoutArgs(this , &ThreadableLoaderTest::cancelLoader));
526 EXPECT_CALL(*client(), didFail(Truly(isCancellation)));
527
528 startLoader(successURL());
529 callCheckpoint(2);
530 serveRequests();
531 }
532
533 TEST_P(ThreadableLoaderTest, ClearIndidReceiveData)
tyoshino (SeeGerritForStatus) 2016/03/03 14:43:19 did -> Did
hiroshige 2016/03/08 23:40:59 Done.
534 {
535 InSequence s;
536 EXPECT_CALL(checkpoint(), Call(1));
537 createLoader();
538 callCheckpoint(1);
539
540 EXPECT_CALL(checkpoint(), Call(2));
541 EXPECT_CALL(*client(), didReceiveResponse(_, _, _));
542 EXPECT_CALL(*client(), didReceiveData(_, _)).WillOnce(InvokeWithoutArgs(this , &ThreadableLoaderTest::clearLoader));
543
544 startLoader(successURL());
545 callCheckpoint(2);
546 serveRequests();
547 }
548
549 TEST_P(ThreadableLoaderTest, DidFinishLoading)
550 {
551 InSequence s;
552 EXPECT_CALL(checkpoint(), Call(1));
553 createLoader();
554 callCheckpoint(1);
555
556 EXPECT_CALL(checkpoint(), Call(2));
557 EXPECT_CALL(*client(), didReceiveResponse(_, _, _));
558 EXPECT_CALL(*client(), didReceiveData(StrEq("fox"), 4));
559 EXPECT_CALL(*client(), didReceiveResourceTiming(_)).Times(AtMost(1));
tyoshino (SeeGerritForStatus) 2016/03/03 14:43:20 please explain why the expectation is AtMost(1)
hiroshige 2016/03/08 23:40:59 Because it is called in DocumentThreadableLoader c
tyoshino (SeeGerritForStatus) 2016/03/09 06:26:12 Thanks. Please add a short comment explaining that
Kunihiko Sakamoto 2016/03/10 02:17:31 hiroshige@ is correct, WorkerThreadableLoader does
hiroshige 2016/03/10 03:20:08 Thanks! Then I'll make the expectation more strict
hiroshige 2016/03/11 19:52:14 Done.
560 EXPECT_CALL(*client(), didFinishLoading(_, _));
561
562 startLoader(successURL());
563 callCheckpoint(2);
564 serveRequests();
565 }
566
567 TEST_P(ThreadableLoaderTest, CancelInDidFinishLoading)
568 {
569 InSequence s;
570 EXPECT_CALL(checkpoint(), Call(1));
571 createLoader();
572 callCheckpoint(1);
573
574 EXPECT_CALL(checkpoint(), Call(2));
575 EXPECT_CALL(*client(), didReceiveResponse(_, _, _));
576 EXPECT_CALL(*client(), didReceiveData(_, _));
577 EXPECT_CALL(*client(), didReceiveResourceTiming(_)).Times(AtMost(1));
578 EXPECT_CALL(*client(), didFinishLoading(_, _)).WillOnce(InvokeWithoutArgs(th is, &ThreadableLoaderTest::cancelLoader));
579
580 startLoader(successURL());
581 callCheckpoint(2);
582 serveRequests();
583 }
584
585 TEST_P(ThreadableLoaderTest, ClearInDidFinishLoading)
586 {
587 InSequence s;
588 EXPECT_CALL(checkpoint(), Call(1));
589 createLoader();
590 callCheckpoint(1);
591
592 EXPECT_CALL(checkpoint(), Call(2));
593 EXPECT_CALL(*client(), didReceiveResponse(_, _, _));
594 EXPECT_CALL(*client(), didReceiveData(_, _));
595 EXPECT_CALL(*client(), didReceiveResourceTiming(_)).Times(AtMost(1));
596 EXPECT_CALL(*client(), didFinishLoading(_, _)).WillOnce(InvokeWithoutArgs(th is, &ThreadableLoaderTest::clearLoader));
597
598 startLoader(successURL());
599 callCheckpoint(2);
600 serveRequests();
601 }
602
603 TEST_P(ThreadableLoaderTest, DidFail)
604 {
605 InSequence s;
606 EXPECT_CALL(checkpoint(), Call(1));
607 createLoader();
608 callCheckpoint(1);
609
610 EXPECT_CALL(checkpoint(), Call(2));
611 EXPECT_CALL(*client(), didReceiveResponse(_, _, _));
612 EXPECT_CALL(*client(), didFail(Truly(isNotCancellation)));
613
614 startLoader(errorURL());
615 callCheckpoint(2);
616 serveRequests();
617 }
618
619 TEST_P(ThreadableLoaderTest, CancelInDidFail)
620 {
621 InSequence s;
622 EXPECT_CALL(checkpoint(), Call(1));
623 createLoader();
624 callCheckpoint(1);
625
626 EXPECT_CALL(checkpoint(), Call(2));
627 EXPECT_CALL(*client(), didReceiveResponse(_, _, _));
628 EXPECT_CALL(*client(), didFail(_)).WillOnce(InvokeWithoutArgs(this, &Threada bleLoaderTest::cancelLoader));
629
630 startLoader(errorURL());
631 callCheckpoint(2);
632 serveRequests();
633 }
634
635 TEST_P(ThreadableLoaderTest, ClearInDidFail)
636 {
637 InSequence s;
638 EXPECT_CALL(checkpoint(), Call(1));
639 createLoader();
640 callCheckpoint(1);
641
642 EXPECT_CALL(checkpoint(), Call(2));
643 EXPECT_CALL(*client(), didReceiveResponse(_, _, _));
644 EXPECT_CALL(*client(), didFail(_)).WillOnce(InvokeWithoutArgs(this, &Threada bleLoaderTest::clearLoader));
645
646 startLoader(errorURL());
647 callCheckpoint(2);
648 serveRequests();
649 }
650
651 TEST_P(ThreadableLoaderTest, DidFailInStart)
652 {
653 InSequence s;
654 EXPECT_CALL(checkpoint(), Call(1));
655 createLoader(DenyCrossOriginRequests);
656 callCheckpoint(1);
657
658 EXPECT_CALL(*client(), didFail(ResourceError(errorDomainBlinkInternal, 0, er rorURL().string(), "Cross origin requests are not supported.")));
659 EXPECT_CALL(checkpoint(), Call(2));
660
661 startLoader(errorURL());
662 callCheckpoint(2);
663 serveRequests();
664 }
665
666 TEST_P(ThreadableLoaderTest, CancelInDidFailInStart)
667 {
668 InSequence s;
669 EXPECT_CALL(checkpoint(), Call(1));
670 createLoader(DenyCrossOriginRequests);
671 callCheckpoint(1);
672
673 EXPECT_CALL(*client(), didFail(_)).WillOnce(InvokeWithoutArgs(this, &Threada bleLoaderTest::cancelLoader));
674 EXPECT_CALL(checkpoint(), Call(2));
675
676 startLoader(errorURL());
677 callCheckpoint(2);
678 serveRequests();
679 }
680
681 TEST_P(ThreadableLoaderTest, ClearInDidFailInStart)
682 {
683 InSequence s;
684 EXPECT_CALL(checkpoint(), Call(1));
685 createLoader(DenyCrossOriginRequests);
686 callCheckpoint(1);
687
688 EXPECT_CALL(*client(), didFail(_)).WillOnce(InvokeWithoutArgs(this, &Threada bleLoaderTest::clearLoader));
689 EXPECT_CALL(checkpoint(), Call(2));
690
691 startLoader(errorURL());
692 callCheckpoint(2);
693 serveRequests();
694 }
695
696 TEST_P(ThreadableLoaderTest, DidFailAccessControlCheck)
697 {
698 InSequence s;
699 EXPECT_CALL(checkpoint(), Call(1));
700 createLoader(UseAccessControl);
701 callCheckpoint(1);
702
703 EXPECT_CALL(checkpoint(), Call(2));
704 EXPECT_CALL(*client(), didFailAccessControlCheck(ResourceError(errorDomainBl inkInternal, 0, successURL().string(), "No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed acc ess.")));
705
706 startLoader(successURL());
707 callCheckpoint(2);
708 serveRequests();
709 }
710
711 TEST_P(ThreadableLoaderTest, CancelInDidFailAccessControlCheck)
712 {
713 InSequence s;
714 EXPECT_CALL(checkpoint(), Call(1));
715 createLoader(UseAccessControl);
716 callCheckpoint(1);
717
718 EXPECT_CALL(checkpoint(), Call(2));
719 EXPECT_CALL(*client(), didFailAccessControlCheck(_)).WillOnce(InvokeWithoutA rgs(this, &ThreadableLoaderTest::cancelLoader));
720
721 startLoader(successURL());
722 callCheckpoint(2);
723 serveRequests();
724 }
725
726 TEST_P(ThreadableLoaderTest, ClearInDidFailAccessControlCheck)
727 {
728 InSequence s;
729 EXPECT_CALL(checkpoint(), Call(1));
730 createLoader(UseAccessControl);
731 callCheckpoint(1);
732
733 EXPECT_CALL(checkpoint(), Call(2));
734 EXPECT_CALL(*client(), didFailAccessControlCheck(_)).WillOnce(InvokeWithoutA rgs(this, &ThreadableLoaderTest::clearLoader));
735
736 startLoader(successURL());
737 callCheckpoint(2);
738 serveRequests();
739 }
740
741 TEST_P(ThreadableLoaderTest, RedirectDidFinishLoading)
742 {
743 InSequence s;
744 EXPECT_CALL(checkpoint(), Call(1));
745 createLoader();
746 callCheckpoint(1);
747
748 EXPECT_CALL(checkpoint(), Call(2));
749 EXPECT_CALL(*client(), didReceiveResponse(_, _, _));
750 EXPECT_CALL(*client(), didReceiveData(StrEq("fox"), 4));
751 EXPECT_CALL(*client(), didReceiveResourceTiming(_)).Times(AtMost(1));
752 EXPECT_CALL(*client(), didFinishLoading(_, _));
753
754 startLoader(redirectURL());
755 callCheckpoint(2);
756 serveRequests();
757 }
758
759 TEST_P(ThreadableLoaderTest, CancelInRedirectDidFinishLoading)
760 {
761 InSequence s;
762 EXPECT_CALL(checkpoint(), Call(1));
763 createLoader();
764 callCheckpoint(1);
765
766 EXPECT_CALL(checkpoint(), Call(2));
767 EXPECT_CALL(*client(), didReceiveResponse(_, _, _));
768 EXPECT_CALL(*client(), didReceiveData(StrEq("fox"), 4));
769 EXPECT_CALL(*client(), didReceiveResourceTiming(_)).Times(AtMost(1));
770 EXPECT_CALL(*client(), didFinishLoading(_, _)).WillOnce(InvokeWithoutArgs(th is, &ThreadableLoaderTest::cancelLoader));
771
772 startLoader(redirectURL());
773 callCheckpoint(2);
774 serveRequests();
775 }
776
777 TEST_P(ThreadableLoaderTest, ClearInRedirectDidFinishLoading)
778 {
779 InSequence s;
780 EXPECT_CALL(checkpoint(), Call(1));
781 createLoader();
782 callCheckpoint(1);
783
784 EXPECT_CALL(checkpoint(), Call(2));
785 EXPECT_CALL(*client(), didReceiveResponse(_, _, _));
786 EXPECT_CALL(*client(), didReceiveData(StrEq("fox"), 4));
787 EXPECT_CALL(*client(), didReceiveResourceTiming(_)).Times(AtMost(1));
788 EXPECT_CALL(*client(), didFinishLoading(_, _)).WillOnce(InvokeWithoutArgs(th is, &ThreadableLoaderTest::clearLoader));
789
790 startLoader(redirectURL());
791 callCheckpoint(2);
792 serveRequests();
793 }
794
795 TEST_P(ThreadableLoaderTest, DidFailRedirectCheck)
796 {
797 InSequence s;
798 EXPECT_CALL(checkpoint(), Call(1));
799 createLoader(UseAccessControl);
800 callCheckpoint(1);
801
802 EXPECT_CALL(checkpoint(), Call(2));
803 EXPECT_CALL(*client(), didFailRedirectCheck());
804
805 startLoader(redirectLoopURL());
806 callCheckpoint(2);
807 serveRequests();
808 }
809
810 TEST_P(ThreadableLoaderTest, CancelInDidFailRedirectCheck)
811 {
812 InSequence s;
813 EXPECT_CALL(checkpoint(), Call(1));
814 createLoader(UseAccessControl);
815 callCheckpoint(1);
816
817 EXPECT_CALL(checkpoint(), Call(2));
818 EXPECT_CALL(*client(), didFailRedirectCheck()).WillOnce(InvokeWithoutArgs(th is, &ThreadableLoaderTest::cancelLoader));
819
820 startLoader(redirectLoopURL());
821 callCheckpoint(2);
822 serveRequests();
823 }
824
825 TEST_P(ThreadableLoaderTest, ClearInDidFailRedirectCheck)
826 {
827 InSequence s;
828 EXPECT_CALL(checkpoint(), Call(1));
829 createLoader(UseAccessControl);
830 callCheckpoint(1);
831
832 EXPECT_CALL(checkpoint(), Call(2));
833 EXPECT_CALL(*client(), didFailRedirectCheck()).WillOnce(InvokeWithoutArgs(th is, &ThreadableLoaderTest::clearLoader));
834
835 startLoader(redirectLoopURL());
836 callCheckpoint(2);
837 serveRequests();
838 }
839
840 } // namespace
841
842 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698