Chromium Code Reviews| OLD | NEW |
|---|---|
| (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 | |
| OLD | NEW |