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

Side by Side Diff: chrome/browser/safe_browsing/protocol_manager_unittest.cc

Issue 11419041: Add tests for redirect responses from SafeBrowsingProtocolManager. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge Created 8 years 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 | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698