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

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

Issue 42553002: Mostly integrate new malware IP blacklist with the csd client. When (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | 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 #include "base/files/file_path.h" 5 #include "base/files/file_path.h"
6 #include "base/memory/ref_counted.h" 6 #include "base/memory/ref_counted.h"
7 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
8 #include "base/run_loop.h" 8 #include "base/run_loop.h"
9 #include "base/strings/stringprintf.h" 9 #include "base/strings/stringprintf.h"
10 #include "base/synchronization/waitable_event.h" 10 #include "base/synchronization/waitable_event.h"
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 private: 132 private:
133 DISALLOW_COPY_AND_ASSIGN(MockSafeBrowsingUIManager); 133 DISALLOW_COPY_AND_ASSIGN(MockSafeBrowsingUIManager);
134 }; 134 };
135 135
136 class MockSafeBrowsingDatabaseManager : public SafeBrowsingDatabaseManager { 136 class MockSafeBrowsingDatabaseManager : public SafeBrowsingDatabaseManager {
137 public: 137 public:
138 explicit MockSafeBrowsingDatabaseManager(SafeBrowsingService* service) 138 explicit MockSafeBrowsingDatabaseManager(SafeBrowsingService* service)
139 : SafeBrowsingDatabaseManager(service) { } 139 : SafeBrowsingDatabaseManager(service) { }
140 140
141 MOCK_METHOD1(MatchCsdWhitelistUrl, bool(const GURL&)); 141 MOCK_METHOD1(MatchCsdWhitelistUrl, bool(const GURL&));
142 MOCK_METHOD1(MatchMalwareIP, bool(const std::string& ip_address));
142 143
143 protected: 144 protected:
144 virtual ~MockSafeBrowsingDatabaseManager() {} 145 virtual ~MockSafeBrowsingDatabaseManager() {}
145 146
146 private: 147 private:
147 DISALLOW_COPY_AND_ASSIGN(MockSafeBrowsingDatabaseManager); 148 DISALLOW_COPY_AND_ASSIGN(MockSafeBrowsingDatabaseManager);
148 }; 149 };
149 150
150 class MockTestingProfile : public TestingProfile { 151 class MockTestingProfile : public TestingProfile {
151 public: 152 public:
152 MockTestingProfile() {} 153 MockTestingProfile() {}
153 virtual ~MockTestingProfile() {} 154 virtual ~MockTestingProfile() {}
154 155
155 MOCK_CONST_METHOD0(IsOffTheRecord, bool()); 156 MOCK_CONST_METHOD0(IsOffTheRecord, bool());
156 }; 157 };
157 158
158 class MockBrowserFeatureExtractor : public BrowserFeatureExtractor { 159 class MockBrowserFeatureExtractor : public BrowserFeatureExtractor {
159 public: 160 public:
160 explicit MockBrowserFeatureExtractor( 161 explicit MockBrowserFeatureExtractor(
161 WebContents* tab, 162 WebContents* tab,
162 ClientSideDetectionService* service) 163 ClientSideDetectionHost* host)
163 : BrowserFeatureExtractor(tab, service) {} 164 : BrowserFeatureExtractor(tab, host) {}
164 virtual ~MockBrowserFeatureExtractor() {} 165 virtual ~MockBrowserFeatureExtractor() {}
165 166
166 MOCK_METHOD3(ExtractFeatures, 167 MOCK_METHOD3(ExtractFeatures,
167 void(const BrowseInfo* info, 168 void(const BrowseInfo*,
168 ClientPhishingRequest*, 169 ClientPhishingRequest*,
169 const BrowserFeatureExtractor::DoneCallback&)); 170 const BrowserFeatureExtractor::DoneCallback&));
170 171
171 MOCK_METHOD2(ExtractMalwareFeatures, 172 MOCK_METHOD3(ExtractMalwareFeatures,
172 void(const BrowseInfo* info, 173 void(const BrowseInfo&,
173 ClientMalwareRequest*)); 174 ClientMalwareRequest*,
175 const BrowserFeatureExtractor::MalwareDoneCallback&));
174 }; 176 };
175 177
176 } // namespace 178 } // namespace
177 179
178 class ClientSideDetectionHostTest : public ChromeRenderViewHostTestHarness { 180 class ClientSideDetectionHostTest : public ChromeRenderViewHostTestHarness {
179 public: 181 public:
180 typedef SafeBrowsingUIManager::UnsafeResource UnsafeResource; 182 typedef SafeBrowsingUIManager::UnsafeResource UnsafeResource;
181 183
182 virtual void SetUp() { 184 virtual void SetUp() {
183 ChromeRenderViewHostTestHarness::SetUp(); 185 ChromeRenderViewHostTestHarness::SetUp();
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 // Crashes on Blink canary bots: http://crbug.com/299149 327 // Crashes on Blink canary bots: http://crbug.com/299149
326 TEST_F(ClientSideDetectionHostTest, 328 TEST_F(ClientSideDetectionHostTest,
327 DISABLED_OnPhishingDetectionDoneInvalidVerdict) { 329 DISABLED_OnPhishingDetectionDoneInvalidVerdict) {
328 #else 330 #else
329 TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneInvalidVerdict) { 331 TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneInvalidVerdict) {
330 #endif 332 #endif
331 // Case 0: renderer sends an invalid verdict string that we're unable to 333 // Case 0: renderer sends an invalid verdict string that we're unable to
332 // parse. 334 // parse.
333 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor( 335 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor(
334 web_contents(), 336 web_contents(),
335 csd_service_.get()); 337 csd_host_.get());
336 SetFeatureExtractor(mock_extractor); // The host class takes ownership. 338 SetFeatureExtractor(mock_extractor); // The host class takes ownership.
337 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)).Times(0); 339 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)).Times(0);
338 OnPhishingDetectionDone("Invalid Protocol Buffer"); 340 OnPhishingDetectionDone("Invalid Protocol Buffer");
339 EXPECT_TRUE(Mock::VerifyAndClear(mock_extractor)); 341 EXPECT_TRUE(Mock::VerifyAndClear(mock_extractor));
340 } 342 }
341 343
342 TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneNotPhishing) { 344 TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneNotPhishing) {
343 // Case 1: client thinks the page is phishing. The server does not agree. 345 // Case 1: client thinks the page is phishing. The server does not agree.
344 // No interstitial is shown. 346 // No interstitial is shown.
345 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor( 347 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor(
346 web_contents(), 348 web_contents(),
347 csd_service_.get()); 349 csd_host_.get());
348 SetFeatureExtractor(mock_extractor); // The host class takes ownership. 350 SetFeatureExtractor(mock_extractor); // The host class takes ownership.
349 351
350 ClientSideDetectionService::ClientReportPhishingRequestCallback cb; 352 ClientSideDetectionService::ClientReportPhishingRequestCallback cb;
351 ClientPhishingRequest verdict; 353 ClientPhishingRequest verdict;
352 verdict.set_url("http://phishingurl.com/"); 354 verdict.set_url("http://phishingurl.com/");
353 verdict.set_client_score(1.0f); 355 verdict.set_client_score(1.0f);
354 verdict.set_is_phishing(true); 356 verdict.set_is_phishing(true);
355 357
356 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)) 358 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _))
357 .WillOnce(DoAll(DeleteArg<1>(), 359 .WillOnce(DoAll(DeleteArg<1>(),
358 InvokeCallbackArgument<2>(true, &verdict))); 360 InvokeCallbackArgument<2>(true, &verdict)));
359 EXPECT_CALL(*csd_service_, 361 EXPECT_CALL(*csd_service_,
360 SendClientReportPhishingRequest( 362 SendClientReportPhishingRequest(
361 Pointee(PartiallyEqualVerdict(verdict)), _)) 363 Pointee(PartiallyEqualVerdict(verdict)), _))
362 .WillOnce(SaveArg<1>(&cb)); 364 .WillOnce(SaveArg<1>(&cb));
363 OnPhishingDetectionDone(verdict.SerializeAsString()); 365 OnPhishingDetectionDone(verdict.SerializeAsString());
364 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); 366 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get()));
365 ASSERT_FALSE(cb.is_null()); 367 ASSERT_FALSE(cb.is_null());
366 368
367 // Make sure DoDisplayBlockingPage is not going to be called. 369 // Make sure DoDisplayBlockingPage is not going to be called.
368 EXPECT_CALL(*ui_manager_.get(), DoDisplayBlockingPage(_)).Times(0); 370 EXPECT_CALL(*ui_manager_.get(), DoDisplayBlockingPage(_)).Times(0);
369 cb.Run(GURL(verdict.url()), false); 371 cb.Run(GURL(verdict.url()), false);
370 base::RunLoop().RunUntilIdle(); 372 base::RunLoop().RunUntilIdle();
371 EXPECT_TRUE(Mock::VerifyAndClear(ui_manager_.get())); 373 EXPECT_TRUE(Mock::VerifyAndClear(ui_manager_.get()));
372 } 374 }
373 375
374 TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneDisabled) { 376 TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneDisabled) {
375 // Case 2: client thinks the page is phishing and so does the server but 377 // Case 2: client thinks the page is phishing and so does the server but
376 // showing the interstitial is disabled => no interstitial is shown. 378 // showing the interstitial is disabled => no interstitial is shown.
377 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor( 379 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor(
378 web_contents(), 380 web_contents(),
379 csd_service_.get()); 381 csd_host_.get());
380 SetFeatureExtractor(mock_extractor); // The host class takes ownership. 382 SetFeatureExtractor(mock_extractor); // The host class takes ownership.
381 383
382 ClientSideDetectionService::ClientReportPhishingRequestCallback cb; 384 ClientSideDetectionService::ClientReportPhishingRequestCallback cb;
383 ClientPhishingRequest verdict; 385 ClientPhishingRequest verdict;
384 verdict.set_url("http://phishingurl.com/"); 386 verdict.set_url("http://phishingurl.com/");
385 verdict.set_client_score(1.0f); 387 verdict.set_client_score(1.0f);
386 verdict.set_is_phishing(true); 388 verdict.set_is_phishing(true);
387 389
388 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)) 390 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _))
389 .WillOnce(DoAll(DeleteArg<1>(), 391 .WillOnce(DoAll(DeleteArg<1>(),
390 InvokeCallbackArgument<2>(true, &verdict))); 392 InvokeCallbackArgument<2>(true, &verdict)));
391 EXPECT_CALL(*csd_service_, 393 EXPECT_CALL(*csd_service_,
392 SendClientReportPhishingRequest( 394 SendClientReportPhishingRequest(
393 Pointee(PartiallyEqualVerdict(verdict)), _)) 395 Pointee(PartiallyEqualVerdict(verdict)), _))
394 .WillOnce(SaveArg<1>(&cb)); 396 .WillOnce(SaveArg<1>(&cb));
395 OnPhishingDetectionDone(verdict.SerializeAsString()); 397 OnPhishingDetectionDone(verdict.SerializeAsString());
396 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); 398 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get()));
397 ASSERT_FALSE(cb.is_null()); 399 ASSERT_FALSE(cb.is_null());
398 400
399 // Make sure DoDisplayBlockingPage is not going to be called. 401 // Make sure DoDisplayBlockingPage is not going to be called.
400 EXPECT_CALL(*ui_manager_.get(), DoDisplayBlockingPage(_)).Times(0); 402 EXPECT_CALL(*ui_manager_.get(), DoDisplayBlockingPage(_)).Times(0);
401 cb.Run(GURL(verdict.url()), false); 403 cb.Run(GURL(verdict.url()), false);
402 base::RunLoop().RunUntilIdle(); 404 base::RunLoop().RunUntilIdle();
403 EXPECT_TRUE(Mock::VerifyAndClear(ui_manager_.get())); 405 EXPECT_TRUE(Mock::VerifyAndClear(ui_manager_.get()));
404 } 406 }
405 407
406 TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneShowInterstitial) { 408 TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneShowInterstitial) {
407 // Case 3: client thinks the page is phishing and so does the server. 409 // Case 3: client thinks the page is phishing and so does the server.
408 // We show an interstitial. 410 // We show an interstitial.
409 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor( 411 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor(
410 web_contents(), 412 web_contents(),
411 csd_service_.get()); 413 csd_host_.get());
412 SetFeatureExtractor(mock_extractor); // The host class takes ownership. 414 SetFeatureExtractor(mock_extractor); // The host class takes ownership.
413 415
414 ClientSideDetectionService::ClientReportPhishingRequestCallback cb; 416 ClientSideDetectionService::ClientReportPhishingRequestCallback cb;
415 GURL phishing_url("http://phishingurl.com/"); 417 GURL phishing_url("http://phishingurl.com/");
416 ClientPhishingRequest verdict; 418 ClientPhishingRequest verdict;
417 verdict.set_url(phishing_url.spec()); 419 verdict.set_url(phishing_url.spec());
418 verdict.set_client_score(1.0f); 420 verdict.set_client_score(1.0f);
419 verdict.set_is_phishing(true); 421 verdict.set_is_phishing(true);
420 422
421 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)) 423 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _))
422 .WillOnce(DoAll(DeleteArg<1>(), 424 .WillOnce(DoAll(DeleteArg<1>(),
423 InvokeCallbackArgument<2>(true, &verdict))); 425 InvokeCallbackArgument<2>(true, &verdict)));
424 EXPECT_CALL(*csd_service_, 426 EXPECT_CALL(*csd_service_,
425 SendClientReportPhishingRequest( 427 SendClientReportPhishingRequest(
426 Pointee(PartiallyEqualVerdict(verdict)), _)) 428 Pointee(PartiallyEqualVerdict(verdict)), _))
427 .WillOnce(SaveArg<1>(&cb)); 429 .WillOnce(SaveArg<1>(&cb));
428 OnPhishingDetectionDone(verdict.SerializeAsString()); 430 OnPhishingDetectionDone(verdict.SerializeAsString());
431 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get()));
429 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); 432 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get()));
430 ASSERT_FALSE(cb.is_null()); 433 ASSERT_FALSE(cb.is_null());
431 434
432 UnsafeResource resource; 435 UnsafeResource resource;
433 EXPECT_CALL(*ui_manager_.get(), DoDisplayBlockingPage(_)) 436 EXPECT_CALL(*ui_manager_.get(), DoDisplayBlockingPage(_))
434 .WillOnce(SaveArg<0>(&resource)); 437 .WillOnce(SaveArg<0>(&resource));
435 cb.Run(phishing_url, true); 438 cb.Run(phishing_url, true);
436 439
437 base::RunLoop().RunUntilIdle(); 440 base::RunLoop().RunUntilIdle();
438 EXPECT_TRUE(Mock::VerifyAndClear(ui_manager_.get())); 441 EXPECT_TRUE(Mock::VerifyAndClear(ui_manager_.get()));
(...skipping 15 matching lines...) Expand all
454 } 457 }
455 458
456 TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneMultiplePings) { 459 TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneMultiplePings) {
457 // Case 4 & 5: client thinks a page is phishing then navigates to 460 // Case 4 & 5: client thinks a page is phishing then navigates to
458 // another page which is also considered phishing by the client 461 // another page which is also considered phishing by the client
459 // before the server responds with a verdict. After a while the 462 // before the server responds with a verdict. After a while the
460 // server responds for both requests with a phishing verdict. Only 463 // server responds for both requests with a phishing verdict. Only
461 // a single interstitial is shown for the second URL. 464 // a single interstitial is shown for the second URL.
462 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor( 465 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor(
463 web_contents(), 466 web_contents(),
464 csd_service_.get()); 467 csd_host_.get());
465 SetFeatureExtractor(mock_extractor); // The host class takes ownership. 468 SetFeatureExtractor(mock_extractor); // The host class takes ownership.
466 469
467 ClientSideDetectionService::ClientReportPhishingRequestCallback cb; 470 ClientSideDetectionService::ClientReportPhishingRequestCallback cb;
468 GURL phishing_url("http://phishingurl.com/"); 471 GURL phishing_url("http://phishingurl.com/");
469 ClientPhishingRequest verdict; 472 ClientPhishingRequest verdict;
470 verdict.set_url(phishing_url.spec()); 473 verdict.set_url(phishing_url.spec());
471 verdict.set_client_score(1.0f); 474 verdict.set_client_score(1.0f);
472 verdict.set_is_phishing(true); 475 verdict.set_is_phishing(true);
473 476
474 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)) 477 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _))
475 .WillOnce(DoAll(DeleteArg<1>(), 478 .WillOnce(DoAll(DeleteArg<1>(),
476 InvokeCallbackArgument<2>(true, &verdict))); 479 InvokeCallbackArgument<2>(true, &verdict)));
477 EXPECT_CALL(*csd_service_, 480 EXPECT_CALL(*csd_service_,
478 SendClientReportPhishingRequest( 481 SendClientReportPhishingRequest(
479 Pointee(PartiallyEqualVerdict(verdict)), _)) 482 Pointee(PartiallyEqualVerdict(verdict)), _))
480 .WillOnce(SaveArg<1>(&cb)); 483 .WillOnce(SaveArg<1>(&cb));
481 OnPhishingDetectionDone(verdict.SerializeAsString()); 484 OnPhishingDetectionDone(verdict.SerializeAsString());
485 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get()));
482 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); 486 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get()));
483 ASSERT_FALSE(cb.is_null()); 487 ASSERT_FALSE(cb.is_null());
484 488
485 // Set this back to a normal browser feature extractor since we're using 489 // Set this back to a normal browser feature extractor since we're using
486 // NavigateAndCommit() and it's easier to use the real thing than setting up 490 // NavigateAndCommit() and it's easier to use the real thing than setting up
487 // mock expectations. 491 // mock expectations.
488 SetFeatureExtractor(new BrowserFeatureExtractor(web_contents(), 492 SetFeatureExtractor(new BrowserFeatureExtractor(web_contents(),
489 csd_service_.get())); 493 csd_host_.get()));
490 GURL other_phishing_url("http://other_phishing_url.com/bla"); 494 GURL other_phishing_url("http://other_phishing_url.com/bla");
491 ExpectPreClassificationChecks(other_phishing_url, &kFalse, &kFalse, &kFalse, 495 ExpectPreClassificationChecks(other_phishing_url, &kFalse, &kFalse, &kFalse,
492 &kFalse, &kFalse, &kFalse); 496 &kFalse, &kFalse, &kFalse);
493 // We navigate away. The callback cb should be revoked. 497 // We navigate away. The callback cb should be revoked.
494 NavigateAndCommit(other_phishing_url); 498 NavigateAndCommit(other_phishing_url);
495 // Wait for the pre-classification checks to finish for other_phishing_url. 499 // Wait for the pre-classification checks to finish for other_phishing_url.
496 WaitAndCheckPreClassificationChecks(); 500 WaitAndCheckPreClassificationChecks();
497 501
498 ClientSideDetectionService::ClientReportPhishingRequestCallback cb_other; 502 ClientSideDetectionService::ClientReportPhishingRequestCallback cb_other;
499 verdict.set_url(other_phishing_url.spec()); 503 verdict.set_url(other_phishing_url.spec());
500 verdict.set_client_score(0.8f); 504 verdict.set_client_score(0.8f);
501 EXPECT_CALL(*csd_service_, 505 EXPECT_CALL(*csd_service_,
502 SendClientReportPhishingRequest( 506 SendClientReportPhishingRequest(
503 Pointee(PartiallyEqualVerdict(verdict)), _)) 507 Pointee(PartiallyEqualVerdict(verdict)), _))
504 .WillOnce(DoAll(DeleteArg<0>(), 508 .WillOnce(DoAll(DeleteArg<0>(),
505 SaveArg<1>(&cb_other), 509 SaveArg<1>(&cb_other),
506 QuitUIMessageLoop())); 510 QuitUIMessageLoop()));
507 std::vector<GURL> redirect_chain; 511 std::vector<GURL> redirect_chain;
508 redirect_chain.push_back(other_phishing_url); 512 redirect_chain.push_back(other_phishing_url);
509 SetRedirectChain(redirect_chain); 513 SetRedirectChain(redirect_chain);
510 OnPhishingDetectionDone(verdict.SerializeAsString()); 514 OnPhishingDetectionDone(verdict.SerializeAsString());
511 base::MessageLoop::current()->Run(); 515 base::MessageLoop::current()->Run();
516 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get()));
512 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); 517 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get()));
513 ASSERT_FALSE(cb_other.is_null()); 518 ASSERT_FALSE(cb_other.is_null());
514 519
515 // We expect that the interstitial is shown for the second phishing URL and 520 // We expect that the interstitial is shown for the second phishing URL and
516 // not for the first phishing URL. 521 // not for the first phishing URL.
517 UnsafeResource resource; 522 UnsafeResource resource;
518 EXPECT_CALL(*ui_manager_.get(), DoDisplayBlockingPage(_)) 523 EXPECT_CALL(*ui_manager_.get(), DoDisplayBlockingPage(_))
519 .WillOnce(SaveArg<0>(&resource)); 524 .WillOnce(SaveArg<0>(&resource));
520 525
521 cb.Run(phishing_url, true); // Should have no effect. 526 cb.Run(phishing_url, true); // Should have no effect.
(...skipping 16 matching lines...) Expand all
538 FROM_HERE, 543 FROM_HERE,
539 base::Bind(&MockSafeBrowsingUIManager::InvokeOnBlockingPageComplete, 544 base::Bind(&MockSafeBrowsingUIManager::InvokeOnBlockingPageComplete,
540 ui_manager_, resource.callback)); 545 ui_manager_, resource.callback));
541 } 546 }
542 547
543 TEST_F(ClientSideDetectionHostTest, 548 TEST_F(ClientSideDetectionHostTest,
544 OnPhishingDetectionDoneVerdictNotPhishing) { 549 OnPhishingDetectionDoneVerdictNotPhishing) {
545 // Case 6: renderer sends a verdict string that isn't phishing. 550 // Case 6: renderer sends a verdict string that isn't phishing.
546 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor( 551 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor(
547 web_contents(), 552 web_contents(),
548 csd_service_.get()); 553 csd_host_.get());
549 SetFeatureExtractor(mock_extractor); // The host class takes ownership. 554 SetFeatureExtractor(mock_extractor); // The host class takes ownership.
550 555
551 ClientPhishingRequest verdict; 556 ClientPhishingRequest verdict;
552 verdict.set_url("http://not-phishing.com/"); 557 verdict.set_url("http://not-phishing.com/");
553 verdict.set_client_score(0.1f); 558 verdict.set_client_score(0.1f);
554 verdict.set_is_phishing(false); 559 verdict.set_is_phishing(false);
555 560
556 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)).Times(0); 561 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)).Times(0);
557 OnPhishingDetectionDone(verdict.SerializeAsString()); 562 OnPhishingDetectionDone(verdict.SerializeAsString());
558 EXPECT_TRUE(Mock::VerifyAndClear(mock_extractor)); 563 EXPECT_TRUE(Mock::VerifyAndClear(mock_extractor));
(...skipping 18 matching lines...) Expand all
577 582
578 EXPECT_CALL(*csd_service_, 583 EXPECT_CALL(*csd_service_,
579 SendClientReportPhishingRequest( 584 SendClientReportPhishingRequest(
580 Pointee(PartiallyEqualVerdict(verdict)), CallbackIsNull())) 585 Pointee(PartiallyEqualVerdict(verdict)), CallbackIsNull()))
581 .WillOnce(DoAll(DeleteArg<0>(), QuitUIMessageLoop())); 586 .WillOnce(DoAll(DeleteArg<0>(), QuitUIMessageLoop()));
582 std::vector<GURL> redirect_chain; 587 std::vector<GURL> redirect_chain;
583 redirect_chain.push_back(url); 588 redirect_chain.push_back(url);
584 SetRedirectChain(redirect_chain); 589 SetRedirectChain(redirect_chain);
585 OnPhishingDetectionDone(verdict.SerializeAsString()); 590 OnPhishingDetectionDone(verdict.SerializeAsString());
586 base::MessageLoop::current()->Run(); 591 base::MessageLoop::current()->Run();
587 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); 592 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get()));
588 } 593 }
589 594
590 TEST_F(ClientSideDetectionHostTest, UpdateIPUrlMap) { 595 TEST_F(ClientSideDetectionHostTest, UpdateIPUrlMap) {
591 BrowseInfo* browse_info = GetBrowseInfo(); 596 BrowseInfo* browse_info = GetBrowseInfo();
592 597
593 // Empty IP or host are skipped 598 // Empty IP or host are skipped
594 UpdateIPUrlMap("250.10.10.10", std::string()); 599 UpdateIPUrlMap("250.10.10.10", std::string());
595 ASSERT_EQ(0U, browse_info->ips.size()); 600 ASSERT_EQ(0U, browse_info->ips.size());
596 UpdateIPUrlMap(std::string(), "http://google.com/a"); 601 UpdateIPUrlMap(std::string(), "http://google.com/a");
597 ASSERT_EQ(0U, browse_info->ips.size()); 602 ASSERT_EQ(0U, browse_info->ips.size());
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 expected_urls.insert("more.com/"); 644 expected_urls.insert("more.com/");
640 EXPECT_EQ(expected_urls, browse_info->ips["100.100.100.256"]); 645 EXPECT_EQ(expected_urls, browse_info->ips["100.100.100.256"]);
641 } 646 }
642 647
643 TEST_F(ClientSideDetectionHostTest, 648 TEST_F(ClientSideDetectionHostTest,
644 OnPhishingDetectionDoneVerdictNotPhishingNotMalwareIP) { 649 OnPhishingDetectionDoneVerdictNotPhishingNotMalwareIP) {
645 // Case 7: renderer sends a verdict string that isn't phishing and not matches 650 // Case 7: renderer sends a verdict string that isn't phishing and not matches
646 // malware bad IP list 651 // malware bad IP list
647 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor( 652 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor(
648 web_contents(), 653 web_contents(),
649 csd_service_.get()); 654 csd_host_.get());
650 SetFeatureExtractor(mock_extractor); // The host class takes ownership. 655 SetFeatureExtractor(mock_extractor); // The host class takes ownership.
651 656
652 ClientPhishingRequest verdict; 657 ClientPhishingRequest verdict;
653 verdict.set_url("http://not-phishing.com/"); 658 verdict.set_url("http://not-phishing.com/");
654 verdict.set_client_score(0.1f); 659 verdict.set_client_score(0.1f);
655 verdict.set_is_phishing(false); 660 verdict.set_is_phishing(false);
656 661
657 ClientMalwareRequest malware_verdict; 662 ClientMalwareRequest malware_verdict;
658 malware_verdict.set_url("http://not-phishing.com/"); 663 malware_verdict.set_url("http://not-phishing.com/");
659 664
660 EXPECT_CALL(*mock_extractor, ExtractMalwareFeatures(_, _)) 665 // That is a special case. If there were no IP matches or if feature
661 .WillOnce(SetArgumentPointee<1>(malware_verdict)); 666 // extraction failed the callback will delete the malware_verdict.
667 EXPECT_CALL(*mock_extractor, ExtractMalwareFeatures(_, _, _))
668 .WillOnce(DoAll(
669 DeleteArg<1>(),
670 InvokeCallbackArgument<2>(
671 true,
672 new ClientMalwareRequest(malware_verdict))));
662 EXPECT_CALL(*csd_service_, 673 EXPECT_CALL(*csd_service_,
663 SendClientReportMalwareRequest(_, _)).Times(0); 674 SendClientReportMalwareRequest(_, _)).Times(0);
664 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)).Times(0); 675 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)).Times(0);
665 676
666 OnPhishingDetectionDone(verdict.SerializeAsString()); 677 OnPhishingDetectionDone(verdict.SerializeAsString());
667 EXPECT_TRUE(Mock::VerifyAndClear(mock_extractor)); 678 EXPECT_TRUE(Mock::VerifyAndClear(mock_extractor));
668 } 679 }
669 680
670 TEST_F(ClientSideDetectionHostTest, 681 TEST_F(ClientSideDetectionHostTest,
671 OnPhishingDetectionDoneVerdictNotPhishingButMalwareIP) { 682 OnPhishingDetectionDoneVerdictNotPhishingButMalwareIP) {
672 // Case 8: renderer sends a verdict string that isn't phishing but matches 683 // Case 8: renderer sends a verdict string that isn't phishing but matches
673 // malware bad IP list 684 // malware bad IP list
674 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor( 685 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor(
675 web_contents(), 686 web_contents(),
676 csd_service_.get()); 687 csd_host_.get());
677 SetFeatureExtractor(mock_extractor); // The host class takes ownership. 688 SetFeatureExtractor(mock_extractor); // The host class takes ownership.
678 689
679 ClientPhishingRequest verdict; 690 ClientPhishingRequest verdict;
680 verdict.set_url("http://not-phishing.com/"); 691 verdict.set_url("http://not-phishing.com/");
681 verdict.set_client_score(0.1f); 692 verdict.set_client_score(0.1f);
682 verdict.set_is_phishing(false); 693 verdict.set_is_phishing(false);
683 694
684 ClientMalwareRequest malware_verdict; 695 ClientMalwareRequest malware_verdict;
685 malware_verdict.set_url("http://not-phishing.com/"); 696 malware_verdict.set_url("http://not-phishing.com/");
686 ClientMalwareRequest::Feature* feature = malware_verdict.add_feature_map(); 697 ClientMalwareRequest::Feature* feature = malware_verdict.add_feature_map();
687 feature->set_name("malwareip1.2.3.4"); 698 feature->set_name("malwareip1.2.3.4");
688 feature->set_value(1.0); 699 feature->set_value(1.0);
689 feature->add_metainfo("badip.com"); 700 feature->add_metainfo("badip.com");
690 701
691 EXPECT_CALL(*mock_extractor, ExtractMalwareFeatures(_, _)) 702 EXPECT_CALL(*mock_extractor, ExtractMalwareFeatures(_, _, _))
692 .WillOnce(SetArgumentPointee<1>(malware_verdict)); 703 .WillOnce(DoAll(DeleteArg<1>(),
704 InvokeCallbackArgument<2>(true, &malware_verdict)));
693 EXPECT_CALL(*csd_service_, 705 EXPECT_CALL(*csd_service_,
694 SendClientReportMalwareRequest( 706 SendClientReportMalwareRequest(
695 Pointee(PartiallyEqualMalwareVerdict(malware_verdict)), _)) 707 Pointee(PartiallyEqualMalwareVerdict(malware_verdict)), _))
696 .WillOnce(DeleteArg<0>()); 708 .Times(1);
697 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)).Times(0); 709 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)).Times(0);
698 710
699 OnPhishingDetectionDone(verdict.SerializeAsString()); 711 OnPhishingDetectionDone(verdict.SerializeAsString());
700 EXPECT_TRUE(Mock::VerifyAndClear(mock_extractor)); 712 EXPECT_TRUE(Mock::VerifyAndClear(mock_extractor));
701 } 713 }
702 714
703 TEST_F(ClientSideDetectionHostTest, 715 TEST_F(ClientSideDetectionHostTest,
704 OnPhishingDetectionDoneVerdictPhishingAndMalwareIP) { 716 OnPhishingDetectionDoneVerdictPhishingAndMalwareIP) {
705 // Case 9: renderer sends a verdict string that is phishing and matches 717 // Case 9: renderer sends a verdict string that is phishing and matches
706 // malware bad IP list 718 // malware bad IP list
707 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor( 719 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor(
708 web_contents(), 720 web_contents(),
709 csd_service_.get()); 721 csd_host_.get());
710 SetFeatureExtractor(mock_extractor); // The host class takes ownership. 722 SetFeatureExtractor(mock_extractor); // The host class takes ownership.
711 723
712 ClientSideDetectionService::ClientReportPhishingRequestCallback cb; 724 ClientSideDetectionService::ClientReportPhishingRequestCallback cb;
713 ClientPhishingRequest verdict; 725 ClientPhishingRequest verdict;
714 verdict.set_url("http://not-phishing.com/"); 726 verdict.set_url("http://not-phishing.com/");
715 verdict.set_client_score(0.1f); 727 verdict.set_client_score(0.1f);
716 verdict.set_is_phishing(true); 728 verdict.set_is_phishing(true);
717 729
718 ClientMalwareRequest malware_verdict; 730 ClientMalwareRequest malware_verdict;
719 malware_verdict.set_url("http://not-phishing.com/"); 731 malware_verdict.set_url("http://not-phishing.com/");
720 ClientMalwareRequest::Feature* feature = malware_verdict.add_feature_map(); 732 ClientMalwareRequest::Feature* feature = malware_verdict.add_feature_map();
721 feature->set_name("malwareip1.2.3.4"); 733 feature->set_name("malwareip1.2.3.4");
722 feature->set_value(1.0); 734 feature->set_value(1.0);
723 feature->add_metainfo("badip.com"); 735 feature->add_metainfo("badip.com");
724 736
725 EXPECT_CALL(*mock_extractor, ExtractMalwareFeatures(_, _)) 737 EXPECT_CALL(*mock_extractor, ExtractMalwareFeatures(_, _, _))
726 .WillOnce(SetArgumentPointee<1>(malware_verdict)); 738 .WillOnce(DoAll(DeleteArg<1>(),
739 InvokeCallbackArgument<2>(true, &malware_verdict)));
727 EXPECT_CALL(*csd_service_, 740 EXPECT_CALL(*csd_service_,
728 SendClientReportMalwareRequest( 741 SendClientReportMalwareRequest(
729 Pointee(PartiallyEqualMalwareVerdict(malware_verdict)), _)) 742 Pointee(PartiallyEqualMalwareVerdict(malware_verdict)), _))
730 .WillOnce(DeleteArg<0>()); 743 .Times(1);
731 744
732 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)) 745 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _))
733 .WillOnce(DoAll(DeleteArg<1>(), 746 .WillOnce(DoAll(DeleteArg<1>(),
734 InvokeCallbackArgument<2>(true, &verdict))); 747 InvokeCallbackArgument<2>(true, &verdict)));
735 748
736 EXPECT_CALL(*csd_service_, 749 EXPECT_CALL(*csd_service_,
737 SendClientReportPhishingRequest( 750 SendClientReportPhishingRequest(
738 Pointee(PartiallyEqualVerdict(verdict)), _)) 751 Pointee(PartiallyEqualVerdict(verdict)), _))
739 .WillOnce(SaveArg<1>(&cb)); 752 .WillOnce(SaveArg<1>(&cb));
740 OnPhishingDetectionDone(verdict.SerializeAsString()); 753 OnPhishingDetectionDone(verdict.SerializeAsString());
741 EXPECT_TRUE(Mock::VerifyAndClear(mock_extractor)); 754 EXPECT_TRUE(Mock::VerifyAndClear(mock_extractor));
755 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get()));
742 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); 756 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get()));
743 ASSERT_FALSE(cb.is_null()); 757 ASSERT_FALSE(cb.is_null());
744 } 758 }
745 759
746 TEST_F(ClientSideDetectionHostTest, 760 TEST_F(ClientSideDetectionHostTest,
747 OnPhishingDetectionDoneShowMalwareInterstitial) { 761 OnPhishingDetectionDoneShowMalwareInterstitial) {
748 // Case 10: client thinks the page match malware IP and so does the server. 762 // Case 10: client thinks the page match malware IP and so does the server.
749 // We show an sub-resource malware interstitial. 763 // We show an sub-resource malware interstitial.
750 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor( 764 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor(
751 web_contents(), 765 web_contents(),
752 csd_service_.get()); 766 csd_host_.get());
753 SetFeatureExtractor(mock_extractor); // The host class takes ownership. 767 SetFeatureExtractor(mock_extractor); // The host class takes ownership.
754 768
755 ClientPhishingRequest verdict; 769 ClientPhishingRequest verdict;
756 verdict.set_url("http://not-phishing.com/"); 770 verdict.set_url("http://not-phishing.com/");
757 verdict.set_client_score(0.1f); 771 verdict.set_client_score(0.1f);
758 verdict.set_is_phishing(false); 772 verdict.set_is_phishing(false);
759 773
760 ClientSideDetectionService::ClientReportMalwareRequestCallback cb; 774 ClientSideDetectionService::ClientReportMalwareRequestCallback cb;
761 GURL malware_landing_url("http://malware.com/"); 775 GURL malware_landing_url("http://malware.com/");
762 GURL malware_ip_url("http://badip.com"); 776 GURL malware_ip_url("http://badip.com");
763 ClientMalwareRequest malware_verdict; 777 ClientMalwareRequest malware_verdict;
764 malware_verdict.set_url("http://malware.com/"); 778 malware_verdict.set_url("http://malware.com/");
765 ClientMalwareRequest::Feature* feature = malware_verdict.add_feature_map(); 779 ClientMalwareRequest::Feature* feature = malware_verdict.add_feature_map();
766 feature->set_name("malwareip1.2.3.4"); 780 feature->set_name("malwareip1.2.3.4");
767 feature->set_value(1.0); 781 feature->set_value(1.0);
768 feature->add_metainfo("http://badip.com"); 782 feature->add_metainfo("http://badip.com");
769 783
770 EXPECT_CALL(*mock_extractor, ExtractMalwareFeatures(_, _)) 784 EXPECT_CALL(*mock_extractor, ExtractMalwareFeatures(_, _, _))
771 .WillOnce(SetArgumentPointee<1>(malware_verdict)); 785 .WillOnce(DoAll(DeleteArg<1>(),
786 InvokeCallbackArgument<2>(true, &malware_verdict)));
772 EXPECT_CALL(*csd_service_, 787 EXPECT_CALL(*csd_service_,
773 SendClientReportMalwareRequest( 788 SendClientReportMalwareRequest(
774 Pointee(PartiallyEqualMalwareVerdict(malware_verdict)), _)) 789 Pointee(PartiallyEqualMalwareVerdict(malware_verdict)), _))
775 .WillOnce(DoAll(DeleteArg<0>(), 790 .WillOnce(SaveArg<1>(&cb));
776 SaveArg<1>(&cb)));
777 OnPhishingDetectionDone(verdict.SerializeAsString()); 791 OnPhishingDetectionDone(verdict.SerializeAsString());
792 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get()));
778 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); 793 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get()));
779 ASSERT_FALSE(cb.is_null()); 794 ASSERT_FALSE(cb.is_null());
780 795
781 UnsafeResource resource; 796 UnsafeResource resource;
782 EXPECT_CALL(*ui_manager_.get(), DoDisplayBlockingPage(_)) 797 EXPECT_CALL(*ui_manager_.get(), DoDisplayBlockingPage(_))
783 .WillOnce(SaveArg<0>(&resource)); 798 .WillOnce(SaveArg<0>(&resource));
784 cb.Run(malware_landing_url, malware_ip_url, true); 799 cb.Run(malware_landing_url, malware_ip_url, true);
785 800
786 base::RunLoop().RunUntilIdle(); 801 base::RunLoop().RunUntilIdle();
787 EXPECT_TRUE(Mock::VerifyAndClear(ui_manager_.get())); 802 EXPECT_TRUE(Mock::VerifyAndClear(ui_manager_.get()));
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
963 978
964 UnsafeResource resource; 979 UnsafeResource resource;
965 EXPECT_CALL(*ui_manager_.get(), DoDisplayBlockingPage(_)) 980 EXPECT_CALL(*ui_manager_.get(), DoDisplayBlockingPage(_))
966 .WillOnce(SaveArg<0>(&resource)); 981 .WillOnce(SaveArg<0>(&resource));
967 982
968 NavigateAndCommit(url); 983 NavigateAndCommit(url);
969 // Wait for CheckCsdWhitelist and CheckCache() to be called. 984 // Wait for CheckCsdWhitelist and CheckCache() to be called.
970 base::RunLoop().RunUntilIdle(); 985 base::RunLoop().RunUntilIdle();
971 // Now we check that all expected functions were indeed called on the two 986 // Now we check that all expected functions were indeed called on the two
972 // service objects. 987 // service objects.
973 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); 988 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get()));
974 EXPECT_TRUE(Mock::VerifyAndClear(ui_manager_.get())); 989 EXPECT_TRUE(Mock::VerifyAndClear(ui_manager_.get()));
975 EXPECT_EQ(url, resource.url); 990 EXPECT_EQ(url, resource.url);
976 EXPECT_EQ(url, resource.original_url); 991 EXPECT_EQ(url, resource.original_url);
977 resource.callback.Reset(); 992 resource.callback.Reset();
978 msg = process()->sink().GetFirstMessageMatching( 993 msg = process()->sink().GetFirstMessageMatching(
979 SafeBrowsingMsg_StartPhishingDetection::ID); 994 SafeBrowsingMsg_StartPhishingDetection::ID);
980 ASSERT_FALSE(msg); 995 ASSERT_FALSE(msg);
981 } 996 }
982 997
998 TEST_F(ClientSideDetectionHostTest, IsBadIpAddress) {
999 EXPECT_CALL(*database_manager_.get(), MatchMalwareIP("1.2.3.4"))
1000 .WillOnce(Return(false));
1001 EXPECT_FALSE(csd_host_->IsBadIpAddress("1.2.3.4"));
1002 EXPECT_CALL(*database_manager_.get(), MatchMalwareIP("2.3.4.5"))
1003 .WillOnce(Return(true));
1004 EXPECT_TRUE(csd_host_->IsBadIpAddress("2.3.4.5"));
1005 }
1006
983 } // namespace safe_browsing 1007 } // namespace safe_browsing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698