OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 // | 4 // |
5 | 5 |
6 #include "base/logging.h" | 6 #include "base/logging.h" |
7 #include "base/single_thread_task_runner.h" | 7 #include "base/single_thread_task_runner.h" |
8 #include "base/stringprintf.h" | 8 #include "base/stringprintf.h" |
9 #include "base/thread_task_runner_handle.h" | 9 #include "base/thread_task_runner_handle.h" |
10 #include "base/time.h" | 10 #include "base/time.h" |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 | 54 |
55 void ValidateUpdateFetcherRequest(const net::TestURLFetcher* url_fetcher) { | 55 void ValidateUpdateFetcherRequest(const net::TestURLFetcher* url_fetcher) { |
56 ASSERT_TRUE(url_fetcher); | 56 ASSERT_TRUE(url_fetcher); |
57 EXPECT_EQ(net::LOAD_DISABLE_CACHE, url_fetcher->GetLoadFlags()); | 57 EXPECT_EQ(net::LOAD_DISABLE_CACHE, url_fetcher->GetLoadFlags()); |
58 EXPECT_EQ("goog-phish-shavar;\ngoog-malware-shavar;\n", | 58 EXPECT_EQ("goog-phish-shavar;\ngoog-malware-shavar;\n", |
59 url_fetcher->upload_data()); | 59 url_fetcher->upload_data()); |
60 EXPECT_EQ(GURL("https://prefix.com/foo/downloads?client=unittest&appver=1.0" | 60 EXPECT_EQ(GURL("https://prefix.com/foo/downloads?client=unittest&appver=1.0" |
61 "&pver=2.2" + key_param_), | 61 "&pver=2.2" + key_param_), |
62 url_fetcher->GetOriginalURL()); | 62 url_fetcher->GetOriginalURL()); |
63 } | 63 } |
| 64 |
| 65 void ValidateRedirectFetcherRequest(const net::TestURLFetcher* url_fetcher, |
| 66 const std::string& expected_url) { |
| 67 ASSERT_TRUE(url_fetcher); |
| 68 EXPECT_EQ(net::LOAD_DISABLE_CACHE, url_fetcher->GetLoadFlags()); |
| 69 EXPECT_EQ("", url_fetcher->upload_data()); |
| 70 EXPECT_EQ(GURL(expected_url), url_fetcher->GetOriginalURL()); |
| 71 } |
64 }; | 72 }; |
65 | 73 |
66 // Ensure that we respect section 5 of the SafeBrowsing protocol specification. | 74 // Ensure that we respect section 5 of the SafeBrowsing protocol specification. |
67 TEST_F(SafeBrowsingProtocolManagerTest, TestBackOffTimes) { | 75 TEST_F(SafeBrowsingProtocolManagerTest, TestBackOffTimes) { |
68 scoped_ptr<SafeBrowsingProtocolManager> pm(CreateProtocolManager(NULL)); | 76 scoped_ptr<SafeBrowsingProtocolManager> pm(CreateProtocolManager(NULL)); |
69 | 77 |
70 pm->next_update_interval_ = base::TimeDelta::FromSeconds(1800); | 78 pm->next_update_interval_ = base::TimeDelta::FromSeconds(1800); |
71 ASSERT_TRUE(pm->back_off_fuzz_ >= 0.0 && pm->back_off_fuzz_ <= 1.0); | 79 ASSERT_TRUE(pm->back_off_fuzz_ >= 0.0 && pm->back_off_fuzz_ <= 1.0); |
72 | 80 |
73 base::TimeDelta next; | 81 base::TimeDelta next; |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 | 254 |
247 class MockProtocolDelegate : public SafeBrowsingProtocolManagerDelegate { | 255 class MockProtocolDelegate : public SafeBrowsingProtocolManagerDelegate { |
248 public: | 256 public: |
249 MockProtocolDelegate() {} | 257 MockProtocolDelegate() {} |
250 virtual ~MockProtocolDelegate() {} | 258 virtual ~MockProtocolDelegate() {} |
251 | 259 |
252 MOCK_METHOD0(UpdateStarted, void()); | 260 MOCK_METHOD0(UpdateStarted, void()); |
253 MOCK_METHOD1(UpdateFinished, void(bool)); | 261 MOCK_METHOD1(UpdateFinished, void(bool)); |
254 MOCK_METHOD0(ResetDatabase, void()); | 262 MOCK_METHOD0(ResetDatabase, void()); |
255 MOCK_METHOD1(GetChunks, void(GetChunksCallback)); | 263 MOCK_METHOD1(GetChunks, void(GetChunksCallback)); |
256 MOCK_METHOD2(AddChunks, void(const std::string&, SBChunkList*)); | 264 MOCK_METHOD3(AddChunks, void(const std::string&, SBChunkList*, |
| 265 AddChunksCallback)); |
257 MOCK_METHOD1(DeleteChunks, void(std::vector<SBChunkDelete>*)); | 266 MOCK_METHOD1(DeleteChunks, void(std::vector<SBChunkDelete>*)); |
258 }; | 267 }; |
259 | 268 |
260 // ImmediateSingleThreadTaskRunner will ignore delayed times for tasks. | 269 // ImmediateSingleThreadTaskRunner will ignore delayed times for tasks. |
261 // This is primarily used to run the timer tasks immediately, and prevent | 270 // This is primarily used to run the timer tasks immediately, and prevent |
262 // the need for constructing a MessageLoop. | 271 // the need for constructing a MessageLoop. |
263 class ImmediateSingleThreadTaskRunner : public base::SingleThreadTaskRunner { | 272 class ImmediateSingleThreadTaskRunner : public base::SingleThreadTaskRunner { |
264 public: | 273 public: |
265 virtual bool RunsTasksOnCurrentThread() const OVERRIDE { | 274 virtual bool RunsTasksOnCurrentThread() const OVERRIDE { |
266 return true; | 275 return true; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 // |InvokeGetChunksCallback| is required because GMock's InvokeArgument action | 314 // |InvokeGetChunksCallback| is required because GMock's InvokeArgument action |
306 // expects to use operator(), and a Callback only provides Run(). | 315 // expects to use operator(), and a Callback only provides Run(). |
307 // TODO(cbentzel): Use ACTION or ACTION_TEMPLATE instead? | 316 // TODO(cbentzel): Use ACTION or ACTION_TEMPLATE instead? |
308 void InvokeGetChunksCallback( | 317 void InvokeGetChunksCallback( |
309 const std::vector<SBListChunkRanges>& ranges, | 318 const std::vector<SBListChunkRanges>& ranges, |
310 bool database_error, | 319 bool database_error, |
311 SafeBrowsingProtocolManagerDelegate::GetChunksCallback callback) { | 320 SafeBrowsingProtocolManagerDelegate::GetChunksCallback callback) { |
312 callback.Run(ranges, database_error); | 321 callback.Run(ranges, database_error); |
313 } | 322 } |
314 | 323 |
| 324 // |HandleAddChunks| deletes the chunks and asynchronously invokes |
| 325 // |callback| since SafeBrowsingProtocolManager is not re-entrant at the time |
| 326 // this is called. This guarantee is part of the |
| 327 // SafeBrowsingProtocolManagerDelegate contract. |
| 328 void HandleAddChunks( |
| 329 const std::string& unused_list, |
| 330 SBChunkList* chunks, |
| 331 SafeBrowsingProtocolManagerDelegate::AddChunksCallback callback) { |
| 332 delete chunks; |
| 333 scoped_refptr<base::SingleThreadTaskRunner> task_runner( |
| 334 base::ThreadTaskRunnerHandle::Get()); |
| 335 if (!task_runner) |
| 336 return; |
| 337 task_runner->PostTask(FROM_HERE, callback); |
| 338 } |
| 339 |
315 } // namespace | 340 } // namespace |
316 | 341 |
317 // Tests that the Update protocol will be skipped if there are problems | 342 // Tests that the Update protocol will be skipped if there are problems |
318 // accessing the database. | 343 // accessing the database. |
319 TEST_F(SafeBrowsingProtocolManagerTest, ProblemAccessingDatabase) { | 344 TEST_F(SafeBrowsingProtocolManagerTest, ProblemAccessingDatabase) { |
320 scoped_refptr<ImmediateSingleThreadTaskRunner> runner( | 345 scoped_refptr<ImmediateSingleThreadTaskRunner> runner( |
321 new ImmediateSingleThreadTaskRunner()); | 346 new ImmediateSingleThreadTaskRunner()); |
322 base::ThreadTaskRunnerHandle runner_handler(runner); | 347 base::ThreadTaskRunnerHandle runner_handler(runner); |
323 | 348 |
324 testing::StrictMock<MockProtocolDelegate> test_delegate; | 349 testing::StrictMock<MockProtocolDelegate> test_delegate; |
325 EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); | 350 EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); |
326 EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( | 351 EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( |
327 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, | 352 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, |
328 std::vector<SBListChunkRanges>(), | 353 std::vector<SBListChunkRanges>(), |
329 true))); | 354 true))); |
330 EXPECT_CALL(test_delegate, UpdateFinished(false)).Times(1); | 355 EXPECT_CALL(test_delegate, UpdateFinished(false)).Times(1); |
331 | 356 |
332 scoped_ptr<SafeBrowsingProtocolManager> pm( | 357 scoped_ptr<SafeBrowsingProtocolManager> pm( |
333 CreateProtocolManager(&test_delegate)); | 358 CreateProtocolManager(&test_delegate)); |
334 | 359 |
335 pm->ForceScheduleNextUpdate(base::TimeDelta()); | 360 pm->ForceScheduleNextUpdate(base::TimeDelta()); |
336 runner->RunTasks(); | 361 runner->RunTasks(); |
| 362 |
| 363 EXPECT_TRUE(pm->IsUpdateScheduled()); |
337 } | 364 } |
338 | 365 |
339 // Tests the contents of the POST body when there are contents in the | 366 // Tests the contents of the POST body when there are contents in the |
340 // local database. This is not exhaustive, as the actual list formatting | 367 // local database. This is not exhaustive, as the actual list formatting |
341 // is covered by SafeBrowsingProtocolManagerTest.TestChunkStrings. | 368 // is covered by SafeBrowsingProtocolManagerTest.TestChunkStrings. |
342 TEST_F(SafeBrowsingProtocolManagerTest, ExistingDatabase) { | 369 TEST_F(SafeBrowsingProtocolManagerTest, ExistingDatabase) { |
343 scoped_refptr<ImmediateSingleThreadTaskRunner> runner( | 370 scoped_refptr<ImmediateSingleThreadTaskRunner> runner( |
344 new ImmediateSingleThreadTaskRunner()); | 371 new ImmediateSingleThreadTaskRunner()); |
345 base::ThreadTaskRunnerHandle runner_handler(runner); | 372 base::ThreadTaskRunnerHandle runner_handler(runner); |
346 net::TestURLFetcherFactory url_fetcher_factory; | 373 net::TestURLFetcherFactory url_fetcher_factory; |
347 | 374 |
348 std::vector<SBListChunkRanges> ranges; | 375 std::vector<SBListChunkRanges> ranges; |
349 SBListChunkRanges range_phish(safe_browsing_util::kPhishingList); | 376 SBListChunkRanges range_phish(safe_browsing_util::kPhishingList); |
350 range_phish.adds = "adds_phish"; | 377 range_phish.adds = "adds_phish"; |
351 range_phish.subs = "subs_phish"; | 378 range_phish.subs = "subs_phish"; |
352 ranges.push_back(range_phish); | 379 ranges.push_back(range_phish); |
353 | 380 |
354 SBListChunkRanges range_unknown("unknown_list"); | 381 SBListChunkRanges range_unknown("unknown_list"); |
355 range_unknown.adds = "adds_unknown"; | 382 range_unknown.adds = "adds_unknown"; |
356 range_unknown.subs = "subs_unknown"; | 383 range_unknown.subs = "subs_unknown"; |
357 ranges.push_back(range_unknown); | 384 ranges.push_back(range_unknown); |
358 | 385 |
359 testing::StrictMock<MockProtocolDelegate> test_delegate; | 386 testing::StrictMock<MockProtocolDelegate> test_delegate; |
360 EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); | 387 EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); |
361 EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( | 388 EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( |
362 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, | 389 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, |
363 ranges, | 390 ranges, |
364 false))); | 391 false))); |
| 392 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); |
365 | 393 |
366 scoped_ptr<SafeBrowsingProtocolManager> pm( | 394 scoped_ptr<SafeBrowsingProtocolManager> pm( |
367 CreateProtocolManager(&test_delegate)); | 395 CreateProtocolManager(&test_delegate)); |
368 | 396 |
369 // Kick off initialization. This returns chunks from the DB synchronously. | 397 // Kick off initialization. This returns chunks from the DB synchronously. |
370 pm->ForceScheduleNextUpdate(base::TimeDelta()); | 398 pm->ForceScheduleNextUpdate(base::TimeDelta()); |
371 runner->RunTasks(); | 399 runner->RunTasks(); |
372 | 400 |
373 // We should have an URLFetcher at this point in time. | 401 // We should have an URLFetcher at this point in time. |
374 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); | 402 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
375 ASSERT_TRUE(url_fetcher); | 403 ASSERT_TRUE(url_fetcher); |
376 EXPECT_EQ(net::LOAD_DISABLE_CACHE, url_fetcher->GetLoadFlags()); | 404 EXPECT_EQ(net::LOAD_DISABLE_CACHE, url_fetcher->GetLoadFlags()); |
377 EXPECT_EQ("goog-phish-shavar;a:adds_phish:s:subs_phish\n" | 405 EXPECT_EQ("goog-phish-shavar;a:adds_phish:s:subs_phish\n" |
378 "unknown_list;a:adds_unknown:s:subs_unknown\n" | 406 "unknown_list;a:adds_unknown:s:subs_unknown\n" |
379 "goog-malware-shavar;\n", | 407 "goog-malware-shavar;\n", |
380 url_fetcher->upload_data()); | 408 url_fetcher->upload_data()); |
381 EXPECT_EQ(GURL("https://prefix.com/foo/downloads?client=unittest&appver=1.0" | 409 EXPECT_EQ(GURL("https://prefix.com/foo/downloads?client=unittest&appver=1.0" |
382 "&pver=2.2" + key_param_), | 410 "&pver=2.2" + key_param_), |
383 url_fetcher->GetOriginalURL()); | 411 url_fetcher->GetOriginalURL()); |
384 } | |
385 | |
386 // Tests what happens when there is a response with no chunks. | |
387 TEST_F(SafeBrowsingProtocolManagerTest, UpdateResponseEmptyBody) { | |
388 scoped_refptr<ImmediateSingleThreadTaskRunner> runner( | |
389 new ImmediateSingleThreadTaskRunner()); | |
390 base::ThreadTaskRunnerHandle runner_handler(runner); | |
391 net::TestURLFetcherFactory url_fetcher_factory; | |
392 | |
393 testing::StrictMock<MockProtocolDelegate> test_delegate; | |
394 EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); | |
395 EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( | |
396 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, | |
397 std::vector<SBListChunkRanges>(), | |
398 false))); | |
399 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); | |
400 | |
401 scoped_ptr<SafeBrowsingProtocolManager> pm( | |
402 CreateProtocolManager(&test_delegate)); | |
403 | |
404 // Kick off initialization. This returns chunks from the DB synchronously. | |
405 pm->ForceScheduleNextUpdate(base::TimeDelta()); | |
406 runner->RunTasks(); | |
407 | |
408 // We should have an URLFetcher at this point in time. | |
409 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); | |
410 ValidateUpdateFetcherRequest(url_fetcher); | |
411 | |
412 // The update response is successful, but an empty body. | |
413 url_fetcher->set_status(net::URLRequestStatus()); | 412 url_fetcher->set_status(net::URLRequestStatus()); |
414 url_fetcher->set_response_code(200); | 413 url_fetcher->set_response_code(200); |
415 url_fetcher->SetResponseString(""); | 414 url_fetcher->SetResponseString(""); |
416 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); | 415 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| 416 |
| 417 EXPECT_TRUE(pm->IsUpdateScheduled()); |
417 } | 418 } |
418 | 419 |
419 TEST_F(SafeBrowsingProtocolManagerTest, UpdateResponseBadBody) { | 420 TEST_F(SafeBrowsingProtocolManagerTest, UpdateResponseBadBody) { |
420 scoped_refptr<ImmediateSingleThreadTaskRunner> runner( | 421 scoped_refptr<ImmediateSingleThreadTaskRunner> runner( |
421 new ImmediateSingleThreadTaskRunner()); | 422 new ImmediateSingleThreadTaskRunner()); |
422 base::ThreadTaskRunnerHandle runner_handler(runner); | 423 base::ThreadTaskRunnerHandle runner_handler(runner); |
423 net::TestURLFetcherFactory url_fetcher_factory; | 424 net::TestURLFetcherFactory url_fetcher_factory; |
424 | 425 |
425 testing::StrictMock<MockProtocolDelegate> test_delegate; | 426 testing::StrictMock<MockProtocolDelegate> test_delegate; |
426 EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); | 427 EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); |
(...skipping 12 matching lines...) Expand all Loading... |
439 | 440 |
440 // We should have an URLFetcher at this point in time. | 441 // We should have an URLFetcher at this point in time. |
441 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); | 442 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
442 ValidateUpdateFetcherRequest(url_fetcher); | 443 ValidateUpdateFetcherRequest(url_fetcher); |
443 | 444 |
444 // The update response is successful, but an invalid body. | 445 // The update response is successful, but an invalid body. |
445 url_fetcher->set_status(net::URLRequestStatus()); | 446 url_fetcher->set_status(net::URLRequestStatus()); |
446 url_fetcher->set_response_code(200); | 447 url_fetcher->set_response_code(200); |
447 url_fetcher->SetResponseString("THIS_IS_A_BAD_RESPONSE"); | 448 url_fetcher->SetResponseString("THIS_IS_A_BAD_RESPONSE"); |
448 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); | 449 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| 450 |
| 451 EXPECT_TRUE(pm->IsUpdateScheduled()); |
449 } | 452 } |
450 | 453 |
451 // Tests what happens when there is an error in the update response. | 454 // Tests what happens when there is an error in the update response. |
452 TEST_F(SafeBrowsingProtocolManagerTest, UpdateResponseHttpError) { | 455 TEST_F(SafeBrowsingProtocolManagerTest, UpdateResponseHttpError) { |
453 scoped_refptr<ImmediateSingleThreadTaskRunner> runner( | 456 scoped_refptr<ImmediateSingleThreadTaskRunner> runner( |
454 new ImmediateSingleThreadTaskRunner()); | 457 new ImmediateSingleThreadTaskRunner()); |
455 base::ThreadTaskRunnerHandle runner_handler(runner); | 458 base::ThreadTaskRunnerHandle runner_handler(runner); |
456 net::TestURLFetcherFactory url_fetcher_factory; | 459 net::TestURLFetcherFactory url_fetcher_factory; |
457 | 460 |
458 testing::StrictMock<MockProtocolDelegate> test_delegate; | 461 testing::StrictMock<MockProtocolDelegate> test_delegate; |
(...skipping 13 matching lines...) Expand all Loading... |
472 | 475 |
473 // We should have an URLFetcher at this point in time. | 476 // We should have an URLFetcher at this point in time. |
474 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); | 477 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
475 ValidateUpdateFetcherRequest(url_fetcher); | 478 ValidateUpdateFetcherRequest(url_fetcher); |
476 | 479 |
477 // Go ahead and respond to it. | 480 // Go ahead and respond to it. |
478 url_fetcher->set_status(net::URLRequestStatus()); | 481 url_fetcher->set_status(net::URLRequestStatus()); |
479 url_fetcher->set_response_code(404); | 482 url_fetcher->set_response_code(404); |
480 url_fetcher->SetResponseString(""); | 483 url_fetcher->SetResponseString(""); |
481 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); | 484 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| 485 |
| 486 EXPECT_TRUE(pm->IsUpdateScheduled()); |
482 } | 487 } |
483 | 488 |
484 // Tests what happens when there is an error with the connection. | 489 // Tests what happens when there is an error with the connection. |
485 TEST_F(SafeBrowsingProtocolManagerTest, UpdateResponseConnectionError) { | 490 TEST_F(SafeBrowsingProtocolManagerTest, UpdateResponseConnectionError) { |
486 scoped_refptr<ImmediateSingleThreadTaskRunner> runner( | 491 scoped_refptr<ImmediateSingleThreadTaskRunner> runner( |
487 new ImmediateSingleThreadTaskRunner()); | 492 new ImmediateSingleThreadTaskRunner()); |
488 base::ThreadTaskRunnerHandle runner_handler(runner); | 493 base::ThreadTaskRunnerHandle runner_handler(runner); |
489 net::TestURLFetcherFactory url_fetcher_factory; | 494 net::TestURLFetcherFactory url_fetcher_factory; |
490 | 495 |
491 testing::StrictMock<MockProtocolDelegate> test_delegate; | 496 testing::StrictMock<MockProtocolDelegate> test_delegate; |
(...skipping 12 matching lines...) Expand all Loading... |
504 runner->RunTasks(); | 509 runner->RunTasks(); |
505 | 510 |
506 // We should have an URLFetcher at this point in time. | 511 // We should have an URLFetcher at this point in time. |
507 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); | 512 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
508 ValidateUpdateFetcherRequest(url_fetcher); | 513 ValidateUpdateFetcherRequest(url_fetcher); |
509 | 514 |
510 // Go ahead and respond to it. | 515 // Go ahead and respond to it. |
511 url_fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, | 516 url_fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, |
512 net::ERR_CONNECTION_RESET)); | 517 net::ERR_CONNECTION_RESET)); |
513 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); | 518 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| 519 |
| 520 EXPECT_TRUE(pm->IsUpdateScheduled()); |
514 } | 521 } |
515 | 522 |
516 // Tests what happens when there is a timeout before an update response. | 523 // Tests what happens when there is a timeout before an update response. |
517 TEST_F(SafeBrowsingProtocolManagerTest, UpdateResponseTimeout) { | 524 TEST_F(SafeBrowsingProtocolManagerTest, UpdateResponseTimeout) { |
518 scoped_refptr<ImmediateSingleThreadTaskRunner> runner( | 525 scoped_refptr<ImmediateSingleThreadTaskRunner> runner( |
519 new ImmediateSingleThreadTaskRunner()); | 526 new ImmediateSingleThreadTaskRunner()); |
520 base::ThreadTaskRunnerHandle runner_handler(runner); | 527 base::ThreadTaskRunnerHandle runner_handler(runner); |
521 net::TestURLFetcherFactory url_fetcher_factory; | 528 net::TestURLFetcherFactory url_fetcher_factory; |
522 | 529 |
523 testing::StrictMock<MockProtocolDelegate> test_delegate; | 530 testing::StrictMock<MockProtocolDelegate> test_delegate; |
(...skipping 11 matching lines...) Expand all Loading... |
535 pm->ForceScheduleNextUpdate(base::TimeDelta()); | 542 pm->ForceScheduleNextUpdate(base::TimeDelta()); |
536 runner->RunTasks(); | 543 runner->RunTasks(); |
537 | 544 |
538 // We should have an URLFetcher at this point in time. | 545 // We should have an URLFetcher at this point in time. |
539 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); | 546 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
540 ValidateUpdateFetcherRequest(url_fetcher); | 547 ValidateUpdateFetcherRequest(url_fetcher); |
541 | 548 |
542 // The first time RunTasks is called above, the update timeout timer is not | 549 // The first time RunTasks is called above, the update timeout timer is not |
543 // handled. This call of RunTasks will handle the update. | 550 // handled. This call of RunTasks will handle the update. |
544 runner->RunTasks(); | 551 runner->RunTasks(); |
| 552 |
| 553 EXPECT_TRUE(pm->IsUpdateScheduled()); |
545 } | 554 } |
546 | 555 |
547 // Tests what happens when there is a reset command in the response. | 556 // Tests what happens when there is a reset command in the response. |
548 TEST_F(SafeBrowsingProtocolManagerTest, UpdateResponseReset) { | 557 TEST_F(SafeBrowsingProtocolManagerTest, UpdateResponseReset) { |
549 scoped_refptr<ImmediateSingleThreadTaskRunner> runner( | 558 scoped_refptr<ImmediateSingleThreadTaskRunner> runner( |
550 new ImmediateSingleThreadTaskRunner()); | 559 new ImmediateSingleThreadTaskRunner()); |
551 base::ThreadTaskRunnerHandle runner_handler(runner); | 560 base::ThreadTaskRunnerHandle runner_handler(runner); |
552 net::TestURLFetcherFactory url_fetcher_factory; | 561 net::TestURLFetcherFactory url_fetcher_factory; |
553 | 562 |
554 testing::StrictMock<MockProtocolDelegate> test_delegate; | 563 testing::StrictMock<MockProtocolDelegate> test_delegate; |
555 EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); | 564 EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); |
556 EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( | 565 EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( |
557 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, | 566 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, |
558 std::vector<SBListChunkRanges>(), | 567 std::vector<SBListChunkRanges>(), |
559 false))); | 568 false))); |
560 EXPECT_CALL(test_delegate, ResetDatabase()).Times(1); | 569 EXPECT_CALL(test_delegate, ResetDatabase()).Times(1); |
561 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); | 570 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); |
562 | 571 |
563 scoped_ptr<SafeBrowsingProtocolManager> pm( | 572 scoped_ptr<SafeBrowsingProtocolManager> pm( |
564 CreateProtocolManager(&test_delegate)); | 573 CreateProtocolManager(&test_delegate)); |
565 | 574 |
566 // Kick off initialization. This returns chunks from the DB synchronously. | 575 // Kick off initialization. This returns chunks from the DB synchronously. |
567 pm->ForceScheduleNextUpdate(base::TimeDelta()); | 576 pm->ForceScheduleNextUpdate(base::TimeDelta()); |
568 runner->RunTasks(); | 577 runner->RunTasks(); |
569 | 578 |
570 // We should have an URLFetcher at this point in time. | |
571 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); | 579 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
572 ValidateUpdateFetcherRequest(url_fetcher); | 580 ValidateUpdateFetcherRequest(url_fetcher); |
573 | 581 |
574 // The update response is successful, and has a reset command. | 582 // The update response is successful, and has a reset command. |
575 url_fetcher->set_status(net::URLRequestStatus()); | 583 url_fetcher->set_status(net::URLRequestStatus()); |
576 url_fetcher->set_response_code(200); | 584 url_fetcher->set_response_code(200); |
577 url_fetcher->SetResponseString("r:pleasereset\n"); | 585 url_fetcher->SetResponseString("r:pleasereset\n"); |
578 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); | 586 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
579 } | 587 |
| 588 EXPECT_TRUE(pm->IsUpdateScheduled()); |
| 589 } |
| 590 |
| 591 // Tests a single valid update response, followed by a single redirect response |
| 592 // that has an valid, but empty body. |
| 593 TEST_F(SafeBrowsingProtocolManagerTest, EmptyRedirectResponse) { |
| 594 scoped_refptr<ImmediateSingleThreadTaskRunner> runner( |
| 595 new ImmediateSingleThreadTaskRunner()); |
| 596 base::ThreadTaskRunnerHandle runner_handler(runner); |
| 597 net::TestURLFetcherFactory url_fetcher_factory; |
| 598 |
| 599 testing::StrictMock<MockProtocolDelegate> test_delegate; |
| 600 EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); |
| 601 EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( |
| 602 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, |
| 603 std::vector<SBListChunkRanges>(), |
| 604 false))); |
| 605 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); |
| 606 |
| 607 scoped_ptr<SafeBrowsingProtocolManager> pm( |
| 608 CreateProtocolManager(&test_delegate)); |
| 609 |
| 610 // Kick off initialization. This returns chunks from the DB synchronously. |
| 611 pm->ForceScheduleNextUpdate(base::TimeDelta()); |
| 612 runner->RunTasks(); |
| 613 |
| 614 // The update response contains a single redirect command. |
| 615 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
| 616 ValidateUpdateFetcherRequest(url_fetcher); |
| 617 url_fetcher->set_status(net::URLRequestStatus()); |
| 618 url_fetcher->set_response_code(200); |
| 619 url_fetcher->SetResponseString( |
| 620 "i:goog-phish-shavar\n" |
| 621 "u:redirect-server.example.com/path\n"); |
| 622 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| 623 |
| 624 // The redirect response contains an empty body. |
| 625 net::TestURLFetcher* chunk_url_fetcher = |
| 626 url_fetcher_factory.GetFetcherByID(1); |
| 627 ValidateRedirectFetcherRequest( |
| 628 chunk_url_fetcher, "https://redirect-server.example.com/path"); |
| 629 chunk_url_fetcher->set_status(net::URLRequestStatus()); |
| 630 chunk_url_fetcher->set_response_code(200); |
| 631 chunk_url_fetcher->SetResponseString(""); |
| 632 chunk_url_fetcher->delegate()->OnURLFetchComplete(chunk_url_fetcher); |
| 633 |
| 634 EXPECT_TRUE(pm->IsUpdateScheduled()); |
| 635 } |
| 636 |
| 637 // Tests a single valid update response, followed by a single redirect response |
| 638 // that has an invalid body. |
| 639 TEST_F(SafeBrowsingProtocolManagerTest, InvalidRedirectResponse) { |
| 640 scoped_refptr<ImmediateSingleThreadTaskRunner> runner( |
| 641 new ImmediateSingleThreadTaskRunner()); |
| 642 base::ThreadTaskRunnerHandle runner_handler(runner); |
| 643 net::TestURLFetcherFactory url_fetcher_factory; |
| 644 |
| 645 testing::StrictMock<MockProtocolDelegate> test_delegate; |
| 646 EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); |
| 647 EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( |
| 648 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, |
| 649 std::vector<SBListChunkRanges>(), |
| 650 false))); |
| 651 EXPECT_CALL(test_delegate, UpdateFinished(false)).Times(1); |
| 652 |
| 653 scoped_ptr<SafeBrowsingProtocolManager> pm( |
| 654 CreateProtocolManager(&test_delegate)); |
| 655 |
| 656 // Kick off initialization. This returns chunks from the DB synchronously. |
| 657 pm->ForceScheduleNextUpdate(base::TimeDelta()); |
| 658 runner->RunTasks(); |
| 659 |
| 660 // The update response contains a single redirect command. |
| 661 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
| 662 ValidateUpdateFetcherRequest(url_fetcher); |
| 663 url_fetcher->set_status(net::URLRequestStatus()); |
| 664 url_fetcher->set_response_code(200); |
| 665 url_fetcher->SetResponseString( |
| 666 "i:goog-phish-shavar\n" |
| 667 "u:redirect-server.example.com/path\n"); |
| 668 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| 669 |
| 670 // The redirect response contains an invalid body. |
| 671 net::TestURLFetcher* chunk_url_fetcher = |
| 672 url_fetcher_factory.GetFetcherByID(1); |
| 673 ValidateRedirectFetcherRequest( |
| 674 chunk_url_fetcher, "https://redirect-server.example.com/path"); |
| 675 chunk_url_fetcher->set_status(net::URLRequestStatus()); |
| 676 chunk_url_fetcher->set_response_code(200); |
| 677 chunk_url_fetcher->SetResponseString("THIS IS AN INVALID RESPONSE"); |
| 678 chunk_url_fetcher->delegate()->OnURLFetchComplete(chunk_url_fetcher); |
| 679 |
| 680 EXPECT_TRUE(pm->IsUpdateScheduled()); |
| 681 } |
| 682 |
| 683 // Tests a single valid update response, followed by a single redirect response |
| 684 // containing chunks. |
| 685 TEST_F(SafeBrowsingProtocolManagerTest, SingleRedirectResponseWithChunks) { |
| 686 scoped_refptr<ImmediateSingleThreadTaskRunner> runner( |
| 687 new ImmediateSingleThreadTaskRunner()); |
| 688 base::ThreadTaskRunnerHandle runner_handler(runner); |
| 689 net::TestURLFetcherFactory url_fetcher_factory; |
| 690 |
| 691 testing::StrictMock<MockProtocolDelegate> test_delegate; |
| 692 EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); |
| 693 EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( |
| 694 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, |
| 695 std::vector<SBListChunkRanges>(), |
| 696 false))); |
| 697 EXPECT_CALL(test_delegate, AddChunks("goog-phish-shavar", _, _)).WillOnce( |
| 698 Invoke(HandleAddChunks)); |
| 699 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); |
| 700 |
| 701 scoped_ptr<SafeBrowsingProtocolManager> pm( |
| 702 CreateProtocolManager(&test_delegate)); |
| 703 |
| 704 // Kick off initialization. This returns chunks from the DB synchronously. |
| 705 pm->ForceScheduleNextUpdate(base::TimeDelta()); |
| 706 runner->RunTasks(); |
| 707 |
| 708 // The update response contains a single redirect command. |
| 709 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
| 710 ValidateUpdateFetcherRequest(url_fetcher); |
| 711 url_fetcher->set_status(net::URLRequestStatus()); |
| 712 url_fetcher->set_response_code(200); |
| 713 url_fetcher->SetResponseString( |
| 714 "i:goog-phish-shavar\n" |
| 715 "u:redirect-server.example.com/path\n"); |
| 716 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| 717 |
| 718 // The redirect response contains a single chunk. |
| 719 net::TestURLFetcher* chunk_url_fetcher = |
| 720 url_fetcher_factory.GetFetcherByID(1); |
| 721 ValidateRedirectFetcherRequest( |
| 722 chunk_url_fetcher, "https://redirect-server.example.com/path"); |
| 723 chunk_url_fetcher->set_status(net::URLRequestStatus()); |
| 724 chunk_url_fetcher->set_response_code(200); |
| 725 chunk_url_fetcher->SetResponseString( |
| 726 "a:4:4:9\n" |
| 727 "host\1fdaf"); |
| 728 chunk_url_fetcher->delegate()->OnURLFetchComplete(chunk_url_fetcher); |
| 729 |
| 730 EXPECT_FALSE(pm->IsUpdateScheduled()); |
| 731 |
| 732 // The AddChunksCallback needs to be invoked. |
| 733 runner->RunTasks(); |
| 734 |
| 735 EXPECT_TRUE(pm->IsUpdateScheduled()); |
| 736 } |
| 737 |
| 738 // Tests a single valid update response, followed by multiple redirect responses |
| 739 // containing chunks. |
| 740 TEST_F(SafeBrowsingProtocolManagerTest, MultipleRedirectResponsesWithChunks) { |
| 741 scoped_refptr<ImmediateSingleThreadTaskRunner> runner( |
| 742 new ImmediateSingleThreadTaskRunner()); |
| 743 base::ThreadTaskRunnerHandle runner_handler(runner); |
| 744 net::TestURLFetcherFactory url_fetcher_factory; |
| 745 |
| 746 testing::StrictMock<MockProtocolDelegate> test_delegate; |
| 747 EXPECT_CALL(test_delegate, UpdateStarted()).Times(1); |
| 748 EXPECT_CALL(test_delegate, GetChunks(_)).WillOnce( |
| 749 Invoke(testing::CreateFunctor(InvokeGetChunksCallback, |
| 750 std::vector<SBListChunkRanges>(), |
| 751 false))); |
| 752 EXPECT_CALL(test_delegate, AddChunks("goog-phish-shavar", _, _)). |
| 753 WillRepeatedly(Invoke(HandleAddChunks)); |
| 754 EXPECT_CALL(test_delegate, UpdateFinished(true)).Times(1); |
| 755 |
| 756 scoped_ptr<SafeBrowsingProtocolManager> pm( |
| 757 CreateProtocolManager(&test_delegate)); |
| 758 |
| 759 // Kick off initialization. This returns chunks from the DB synchronously. |
| 760 pm->ForceScheduleNextUpdate(base::TimeDelta()); |
| 761 runner->RunTasks(); |
| 762 |
| 763 // The update response contains multiple redirect commands. |
| 764 net::TestURLFetcher* url_fetcher = url_fetcher_factory.GetFetcherByID(0); |
| 765 ValidateUpdateFetcherRequest(url_fetcher); |
| 766 url_fetcher->set_status(net::URLRequestStatus()); |
| 767 url_fetcher->set_response_code(200); |
| 768 url_fetcher->SetResponseString( |
| 769 "i:goog-phish-shavar\n" |
| 770 "u:redirect-server.example.com/one\n" |
| 771 "u:redirect-server.example.com/two\n"); |
| 772 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| 773 |
| 774 // The first redirect response contains a single chunk. |
| 775 net::TestURLFetcher* first_chunk_url_fetcher = |
| 776 url_fetcher_factory.GetFetcherByID(1); |
| 777 ValidateRedirectFetcherRequest( |
| 778 first_chunk_url_fetcher, "https://redirect-server.example.com/one"); |
| 779 first_chunk_url_fetcher->set_status(net::URLRequestStatus()); |
| 780 first_chunk_url_fetcher->set_response_code(200); |
| 781 first_chunk_url_fetcher->SetResponseString( |
| 782 "a:4:4:9\n" |
| 783 "host\1aaaa"); |
| 784 first_chunk_url_fetcher->delegate()->OnURLFetchComplete( |
| 785 first_chunk_url_fetcher); |
| 786 |
| 787 // Invoke the AddChunksCallback to trigger the second request. |
| 788 runner->RunTasks(); |
| 789 |
| 790 EXPECT_FALSE(pm->IsUpdateScheduled()); |
| 791 |
| 792 // The second redirect response contains a single chunk. |
| 793 net::TestURLFetcher* second_chunk_url_fetcher = |
| 794 url_fetcher_factory.GetFetcherByID(2); |
| 795 ValidateRedirectFetcherRequest( |
| 796 second_chunk_url_fetcher, "https://redirect-server.example.com/two"); |
| 797 second_chunk_url_fetcher->set_status(net::URLRequestStatus()); |
| 798 second_chunk_url_fetcher->set_response_code(200); |
| 799 second_chunk_url_fetcher->SetResponseString( |
| 800 "a:5:4:9\n" |
| 801 "host\1bbbb"); |
| 802 second_chunk_url_fetcher->delegate()->OnURLFetchComplete( |
| 803 second_chunk_url_fetcher); |
| 804 |
| 805 EXPECT_FALSE(pm->IsUpdateScheduled()); |
| 806 |
| 807 // Invoke the AddChunksCallback to finish the update. |
| 808 runner->RunTasks(); |
| 809 |
| 810 EXPECT_TRUE(pm->IsUpdateScheduled()); |
| 811 } |
OLD | NEW |