Chromium Code Reviews| 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 #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 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 152 DISALLOW_COPY_AND_ASSIGN(MockSafeBrowsingUIManager); | 152 DISALLOW_COPY_AND_ASSIGN(MockSafeBrowsingUIManager); |
| 153 }; | 153 }; |
| 154 | 154 |
| 155 class MockSafeBrowsingDatabaseManager : public SafeBrowsingDatabaseManager { | 155 class MockSafeBrowsingDatabaseManager : public SafeBrowsingDatabaseManager { |
| 156 public: | 156 public: |
| 157 explicit MockSafeBrowsingDatabaseManager(SafeBrowsingService* service) | 157 explicit MockSafeBrowsingDatabaseManager(SafeBrowsingService* service) |
| 158 : SafeBrowsingDatabaseManager(service) { } | 158 : SafeBrowsingDatabaseManager(service) { } |
| 159 | 159 |
| 160 MOCK_METHOD1(MatchCsdWhitelistUrl, bool(const GURL&)); | 160 MOCK_METHOD1(MatchCsdWhitelistUrl, bool(const GURL&)); |
| 161 MOCK_METHOD1(MatchMalwareIP, bool(const std::string& ip_address)); | 161 MOCK_METHOD1(MatchMalwareIP, bool(const std::string& ip_address)); |
| 162 MOCK_METHOD0(IsMalwareKillSwitchOn, bool()); | |
| 162 | 163 |
| 163 protected: | 164 protected: |
| 164 virtual ~MockSafeBrowsingDatabaseManager() {} | 165 virtual ~MockSafeBrowsingDatabaseManager() {} |
| 165 | 166 |
| 166 private: | 167 private: |
| 167 DISALLOW_COPY_AND_ASSIGN(MockSafeBrowsingDatabaseManager); | 168 DISALLOW_COPY_AND_ASSIGN(MockSafeBrowsingDatabaseManager); |
| 168 }; | 169 }; |
| 169 | 170 |
| 170 class MockTestingProfile : public TestingProfile { | 171 class MockTestingProfile : public TestingProfile { |
| 171 public: | 172 public: |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 212 new StrictMock<MockSafeBrowsingDatabaseManager>(sb_service); | 213 new StrictMock<MockSafeBrowsingDatabaseManager>(sb_service); |
| 213 ui_manager_ = new StrictMock<MockSafeBrowsingUIManager>(sb_service); | 214 ui_manager_ = new StrictMock<MockSafeBrowsingUIManager>(sb_service); |
| 214 csd_host_.reset(safe_browsing::ClientSideDetectionHost::Create( | 215 csd_host_.reset(safe_browsing::ClientSideDetectionHost::Create( |
| 215 web_contents())); | 216 web_contents())); |
| 216 csd_host_->set_client_side_detection_service(csd_service_.get()); | 217 csd_host_->set_client_side_detection_service(csd_service_.get()); |
| 217 csd_host_->set_safe_browsing_managers(ui_manager_.get(), | 218 csd_host_->set_safe_browsing_managers(ui_manager_.get(), |
| 218 database_manager_.get()); | 219 database_manager_.get()); |
| 219 // We need to create this here since we don't call | 220 // We need to create this here since we don't call |
| 220 // DidNavigateMainFramePostCommit in this test. | 221 // DidNavigateMainFramePostCommit in this test. |
| 221 csd_host_->browse_info_.reset(new BrowseInfo); | 222 csd_host_->browse_info_.reset(new BrowseInfo); |
| 222 | |
| 223 // By default this is set to false. Turn it on as if we are in canary or | |
| 224 // dev channel | |
| 225 csd_host_->malware_report_enabled_ = true; | |
| 226 } | 223 } |
| 227 | 224 |
| 228 virtual void TearDown() { | 225 virtual void TearDown() { |
| 229 // Delete the host object on the UI thread and release the | 226 // Delete the host object on the UI thread and release the |
| 230 // SafeBrowsingService. | 227 // SafeBrowsingService. |
| 231 BrowserThread::DeleteSoon(BrowserThread::UI, FROM_HERE, | 228 BrowserThread::DeleteSoon(BrowserThread::UI, FROM_HERE, |
| 232 csd_host_.release()); | 229 csd_host_.release()); |
| 233 database_manager_ = NULL; | 230 database_manager_ = NULL; |
| 234 ui_manager_ = NULL; | 231 ui_manager_ = NULL; |
| 235 base::RunLoop().RunUntilIdle(); | 232 base::RunLoop().RunUntilIdle(); |
| 236 ChromeRenderViewHostTestHarness::TearDown(); | 233 ChromeRenderViewHostTestHarness::TearDown(); |
| 237 } | 234 } |
| 238 | 235 |
| 239 virtual content::BrowserContext* CreateBrowserContext() OVERRIDE { | 236 virtual content::BrowserContext* CreateBrowserContext() OVERRIDE { |
| 240 // Set custom profile object so that we can mock calls to IsOffTheRecord. | 237 // Set custom profile object so that we can mock calls to IsOffTheRecord. |
| 241 // This needs to happen before we call the parent SetUp() function. We use | 238 // This needs to happen before we call the parent SetUp() function. We use |
| 242 // a nice mock because other parts of the code are calling IsOffTheRecord. | 239 // a nice mock because other parts of the code are calling IsOffTheRecord. |
| 243 mock_profile_ = new NiceMock<MockTestingProfile>(); | 240 mock_profile_ = new NiceMock<MockTestingProfile>(); |
| 244 return mock_profile_; | 241 return mock_profile_; |
| 245 } | 242 } |
| 246 | 243 |
| 247 void OnPhishingDetectionDone(const std::string& verdict_str) { | 244 void OnPhishingDetectionDone(const std::string& verdict_str) { |
| 248 csd_host_->OnPhishingDetectionDone(verdict_str); | 245 csd_host_->OnPhishingDetectionDone(verdict_str); |
| 249 } | 246 } |
| 250 | 247 |
| 248 void DocumentOnLoadCompletedInMainFrame(int32 page_id) { | |
| 249 csd_host_->DocumentOnLoadCompletedInMainFrame(page_id); | |
| 250 } | |
| 251 | |
| 251 void UpdateIPUrlMap(const std::string& ip, const std::string& host) { | 252 void UpdateIPUrlMap(const std::string& ip, const std::string& host) { |
| 252 csd_host_->UpdateIPUrlMap(ip, host, "", "", ResourceType::OBJECT); | 253 csd_host_->UpdateIPUrlMap(ip, host, "", "", ResourceType::OBJECT); |
| 253 } | 254 } |
| 254 | 255 |
| 255 BrowseInfo* GetBrowseInfo() { | 256 BrowseInfo* GetBrowseInfo() { |
| 256 return csd_host_->browse_info_.get(); | 257 return csd_host_->browse_info_.get(); |
| 257 } | 258 } |
| 258 | 259 |
| 259 void ExpectPreClassificationChecks(const GURL& url, | 260 void ExpectPreClassificationChecks(const GURL& url, |
| 260 const bool* is_private, | 261 const bool* is_private, |
| 261 const bool* is_incognito, | 262 const bool* is_incognito, |
| 262 const bool* match_csd_whitelist, | 263 const bool* match_csd_whitelist, |
| 263 const bool* get_valid_cached_result, | 264 const bool* get_valid_cached_result, |
| 264 const bool* is_in_cache, | 265 const bool* is_in_cache, |
| 265 const bool* over_report_limit) { | 266 const bool* over_report_limit) { |
| 266 if (is_private) { | 267 if (is_private) { |
| 267 EXPECT_CALL(*csd_service_, IsPrivateIPAddress(_)) | 268 EXPECT_CALL(*csd_service_, IsPrivateIPAddress(_)) |
| 268 .WillOnce(Return(*is_private)); | 269 .WillOnce(Return(*is_private)); |
| 269 } | 270 } |
| 270 if (is_incognito) { | 271 if (is_incognito) { |
| 271 EXPECT_CALL(*mock_profile_, IsOffTheRecord()) | 272 EXPECT_CALL(*mock_profile_, IsOffTheRecord()) |
| 272 .WillRepeatedly(Return(*is_incognito)); | 273 .WillRepeatedly(Return(*is_incognito)); |
| 273 } | 274 } |
| 274 if (match_csd_whitelist) { | 275 if (match_csd_whitelist) { |
|
mattm
2014/03/18 02:19:06
hm, does it make sense to make these dependent on
noé
2014/03/20 17:01:45
Separated them.
| |
| 275 EXPECT_CALL(*database_manager_.get(), MatchCsdWhitelistUrl(url)) | 276 EXPECT_CALL(*database_manager_.get(), MatchCsdWhitelistUrl(url)) |
| 276 .WillOnce(Return(*match_csd_whitelist)); | 277 .WillOnce(Return(*match_csd_whitelist)); |
| 278 EXPECT_CALL(*database_manager_.get(), IsMalwareKillSwitchOn()) | |
| 279 .WillRepeatedly(Return(*match_csd_whitelist)); | |
|
mattm
2014/03/18 02:19:06
reason this is Repeatedly instead of Once?
noé
2014/03/20 17:01:45
That's because some tests call the Expect method m
| |
| 277 } | 280 } |
| 278 if (get_valid_cached_result) { | 281 if (get_valid_cached_result) { |
| 279 EXPECT_CALL(*csd_service_, GetValidCachedResult(url, NotNull())) | 282 EXPECT_CALL(*csd_service_, GetValidCachedResult(url, NotNull())) |
| 280 .WillOnce(DoAll(SetArgumentPointee<1>(true), | 283 .WillOnce(DoAll(SetArgumentPointee<1>(true), |
| 281 Return(*get_valid_cached_result))); | 284 Return(*get_valid_cached_result))); |
| 282 } | 285 } |
| 283 if (is_in_cache) { | 286 if (is_in_cache) { |
| 284 EXPECT_CALL(*csd_service_, IsInCache(url)).WillOnce(Return(*is_in_cache)); | 287 EXPECT_CALL(*csd_service_, IsInCache(url)).WillOnce(Return(*is_in_cache)); |
| 285 } | 288 } |
| 286 if (over_report_limit) { | 289 if (over_report_limit) { |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 303 } | 306 } |
| 304 | 307 |
| 305 void SetRedirectChain(const std::vector<GURL>& redirect_chain) { | 308 void SetRedirectChain(const std::vector<GURL>& redirect_chain) { |
| 306 csd_host_->browse_info_->url_redirects = redirect_chain; | 309 csd_host_->browse_info_->url_redirects = redirect_chain; |
| 307 } | 310 } |
| 308 | 311 |
| 309 void SetReferrer(const GURL& referrer) { | 312 void SetReferrer(const GURL& referrer) { |
| 310 csd_host_->browse_info_->referrer = referrer; | 313 csd_host_->browse_info_->referrer = referrer; |
| 311 } | 314 } |
| 312 | 315 |
| 316 void ExpectShouldClassifyForMalwareResult(const bool* should_classify) { | |
| 317 if (should_classify == NULL) { | |
| 318 EXPECT_EQ(NULL, csd_host_->should_classify_for_malware_.get()); | |
| 319 } else { | |
| 320 EXPECT_TRUE(csd_host_->should_classify_for_malware_.get()); | |
| 321 if (csd_host_->should_classify_for_malware_.get()) { | |
| 322 EXPECT_EQ(*should_classify, *(csd_host_->should_classify_for_malware_)); | |
| 323 } | |
| 324 } | |
| 325 } | |
| 326 | |
| 313 void TestUnsafeResourceCopied(const UnsafeResource& resource) { | 327 void TestUnsafeResourceCopied(const UnsafeResource& resource) { |
| 314 ASSERT_TRUE(csd_host_->unsafe_resource_.get()); | 328 ASSERT_TRUE(csd_host_->unsafe_resource_.get()); |
| 315 // Test that the resource from OnSafeBrowsingHit notification was copied | 329 // Test that the resource from OnSafeBrowsingHit notification was copied |
| 316 // into the CSDH. | 330 // into the CSDH. |
| 317 EXPECT_EQ(resource.url, csd_host_->unsafe_resource_->url); | 331 EXPECT_EQ(resource.url, csd_host_->unsafe_resource_->url); |
| 318 EXPECT_EQ(resource.original_url, csd_host_->unsafe_resource_->original_url); | 332 EXPECT_EQ(resource.original_url, csd_host_->unsafe_resource_->original_url); |
| 319 EXPECT_EQ(resource.is_subresource, | 333 EXPECT_EQ(resource.is_subresource, |
| 320 csd_host_->unsafe_resource_->is_subresource); | 334 csd_host_->unsafe_resource_->is_subresource); |
| 321 EXPECT_EQ(resource.threat_type, csd_host_->unsafe_resource_->threat_type); | 335 EXPECT_EQ(resource.threat_type, csd_host_->unsafe_resource_->threat_type); |
| 322 EXPECT_TRUE(csd_host_->unsafe_resource_->callback.is_null()); | 336 EXPECT_TRUE(csd_host_->unsafe_resource_->callback.is_null()); |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 443 web_contents(), | 457 web_contents(), |
| 444 csd_host_.get()); | 458 csd_host_.get()); |
| 445 SetFeatureExtractor(mock_extractor); // The host class takes ownership. | 459 SetFeatureExtractor(mock_extractor); // The host class takes ownership. |
| 446 | 460 |
| 447 ClientSideDetectionService::ClientReportPhishingRequestCallback cb; | 461 ClientSideDetectionService::ClientReportPhishingRequestCallback cb; |
| 448 ClientPhishingRequest verdict; | 462 ClientPhishingRequest verdict; |
| 449 verdict.set_url("http://phishingurl.com/"); | 463 verdict.set_url("http://phishingurl.com/"); |
| 450 verdict.set_client_score(1.0f); | 464 verdict.set_client_score(1.0f); |
| 451 verdict.set_is_phishing(true); | 465 verdict.set_is_phishing(true); |
| 452 | 466 |
| 453 ClientMalwareRequest malware_verdict; | |
| 454 malware_verdict.set_url(verdict.url()); | |
| 455 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)) | 467 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)) |
| 456 .WillOnce(DoAll(DeleteArg<1>(), | 468 .WillOnce(DoAll(DeleteArg<1>(), |
| 457 InvokeCallbackArgument<2>(true, &verdict))); | 469 InvokeCallbackArgument<2>(true, &verdict))); |
| 458 EXPECT_CALL(*mock_extractor, ExtractMalwareFeatures(_, _, _)) | |
| 459 .WillOnce(InvokeMalwareCallback(&malware_verdict)); | |
| 460 EXPECT_CALL(*csd_service_, | 470 EXPECT_CALL(*csd_service_, |
| 461 SendClientReportPhishingRequest( | 471 SendClientReportPhishingRequest( |
| 462 Pointee(PartiallyEqualVerdict(verdict)), _)) | 472 Pointee(PartiallyEqualVerdict(verdict)), _)) |
| 463 .WillOnce(SaveArg<1>(&cb)); | 473 .WillOnce(SaveArg<1>(&cb)); |
| 464 OnPhishingDetectionDone(verdict.SerializeAsString()); | 474 OnPhishingDetectionDone(verdict.SerializeAsString()); |
| 465 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get())); | 475 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get())); |
| 466 ASSERT_FALSE(cb.is_null()); | 476 ASSERT_FALSE(cb.is_null()); |
| 467 | 477 |
| 468 // Make sure DisplayBlockingPage is not going to be called. | 478 // Make sure DisplayBlockingPage is not going to be called. |
| 469 EXPECT_CALL(*ui_manager_.get(), DisplayBlockingPage(_)).Times(0); | 479 EXPECT_CALL(*ui_manager_.get(), DisplayBlockingPage(_)).Times(0); |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 487 verdict.set_client_score(1.0f); | 497 verdict.set_client_score(1.0f); |
| 488 verdict.set_is_phishing(true); | 498 verdict.set_is_phishing(true); |
| 489 | 499 |
| 490 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)) | 500 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)) |
| 491 .WillOnce(DoAll(DeleteArg<1>(), | 501 .WillOnce(DoAll(DeleteArg<1>(), |
| 492 InvokeCallbackArgument<2>(true, &verdict))); | 502 InvokeCallbackArgument<2>(true, &verdict))); |
| 493 EXPECT_CALL(*csd_service_, | 503 EXPECT_CALL(*csd_service_, |
| 494 SendClientReportPhishingRequest( | 504 SendClientReportPhishingRequest( |
| 495 Pointee(PartiallyEqualVerdict(verdict)), _)) | 505 Pointee(PartiallyEqualVerdict(verdict)), _)) |
| 496 .WillOnce(SaveArg<1>(&cb)); | 506 .WillOnce(SaveArg<1>(&cb)); |
| 497 | |
| 498 ClientMalwareRequest malware_verdict; | |
| 499 malware_verdict.set_url(verdict.url()); | |
| 500 EXPECT_CALL(*mock_extractor, ExtractMalwareFeatures(_, _, _)) | |
| 501 .WillOnce(InvokeMalwareCallback(&malware_verdict)); | |
| 502 EXPECT_CALL(*csd_service_, | |
| 503 SendClientReportMalwareRequest(_, _)).Times(0); | |
| 504 | |
| 505 OnPhishingDetectionDone(verdict.SerializeAsString()); | 507 OnPhishingDetectionDone(verdict.SerializeAsString()); |
| 506 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get())); | 508 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get())); |
| 507 ASSERT_FALSE(cb.is_null()); | 509 ASSERT_FALSE(cb.is_null()); |
| 508 | 510 |
| 509 // Make sure DisplayBlockingPage is not going to be called. | 511 // Make sure DisplayBlockingPage is not going to be called. |
| 510 EXPECT_CALL(*ui_manager_.get(), DisplayBlockingPage(_)).Times(0); | 512 EXPECT_CALL(*ui_manager_.get(), DisplayBlockingPage(_)).Times(0); |
| 511 cb.Run(GURL(verdict.url()), false); | 513 cb.Run(GURL(verdict.url()), false); |
| 512 base::RunLoop().RunUntilIdle(); | 514 base::RunLoop().RunUntilIdle(); |
| 513 EXPECT_TRUE(Mock::VerifyAndClear(ui_manager_.get())); | 515 EXPECT_TRUE(Mock::VerifyAndClear(ui_manager_.get())); |
| 514 } | 516 } |
| 515 | 517 |
| 516 TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneShowInterstitial) { | 518 TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneShowInterstitial) { |
| 517 // Case 3: client thinks the page is phishing and so does the server. | 519 // Case 3: client thinks the page is phishing and so does the server. |
| 518 // We show an interstitial. | 520 // We show an interstitial. |
| 519 MockBrowserFeatureExtractor* mock_extractor = | 521 MockBrowserFeatureExtractor* mock_extractor = |
| 520 new StrictMock<MockBrowserFeatureExtractor>( | 522 new StrictMock<MockBrowserFeatureExtractor>( |
| 521 web_contents(), | 523 web_contents(), |
| 522 csd_host_.get()); | 524 csd_host_.get()); |
| 523 SetFeatureExtractor(mock_extractor); // The host class takes ownership. | 525 SetFeatureExtractor(mock_extractor); // The host class takes ownership. |
| 524 | 526 |
| 525 ClientSideDetectionService::ClientReportPhishingRequestCallback cb; | 527 ClientSideDetectionService::ClientReportPhishingRequestCallback cb; |
| 526 GURL phishing_url("http://phishingurl.com/"); | 528 GURL phishing_url("http://phishingurl.com/"); |
| 527 ClientPhishingRequest verdict; | 529 ClientPhishingRequest verdict; |
| 528 verdict.set_url(phishing_url.spec()); | 530 verdict.set_url(phishing_url.spec()); |
| 529 verdict.set_client_score(1.0f); | 531 verdict.set_client_score(1.0f); |
| 530 verdict.set_is_phishing(true); | 532 verdict.set_is_phishing(true); |
| 531 | 533 |
| 532 ClientMalwareRequest malware_verdict; | |
| 533 malware_verdict.set_url(verdict.url()); | |
| 534 | |
| 535 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)) | 534 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)) |
| 536 .WillOnce(DoAll(DeleteArg<1>(), | 535 .WillOnce(DoAll(DeleteArg<1>(), |
| 537 InvokeCallbackArgument<2>(true, &verdict))); | 536 InvokeCallbackArgument<2>(true, &verdict))); |
| 538 EXPECT_CALL(*mock_extractor, ExtractMalwareFeatures(_, _, _)) | |
| 539 .WillOnce(InvokeMalwareCallback(&malware_verdict)); | |
| 540 EXPECT_CALL(*csd_service_, | 537 EXPECT_CALL(*csd_service_, |
| 541 SendClientReportPhishingRequest( | 538 SendClientReportPhishingRequest( |
| 542 Pointee(PartiallyEqualVerdict(verdict)), _)) | 539 Pointee(PartiallyEqualVerdict(verdict)), _)) |
| 543 .WillOnce(SaveArg<1>(&cb)); | 540 .WillOnce(SaveArg<1>(&cb)); |
| 544 OnPhishingDetectionDone(verdict.SerializeAsString()); | 541 OnPhishingDetectionDone(verdict.SerializeAsString()); |
| 545 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get())); | 542 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get())); |
| 546 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); | 543 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); |
| 547 ASSERT_FALSE(cb.is_null()); | 544 ASSERT_FALSE(cb.is_null()); |
| 548 | 545 |
| 549 UnsafeResource resource; | 546 UnsafeResource resource; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 582 csd_host_.get()); | 579 csd_host_.get()); |
| 583 SetFeatureExtractor(mock_extractor); // The host class takes ownership. | 580 SetFeatureExtractor(mock_extractor); // The host class takes ownership. |
| 584 | 581 |
| 585 ClientSideDetectionService::ClientReportPhishingRequestCallback cb; | 582 ClientSideDetectionService::ClientReportPhishingRequestCallback cb; |
| 586 GURL phishing_url("http://phishingurl.com/"); | 583 GURL phishing_url("http://phishingurl.com/"); |
| 587 ClientPhishingRequest verdict; | 584 ClientPhishingRequest verdict; |
| 588 verdict.set_url(phishing_url.spec()); | 585 verdict.set_url(phishing_url.spec()); |
| 589 verdict.set_client_score(1.0f); | 586 verdict.set_client_score(1.0f); |
| 590 verdict.set_is_phishing(true); | 587 verdict.set_is_phishing(true); |
| 591 | 588 |
| 592 ClientMalwareRequest malware_verdict; | |
| 593 malware_verdict.set_url(verdict.url()); | |
| 594 | |
| 595 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)) | 589 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)) |
| 596 .WillOnce(DoAll(DeleteArg<1>(), | 590 .WillOnce(DoAll(DeleteArg<1>(), |
| 597 InvokeCallbackArgument<2>(true, &verdict))); | 591 InvokeCallbackArgument<2>(true, &verdict))); |
| 598 EXPECT_CALL(*mock_extractor, ExtractMalwareFeatures(_, _, _)) | |
| 599 .WillOnce(InvokeMalwareCallback(&malware_verdict)); | |
| 600 EXPECT_CALL(*csd_service_, | 592 EXPECT_CALL(*csd_service_, |
| 601 SendClientReportPhishingRequest( | 593 SendClientReportPhishingRequest( |
| 602 Pointee(PartiallyEqualVerdict(verdict)), _)) | 594 Pointee(PartiallyEqualVerdict(verdict)), _)) |
| 603 .WillOnce(SaveArg<1>(&cb)); | 595 .WillOnce(SaveArg<1>(&cb)); |
| 604 OnPhishingDetectionDone(verdict.SerializeAsString()); | 596 OnPhishingDetectionDone(verdict.SerializeAsString()); |
| 605 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get())); | 597 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get())); |
| 606 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); | 598 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); |
| 607 ASSERT_FALSE(cb.is_null()); | 599 ASSERT_FALSE(cb.is_null()); |
| 608 | 600 |
| 609 // Set this back to a normal browser feature extractor since we're using | 601 // Set this back to a normal browser feature extractor since we're using |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 672 new StrictMock<MockBrowserFeatureExtractor>( | 664 new StrictMock<MockBrowserFeatureExtractor>( |
| 673 web_contents(), | 665 web_contents(), |
| 674 csd_host_.get()); | 666 csd_host_.get()); |
| 675 SetFeatureExtractor(mock_extractor); // The host class takes ownership. | 667 SetFeatureExtractor(mock_extractor); // The host class takes ownership. |
| 676 | 668 |
| 677 ClientPhishingRequest verdict; | 669 ClientPhishingRequest verdict; |
| 678 verdict.set_url("http://not-phishing.com/"); | 670 verdict.set_url("http://not-phishing.com/"); |
| 679 verdict.set_client_score(0.1f); | 671 verdict.set_client_score(0.1f); |
| 680 verdict.set_is_phishing(false); | 672 verdict.set_is_phishing(false); |
| 681 | 673 |
| 682 ClientMalwareRequest malware_verdict; | |
| 683 malware_verdict.set_url(verdict.url()); | |
| 684 | |
| 685 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)).Times(0); | 674 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)).Times(0); |
| 686 EXPECT_CALL(*mock_extractor, ExtractMalwareFeatures(_, _, _)) | |
| 687 .WillOnce(InvokeMalwareCallback(&malware_verdict)); | |
| 688 OnPhishingDetectionDone(verdict.SerializeAsString()); | 675 OnPhishingDetectionDone(verdict.SerializeAsString()); |
| 689 EXPECT_TRUE(Mock::VerifyAndClear(mock_extractor)); | 676 EXPECT_TRUE(Mock::VerifyAndClear(mock_extractor)); |
| 690 } | 677 } |
| 691 | 678 |
| 692 TEST_F(ClientSideDetectionHostTest, | 679 TEST_F(ClientSideDetectionHostTest, |
| 693 OnPhishingDetectionDoneVerdictNotPhishingButSBMatchSubResource) { | 680 OnPhishingDetectionDoneVerdictNotPhishingButSBMatchSubResource) { |
| 694 // Case 7: renderer sends a verdict string that isn't phishing but the URL | 681 // Case 7: renderer sends a verdict string that isn't phishing but the URL |
| 695 // of a subresource was on the regular phishing or malware lists. | 682 // of a subresource was on the regular phishing or malware lists. |
| 696 GURL url("http://not-phishing.com/"); | 683 GURL url("http://not-phishing.com/"); |
| 697 ClientPhishingRequest verdict; | 684 ClientPhishingRequest verdict; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 754 OnPhishingDetectionDone(verdict.SerializeAsString()); | 741 OnPhishingDetectionDone(verdict.SerializeAsString()); |
| 755 base::MessageLoop::current()->Run(); | 742 base::MessageLoop::current()->Run(); |
| 756 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get())); | 743 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get())); |
| 757 | 744 |
| 758 ExpectPreClassificationChecks(start_url, &kFalse, &kFalse, &kFalse, &kFalse, | 745 ExpectPreClassificationChecks(start_url, &kFalse, &kFalse, &kFalse, &kFalse, |
| 759 &kFalse, &kFalse); | 746 &kFalse, &kFalse); |
| 760 NavigateWithoutSBHitAndCommit(start_url); | 747 NavigateWithoutSBHitAndCommit(start_url); |
| 761 WaitAndCheckPreClassificationChecks(); | 748 WaitAndCheckPreClassificationChecks(); |
| 762 } | 749 } |
| 763 | 750 |
| 764 TEST_F(ClientSideDetectionHostTest, UpdateIPUrlMap) { | |
| 765 BrowseInfo* browse_info = GetBrowseInfo(); | |
| 766 | |
| 767 // Empty IP or host are skipped | |
| 768 UpdateIPUrlMap("250.10.10.10", std::string()); | |
| 769 ASSERT_EQ(0U, browse_info->ips.size()); | |
| 770 UpdateIPUrlMap(std::string(), "http://google.com/a"); | |
| 771 ASSERT_EQ(0U, browse_info->ips.size()); | |
| 772 UpdateIPUrlMap(std::string(), std::string()); | |
| 773 ASSERT_EQ(0U, browse_info->ips.size()); | |
| 774 | |
| 775 std::vector<IPUrlInfo> expected_urls; | |
| 776 for (int i = 0; i < 20; i++) { | |
| 777 std::string url = base::StringPrintf("http://%d.com/", i); | |
| 778 expected_urls.push_back(IPUrlInfo(url, "", "", ResourceType::OBJECT)); | |
| 779 UpdateIPUrlMap("250.10.10.10", url); | |
| 780 } | |
| 781 ASSERT_EQ(1U, browse_info->ips.size()); | |
| 782 ASSERT_EQ(20U, browse_info->ips["250.10.10.10"].size()); | |
| 783 CheckIPUrlEqual(expected_urls, | |
| 784 browse_info->ips["250.10.10.10"]); | |
| 785 | |
| 786 // Add more urls for this ip, it exceeds max limit and won't be added | |
| 787 UpdateIPUrlMap("250.10.10.10", "http://21.com/"); | |
| 788 ASSERT_EQ(1U, browse_info->ips.size()); | |
| 789 ASSERT_EQ(20U, browse_info->ips["250.10.10.10"].size()); | |
| 790 CheckIPUrlEqual(expected_urls, | |
| 791 browse_info->ips["250.10.10.10"]); | |
| 792 | |
| 793 // Add 199 more IPs | |
| 794 for (int i = 0; i < 199; i++) { | |
| 795 std::string ip = base::StringPrintf("%d.%d.%d.256", i, i, i); | |
| 796 expected_urls.clear(); | |
| 797 expected_urls.push_back(IPUrlInfo("test.com/", "", "", | |
| 798 ResourceType::OBJECT)); | |
| 799 UpdateIPUrlMap(ip, "test.com/"); | |
| 800 ASSERT_EQ(1U, browse_info->ips[ip].size()); | |
| 801 CheckIPUrlEqual(expected_urls, | |
| 802 browse_info->ips[ip]); | |
| 803 } | |
| 804 ASSERT_EQ(200U, browse_info->ips.size()); | |
| 805 | |
| 806 // Exceeding max ip limit 200, these won't be added | |
| 807 UpdateIPUrlMap("250.250.250.250", "goo.com/"); | |
| 808 UpdateIPUrlMap("250.250.250.250", "bar.com/"); | |
| 809 UpdateIPUrlMap("250.250.0.250", "foo.com/"); | |
| 810 ASSERT_EQ(200U, browse_info->ips.size()); | |
| 811 | |
| 812 // Add url to existing IPs succeed | |
| 813 UpdateIPUrlMap("100.100.100.256", "more.com/"); | |
| 814 ASSERT_EQ(2U, browse_info->ips["100.100.100.256"].size()); | |
| 815 expected_urls.clear(); | |
| 816 expected_urls.push_back(IPUrlInfo("test.com/", "", "", ResourceType::OBJECT)); | |
| 817 expected_urls.push_back(IPUrlInfo("more.com/", "", "", ResourceType::OBJECT)); | |
| 818 CheckIPUrlEqual(expected_urls, | |
| 819 browse_info->ips["100.100.100.256"]); | |
| 820 } | |
| 821 | |
| 822 TEST_F(ClientSideDetectionHostTest, | 751 TEST_F(ClientSideDetectionHostTest, |
| 823 OnPhishingDetectionDoneVerdictNotPhishingNotMalwareIP) { | 752 DocumentOnLoadCompletedInMainFrameMalwareIP) { |
|
mattm
2014/03/18 02:19:06
what is this case testing / how is it different th
noé
2014/03/20 17:01:45
Good point. The other test is more complete. Rem
| |
| 824 // Case 7: renderer sends a verdict string that isn't phishing and not matches | 753 // Renderer is done loading the main frame and there is a bad IP match. |
| 825 // malware bad IP list | |
| 826 MockBrowserFeatureExtractor* mock_extractor = | 754 MockBrowserFeatureExtractor* mock_extractor = |
| 827 new StrictMock<MockBrowserFeatureExtractor>( | 755 new StrictMock<MockBrowserFeatureExtractor>( |
| 828 web_contents(), | 756 web_contents(), |
| 829 csd_host_.get()); | 757 csd_host_.get()); |
| 830 SetFeatureExtractor(mock_extractor); // The host class takes ownership. | 758 SetFeatureExtractor(mock_extractor); // The host class takes ownership. |
| 831 | 759 |
| 832 ClientPhishingRequest verdict; | |
| 833 verdict.set_url("http://not-phishing.com/"); | |
| 834 verdict.set_client_score(0.1f); | |
| 835 verdict.set_is_phishing(false); | |
| 836 | |
| 837 ClientMalwareRequest malware_verdict; | 760 ClientMalwareRequest malware_verdict; |
| 838 malware_verdict.set_url(verdict.url()); | 761 malware_verdict.set_url("http://not-phishing.com/"); |
| 839 | |
| 840 // That is a special case. If there were no IP matches or if feature | |
| 841 // extraction failed the callback will delete the malware_verdict. | |
| 842 EXPECT_CALL(*mock_extractor, ExtractMalwareFeatures(_, _, _)) | |
| 843 .WillOnce(InvokeMalwareCallback(&malware_verdict)); | |
| 844 EXPECT_CALL(*csd_service_, | |
| 845 SendClientReportMalwareRequest(_, _)).Times(0); | |
| 846 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)).Times(0); | |
| 847 | |
| 848 OnPhishingDetectionDone(verdict.SerializeAsString()); | |
| 849 EXPECT_TRUE(Mock::VerifyAndClear(mock_extractor)); | |
| 850 } | |
| 851 | |
| 852 TEST_F(ClientSideDetectionHostTest, | |
| 853 OnPhishingDetectionDoneVerdictNotPhishingButMalwareIP) { | |
| 854 // Case 8: renderer sends a verdict string that isn't phishing but matches | |
| 855 // malware bad IP list | |
| 856 MockBrowserFeatureExtractor* mock_extractor = | |
| 857 new StrictMock<MockBrowserFeatureExtractor>( | |
| 858 web_contents(), | |
| 859 csd_host_.get()); | |
| 860 SetFeatureExtractor(mock_extractor); // The host class takes ownership. | |
| 861 | |
| 862 ClientPhishingRequest verdict; | |
| 863 verdict.set_url("http://not-phishing.com/"); | |
| 864 verdict.set_client_score(0.1f); | |
| 865 verdict.set_is_phishing(false); | |
| 866 | |
| 867 ClientMalwareRequest malware_verdict; | |
| 868 malware_verdict.set_url(verdict.url()); | |
| 869 malware_verdict.set_referrer_url("http://referrer.com/"); | 762 malware_verdict.set_referrer_url("http://referrer.com/"); |
| 870 ClientMalwareRequest::UrlInfo* badipurl = | 763 ClientMalwareRequest::UrlInfo* badipurl = |
| 871 malware_verdict.add_bad_ip_url_info(); | 764 malware_verdict.add_bad_ip_url_info(); |
| 872 badipurl->set_ip("1.2.3.4"); | 765 badipurl->set_ip("1.2.3.4"); |
| 873 badipurl->set_url("badip.com"); | 766 badipurl->set_url("badip.com"); |
| 874 | 767 |
| 875 EXPECT_CALL(*mock_extractor, ExtractMalwareFeatures(_, _, _)) | 768 SetReferrer(GURL("http://referrer.com/")); |
| 876 .WillOnce(InvokeMalwareCallback(&malware_verdict)); | |
| 877 EXPECT_CALL(*csd_service_, | |
| 878 SendClientReportMalwareRequest( | |
| 879 Pointee(PartiallyEqualMalwareVerdict(malware_verdict)), _)) | |
| 880 .WillOnce(DeleteArg<0>()); | |
| 881 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)).Times(0); | |
| 882 | 769 |
| 883 SetReferrer(GURL("http://referrer.com/")); | 770 ExpectPreClassificationChecks(GURL(malware_verdict.url()), &kFalse, &kFalse, |
| 884 OnPhishingDetectionDone(verdict.SerializeAsString()); | 771 &kFalse, &kFalse, &kFalse, &kFalse); |
| 885 EXPECT_TRUE(Mock::VerifyAndClear(mock_extractor)); | 772 NavigateAndCommit(GURL(malware_verdict.url())); |
| 886 } | 773 WaitAndCheckPreClassificationChecks(); |
| 887 | |
| 888 TEST_F(ClientSideDetectionHostTest, | |
| 889 OnPhishingDetectionDoneVerdictPhishingAndMalwareIP) { | |
| 890 // Case 9: renderer sends a verdict string that is phishing and matches | |
| 891 // malware bad IP list | |
| 892 MockBrowserFeatureExtractor* mock_extractor = | |
| 893 new StrictMock<MockBrowserFeatureExtractor>( | |
| 894 web_contents(), | |
| 895 csd_host_.get()); | |
| 896 SetFeatureExtractor(mock_extractor); // The host class takes ownership. | |
| 897 | |
| 898 ClientSideDetectionService::ClientReportPhishingRequestCallback cb; | |
| 899 ClientPhishingRequest verdict; | |
| 900 verdict.set_url("http://not-phishing.com/"); | |
| 901 verdict.set_client_score(0.1f); | |
| 902 verdict.set_is_phishing(true); | |
| 903 | |
| 904 ClientMalwareRequest malware_verdict; | |
| 905 malware_verdict.set_url(verdict.url()); | |
| 906 ClientMalwareRequest::UrlInfo* badipurl = | |
| 907 malware_verdict.add_bad_ip_url_info(); | |
| 908 badipurl->set_ip("1.2.3.4"); | |
| 909 badipurl->set_url("badip.com"); | |
| 910 | 774 |
| 911 EXPECT_CALL(*mock_extractor, ExtractMalwareFeatures(_, _, _)) | 775 EXPECT_CALL(*mock_extractor, ExtractMalwareFeatures(_, _, _)) |
| 912 .WillOnce(InvokeMalwareCallback(&malware_verdict)); | 776 .WillOnce(InvokeMalwareCallback(&malware_verdict)); |
| 913 EXPECT_CALL(*csd_service_, | 777 EXPECT_CALL(*csd_service_, |
| 914 SendClientReportMalwareRequest( | 778 SendClientReportMalwareRequest( |
| 915 Pointee(PartiallyEqualMalwareVerdict(malware_verdict)), _)) | 779 Pointee(PartiallyEqualMalwareVerdict(malware_verdict)), _)) |
| 916 .WillOnce(DeleteArg<0>()); | 780 .WillOnce(DeleteArg<0>()); |
| 917 | 781 |
| 918 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)) | 782 DocumentOnLoadCompletedInMainFrame(GetBrowseInfo()->page_id); |
| 919 .WillOnce(DoAll(DeleteArg<1>(), | |
| 920 InvokeCallbackArgument<2>(true, &verdict))); | |
| 921 | |
| 922 EXPECT_CALL(*csd_service_, | |
| 923 SendClientReportPhishingRequest( | |
| 924 Pointee(PartiallyEqualVerdict(verdict)), _)) | |
| 925 .WillOnce(SaveArg<1>(&cb)); | |
| 926 | |
| 927 // Referrer url using https won't be set and sent out. | |
| 928 SetReferrer(GURL("https://referrer.com/")); | |
| 929 OnPhishingDetectionDone(verdict.SerializeAsString()); | |
| 930 EXPECT_TRUE(Mock::VerifyAndClear(mock_extractor)); | 783 EXPECT_TRUE(Mock::VerifyAndClear(mock_extractor)); |
| 931 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get())); | |
| 932 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); | |
| 933 ASSERT_FALSE(cb.is_null()); | |
| 934 } | 784 } |
| 935 | 785 |
| 936 TEST_F(ClientSideDetectionHostTest, | 786 TEST_F(ClientSideDetectionHostTest, |
| 937 OnPhishingDetectionDoneShowMalwareInterstitial) { | 787 DocumentOnLoadCompletedInMainFrameShowMalwareInterstitial) { |
| 938 // Case 10: client thinks the page match malware IP and so does the server. | 788 // Case 9: client thinks the page match malware IP and so does the server. |
| 939 // We show an sub-resource malware interstitial. | 789 // We show an sub-resource malware interstitial. |
| 940 MockBrowserFeatureExtractor* mock_extractor = | 790 MockBrowserFeatureExtractor* mock_extractor = |
| 941 new StrictMock<MockBrowserFeatureExtractor>( | 791 new StrictMock<MockBrowserFeatureExtractor>( |
| 942 web_contents(), | 792 web_contents(), |
| 943 csd_host_.get()); | 793 csd_host_.get()); |
| 944 SetFeatureExtractor(mock_extractor); // The host class takes ownership. | 794 SetFeatureExtractor(mock_extractor); // The host class takes ownership. |
| 945 | 795 |
| 946 ClientPhishingRequest verdict; | |
| 947 verdict.set_url("http://not-phishing.com/"); | |
| 948 verdict.set_client_score(0.1f); | |
| 949 verdict.set_is_phishing(false); | |
| 950 | |
| 951 ClientSideDetectionService::ClientReportMalwareRequestCallback cb; | |
| 952 GURL malware_landing_url("http://malware.com/"); | 796 GURL malware_landing_url("http://malware.com/"); |
| 953 GURL malware_ip_url("http://badip.com"); | 797 GURL malware_ip_url("http://badip.com"); |
| 954 ClientMalwareRequest malware_verdict; | 798 ClientMalwareRequest malware_verdict; |
| 955 malware_verdict.set_url("http://malware.com/"); | 799 malware_verdict.set_url("http://malware.com/"); |
| 956 ClientMalwareRequest::UrlInfo* badipurl = | 800 ClientMalwareRequest::UrlInfo* badipurl = |
| 957 malware_verdict.add_bad_ip_url_info(); | 801 malware_verdict.add_bad_ip_url_info(); |
| 958 badipurl->set_ip("1.2.3.4"); | 802 badipurl->set_ip("1.2.3.4"); |
| 959 badipurl->set_url("http://badip.com"); | 803 badipurl->set_url("http://badip.com"); |
| 960 | 804 |
| 805 ExpectPreClassificationChecks(GURL(malware_verdict.url()), &kFalse, &kFalse, | |
| 806 &kFalse, &kFalse, &kFalse, &kFalse); | |
| 807 NavigateAndCommit(GURL(malware_verdict.url())); | |
| 808 WaitAndCheckPreClassificationChecks(); | |
| 809 | |
| 810 ClientSideDetectionService::ClientReportMalwareRequestCallback cb; | |
| 961 EXPECT_CALL(*mock_extractor, ExtractMalwareFeatures(_, _, _)) | 811 EXPECT_CALL(*mock_extractor, ExtractMalwareFeatures(_, _, _)) |
| 962 .WillOnce(InvokeMalwareCallback(&malware_verdict)); | 812 .WillOnce(InvokeMalwareCallback(&malware_verdict)); |
| 963 EXPECT_CALL(*csd_service_, | 813 EXPECT_CALL(*csd_service_, |
| 964 SendClientReportMalwareRequest( | 814 SendClientReportMalwareRequest( |
| 965 Pointee(PartiallyEqualMalwareVerdict(malware_verdict)), _)) | 815 Pointee(PartiallyEqualMalwareVerdict(malware_verdict)), _)) |
| 966 .WillOnce(DoAll(DeleteArg<0>(), SaveArg<1>(&cb))); | 816 .WillOnce(DoAll(DeleteArg<0>(), SaveArg<1>(&cb))); |
| 967 OnPhishingDetectionDone(verdict.SerializeAsString()); | 817 DocumentOnLoadCompletedInMainFrame(GetBrowseInfo()->page_id); |
| 968 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get())); | 818 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get())); |
| 969 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); | 819 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); |
| 970 ASSERT_FALSE(cb.is_null()); | 820 ASSERT_FALSE(cb.is_null()); |
| 971 | 821 |
| 972 UnsafeResource resource; | 822 UnsafeResource resource; |
| 973 EXPECT_CALL(*ui_manager_.get(), DisplayBlockingPage(_)) | 823 EXPECT_CALL(*ui_manager_.get(), DisplayBlockingPage(_)) |
| 974 .WillOnce(SaveArg<0>(&resource)); | 824 .WillOnce(SaveArg<0>(&resource)); |
| 975 cb.Run(malware_landing_url, malware_ip_url, true); | 825 cb.Run(malware_landing_url, malware_ip_url, true); |
| 976 | 826 |
| 977 base::RunLoop().RunUntilIdle(); | 827 base::RunLoop().RunUntilIdle(); |
| 978 EXPECT_TRUE(Mock::VerifyAndClear(ui_manager_.get())); | 828 EXPECT_TRUE(Mock::VerifyAndClear(ui_manager_.get())); |
| 979 EXPECT_EQ(malware_ip_url, resource.url); | 829 EXPECT_EQ(malware_ip_url, resource.url); |
| 980 EXPECT_EQ(malware_landing_url, resource.original_url); | 830 EXPECT_EQ(malware_landing_url, resource.original_url); |
| 981 EXPECT_TRUE(resource.is_subresource); | 831 EXPECT_TRUE(resource.is_subresource); |
| 982 EXPECT_EQ(SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL, resource.threat_type); | 832 EXPECT_EQ(SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL, resource.threat_type); |
| 983 EXPECT_EQ(web_contents()->GetRenderProcessHost()->GetID(), | 833 EXPECT_EQ(web_contents()->GetRenderProcessHost()->GetID(), |
| 984 resource.render_process_host_id); | 834 resource.render_process_host_id); |
| 985 EXPECT_EQ(web_contents()->GetRenderViewHost()->GetRoutingID(), | 835 EXPECT_EQ(web_contents()->GetRenderViewHost()->GetRoutingID(), |
| 986 resource.render_view_id); | 836 resource.render_view_id); |
| 987 | 837 |
| 988 // Make sure the client object will be deleted. | 838 // Make sure the client object will be deleted. |
| 989 BrowserThread::PostTask( | 839 BrowserThread::PostTask( |
| 990 BrowserThread::IO, | 840 BrowserThread::IO, |
| 991 FROM_HERE, | 841 FROM_HERE, |
| 992 base::Bind(&MockSafeBrowsingUIManager::InvokeOnBlockingPageComplete, | 842 base::Bind(&MockSafeBrowsingUIManager::InvokeOnBlockingPageComplete, |
| 993 ui_manager_, resource.callback)); | 843 ui_manager_, resource.callback)); |
| 994 } | 844 } |
| 995 | 845 |
| 846 TEST_F(ClientSideDetectionHostTest, UpdateIPUrlMap) { | |
| 847 BrowseInfo* browse_info = GetBrowseInfo(); | |
| 848 | |
| 849 // Empty IP or host are skipped | |
| 850 UpdateIPUrlMap("250.10.10.10", std::string()); | |
| 851 ASSERT_EQ(0U, browse_info->ips.size()); | |
| 852 UpdateIPUrlMap(std::string(), "http://google.com/a"); | |
| 853 ASSERT_EQ(0U, browse_info->ips.size()); | |
| 854 UpdateIPUrlMap(std::string(), std::string()); | |
| 855 ASSERT_EQ(0U, browse_info->ips.size()); | |
| 856 | |
| 857 std::vector<IPUrlInfo> expected_urls; | |
| 858 for (int i = 0; i < 20; i++) { | |
| 859 std::string url = base::StringPrintf("http://%d.com/", i); | |
| 860 expected_urls.push_back(IPUrlInfo(url, "", "", ResourceType::OBJECT)); | |
| 861 UpdateIPUrlMap("250.10.10.10", url); | |
| 862 } | |
| 863 ASSERT_EQ(1U, browse_info->ips.size()); | |
| 864 ASSERT_EQ(20U, browse_info->ips["250.10.10.10"].size()); | |
| 865 CheckIPUrlEqual(expected_urls, | |
| 866 browse_info->ips["250.10.10.10"]); | |
| 867 | |
| 868 // Add more urls for this ip, it exceeds max limit and won't be added | |
| 869 UpdateIPUrlMap("250.10.10.10", "http://21.com/"); | |
| 870 ASSERT_EQ(1U, browse_info->ips.size()); | |
| 871 ASSERT_EQ(20U, browse_info->ips["250.10.10.10"].size()); | |
| 872 CheckIPUrlEqual(expected_urls, | |
| 873 browse_info->ips["250.10.10.10"]); | |
| 874 | |
| 875 // Add 199 more IPs | |
| 876 for (int i = 0; i < 199; i++) { | |
| 877 std::string ip = base::StringPrintf("%d.%d.%d.256", i, i, i); | |
| 878 expected_urls.clear(); | |
| 879 expected_urls.push_back(IPUrlInfo("test.com/", "", "", | |
| 880 ResourceType::OBJECT)); | |
| 881 UpdateIPUrlMap(ip, "test.com/"); | |
| 882 ASSERT_EQ(1U, browse_info->ips[ip].size()); | |
| 883 CheckIPUrlEqual(expected_urls, | |
| 884 browse_info->ips[ip]); | |
| 885 } | |
| 886 ASSERT_EQ(200U, browse_info->ips.size()); | |
| 887 | |
| 888 // Exceeding max ip limit 200, these won't be added | |
| 889 UpdateIPUrlMap("250.250.250.250", "goo.com/"); | |
| 890 UpdateIPUrlMap("250.250.250.250", "bar.com/"); | |
| 891 UpdateIPUrlMap("250.250.0.250", "foo.com/"); | |
| 892 ASSERT_EQ(200U, browse_info->ips.size()); | |
| 893 | |
| 894 // Add url to existing IPs succeed | |
| 895 UpdateIPUrlMap("100.100.100.256", "more.com/"); | |
| 896 ASSERT_EQ(2U, browse_info->ips["100.100.100.256"].size()); | |
| 897 expected_urls.clear(); | |
| 898 expected_urls.push_back(IPUrlInfo("test.com/", "", "", ResourceType::OBJECT)); | |
| 899 expected_urls.push_back(IPUrlInfo("more.com/", "", "", ResourceType::OBJECT)); | |
| 900 CheckIPUrlEqual(expected_urls, | |
| 901 browse_info->ips["100.100.100.256"]); | |
| 902 } | |
| 903 | |
| 996 TEST_F(ClientSideDetectionHostTest, NavigationCancelsShouldClassifyUrl) { | 904 TEST_F(ClientSideDetectionHostTest, NavigationCancelsShouldClassifyUrl) { |
| 997 // Test that canceling pending should classify requests works as expected. | 905 // Test that canceling pending should classify requests works as expected. |
| 998 | 906 |
| 999 GURL first_url("http://first.phishy.url.com"); | 907 GURL first_url("http://first.phishy.url.com"); |
| 1000 GURL second_url("http://second.url.com/"); | 908 GURL second_url("http://second.url.com/"); |
| 1001 // The first few checks are done synchronously so check that they have been | 909 // The first few checks are done synchronously so check that they have been |
| 1002 // done for the first URL, while the second URL has all the checks done. We | 910 // done for the first URL, while the second URL has all the checks done. We |
| 1003 // need to manually set up the IsPrivateIPAddress mock since if the same mock | 911 // need to manually set up the IsPrivateIPAddress mock since if the same mock |
| 1004 // expectation is specified twice, gmock will only use the last instance of | 912 // expectation is specified twice, gmock will only use the last instance of |
| 1005 // it, meaning the first will never be matched. | 913 // it, meaning the first will never be matched. |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 1027 WaitAndCheckPreClassificationChecks(); | 935 WaitAndCheckPreClassificationChecks(); |
| 1028 | 936 |
| 1029 const IPC::Message* msg = process()->sink().GetFirstMessageMatching( | 937 const IPC::Message* msg = process()->sink().GetFirstMessageMatching( |
| 1030 SafeBrowsingMsg_StartPhishingDetection::ID); | 938 SafeBrowsingMsg_StartPhishingDetection::ID); |
| 1031 ASSERT_TRUE(msg); | 939 ASSERT_TRUE(msg); |
| 1032 Tuple1<GURL> actual_url; | 940 Tuple1<GURL> actual_url; |
| 1033 SafeBrowsingMsg_StartPhishingDetection::Read(msg, &actual_url); | 941 SafeBrowsingMsg_StartPhishingDetection::Read(msg, &actual_url); |
| 1034 EXPECT_EQ(url, actual_url.a); | 942 EXPECT_EQ(url, actual_url.a); |
| 1035 EXPECT_EQ(rvh()->GetRoutingID(), msg->routing_id()); | 943 EXPECT_EQ(rvh()->GetRoutingID(), msg->routing_id()); |
| 1036 process()->sink().ClearMessages(); | 944 process()->sink().ClearMessages(); |
| 945 ExpectShouldClassifyForMalwareResult(&kTrue); | |
| 1037 | 946 |
| 1038 // Now try an in-page navigation. This should not trigger an IPC. | 947 // Now try an in-page navigation. This should not trigger an IPC. |
| 1039 EXPECT_CALL(*csd_service_, IsPrivateIPAddress(_)).Times(0); | 948 EXPECT_CALL(*csd_service_, IsPrivateIPAddress(_)).Times(0); |
| 1040 url = GURL("http://host.com/#foo"); | 949 url = GURL("http://host.com/#foo"); |
| 1041 ExpectPreClassificationChecks(url, NULL, NULL, NULL, NULL, NULL, NULL); | 950 ExpectPreClassificationChecks(url, NULL, NULL, NULL, NULL, NULL, NULL); |
| 1042 NavigateAndCommit(url); | 951 NavigateAndCommit(url); |
| 1043 WaitAndCheckPreClassificationChecks(); | 952 WaitAndCheckPreClassificationChecks(); |
| 1044 | 953 |
| 1045 msg = process()->sink().GetFirstMessageMatching( | 954 msg = process()->sink().GetFirstMessageMatching( |
| 1046 SafeBrowsingMsg_StartPhishingDetection::ID); | 955 SafeBrowsingMsg_StartPhishingDetection::ID); |
| 1047 ASSERT_FALSE(msg); | 956 ASSERT_FALSE(msg); |
| 1048 | 957 |
| 1049 // Check that XHTML is supported, in addition to the default HTML type. | 958 // Check that XHTML is supported, in addition to the default HTML type. |
| 1050 // Note: for this test to work correctly, the new URL must be on the | 959 // Note: for this test to work correctly, the new URL must be on the |
| 1051 // same domain as the previous URL, otherwise it will create a new | 960 // same domain as the previous URL, otherwise it will create a new |
| 1052 // RenderViewHost that won't have the mime type set. | 961 // RenderViewHost that won't have the mime type set. |
| 1053 url = GURL("http://host.com/xhtml"); | 962 url = GURL("http://host.com/xhtml"); |
| 1054 rvh_tester()->SetContentsMimeType("application/xhtml+xml"); | 963 rvh_tester()->SetContentsMimeType("application/xhtml+xml"); |
| 1055 ExpectPreClassificationChecks(url, &kFalse, &kFalse, &kFalse, &kFalse, | 964 ExpectPreClassificationChecks(url, &kFalse, &kFalse, &kFalse, &kFalse, |
| 1056 &kFalse, &kFalse); | 965 &kFalse, &kFalse); |
| 1057 NavigateAndCommit(url); | 966 NavigateAndCommit(url); |
| 1058 WaitAndCheckPreClassificationChecks(); | 967 WaitAndCheckPreClassificationChecks(); |
| 1059 msg = process()->sink().GetFirstMessageMatching( | 968 msg = process()->sink().GetFirstMessageMatching( |
| 1060 SafeBrowsingMsg_StartPhishingDetection::ID); | 969 SafeBrowsingMsg_StartPhishingDetection::ID); |
| 1061 ASSERT_TRUE(msg); | 970 ASSERT_TRUE(msg); |
| 1062 SafeBrowsingMsg_StartPhishingDetection::Read(msg, &actual_url); | 971 SafeBrowsingMsg_StartPhishingDetection::Read(msg, &actual_url); |
| 1063 EXPECT_EQ(url, actual_url.a); | 972 EXPECT_EQ(url, actual_url.a); |
| 1064 EXPECT_EQ(rvh()->GetRoutingID(), msg->routing_id()); | 973 EXPECT_EQ(rvh()->GetRoutingID(), msg->routing_id()); |
| 1065 process()->sink().ClearMessages(); | 974 process()->sink().ClearMessages(); |
| 975 ExpectShouldClassifyForMalwareResult(&kTrue); | |
| 1066 | 976 |
| 1067 // Navigate to a new host, which should cause another IPC. | 977 // Navigate to a new host, which should cause another IPC. |
| 1068 url = GURL("http://host2.com/"); | 978 url = GURL("http://host2.com/"); |
| 1069 ExpectPreClassificationChecks(url, &kFalse, &kFalse, &kFalse, &kFalse, | 979 ExpectPreClassificationChecks(url, &kFalse, &kFalse, &kFalse, &kFalse, |
| 1070 &kFalse, &kFalse); | 980 &kFalse, &kFalse); |
| 1071 NavigateAndCommit(url); | 981 NavigateAndCommit(url); |
| 1072 WaitAndCheckPreClassificationChecks(); | 982 WaitAndCheckPreClassificationChecks(); |
| 1073 msg = process()->sink().GetFirstMessageMatching( | 983 msg = process()->sink().GetFirstMessageMatching( |
| 1074 SafeBrowsingMsg_StartPhishingDetection::ID); | 984 SafeBrowsingMsg_StartPhishingDetection::ID); |
| 1075 ASSERT_TRUE(msg); | 985 ASSERT_TRUE(msg); |
| 1076 SafeBrowsingMsg_StartPhishingDetection::Read(msg, &actual_url); | 986 SafeBrowsingMsg_StartPhishingDetection::Read(msg, &actual_url); |
| 1077 EXPECT_EQ(url, actual_url.a); | 987 EXPECT_EQ(url, actual_url.a); |
| 1078 EXPECT_EQ(rvh()->GetRoutingID(), msg->routing_id()); | 988 EXPECT_EQ(rvh()->GetRoutingID(), msg->routing_id()); |
| 1079 process()->sink().ClearMessages(); | 989 process()->sink().ClearMessages(); |
| 990 ExpectShouldClassifyForMalwareResult(&kTrue); | |
| 1080 | 991 |
| 1081 // If the mime type is not one that we support, no IPC should be triggered. | 992 // If the mime type is not one that we support, no IPC should be triggered |
| 993 // but all pre-classification checks should run because we might classify | |
| 994 // other mime types for malware. | |
| 1082 // Note: for this test to work correctly, the new URL must be on the | 995 // Note: for this test to work correctly, the new URL must be on the |
| 1083 // same domain as the previous URL, otherwise it will create a new | 996 // same domain as the previous URL, otherwise it will create a new |
| 1084 // RenderViewHost that won't have the mime type set. | 997 // RenderViewHost that won't have the mime type set. |
| 1085 url = GURL("http://host2.com/image.jpg"); | 998 url = GURL("http://host2.com/image.jpg"); |
| 1086 rvh_tester()->SetContentsMimeType("image/jpeg"); | 999 rvh_tester()->SetContentsMimeType("image/jpeg"); |
| 1087 ExpectPreClassificationChecks(url, NULL, NULL, NULL, NULL, NULL, NULL); | 1000 ExpectPreClassificationChecks(url, &kFalse, &kFalse, &kFalse, &kFalse, |
| 1001 &kFalse,&kFalse); | |
| 1088 NavigateAndCommit(url); | 1002 NavigateAndCommit(url); |
| 1089 WaitAndCheckPreClassificationChecks(); | 1003 WaitAndCheckPreClassificationChecks(); |
| 1090 msg = process()->sink().GetFirstMessageMatching( | 1004 msg = process()->sink().GetFirstMessageMatching( |
| 1091 SafeBrowsingMsg_StartPhishingDetection::ID); | 1005 SafeBrowsingMsg_StartPhishingDetection::ID); |
| 1092 ASSERT_FALSE(msg); | 1006 ASSERT_FALSE(msg); |
| 1007 ExpectShouldClassifyForMalwareResult(&kTrue); | |
| 1093 | 1008 |
| 1094 // If IsPrivateIPAddress returns true, no IPC should be triggered. | 1009 // If IsPrivateIPAddress returns true, no IPC should be triggered. |
| 1095 url = GURL("http://host3.com/"); | 1010 url = GURL("http://host3.com/"); |
| 1096 ExpectPreClassificationChecks(url, &kTrue, NULL, NULL, NULL, NULL, NULL); | 1011 ExpectPreClassificationChecks(url, &kTrue, &kFalse, NULL, NULL, NULL, NULL); |
| 1097 NavigateAndCommit(url); | 1012 NavigateAndCommit(url); |
| 1098 WaitAndCheckPreClassificationChecks(); | 1013 WaitAndCheckPreClassificationChecks(); |
| 1099 msg = process()->sink().GetFirstMessageMatching( | 1014 msg = process()->sink().GetFirstMessageMatching( |
| 1100 SafeBrowsingMsg_StartPhishingDetection::ID); | 1015 SafeBrowsingMsg_StartPhishingDetection::ID); |
| 1101 ASSERT_FALSE(msg); | 1016 ASSERT_FALSE(msg); |
| 1017 ExpectShouldClassifyForMalwareResult(&kFalse); | |
| 1102 | 1018 |
| 1103 // If the tab is incognito there should be no IPC. Also, we shouldn't | 1019 // If the tab is incognito there should be no IPC. Also, we shouldn't |
| 1104 // even check the csd-whitelist. | 1020 // even check the csd-whitelist. |
| 1105 url = GURL("http://host4.com/"); | 1021 url = GURL("http://host4.com/"); |
| 1106 ExpectPreClassificationChecks(url, &kFalse, &kTrue, NULL, NULL, NULL, NULL); | 1022 ExpectPreClassificationChecks(url, &kFalse, &kTrue, NULL, NULL, NULL, NULL); |
| 1107 NavigateAndCommit(url); | 1023 NavigateAndCommit(url); |
| 1108 WaitAndCheckPreClassificationChecks(); | 1024 WaitAndCheckPreClassificationChecks(); |
| 1109 msg = process()->sink().GetFirstMessageMatching( | 1025 msg = process()->sink().GetFirstMessageMatching( |
| 1110 SafeBrowsingMsg_StartPhishingDetection::ID); | 1026 SafeBrowsingMsg_StartPhishingDetection::ID); |
| 1111 ASSERT_FALSE(msg); | 1027 ASSERT_FALSE(msg); |
| 1028 ExpectShouldClassifyForMalwareResult(&kFalse); | |
| 1112 | 1029 |
| 1113 // If the URL is on the csd whitelist, no IPC should be triggered. | 1030 // If the URL is on the csd whitelist, no IPC should be triggered. |
| 1114 url = GURL("http://host5.com/"); | 1031 url = GURL("http://host5.com/"); |
| 1115 ExpectPreClassificationChecks(url, &kFalse, &kFalse, &kTrue, NULL, NULL, | 1032 ExpectPreClassificationChecks(url, &kFalse, &kFalse, &kTrue, NULL, NULL, |
| 1116 NULL); | 1033 NULL); |
| 1117 NavigateAndCommit(url); | 1034 NavigateAndCommit(url); |
| 1118 WaitAndCheckPreClassificationChecks(); | 1035 WaitAndCheckPreClassificationChecks(); |
| 1119 msg = process()->sink().GetFirstMessageMatching( | 1036 msg = process()->sink().GetFirstMessageMatching( |
| 1120 SafeBrowsingMsg_StartPhishingDetection::ID); | 1037 SafeBrowsingMsg_StartPhishingDetection::ID); |
| 1121 ASSERT_FALSE(msg); | 1038 ASSERT_FALSE(msg); |
| 1039 ExpectShouldClassifyForMalwareResult(&kFalse); | |
| 1122 | 1040 |
| 1123 // If item is in the cache but it isn't valid, we will classify regardless | 1041 // If item is in the cache but it isn't valid, we will classify regardless |
| 1124 // of whether we are over the reporting limit. | 1042 // of whether we are over the reporting limit. |
| 1125 url = GURL("http://host6.com/"); | 1043 url = GURL("http://host6.com/"); |
| 1126 ExpectPreClassificationChecks(url, &kFalse, &kFalse, &kFalse, &kFalse, &kTrue, | 1044 ExpectPreClassificationChecks(url, &kFalse, &kFalse, &kFalse, &kFalse, &kTrue, |
| 1127 NULL); | 1045 NULL); |
| 1128 NavigateAndCommit(url); | 1046 NavigateAndCommit(url); |
| 1129 WaitAndCheckPreClassificationChecks(); | 1047 WaitAndCheckPreClassificationChecks(); |
| 1130 msg = process()->sink().GetFirstMessageMatching( | 1048 msg = process()->sink().GetFirstMessageMatching( |
| 1131 SafeBrowsingMsg_StartPhishingDetection::ID); | 1049 SafeBrowsingMsg_StartPhishingDetection::ID); |
| 1132 ASSERT_TRUE(msg); | 1050 ASSERT_TRUE(msg); |
| 1133 SafeBrowsingMsg_StartPhishingDetection::Read(msg, &actual_url); | 1051 SafeBrowsingMsg_StartPhishingDetection::Read(msg, &actual_url); |
| 1134 EXPECT_EQ(url, actual_url.a); | 1052 EXPECT_EQ(url, actual_url.a); |
| 1135 EXPECT_EQ(rvh()->GetRoutingID(), msg->routing_id()); | 1053 EXPECT_EQ(rvh()->GetRoutingID(), msg->routing_id()); |
| 1136 process()->sink().ClearMessages(); | 1054 process()->sink().ClearMessages(); |
| 1055 ExpectShouldClassifyForMalwareResult(&kTrue); | |
| 1137 | 1056 |
| 1138 // If the url isn't in the cache and we are over the reporting limit, we | 1057 // If the url isn't in the cache and we are over the reporting limit, we |
| 1139 // don't do classification. | 1058 // don't do classification. |
| 1140 url = GURL("http://host7.com/"); | 1059 url = GURL("http://host7.com/"); |
| 1141 ExpectPreClassificationChecks(url, &kFalse, &kFalse, &kFalse, &kFalse, | 1060 ExpectPreClassificationChecks(url, &kFalse, &kFalse, &kFalse, &kFalse, |
| 1142 &kFalse, &kTrue); | 1061 &kFalse, &kTrue); |
| 1143 NavigateAndCommit(url); | 1062 NavigateAndCommit(url); |
| 1144 WaitAndCheckPreClassificationChecks(); | 1063 WaitAndCheckPreClassificationChecks(); |
| 1145 msg = process()->sink().GetFirstMessageMatching( | 1064 msg = process()->sink().GetFirstMessageMatching( |
| 1146 SafeBrowsingMsg_StartPhishingDetection::ID); | 1065 SafeBrowsingMsg_StartPhishingDetection::ID); |
| 1147 ASSERT_FALSE(msg); | 1066 ASSERT_FALSE(msg); |
| 1067 ExpectShouldClassifyForMalwareResult(&kTrue); | |
| 1148 | 1068 |
| 1149 // If result is cached, we will try and display the blocking page directly | 1069 // If result is cached, we will try and display the blocking page directly |
| 1150 // with no start classification message. | 1070 // with no start classification message. |
| 1151 url = GURL("http://host8.com/"); | 1071 url = GURL("http://host8.com/"); |
| 1152 ExpectPreClassificationChecks(url, &kFalse, &kFalse, &kFalse, &kTrue, NULL, | 1072 ExpectPreClassificationChecks(url, &kFalse, &kFalse, &kFalse, &kTrue, &kFalse, |
| 1153 NULL); | 1073 &kFalse); |
| 1154 | 1074 |
| 1155 UnsafeResource resource; | 1075 UnsafeResource resource; |
| 1156 EXPECT_CALL(*ui_manager_.get(), DisplayBlockingPage(_)) | 1076 EXPECT_CALL(*ui_manager_.get(), DisplayBlockingPage(_)) |
| 1157 .WillOnce(SaveArg<0>(&resource)); | 1077 .WillOnce(SaveArg<0>(&resource)); |
| 1158 | 1078 |
| 1159 NavigateAndCommit(url); | 1079 NavigateAndCommit(url); |
| 1160 // Wait for CheckCsdWhitelist and CheckCache() to be called. | 1080 // Wait for CheckCsdWhitelist and CheckCache() to be called. |
| 1161 base::RunLoop().RunUntilIdle(); | 1081 base::RunLoop().RunUntilIdle(); |
| 1162 // Now we check that all expected functions were indeed called on the two | 1082 // Now we check that all expected functions were indeed called on the two |
| 1163 // service objects. | 1083 // service objects. |
| 1164 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get())); | 1084 EXPECT_TRUE(Mock::VerifyAndClear(csd_host_.get())); |
| 1165 EXPECT_TRUE(Mock::VerifyAndClear(ui_manager_.get())); | 1085 EXPECT_TRUE(Mock::VerifyAndClear(ui_manager_.get())); |
| 1166 EXPECT_EQ(url, resource.url); | 1086 EXPECT_EQ(url, resource.url); |
| 1167 EXPECT_EQ(url, resource.original_url); | 1087 EXPECT_EQ(url, resource.original_url); |
| 1168 resource.callback.Reset(); | 1088 resource.callback.Reset(); |
| 1169 msg = process()->sink().GetFirstMessageMatching( | 1089 msg = process()->sink().GetFirstMessageMatching( |
| 1170 SafeBrowsingMsg_StartPhishingDetection::ID); | 1090 SafeBrowsingMsg_StartPhishingDetection::ID); |
| 1171 ASSERT_FALSE(msg); | 1091 ASSERT_FALSE(msg); |
| 1172 } | 1092 } |
| 1173 } // namespace safe_browsing | 1093 } // namespace safe_browsing |
| OLD | NEW |