| 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 "chrome/browser/safe_browsing/download_protection_service.h" | 5 #include "chrome/browser/safe_browsing/download_protection_service.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <map> | 10 #include <map> |
| 11 #include <memory> | 11 #include <memory> |
| 12 #include <string> | 12 #include <string> |
| 13 | 13 |
| 14 #include "base/base_paths.h" | 14 #include "base/base_paths.h" |
| 15 #include "base/bind.h" | 15 #include "base/bind.h" |
| 16 #include "base/callback.h" | 16 #include "base/callback.h" |
| 17 #include "base/command_line.h" | 17 #include "base/command_line.h" |
| 18 #include "base/files/file_path.h" | 18 #include "base/files/file_path.h" |
| 19 #include "base/files/file_util.h" | 19 #include "base/files/file_util.h" |
| 20 #include "base/files/scoped_temp_dir.h" | 20 #include "base/files/scoped_temp_dir.h" |
| 21 #include "base/location.h" | 21 #include "base/location.h" |
| 22 #include "base/macros.h" | 22 #include "base/macros.h" |
| 23 #include "base/memory/ref_counted.h" | 23 #include "base/memory/ref_counted.h" |
| 24 #include "base/message_loop/message_loop.h" | |
| 25 #include "base/path_service.h" | 24 #include "base/path_service.h" |
| 26 #include "base/run_loop.h" | 25 #include "base/run_loop.h" |
| 27 #include "base/sha1.h" | 26 #include "base/sha1.h" |
| 28 #include "base/single_thread_task_runner.h" | 27 #include "base/single_thread_task_runner.h" |
| 29 #include "base/strings/string_number_conversions.h" | 28 #include "base/strings/string_number_conversions.h" |
| 30 #include "base/threading/sequenced_worker_pool.h" | 29 #include "base/threading/sequenced_worker_pool.h" |
| 31 #include "base/threading/thread_task_runner_handle.h" | 30 #include "base/threading/thread_task_runner_handle.h" |
| 32 #include "chrome/browser/history/history_service_factory.h" | 31 #include "chrome/browser/history/history_service_factory.h" |
| 33 #include "chrome/browser/safe_browsing/download_feedback_service.h" | 32 #include "chrome/browser/safe_browsing/download_feedback_service.h" |
| 34 #include "chrome/browser/safe_browsing/incident_reporting/incident_reporting_ser
vice.h" | 33 #include "chrome/browser/safe_browsing/incident_reporting/incident_reporting_ser
vice.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 using ::testing::DoAll; | 65 using ::testing::DoAll; |
| 67 using ::testing::ElementsAre; | 66 using ::testing::ElementsAre; |
| 68 using ::testing::Invoke; | 67 using ::testing::Invoke; |
| 69 using ::testing::Mock; | 68 using ::testing::Mock; |
| 70 using ::testing::NotNull; | 69 using ::testing::NotNull; |
| 71 using ::testing::Return; | 70 using ::testing::Return; |
| 72 using ::testing::ReturnRef; | 71 using ::testing::ReturnRef; |
| 73 using ::testing::SaveArg; | 72 using ::testing::SaveArg; |
| 74 using ::testing::StrictMock; | 73 using ::testing::StrictMock; |
| 75 using ::testing::_; | 74 using ::testing::_; |
| 76 using base::MessageLoop; | 75 using base::RunLoop; |
| 77 using content::BrowserThread; | 76 using content::BrowserThread; |
| 78 namespace safe_browsing { | 77 namespace safe_browsing { |
| 79 namespace { | 78 namespace { |
| 80 // A SafeBrowsingDatabaseManager implementation that returns a fixed result for | 79 // A SafeBrowsingDatabaseManager implementation that returns a fixed result for |
| 81 // a given URL. | 80 // a given URL. |
| 82 class MockSafeBrowsingDatabaseManager : public TestSafeBrowsingDatabaseManager { | 81 class MockSafeBrowsingDatabaseManager : public TestSafeBrowsingDatabaseManager { |
| 83 public: | 82 public: |
| 84 MockSafeBrowsingDatabaseManager() {} | 83 MockSafeBrowsingDatabaseManager() {} |
| 85 | 84 |
| 86 MOCK_METHOD1(MatchDownloadWhitelistUrl, bool(const GURL&)); | 85 MOCK_METHOD1(MatchDownloadWhitelistUrl, bool(const GURL&)); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 void OnRequestEnd(int fetcher_id) override {} | 180 void OnRequestEnd(int fetcher_id) override {} |
| 182 | 181 |
| 183 int WaitForRequest() { | 182 int WaitForRequest() { |
| 184 run_loop_.Run(); | 183 run_loop_.Run(); |
| 185 return fetcher_id_; | 184 return fetcher_id_; |
| 186 } | 185 } |
| 187 | 186 |
| 188 private: | 187 private: |
| 189 net::TestURLFetcherFactory* factory_; | 188 net::TestURLFetcherFactory* factory_; |
| 190 int fetcher_id_; | 189 int fetcher_id_; |
| 191 base::RunLoop run_loop_; | 190 RunLoop run_loop_; |
| 192 }; | 191 }; |
| 193 } // namespace | 192 } // namespace |
| 194 | 193 |
| 195 ACTION_P(SetCertificateContents, contents) { | 194 ACTION_P(SetCertificateContents, contents) { |
| 196 arg1->add_certificate_chain()->add_element()->set_certificate(contents); | 195 arg1->add_certificate_chain()->add_element()->set_certificate(contents); |
| 197 } | 196 } |
| 198 | 197 |
| 199 ACTION_P(SetDosHeaderContents, contents) { | 198 ACTION_P(SetDosHeaderContents, contents) { |
| 200 arg2->mutable_pe_headers()->set_dos_header(contents); | 199 arg2->mutable_pe_headers()->set_dos_header(contents); |
| 201 return true; | 200 return true; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 251 binary_feature_extractor_ = new StrictMock<MockBinaryFeatureExtractor>(); | 250 binary_feature_extractor_ = new StrictMock<MockBinaryFeatureExtractor>(); |
| 252 ON_CALL(*binary_feature_extractor_, ExtractImageFeatures(_, _, _, _)) | 251 ON_CALL(*binary_feature_extractor_, ExtractImageFeatures(_, _, _, _)) |
| 253 .WillByDefault(Return(true)); | 252 .WillByDefault(Return(true)); |
| 254 download_service_ = sb_service_->download_protection_service(); | 253 download_service_ = sb_service_->download_protection_service(); |
| 255 download_service_->binary_feature_extractor_ = binary_feature_extractor_; | 254 download_service_->binary_feature_extractor_ = binary_feature_extractor_; |
| 256 download_service_->SetEnabled(true); | 255 download_service_->SetEnabled(true); |
| 257 client_download_request_subscription_ = | 256 client_download_request_subscription_ = |
| 258 download_service_->RegisterClientDownloadRequestCallback( | 257 download_service_->RegisterClientDownloadRequestCallback( |
| 259 base::Bind(&DownloadProtectionServiceTest::OnClientDownloadRequest, | 258 base::Bind(&DownloadProtectionServiceTest::OnClientDownloadRequest, |
| 260 base::Unretained(this))); | 259 base::Unretained(this))); |
| 261 base::RunLoop().RunUntilIdle(); | 260 RunLoop().RunUntilIdle(); |
| 262 has_result_ = false; | 261 has_result_ = false; |
| 263 | 262 |
| 264 base::FilePath source_path; | 263 base::FilePath source_path; |
| 265 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &source_path)); | 264 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &source_path)); |
| 266 testdata_path_ = source_path | 265 testdata_path_ = source_path |
| 267 .AppendASCII("chrome") | 266 .AppendASCII("chrome") |
| 268 .AppendASCII("test") | 267 .AppendASCII("test") |
| 269 .AppendASCII("data") | 268 .AppendASCII("data") |
| 270 .AppendASCII("safe_browsing") | 269 .AppendASCII("safe_browsing") |
| 271 .AppendASCII("download_protection"); | 270 .AppendASCII("download_protection"); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 if (archived_binary.file_basename() == file_basename) | 338 if (archived_binary.file_basename() == file_basename) |
| 340 return &archived_binary; | 339 return &archived_binary; |
| 341 } | 340 } |
| 342 return nullptr; | 341 return nullptr; |
| 343 } | 342 } |
| 344 | 343 |
| 345 // Flushes any pending tasks in the message loops of all threads. | 344 // Flushes any pending tasks in the message loops of all threads. |
| 346 void FlushThreadMessageLoops() { | 345 void FlushThreadMessageLoops() { |
| 347 BrowserThread::GetBlockingPool()->FlushForTesting(); | 346 BrowserThread::GetBlockingPool()->FlushForTesting(); |
| 348 FlushMessageLoop(BrowserThread::IO); | 347 FlushMessageLoop(BrowserThread::IO); |
| 349 base::RunLoop().RunUntilIdle(); | 348 RunLoop().RunUntilIdle(); |
| 350 } | 349 } |
| 351 | 350 |
| 352 // Proxy for private method. | 351 // Proxy for private method. |
| 353 static void GetCertificateWhitelistStrings( | 352 static void GetCertificateWhitelistStrings( |
| 354 const net::X509Certificate& certificate, | 353 const net::X509Certificate& certificate, |
| 355 const net::X509Certificate& issuer, | 354 const net::X509Certificate& issuer, |
| 356 std::vector<std::string>* whitelist_strings) { | 355 std::vector<std::string>* whitelist_strings) { |
| 357 DownloadProtectionService::GetCertificateWhitelistStrings( | 356 DownloadProtectionService::GetCertificateWhitelistStrings( |
| 358 certificate, issuer, whitelist_strings); | 357 certificate, issuer, whitelist_strings); |
| 359 } | 358 } |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 434 EXPECT_CALL(*item, GetTabReferrerUrl()) | 433 EXPECT_CALL(*item, GetTabReferrerUrl()) |
| 435 .WillRepeatedly(ReturnRef(GURL::EmptyGURL())); | 434 .WillRepeatedly(ReturnRef(GURL::EmptyGURL())); |
| 436 EXPECT_CALL(*item, GetHash()).WillRepeatedly(ReturnRef(hash_)); | 435 EXPECT_CALL(*item, GetHash()).WillRepeatedly(ReturnRef(hash_)); |
| 437 EXPECT_CALL(*item, GetReceivedBytes()).WillRepeatedly(Return(100)); | 436 EXPECT_CALL(*item, GetReceivedBytes()).WillRepeatedly(Return(100)); |
| 438 EXPECT_CALL(*item, HasUserGesture()).WillRepeatedly(Return(true)); | 437 EXPECT_CALL(*item, HasUserGesture()).WillRepeatedly(Return(true)); |
| 439 EXPECT_CALL(*item, GetRemoteAddress()).WillRepeatedly(Return("")); | 438 EXPECT_CALL(*item, GetRemoteAddress()).WillRepeatedly(Return("")); |
| 440 } | 439 } |
| 441 | 440 |
| 442 private: | 441 private: |
| 443 // Helper functions for FlushThreadMessageLoops. | 442 // Helper functions for FlushThreadMessageLoops. |
| 444 void RunAllPendingAndQuitUI() { | 443 void RunAllPendingAndQuitUI(base::Closure quit_closure) { |
| 445 base::RunLoop().RunUntilIdle(); | 444 RunLoop().RunUntilIdle(); |
| 446 BrowserThread::PostTask( | 445 BrowserThread::PostTask( |
| 447 BrowserThread::UI, | 446 BrowserThread::UI, FROM_HERE, |
| 448 FROM_HERE, | |
| 449 base::Bind(&DownloadProtectionServiceTest::QuitMessageLoop, | 447 base::Bind(&DownloadProtectionServiceTest::QuitMessageLoop, |
| 450 base::Unretained(this))); | 448 base::Unretained(this), quit_closure)); |
| 451 } | 449 } |
| 452 | 450 |
| 453 void QuitMessageLoop() { base::MessageLoop::current()->QuitWhenIdle(); } | 451 void QuitMessageLoop(base::Closure quit_closure) { quit_closure.Run(); } |
| 454 | 452 |
| 455 void PostRunMessageLoopTask(BrowserThread::ID thread) { | 453 void PostRunMessageLoopTask(base::Closure quit_closure, |
| 454 BrowserThread::ID thread) { |
| 456 BrowserThread::PostTask( | 455 BrowserThread::PostTask( |
| 457 thread, | 456 thread, FROM_HERE, |
| 458 FROM_HERE, | |
| 459 base::Bind(&DownloadProtectionServiceTest::RunAllPendingAndQuitUI, | 457 base::Bind(&DownloadProtectionServiceTest::RunAllPendingAndQuitUI, |
| 460 base::Unretained(this))); | 458 base::Unretained(this), quit_closure)); |
| 461 } | 459 } |
| 462 | 460 |
| 463 void FlushMessageLoop(BrowserThread::ID thread) { | 461 void FlushMessageLoop(BrowserThread::ID thread) { |
| 462 RunLoop run_loop; |
| 464 BrowserThread::PostTask( | 463 BrowserThread::PostTask( |
| 465 BrowserThread::UI, | 464 BrowserThread::UI, FROM_HERE, |
| 466 FROM_HERE, | |
| 467 base::Bind(&DownloadProtectionServiceTest::PostRunMessageLoopTask, | 465 base::Bind(&DownloadProtectionServiceTest::PostRunMessageLoopTask, |
| 468 base::Unretained(this), thread)); | 466 base::Unretained(this), run_loop.QuitClosure(), thread)); |
| 469 base::RunLoop().Run(); | 467 run_loop.Run(); |
| 470 } | 468 } |
| 471 | 469 |
| 472 void OnClientDownloadRequest(content::DownloadItem* download, | 470 void OnClientDownloadRequest(content::DownloadItem* download, |
| 473 const ClientDownloadRequest* request) { | 471 const ClientDownloadRequest* request) { |
| 474 if (request) | 472 if (request) |
| 475 last_client_download_request_.reset(new ClientDownloadRequest(*request)); | 473 last_client_download_request_.reset(new ClientDownloadRequest(*request)); |
| 476 else | 474 else |
| 477 last_client_download_request_.reset(); | 475 last_client_download_request_.reset(); |
| 478 } | 476 } |
| 479 | 477 |
| 480 public: | 478 public: |
| 481 enum ArchiveType { ZIP, DMG }; | 479 enum ArchiveType { ZIP, DMG }; |
| 482 | 480 |
| 483 void CheckDoneCallback( | 481 void CheckDoneCallback( |
| 482 base::Closure quit_closure, |
| 484 DownloadProtectionService::DownloadCheckResult result) { | 483 DownloadProtectionService::DownloadCheckResult result) { |
| 485 result_ = result; | 484 result_ = result; |
| 486 has_result_ = true; | 485 has_result_ = true; |
| 487 MessageLoop::current()->QuitWhenIdle(); | 486 quit_closure.Run(); |
| 488 } | 487 } |
| 489 | 488 |
| 490 void SyncCheckDoneCallback( | 489 void SyncCheckDoneCallback( |
| 491 DownloadProtectionService::DownloadCheckResult result) { | 490 DownloadProtectionService::DownloadCheckResult result) { |
| 492 result_ = result; | 491 result_ = result; |
| 493 has_result_ = true; | 492 has_result_ = true; |
| 494 } | 493 } |
| 495 | 494 |
| 496 void SendURLFetchComplete(net::TestURLFetcher* fetcher) { | 495 void SendURLFetchComplete(net::TestURLFetcher* fetcher) { |
| 497 fetcher->delegate()->OnURLFetchComplete(fetcher); | 496 fetcher->delegate()->OnURLFetchComplete(fetcher); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 549 | 548 |
| 550 void DownloadProtectionServiceTest::CheckClientDownloadReportCorruptArchive( | 549 void DownloadProtectionServiceTest::CheckClientDownloadReportCorruptArchive( |
| 551 ArchiveType type, | 550 ArchiveType type, |
| 552 bool is_extended_reporting, | 551 bool is_extended_reporting, |
| 553 bool is_incognito) { | 552 bool is_incognito) { |
| 554 net::FakeURLFetcherFactory factory(NULL); | 553 net::FakeURLFetcherFactory factory(NULL); |
| 555 PrepareResponse( | 554 PrepareResponse( |
| 556 &factory, ClientDownloadResponse::SAFE, net::HTTP_OK, | 555 &factory, ClientDownloadResponse::SAFE, net::HTTP_OK, |
| 557 net::URLRequestStatus::SUCCESS); | 556 net::URLRequestStatus::SUCCESS); |
| 558 | 557 |
| 559 profile_->GetPrefs()->SetBoolean(prefs::kSafeBrowsingExtendedReportingEnabled, | 558 SetExtendedReportingPreference(is_extended_reporting); |
| 560 is_extended_reporting); | |
| 561 content::MockDownloadItem item; | 559 content::MockDownloadItem item; |
| 562 if (type == ZIP) { | 560 if (type == ZIP) { |
| 563 PrepareBasicDownloadItem(&item, {"http://www.evil.com/a.zip"}, // url_chain | 561 PrepareBasicDownloadItem(&item, {"http://www.evil.com/a.zip"}, // url_chain |
| 564 "http://www.google.com/", // referrer | 562 "http://www.google.com/", // referrer |
| 565 FILE_PATH_LITERAL("a.tmp"), // tmp_path | 563 FILE_PATH_LITERAL("a.tmp"), // tmp_path |
| 566 FILE_PATH_LITERAL("a.zip")); // final_path | 564 FILE_PATH_LITERAL("a.zip")); // final_path |
| 567 } else if (type == DMG) { | 565 } else if (type == DMG) { |
| 568 PrepareBasicDownloadItem(&item, {"http://www.evil.com/a.dmg"}, // url_chain | 566 PrepareBasicDownloadItem(&item, {"http://www.evil.com/a.dmg"}, // url_chain |
| 569 "http://www.google.com/", // referrer | 567 "http://www.google.com/", // referrer |
| 570 FILE_PATH_LITERAL("a.tmp"), // tmp_path | 568 FILE_PATH_LITERAL("a.tmp"), // tmp_path |
| 571 FILE_PATH_LITERAL("a.dmg")); // final_path | 569 FILE_PATH_LITERAL("a.dmg")); // final_path |
| 572 } | 570 } |
| 573 | 571 |
| 574 if (is_incognito) { | 572 if (is_incognito) { |
| 575 EXPECT_CALL(item, GetBrowserContext()) | 573 EXPECT_CALL(item, GetBrowserContext()) |
| 576 .WillRepeatedly(Return(profile_->GetOffTheRecordProfile())); | 574 .WillRepeatedly(Return(profile_->GetOffTheRecordProfile())); |
| 577 } else { | 575 } else { |
| 578 EXPECT_CALL(item, GetBrowserContext()) | 576 EXPECT_CALL(item, GetBrowserContext()) |
| 579 .WillRepeatedly(Return(profile_.get())); | 577 .WillRepeatedly(Return(profile_.get())); |
| 580 } | 578 } |
| 581 | 579 |
| 582 std::string file_contents = "corrupt archive file"; | 580 std::string file_contents = "corrupt archive file"; |
| 583 ASSERT_EQ(static_cast<int>(file_contents.size()), base::WriteFile( | 581 ASSERT_EQ(static_cast<int>(file_contents.size()), base::WriteFile( |
| 584 tmp_path_, file_contents.data(), file_contents.size())); | 582 tmp_path_, file_contents.data(), file_contents.size())); |
| 585 | 583 |
| 584 RunLoop run_loop; |
| 586 download_service_->CheckClientDownload( | 585 download_service_->CheckClientDownload( |
| 587 &item, | 586 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 588 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 587 base::Unretained(this), run_loop.QuitClosure())); |
| 589 base::Unretained(this))); | 588 run_loop.Run(); |
| 590 base::RunLoop().Run(); | |
| 591 | 589 |
| 592 const bool expect_request = | 590 const bool expect_request = |
| 593 type == ZIP ? is_extended_reporting && !is_incognito : true; | 591 type == ZIP ? is_extended_reporting && !is_incognito : true; |
| 594 | 592 |
| 595 if (expect_request) { | 593 if (expect_request) { |
| 596 ASSERT_TRUE(HasClientDownloadRequest()); | 594 ASSERT_TRUE(HasClientDownloadRequest()); |
| 597 EXPECT_EQ(0, GetClientDownloadRequest()->archived_binary_size()); | 595 EXPECT_EQ(0, GetClientDownloadRequest()->archived_binary_size()); |
| 598 EXPECT_TRUE(GetClientDownloadRequest()->has_download_type()); | 596 EXPECT_TRUE(GetClientDownloadRequest()->has_download_type()); |
| 599 ClientDownloadRequest::DownloadType expected_type = | 597 ClientDownloadRequest::DownloadType expected_type = |
| 600 type == ZIP ? ClientDownloadRequest_DownloadType_INVALID_ZIP | 598 type == ZIP ? ClientDownloadRequest_DownloadType_INVALID_ZIP |
| 601 : ClientDownloadRequest_DownloadType_INVALID_MAC_ARCHIVE; | 599 : ClientDownloadRequest_DownloadType_INVALID_MAC_ARCHIVE; |
| 602 EXPECT_EQ(expected_type, GetClientDownloadRequest()->download_type()); | 600 EXPECT_EQ(expected_type, GetClientDownloadRequest()->download_type()); |
| 603 ClearClientDownloadRequest(); | 601 ClearClientDownloadRequest(); |
| 604 } else { | 602 } else { |
| 605 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); | 603 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); |
| 606 EXPECT_FALSE(HasClientDownloadRequest()); | 604 EXPECT_FALSE(HasClientDownloadRequest()); |
| 607 } | 605 } |
| 608 | 606 |
| 609 Mock::VerifyAndClearExpectations(sb_service_.get()); | 607 Mock::VerifyAndClearExpectations(sb_service_.get()); |
| 610 Mock::VerifyAndClearExpectations(binary_feature_extractor_.get()); | 608 Mock::VerifyAndClearExpectations(binary_feature_extractor_.get()); |
| 611 } | 609 } |
| 612 | 610 |
| 613 TEST_F(DownloadProtectionServiceTest, CheckClientDownloadInvalidUrl) { | 611 TEST_F(DownloadProtectionServiceTest, CheckClientDownloadInvalidUrl) { |
| 614 content::MockDownloadItem item; | 612 content::MockDownloadItem item; |
| 615 PrepareBasicDownloadItem( | 613 { |
| 616 &item, | 614 PrepareBasicDownloadItem(&item, |
| 617 std::vector<std::string>(), // empty url_chain | 615 std::vector<std::string>(), // empty url_chain |
| 618 "http://www.google.com/", // referrer | 616 "http://www.google.com/", // referrer |
| 619 FILE_PATH_LITERAL("a.tmp"), // tmp_path | 617 FILE_PATH_LITERAL("a.tmp"), // tmp_path |
| 620 FILE_PATH_LITERAL("a.exe")); // final_path | 618 FILE_PATH_LITERAL("a.exe")); // final_path |
| 621 download_service_->CheckClientDownload( | 619 RunLoop run_loop; |
| 622 &item, | 620 download_service_->CheckClientDownload( |
| 623 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 621 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 624 base::Unretained(this))); | 622 base::Unretained(this), run_loop.QuitClosure())); |
| 625 base::RunLoop().Run(); | 623 run_loop.Run(); |
| 626 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); | 624 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); |
| 627 EXPECT_FALSE(HasClientDownloadRequest()); | 625 EXPECT_FALSE(HasClientDownloadRequest()); |
| 628 Mock::VerifyAndClearExpectations(&item); | 626 Mock::VerifyAndClearExpectations(&item); |
| 627 } |
| 629 | 628 |
| 630 PrepareBasicDownloadItem( | 629 { |
| 631 &item, | 630 PrepareBasicDownloadItem(&item, {"file://www.google.com/"}, // url_chain |
| 632 {"file://www.google.com/"}, // url_chain | 631 "http://www.google.com/", // referrer |
| 633 "http://www.google.com/", // referrer | 632 FILE_PATH_LITERAL("a.tmp"), // tmp_path |
| 634 FILE_PATH_LITERAL("a.tmp"), // tmp_path | 633 FILE_PATH_LITERAL("a.exe")); // final_path |
| 635 FILE_PATH_LITERAL("a.exe")); // final_path | 634 RunLoop run_loop; |
| 636 download_service_->CheckClientDownload( | 635 download_service_->CheckClientDownload( |
| 637 &item, | 636 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 638 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 637 base::Unretained(this), run_loop.QuitClosure())); |
| 639 base::Unretained(this))); | 638 run_loop.Run(); |
| 640 base::RunLoop().Run(); | 639 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); |
| 641 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); | 640 EXPECT_FALSE(HasClientDownloadRequest()); |
| 642 EXPECT_FALSE(HasClientDownloadRequest()); | 641 } |
| 643 } | 642 } |
| 644 | 643 |
| 645 TEST_F(DownloadProtectionServiceTest, CheckClientDownloadNotABinary) { | 644 TEST_F(DownloadProtectionServiceTest, CheckClientDownloadNotABinary) { |
| 646 content::MockDownloadItem item; | 645 content::MockDownloadItem item; |
| 647 PrepareBasicDownloadItem( | 646 PrepareBasicDownloadItem( |
| 648 &item, | 647 &item, |
| 649 std::vector<std::string>(), // empty url_chain | 648 std::vector<std::string>(), // empty url_chain |
| 650 "http://www.google.com/", // referrer | 649 "http://www.google.com/", // referrer |
| 651 FILE_PATH_LITERAL("a.tmp"), // tmp_path | 650 FILE_PATH_LITERAL("a.tmp"), // tmp_path |
| 652 FILE_PATH_LITERAL("a.txt")); // final_path | 651 FILE_PATH_LITERAL("a.txt")); // final_path |
| 652 RunLoop run_loop; |
| 653 download_service_->CheckClientDownload( | 653 download_service_->CheckClientDownload( |
| 654 &item, | 654 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 655 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 655 base::Unretained(this), run_loop.QuitClosure())); |
| 656 base::Unretained(this))); | 656 run_loop.Run(); |
| 657 base::RunLoop().Run(); | |
| 658 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); | 657 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); |
| 659 EXPECT_FALSE(HasClientDownloadRequest()); | 658 EXPECT_FALSE(HasClientDownloadRequest()); |
| 660 } | 659 } |
| 661 | 660 |
| 662 TEST_F(DownloadProtectionServiceTest, | 661 TEST_F(DownloadProtectionServiceTest, |
| 663 CheckClientDownloadWhitelistedUrlWithoutSampling) { | 662 CheckClientDownloadWhitelistedUrlWithoutSampling) { |
| 664 // Response to any requests will be DANGEROUS. | 663 // Response to any requests will be DANGEROUS. |
| 665 net::FakeURLFetcherFactory factory(NULL); | 664 net::FakeURLFetcherFactory factory(NULL); |
| 666 PrepareResponse( | 665 PrepareResponse( |
| 667 &factory, ClientDownloadResponse::DANGEROUS, net::HTTP_OK, | 666 &factory, ClientDownloadResponse::DANGEROUS, net::HTTP_OK, |
| (...skipping 16 matching lines...) Expand all Loading... |
| 684 | 683 |
| 685 // We should not get whilelist checks for other URLs than specified below. | 684 // We should not get whilelist checks for other URLs than specified below. |
| 686 EXPECT_CALL(*sb_service_->mock_database_manager(), | 685 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 687 MatchDownloadWhitelistUrl(_)).Times(0); | 686 MatchDownloadWhitelistUrl(_)).Times(0); |
| 688 EXPECT_CALL(*sb_service_->mock_database_manager(), | 687 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 689 MatchDownloadWhitelistUrl(GURL("http://www.evil.com/bla.exe"))) | 688 MatchDownloadWhitelistUrl(GURL("http://www.evil.com/bla.exe"))) |
| 690 .WillRepeatedly(Return(false)); | 689 .WillRepeatedly(Return(false)); |
| 691 EXPECT_CALL(*sb_service_->mock_database_manager(), | 690 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 692 MatchDownloadWhitelistUrl(GURL("http://www.google.com/a.exe"))) | 691 MatchDownloadWhitelistUrl(GURL("http://www.google.com/a.exe"))) |
| 693 .WillRepeatedly(Return(true)); | 692 .WillRepeatedly(Return(true)); |
| 694 | |
| 695 // With no referrer and just the bad url, should be marked DANGEROUS. | |
| 696 url_chain_.push_back(GURL("http://www.evil.com/bla.exe")); | |
| 697 // Set sample rate to 0 to prevent sampling. | 693 // Set sample rate to 0 to prevent sampling. |
| 698 SetWhitelistedDownloadSampleRate(0); | 694 SetWhitelistedDownloadSampleRate(0); |
| 699 download_service_->CheckClientDownload( | |
| 700 &item, | |
| 701 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | |
| 702 base::Unretained(this))); | |
| 703 base::RunLoop().Run(); | |
| 704 | 695 |
| 705 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); | 696 { |
| 706 EXPECT_TRUE(HasClientDownloadRequest()); | 697 // With no referrer and just the bad url, should be marked DANGEROUS. |
| 707 EXPECT_FALSE(GetClientDownloadRequest()->skipped_url_whitelist()); | 698 url_chain_.push_back(GURL("http://www.evil.com/bla.exe")); |
| 708 EXPECT_FALSE(GetClientDownloadRequest()->skipped_certificate_whitelist()); | 699 RunLoop run_loop; |
| 709 ClearClientDownloadRequest(); | 700 download_service_->CheckClientDownload( |
| 701 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 702 base::Unretained(this), run_loop.QuitClosure())); |
| 703 run_loop.Run(); |
| 710 | 704 |
| 711 // Check that the referrer is not matched against the whitelist. | 705 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); |
| 712 referrer_ = GURL("http://www.google.com/"); | 706 EXPECT_TRUE(HasClientDownloadRequest()); |
| 713 download_service_->CheckClientDownload( | 707 EXPECT_FALSE(GetClientDownloadRequest()->skipped_url_whitelist()); |
| 714 &item, | 708 EXPECT_FALSE(GetClientDownloadRequest()->skipped_certificate_whitelist()); |
| 715 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 709 ClearClientDownloadRequest(); |
| 716 base::Unretained(this))); | 710 } |
| 717 base::RunLoop().Run(); | |
| 718 | 711 |
| 719 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); | 712 { |
| 720 EXPECT_TRUE(HasClientDownloadRequest()); | 713 // Check that the referrer is not matched against the whitelist. |
| 721 EXPECT_FALSE(GetClientDownloadRequest()->skipped_url_whitelist()); | 714 referrer_ = GURL("http://www.google.com/"); |
| 722 EXPECT_FALSE(GetClientDownloadRequest()->skipped_certificate_whitelist()); | 715 RunLoop run_loop; |
| 723 ClearClientDownloadRequest(); | 716 download_service_->CheckClientDownload( |
| 717 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 718 base::Unretained(this), run_loop.QuitClosure())); |
| 719 run_loop.Run(); |
| 724 | 720 |
| 725 // Redirect from a site shouldn't be checked either. | 721 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); |
| 726 url_chain_.insert(url_chain_.begin(), GURL("http://www.google.com/redirect")); | 722 EXPECT_TRUE(HasClientDownloadRequest()); |
| 727 download_service_->CheckClientDownload( | 723 EXPECT_FALSE(GetClientDownloadRequest()->skipped_url_whitelist()); |
| 728 &item, | 724 EXPECT_FALSE(GetClientDownloadRequest()->skipped_certificate_whitelist()); |
| 729 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 725 ClearClientDownloadRequest(); |
| 730 base::Unretained(this))); | 726 } |
| 731 base::RunLoop().Run(); | |
| 732 | 727 |
| 733 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); | 728 { |
| 734 EXPECT_TRUE(HasClientDownloadRequest()); | 729 // Redirect from a site shouldn't be checked either. |
| 735 EXPECT_FALSE(GetClientDownloadRequest()->skipped_url_whitelist()); | 730 url_chain_.insert(url_chain_.begin(), |
| 736 EXPECT_FALSE(GetClientDownloadRequest()->skipped_certificate_whitelist()); | 731 GURL("http://www.google.com/redirect")); |
| 737 ClearClientDownloadRequest(); | 732 RunLoop run_loop; |
| 733 download_service_->CheckClientDownload( |
| 734 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 735 base::Unretained(this), run_loop.QuitClosure())); |
| 736 run_loop.Run(); |
| 738 | 737 |
| 739 // Only if the final url is whitelisted should it be SAFE. | 738 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); |
| 740 url_chain_.push_back(GURL("http://www.google.com/a.exe")); | 739 EXPECT_TRUE(HasClientDownloadRequest()); |
| 741 download_service_->CheckClientDownload( | 740 EXPECT_FALSE(GetClientDownloadRequest()->skipped_url_whitelist()); |
| 742 &item, | 741 EXPECT_FALSE(GetClientDownloadRequest()->skipped_certificate_whitelist()); |
| 743 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 742 ClearClientDownloadRequest(); |
| 744 base::Unretained(this))); | 743 } |
| 745 base::RunLoop().Run(); | 744 |
| 746 EXPECT_TRUE(IsResult(DownloadProtectionService::SAFE)); | 745 { |
| 747 // TODO(grt): Make the service produce the request even when the URL is | 746 // Only if the final url is whitelisted should it be SAFE. |
| 748 // whitelisted. | 747 url_chain_.push_back(GURL("http://www.google.com/a.exe")); |
| 749 EXPECT_FALSE(HasClientDownloadRequest()); | 748 RunLoop run_loop; |
| 749 download_service_->CheckClientDownload( |
| 750 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 751 base::Unretained(this), run_loop.QuitClosure())); |
| 752 run_loop.Run(); |
| 753 EXPECT_TRUE(IsResult(DownloadProtectionService::SAFE)); |
| 754 // TODO(grt): Make the service produce the request even when the URL is |
| 755 // whitelisted. |
| 756 EXPECT_FALSE(HasClientDownloadRequest()); |
| 757 } |
| 750 } | 758 } |
| 751 | 759 |
| 752 TEST_F(DownloadProtectionServiceTest, | 760 TEST_F(DownloadProtectionServiceTest, |
| 753 CheckClientDownloadWhitelistedUrlWithSampling) { | 761 CheckClientDownloadWhitelistedUrlWithSampling) { |
| 754 // Server responses "SAFE" to every requests coming from whitelisted | 762 // Server responses "SAFE" to every requests coming from whitelisted |
| 755 // download. | 763 // download. |
| 756 net::FakeURLFetcherFactory factory(NULL); | 764 net::FakeURLFetcherFactory factory(NULL); |
| 757 PrepareResponse( | 765 PrepareResponse( |
| 758 &factory, ClientDownloadResponse::SAFE, net::HTTP_OK, | 766 &factory, ClientDownloadResponse::SAFE, net::HTTP_OK, |
| 759 net::URLRequestStatus::SUCCESS); | 767 net::URLRequestStatus::SUCCESS); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 774 // Assume http://www.whitelist.com/a.exe is on the whitelist. | 782 // Assume http://www.whitelist.com/a.exe is on the whitelist. |
| 775 EXPECT_CALL(*sb_service_->mock_database_manager(), | 783 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 776 MatchDownloadWhitelistUrl(_)).Times(0); | 784 MatchDownloadWhitelistUrl(_)).Times(0); |
| 777 EXPECT_CALL(*sb_service_->mock_database_manager(), | 785 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 778 MatchDownloadWhitelistUrl(GURL("http://www.whitelist.com/a.exe"))) | 786 MatchDownloadWhitelistUrl(GURL("http://www.whitelist.com/a.exe"))) |
| 779 .WillRepeatedly(Return(true)); | 787 .WillRepeatedly(Return(true)); |
| 780 url_chain_.push_back(GURL("http://www.whitelist.com/a.exe")); | 788 url_chain_.push_back(GURL("http://www.whitelist.com/a.exe")); |
| 781 // Set sample rate to 1.00, so download_service_ will always send download | 789 // Set sample rate to 1.00, so download_service_ will always send download |
| 782 // pings for whitelisted downloads. | 790 // pings for whitelisted downloads. |
| 783 SetWhitelistedDownloadSampleRate(1.00); | 791 SetWhitelistedDownloadSampleRate(1.00); |
| 784 // Case (1): is_extended_reporting && is_incognito. | |
| 785 // ClientDownloadRequest should NOT be sent. | |
| 786 SetExtendedReportingPreference(true); | |
| 787 EXPECT_CALL(item, GetBrowserContext()) | |
| 788 .WillRepeatedly(Return(profile_->GetOffTheRecordProfile())); | |
| 789 download_service_->CheckClientDownload( | |
| 790 &item, | |
| 791 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | |
| 792 base::Unretained(this))); | |
| 793 base::RunLoop().Run(); | |
| 794 EXPECT_TRUE(IsResult(DownloadProtectionService::SAFE)); | |
| 795 EXPECT_FALSE(HasClientDownloadRequest()); | |
| 796 | 792 |
| 797 // Case (2): is_extended_reporting && !is_incognito. | 793 { |
| 798 // ClientDownloadRequest should be sent. | 794 // Case (1): is_extended_reporting && is_incognito. |
| 799 EXPECT_CALL(item, GetBrowserContext()) | 795 // ClientDownloadRequest should NOT be sent. |
| 800 .WillRepeatedly(Return(profile_.get())); | 796 SetExtendedReportingPreference(true); |
| 801 download_service_->CheckClientDownload( | 797 EXPECT_CALL(item, GetBrowserContext()) |
| 802 &item, | 798 .WillRepeatedly(Return(profile_->GetOffTheRecordProfile())); |
| 803 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 799 RunLoop run_loop; |
| 804 base::Unretained(this))); | 800 download_service_->CheckClientDownload( |
| 805 base::RunLoop().Run(); | 801 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 806 EXPECT_TRUE(IsResult(DownloadProtectionService::SAFE)); | 802 base::Unretained(this), run_loop.QuitClosure())); |
| 807 EXPECT_TRUE(HasClientDownloadRequest()); | 803 run_loop.Run(); |
| 808 EXPECT_TRUE(GetClientDownloadRequest()->skipped_url_whitelist()); | 804 EXPECT_TRUE(IsResult(DownloadProtectionService::SAFE)); |
| 809 ClearClientDownloadRequest(); | 805 EXPECT_FALSE(HasClientDownloadRequest()); |
| 806 } |
| 810 | 807 |
| 811 // Case (3): !is_extended_reporting && is_incognito. | 808 { |
| 812 // ClientDownloadRequest should NOT be sent. | 809 // Case (2): is_extended_reporting && !is_incognito. |
| 813 SetExtendedReportingPreference(false); | 810 // ClientDownloadRequest should be sent. |
| 814 EXPECT_CALL(item, GetBrowserContext()) | 811 EXPECT_CALL(item, GetBrowserContext()) |
| 815 .WillRepeatedly(Return(profile_->GetOffTheRecordProfile())); | 812 .WillRepeatedly(Return(profile_.get())); |
| 816 download_service_->CheckClientDownload( | 813 RunLoop run_loop; |
| 817 &item, | 814 download_service_->CheckClientDownload( |
| 818 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 815 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 819 base::Unretained(this))); | 816 base::Unretained(this), run_loop.QuitClosure())); |
| 820 base::RunLoop().Run(); | 817 run_loop.Run(); |
| 821 EXPECT_TRUE(IsResult(DownloadProtectionService::SAFE)); | 818 EXPECT_TRUE(IsResult(DownloadProtectionService::SAFE)); |
| 822 EXPECT_FALSE(HasClientDownloadRequest()); | 819 EXPECT_TRUE(HasClientDownloadRequest()); |
| 820 EXPECT_TRUE(GetClientDownloadRequest()->skipped_url_whitelist()); |
| 821 ClearClientDownloadRequest(); |
| 822 } |
| 823 | 823 |
| 824 // Case (4): !is_extended_reporting && !is_incognito. | 824 { |
| 825 // ClientDownloadRequest should NOT be sent. | 825 // Case (3): !is_extended_reporting && is_incognito. |
| 826 EXPECT_CALL(item, GetBrowserContext()) | 826 // ClientDownloadRequest should NOT be sent. |
| 827 .WillRepeatedly(Return(profile_.get())); | 827 SetExtendedReportingPreference(false); |
| 828 download_service_->CheckClientDownload( | 828 EXPECT_CALL(item, GetBrowserContext()) |
| 829 &item, | 829 .WillRepeatedly(Return(profile_->GetOffTheRecordProfile())); |
| 830 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 830 RunLoop run_loop; |
| 831 base::Unretained(this))); | 831 download_service_->CheckClientDownload( |
| 832 base::RunLoop().Run(); | 832 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 833 EXPECT_TRUE(IsResult(DownloadProtectionService::SAFE)); | 833 base::Unretained(this), run_loop.QuitClosure())); |
| 834 EXPECT_FALSE(HasClientDownloadRequest()); | 834 run_loop.Run(); |
| 835 EXPECT_TRUE(IsResult(DownloadProtectionService::SAFE)); |
| 836 EXPECT_FALSE(HasClientDownloadRequest()); |
| 837 } |
| 838 |
| 839 { |
| 840 // Case (4): !is_extended_reporting && !is_incognito. |
| 841 // ClientDownloadRequest should NOT be sent. |
| 842 EXPECT_CALL(item, GetBrowserContext()) |
| 843 .WillRepeatedly(Return(profile_.get())); |
| 844 RunLoop run_loop; |
| 845 download_service_->CheckClientDownload( |
| 846 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 847 base::Unretained(this), run_loop.QuitClosure())); |
| 848 run_loop.Run(); |
| 849 EXPECT_TRUE(IsResult(DownloadProtectionService::SAFE)); |
| 850 EXPECT_FALSE(HasClientDownloadRequest()); |
| 851 } |
| 835 } | 852 } |
| 836 | 853 |
| 837 TEST_F(DownloadProtectionServiceTest, CheckClientDownloadSampledFile) { | 854 TEST_F(DownloadProtectionServiceTest, CheckClientDownloadSampledFile) { |
| 838 // Server response will be discarded. | 855 // Server response will be discarded. |
| 839 net::FakeURLFetcherFactory factory(NULL); | 856 net::FakeURLFetcherFactory factory(NULL); |
| 840 PrepareResponse( | 857 PrepareResponse( |
| 841 &factory, ClientDownloadResponse::DANGEROUS, net::HTTP_OK, | 858 &factory, ClientDownloadResponse::DANGEROUS, net::HTTP_OK, |
| 842 net::URLRequestStatus::SUCCESS); | 859 net::URLRequestStatus::SUCCESS); |
| 843 | 860 |
| 844 content::MockDownloadItem item; | 861 content::MockDownloadItem item; |
| 845 PrepareBasicDownloadItem( | 862 PrepareBasicDownloadItem( |
| 846 &item, | 863 &item, |
| 847 std::vector<std::string>(), // empty url_chain | 864 std::vector<std::string>(), // empty url_chain |
| 848 "http://www.google.com/", // referrer | 865 "http://www.google.com/", // referrer |
| 849 FILE_PATH_LITERAL("a.tmp"), // tmp_path | 866 FILE_PATH_LITERAL("a.tmp"), // tmp_path |
| 850 FILE_PATH_LITERAL("a.foobar_unknown_ype")); // final_path | 867 FILE_PATH_LITERAL("a.foobar_unknown_ype")); // final_path |
| 851 EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)) | 868 EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)) |
| 852 .Times(1); | 869 .Times(1); |
| 853 EXPECT_CALL(*binary_feature_extractor_.get(), | 870 EXPECT_CALL(*binary_feature_extractor_.get(), |
| 854 ExtractImageFeatures( | 871 ExtractImageFeatures( |
| 855 tmp_path_, BinaryFeatureExtractor::kDefaultOptions, _, _)) | 872 tmp_path_, BinaryFeatureExtractor::kDefaultOptions, _, _)) |
| 856 .Times(1); | 873 .Times(1); |
| 857 url_chain_.push_back(GURL("http://www.whitelist.com/a.foobar_unknown_type")); | 874 url_chain_.push_back(GURL("http://www.whitelist.com/a.foobar_unknown_type")); |
| 858 | 875 |
| 859 // Set ping sample rate to 1.00 so download_service_ will always send a | 876 // Set ping sample rate to 1.00 so download_service_ will always send a |
| 860 // "light" ping for unknown types if allowed. | 877 // "light" ping for unknown types if allowed. |
| 861 SetBinarySamplingProbability(1.0); | 878 SetBinarySamplingProbability(1.0); |
| 879 { |
| 880 // Case (1): is_extended_reporting && is_incognito. |
| 881 // ClientDownloadRequest should NOT be sent. |
| 882 SetExtendedReportingPreference(true); |
| 883 EXPECT_CALL(item, GetBrowserContext()) |
| 884 .WillRepeatedly(Return(profile_->GetOffTheRecordProfile())); |
| 885 RunLoop run_loop; |
| 886 download_service_->CheckClientDownload( |
| 887 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 888 base::Unretained(this), run_loop.QuitClosure())); |
| 889 run_loop.Run(); |
| 890 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); |
| 891 EXPECT_FALSE(HasClientDownloadRequest()); |
| 892 } |
| 862 | 893 |
| 863 // Case (1): is_extended_reporting && is_incognito. | 894 { |
| 864 // ClientDownloadRequest should NOT be sent. | 895 // Case (2): is_extended_reporting && !is_incognito. |
| 865 SetExtendedReportingPreference(true); | 896 // A "light" ClientDownloadRequest should be sent. |
| 866 EXPECT_CALL(item, GetBrowserContext()) | 897 EXPECT_CALL(item, GetBrowserContext()) |
| 867 .WillRepeatedly(Return(profile_->GetOffTheRecordProfile())); | 898 .WillRepeatedly(Return(profile_.get())); |
| 868 download_service_->CheckClientDownload( | 899 RunLoop run_loop; |
| 869 &item, | 900 download_service_->CheckClientDownload( |
| 870 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 901 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 871 base::Unretained(this))); | 902 base::Unretained(this), run_loop.QuitClosure())); |
| 872 base::RunLoop().Run(); | 903 run_loop.Run(); |
| 873 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); | 904 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); |
| 874 EXPECT_FALSE(HasClientDownloadRequest()); | 905 EXPECT_TRUE(HasClientDownloadRequest()); |
| 875 | 906 // Verify it's a "light" ping, check that URLs don't have paths, and |
| 876 // Case (2): is_extended_reporting && !is_incognito. | 907 // and verify filename is just an extension. |
| 877 // A "light" ClientDownloadRequest should be sent. | 908 auto* req = GetClientDownloadRequest(); |
| 878 EXPECT_CALL(item, GetBrowserContext()) | 909 EXPECT_EQ(ClientDownloadRequest::SAMPLED_UNSUPPORTED_FILE, |
| 879 .WillRepeatedly(Return(profile_.get())); | 910 req->download_type()); |
| 880 download_service_->CheckClientDownload( | 911 EXPECT_EQ(GURL(req->url()).GetOrigin().spec(), req->url()); |
| 881 &item, | 912 for (auto resource : req->resources()) { |
| 882 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 913 EXPECT_EQ(GURL(resource.url()).GetOrigin().spec(), resource.url()); |
| 883 base::Unretained(this))); | 914 EXPECT_EQ(GURL(resource.referrer()).GetOrigin().spec(), |
| 884 base::RunLoop().Run(); | 915 resource.referrer()); |
| 885 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); | 916 } |
| 886 EXPECT_TRUE(HasClientDownloadRequest()); | 917 EXPECT_EQ('.', req->file_basename()[0]); |
| 887 // Verify it's a "light" ping, check that URLs don't have paths, and | |
| 888 // and verify filename is just an extension. | |
| 889 auto* req = GetClientDownloadRequest(); | |
| 890 EXPECT_EQ(ClientDownloadRequest::SAMPLED_UNSUPPORTED_FILE, | |
| 891 req->download_type()); | |
| 892 EXPECT_EQ(GURL(req->url()).GetOrigin().spec(), req->url()); | |
| 893 for (auto resource : req->resources()) { | |
| 894 EXPECT_EQ(GURL(resource.url()).GetOrigin().spec(), resource.url()); | |
| 895 EXPECT_EQ(GURL(resource.referrer()).GetOrigin().spec(), | |
| 896 resource.referrer()); | |
| 897 } | 918 } |
| 898 EXPECT_EQ('.', req->file_basename()[0]); | |
| 899 | 919 |
| 900 ClearClientDownloadRequest(); | 920 ClearClientDownloadRequest(); |
| 901 | 921 |
| 902 // Case (3): !is_extended_reporting && is_incognito. | 922 { |
| 903 // ClientDownloadRequest should NOT be sent. | 923 // Case (3): !is_extended_reporting && is_incognito. |
| 904 SetExtendedReportingPreference(false); | 924 // ClientDownloadRequest should NOT be sent. |
| 905 EXPECT_CALL(item, GetBrowserContext()) | 925 SetExtendedReportingPreference(false); |
| 906 .WillRepeatedly(Return(profile_->GetOffTheRecordProfile())); | 926 EXPECT_CALL(item, GetBrowserContext()) |
| 907 download_service_->CheckClientDownload( | 927 .WillRepeatedly(Return(profile_->GetOffTheRecordProfile())); |
| 908 &item, | 928 RunLoop run_loop; |
| 909 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 929 download_service_->CheckClientDownload( |
| 910 base::Unretained(this))); | 930 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 911 base::RunLoop().Run(); | 931 base::Unretained(this), run_loop.QuitClosure())); |
| 912 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); | 932 run_loop.Run(); |
| 913 EXPECT_FALSE(HasClientDownloadRequest()); | 933 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); |
| 934 EXPECT_FALSE(HasClientDownloadRequest()); |
| 935 } |
| 914 | 936 |
| 915 // Case (4): !is_extended_reporting && !is_incognito. | 937 { |
| 916 // ClientDownloadRequest should NOT be sent. | 938 // Case (4): !is_extended_reporting && !is_incognito. |
| 917 EXPECT_CALL(item, GetBrowserContext()) | 939 // ClientDownloadRequest should NOT be sent. |
| 918 .WillRepeatedly(Return(profile_.get())); | 940 EXPECT_CALL(item, GetBrowserContext()) |
| 919 download_service_->CheckClientDownload( | 941 .WillRepeatedly(Return(profile_.get())); |
| 920 &item, | 942 RunLoop run_loop; |
| 921 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 943 download_service_->CheckClientDownload( |
| 922 base::Unretained(this))); | 944 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 923 base::RunLoop().Run(); | 945 base::Unretained(this), run_loop.QuitClosure())); |
| 924 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); | 946 run_loop.Run(); |
| 925 EXPECT_FALSE(HasClientDownloadRequest()); | 947 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); |
| 948 EXPECT_FALSE(HasClientDownloadRequest()); |
| 949 } |
| 926 } | 950 } |
| 927 | 951 |
| 928 TEST_F(DownloadProtectionServiceTest, CheckClientDownloadFetchFailed) { | 952 TEST_F(DownloadProtectionServiceTest, CheckClientDownloadFetchFailed) { |
| 929 // HTTP request will fail. | 953 // HTTP request will fail. |
| 930 net::FakeURLFetcherFactory factory(NULL); | 954 net::FakeURLFetcherFactory factory(NULL); |
| 931 PrepareResponse( | 955 PrepareResponse( |
| 932 &factory, ClientDownloadResponse::SAFE, net::HTTP_INTERNAL_SERVER_ERROR, | 956 &factory, ClientDownloadResponse::SAFE, net::HTTP_INTERNAL_SERVER_ERROR, |
| 933 net::URLRequestStatus::FAILED); | 957 net::URLRequestStatus::FAILED); |
| 934 | 958 |
| 935 content::MockDownloadItem item; | 959 content::MockDownloadItem item; |
| 936 PrepareBasicDownloadItem( | 960 PrepareBasicDownloadItem( |
| 937 &item, | 961 &item, |
| 938 {"http://www.evil.com/a.exe"}, // url_chain | 962 {"http://www.evil.com/a.exe"}, // url_chain |
| 939 "http://www.google.com/", // referrer | 963 "http://www.google.com/", // referrer |
| 940 FILE_PATH_LITERAL("a.tmp"), // tmp_path | 964 FILE_PATH_LITERAL("a.tmp"), // tmp_path |
| 941 FILE_PATH_LITERAL("a.exe")); // final_path | 965 FILE_PATH_LITERAL("a.exe")); // final_path |
| 942 | 966 |
| 943 EXPECT_CALL(*sb_service_->mock_database_manager(), | 967 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 944 MatchDownloadWhitelistUrl(_)) | 968 MatchDownloadWhitelistUrl(_)) |
| 945 .WillRepeatedly(Return(false)); | 969 .WillRepeatedly(Return(false)); |
| 946 EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)); | 970 EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)); |
| 947 EXPECT_CALL( | 971 EXPECT_CALL( |
| 948 *binary_feature_extractor_.get(), | 972 *binary_feature_extractor_.get(), |
| 949 ExtractImageFeatures(tmp_path_, BinaryFeatureExtractor::kDefaultOptions, | 973 ExtractImageFeatures(tmp_path_, BinaryFeatureExtractor::kDefaultOptions, |
| 950 _, _)); | 974 _, _)); |
| 951 | 975 |
| 976 RunLoop run_loop; |
| 952 download_service_->CheckClientDownload( | 977 download_service_->CheckClientDownload( |
| 953 &item, | 978 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 954 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 979 base::Unretained(this), run_loop.QuitClosure())); |
| 955 base::Unretained(this))); | 980 run_loop.Run(); |
| 956 base::RunLoop().Run(); | |
| 957 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); | 981 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); |
| 958 } | 982 } |
| 959 | 983 |
| 960 TEST_F(DownloadProtectionServiceTest, CheckClientDownloadSuccess) { | 984 TEST_F(DownloadProtectionServiceTest, CheckClientDownloadSuccess) { |
| 961 net::FakeURLFetcherFactory factory(NULL); | 985 net::FakeURLFetcherFactory factory(NULL); |
| 962 PrepareResponse( | 986 PrepareResponse( |
| 963 &factory, ClientDownloadResponse::SAFE, net::HTTP_OK, | 987 &factory, ClientDownloadResponse::SAFE, net::HTTP_OK, |
| 964 net::URLRequestStatus::SUCCESS); | 988 net::URLRequestStatus::SUCCESS); |
| 965 | 989 |
| 966 content::MockDownloadItem item; | 990 content::MockDownloadItem item; |
| 967 PrepareBasicDownloadItem( | 991 PrepareBasicDownloadItem( |
| 968 &item, | 992 &item, |
| 969 {"http://www.evil.com/a.exe"}, // url_chain | 993 {"http://www.evil.com/a.exe"}, // url_chain |
| 970 "http://www.google.com/", // referrer | 994 "http://www.google.com/", // referrer |
| 971 FILE_PATH_LITERAL("a.tmp"), // tmp_path | 995 FILE_PATH_LITERAL("a.tmp"), // tmp_path |
| 972 FILE_PATH_LITERAL("a.exe")); // final_path | 996 FILE_PATH_LITERAL("a.exe")); // final_path |
| 973 | 997 |
| 974 EXPECT_CALL(*sb_service_->mock_database_manager(), | 998 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 975 MatchDownloadWhitelistUrl(_)) | 999 MatchDownloadWhitelistUrl(_)) |
| 976 .WillRepeatedly(Return(false)); | 1000 .WillRepeatedly(Return(false)); |
| 977 EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)) | 1001 EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)) |
| 978 .Times(7); | 1002 .Times(7); |
| 979 EXPECT_CALL(*binary_feature_extractor_.get(), | 1003 EXPECT_CALL(*binary_feature_extractor_.get(), |
| 980 ExtractImageFeatures( | 1004 ExtractImageFeatures( |
| 981 tmp_path_, BinaryFeatureExtractor::kDefaultOptions, _, _)) | 1005 tmp_path_, BinaryFeatureExtractor::kDefaultOptions, _, _)) |
| 982 .Times(7); | 1006 .Times(7); |
| 983 | |
| 984 download_service_->CheckClientDownload( | |
| 985 &item, | |
| 986 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | |
| 987 base::Unretained(this))); | |
| 988 base::RunLoop().Run(); | |
| 989 | |
| 990 EXPECT_TRUE(IsResult(DownloadProtectionService::SAFE)); | |
| 991 EXPECT_TRUE(HasClientDownloadRequest()); | |
| 992 ClearClientDownloadRequest(); | |
| 993 | |
| 994 // Invalid response should result in UNKNOWN. | |
| 995 ClientDownloadResponse invalid_response; | |
| 996 factory.SetFakeResponse( | |
| 997 DownloadProtectionService::GetDownloadRequestUrl(), | |
| 998 invalid_response.SerializePartialAsString(), | |
| 999 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | |
| 1000 | |
| 1001 download_service_->CheckClientDownload( | |
| 1002 &item, | |
| 1003 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | |
| 1004 base::Unretained(this))); | |
| 1005 base::RunLoop().Run(); | |
| 1006 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); | |
| 1007 EXPECT_TRUE(HasClientDownloadRequest()); | |
| 1008 ClearClientDownloadRequest(); | |
| 1009 std::string feedback_ping; | 1007 std::string feedback_ping; |
| 1010 std::string feedback_response; | 1008 std::string feedback_response; |
| 1011 EXPECT_FALSE(DownloadFeedbackService::GetPingsForDownloadForTesting( | 1009 ClientDownloadResponse expected_response; |
| 1012 item, &feedback_ping, &feedback_response)); | |
| 1013 | 1010 |
| 1014 // If the response is dangerous the result should also be marked as dangerous. | 1011 { |
| 1015 PrepareResponse( | 1012 RunLoop run_loop; |
| 1016 &factory, ClientDownloadResponse::DANGEROUS, net::HTTP_OK, | 1013 download_service_->CheckClientDownload( |
| 1017 net::URLRequestStatus::SUCCESS); | 1014 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1015 base::Unretained(this), run_loop.QuitClosure())); |
| 1016 run_loop.Run(); |
| 1018 | 1017 |
| 1019 download_service_->CheckClientDownload( | 1018 EXPECT_TRUE(IsResult(DownloadProtectionService::SAFE)); |
| 1020 &item, | 1019 EXPECT_TRUE(HasClientDownloadRequest()); |
| 1021 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1020 ClearClientDownloadRequest(); |
| 1022 base::Unretained(this))); | 1021 } |
| 1023 base::RunLoop().Run(); | |
| 1024 EXPECT_FALSE(DownloadFeedbackService::GetPingsForDownloadForTesting( | |
| 1025 item, &feedback_ping, &feedback_response)); | |
| 1026 | 1022 |
| 1027 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); | 1023 { |
| 1028 EXPECT_TRUE(HasClientDownloadRequest()); | 1024 // Invalid response should result in UNKNOWN. |
| 1029 ClearClientDownloadRequest(); | 1025 ClientDownloadResponse invalid_response; |
| 1026 factory.SetFakeResponse(DownloadProtectionService::GetDownloadRequestUrl(), |
| 1027 invalid_response.SerializePartialAsString(), |
| 1028 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
| 1030 | 1029 |
| 1031 // If the response is uncommon the result should also be marked as uncommon. | 1030 RunLoop run_loop; |
| 1032 PrepareResponse( | 1031 download_service_->CheckClientDownload( |
| 1033 &factory, ClientDownloadResponse::UNCOMMON, net::HTTP_OK, | 1032 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1034 net::URLRequestStatus::SUCCESS); | 1033 base::Unretained(this), run_loop.QuitClosure())); |
| 1034 run_loop.Run(); |
| 1035 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); |
| 1036 EXPECT_TRUE(HasClientDownloadRequest()); |
| 1037 ClearClientDownloadRequest(); |
| 1035 | 1038 |
| 1036 download_service_->CheckClientDownload( | 1039 EXPECT_FALSE(DownloadFeedbackService::GetPingsForDownloadForTesting( |
| 1037 &item, | 1040 item, &feedback_ping, &feedback_response)); |
| 1038 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1041 } |
| 1039 base::Unretained(this))); | |
| 1040 base::RunLoop().Run(); | |
| 1041 EXPECT_TRUE(IsResult(DownloadProtectionService::UNCOMMON)); | |
| 1042 EXPECT_TRUE(DownloadFeedbackService::GetPingsForDownloadForTesting( | |
| 1043 item, &feedback_ping, &feedback_response)); | |
| 1044 ClientDownloadRequest decoded_request; | |
| 1045 EXPECT_TRUE(decoded_request.ParseFromString(feedback_ping)); | |
| 1046 EXPECT_EQ(url_chain_.back().spec(), decoded_request.url()); | |
| 1047 ClientDownloadResponse expected_response; | |
| 1048 expected_response.set_verdict(ClientDownloadResponse::UNCOMMON); | |
| 1049 EXPECT_EQ(expected_response.SerializeAsString(), feedback_response); | |
| 1050 EXPECT_TRUE(HasClientDownloadRequest()); | |
| 1051 ClearClientDownloadRequest(); | |
| 1052 | 1042 |
| 1053 // If the response is dangerous_host the result should also be marked as | 1043 { |
| 1054 // dangerous_host. | 1044 // If the response is dangerous the result should also be marked as |
| 1055 PrepareResponse( | 1045 // dangerous. |
| 1056 &factory, ClientDownloadResponse::DANGEROUS_HOST, net::HTTP_OK, | 1046 PrepareResponse(&factory, ClientDownloadResponse::DANGEROUS, net::HTTP_OK, |
| 1057 net::URLRequestStatus::SUCCESS); | 1047 net::URLRequestStatus::SUCCESS); |
| 1048 RunLoop run_loop; |
| 1049 download_service_->CheckClientDownload( |
| 1050 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1051 base::Unretained(this), run_loop.QuitClosure())); |
| 1052 run_loop.Run(); |
| 1053 EXPECT_FALSE(DownloadFeedbackService::GetPingsForDownloadForTesting( |
| 1054 item, &feedback_ping, &feedback_response)); |
| 1058 | 1055 |
| 1059 download_service_->CheckClientDownload( | 1056 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); |
| 1060 &item, | 1057 EXPECT_TRUE(HasClientDownloadRequest()); |
| 1061 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1058 ClearClientDownloadRequest(); |
| 1062 base::Unretained(this))); | 1059 } |
| 1063 base::RunLoop().Run(); | |
| 1064 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS_HOST)); | |
| 1065 EXPECT_TRUE(DownloadFeedbackService::GetPingsForDownloadForTesting( | |
| 1066 item, &feedback_ping, &feedback_response)); | |
| 1067 expected_response.set_verdict(ClientDownloadResponse::DANGEROUS_HOST); | |
| 1068 EXPECT_EQ(expected_response.SerializeAsString(), feedback_response); | |
| 1069 EXPECT_TRUE(HasClientDownloadRequest()); | |
| 1070 ClearClientDownloadRequest(); | |
| 1071 | 1060 |
| 1072 // If the response is POTENTIALLY_UNWANTED the result should also be marked as | 1061 { |
| 1073 // POTENTIALLY_UNWANTED. | 1062 // If the response is uncommon the result should also be marked as uncommon. |
| 1074 PrepareResponse( | 1063 PrepareResponse(&factory, ClientDownloadResponse::UNCOMMON, net::HTTP_OK, |
| 1075 &factory, ClientDownloadResponse::POTENTIALLY_UNWANTED, net::HTTP_OK, | 1064 net::URLRequestStatus::SUCCESS); |
| 1076 net::URLRequestStatus::SUCCESS); | |
| 1077 | 1065 |
| 1078 download_service_->CheckClientDownload( | 1066 RunLoop run_loop; |
| 1079 &item, | 1067 download_service_->CheckClientDownload( |
| 1080 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1068 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1081 base::Unretained(this))); | 1069 base::Unretained(this), run_loop.QuitClosure())); |
| 1082 base::RunLoop().Run(); | 1070 run_loop.Run(); |
| 1071 EXPECT_TRUE(IsResult(DownloadProtectionService::UNCOMMON)); |
| 1072 EXPECT_TRUE(DownloadFeedbackService::GetPingsForDownloadForTesting( |
| 1073 item, &feedback_ping, &feedback_response)); |
| 1074 ClientDownloadRequest decoded_request; |
| 1075 EXPECT_TRUE(decoded_request.ParseFromString(feedback_ping)); |
| 1076 EXPECT_EQ(url_chain_.back().spec(), decoded_request.url()); |
| 1077 expected_response.set_verdict(ClientDownloadResponse::UNCOMMON); |
| 1078 EXPECT_EQ(expected_response.SerializeAsString(), feedback_response); |
| 1079 EXPECT_TRUE(HasClientDownloadRequest()); |
| 1080 ClearClientDownloadRequest(); |
| 1081 } |
| 1083 | 1082 |
| 1084 EXPECT_TRUE(IsResult(DownloadProtectionService::POTENTIALLY_UNWANTED)); | 1083 { |
| 1085 EXPECT_TRUE(HasClientDownloadRequest()); | 1084 // If the response is dangerous_host the result should also be marked as |
| 1086 ClearClientDownloadRequest(); | 1085 // dangerous_host. |
| 1086 PrepareResponse(&factory, ClientDownloadResponse::DANGEROUS_HOST, |
| 1087 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
| 1088 RunLoop run_loop; |
| 1089 download_service_->CheckClientDownload( |
| 1090 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1091 base::Unretained(this), run_loop.QuitClosure())); |
| 1092 run_loop.Run(); |
| 1093 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS_HOST)); |
| 1094 EXPECT_TRUE(DownloadFeedbackService::GetPingsForDownloadForTesting( |
| 1095 item, &feedback_ping, &feedback_response)); |
| 1096 expected_response.set_verdict(ClientDownloadResponse::DANGEROUS_HOST); |
| 1097 EXPECT_EQ(expected_response.SerializeAsString(), feedback_response); |
| 1098 EXPECT_TRUE(HasClientDownloadRequest()); |
| 1099 ClearClientDownloadRequest(); |
| 1100 } |
| 1087 | 1101 |
| 1088 // If the response is UNKNOWN the result should also be marked as | 1102 { |
| 1089 // UNKNOWN | 1103 // If the response is POTENTIALLY_UNWANTED the result should also be marked |
| 1090 PrepareResponse( | 1104 // as |
| 1091 &factory, ClientDownloadResponse::UNKNOWN, net::HTTP_OK, | 1105 // POTENTIALLY_UNWANTED. |
| 1092 net::URLRequestStatus::SUCCESS); | 1106 PrepareResponse(&factory, ClientDownloadResponse::POTENTIALLY_UNWANTED, |
| 1107 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
| 1093 | 1108 |
| 1094 download_service_->CheckClientDownload( | 1109 RunLoop run_loop; |
| 1095 &item, | 1110 download_service_->CheckClientDownload( |
| 1096 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1111 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1097 base::Unretained(this))); | 1112 base::Unretained(this), run_loop.QuitClosure())); |
| 1098 base::RunLoop().Run(); | 1113 run_loop.Run(); |
| 1099 | 1114 |
| 1100 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); | 1115 EXPECT_TRUE(IsResult(DownloadProtectionService::POTENTIALLY_UNWANTED)); |
| 1101 EXPECT_TRUE(HasClientDownloadRequest()); | 1116 EXPECT_TRUE(HasClientDownloadRequest()); |
| 1102 ClearClientDownloadRequest(); | 1117 ClearClientDownloadRequest(); |
| 1118 } |
| 1119 |
| 1120 { |
| 1121 // If the response is UNKNOWN the result should also be marked as |
| 1122 // UNKNOWN |
| 1123 PrepareResponse(&factory, ClientDownloadResponse::UNKNOWN, net::HTTP_OK, |
| 1124 net::URLRequestStatus::SUCCESS); |
| 1125 |
| 1126 RunLoop run_loop; |
| 1127 download_service_->CheckClientDownload( |
| 1128 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1129 base::Unretained(this), run_loop.QuitClosure())); |
| 1130 run_loop.Run(); |
| 1131 |
| 1132 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); |
| 1133 EXPECT_TRUE(HasClientDownloadRequest()); |
| 1134 ClearClientDownloadRequest(); |
| 1135 } |
| 1103 } | 1136 } |
| 1104 | 1137 |
| 1105 TEST_F(DownloadProtectionServiceTest, CheckClientDownloadHTTPS) { | 1138 TEST_F(DownloadProtectionServiceTest, CheckClientDownloadHTTPS) { |
| 1106 net::FakeURLFetcherFactory factory(NULL); | 1139 net::FakeURLFetcherFactory factory(NULL); |
| 1107 PrepareResponse( | 1140 PrepareResponse( |
| 1108 &factory, ClientDownloadResponse::DANGEROUS, net::HTTP_OK, | 1141 &factory, ClientDownloadResponse::DANGEROUS, net::HTTP_OK, |
| 1109 net::URLRequestStatus::SUCCESS); | 1142 net::URLRequestStatus::SUCCESS); |
| 1110 | 1143 |
| 1111 content::MockDownloadItem item; | 1144 content::MockDownloadItem item; |
| 1112 PrepareBasicDownloadItem(&item, | 1145 PrepareBasicDownloadItem(&item, |
| 1113 {"http://www.evil.com/a.exe"}, // url_chain | 1146 {"http://www.evil.com/a.exe"}, // url_chain |
| 1114 "http://www.google.com/", // referrer | 1147 "http://www.google.com/", // referrer |
| 1115 FILE_PATH_LITERAL("a.tmp"), // tmp_path | 1148 FILE_PATH_LITERAL("a.tmp"), // tmp_path |
| 1116 FILE_PATH_LITERAL("a.exe")); // final_path | 1149 FILE_PATH_LITERAL("a.exe")); // final_path |
| 1117 | 1150 |
| 1118 EXPECT_CALL(*sb_service_->mock_database_manager(), | 1151 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 1119 MatchDownloadWhitelistUrl(_)) | 1152 MatchDownloadWhitelistUrl(_)) |
| 1120 .WillRepeatedly(Return(false)); | 1153 .WillRepeatedly(Return(false)); |
| 1121 EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)) | 1154 EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)) |
| 1122 .Times(1); | 1155 .Times(1); |
| 1123 EXPECT_CALL(*binary_feature_extractor_.get(), | 1156 EXPECT_CALL(*binary_feature_extractor_.get(), |
| 1124 ExtractImageFeatures( | 1157 ExtractImageFeatures( |
| 1125 tmp_path_, BinaryFeatureExtractor::kDefaultOptions, _, _)) | 1158 tmp_path_, BinaryFeatureExtractor::kDefaultOptions, _, _)) |
| 1126 .Times(1); | 1159 .Times(1); |
| 1127 | 1160 |
| 1161 RunLoop run_loop; |
| 1128 download_service_->CheckClientDownload( | 1162 download_service_->CheckClientDownload( |
| 1129 &item, | 1163 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1130 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1164 base::Unretained(this), run_loop.QuitClosure())); |
| 1131 base::Unretained(this))); | 1165 run_loop.Run(); |
| 1132 base::RunLoop().Run(); | |
| 1133 | 1166 |
| 1134 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); | 1167 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); |
| 1135 EXPECT_TRUE(HasClientDownloadRequest()); | 1168 EXPECT_TRUE(HasClientDownloadRequest()); |
| 1136 ClearClientDownloadRequest(); | 1169 ClearClientDownloadRequest(); |
| 1137 } | 1170 } |
| 1138 | 1171 |
| 1139 TEST_F(DownloadProtectionServiceTest, CheckClientDownloadBlob) { | 1172 TEST_F(DownloadProtectionServiceTest, CheckClientDownloadBlob) { |
| 1140 net::FakeURLFetcherFactory factory(NULL); | 1173 net::FakeURLFetcherFactory factory(NULL); |
| 1141 PrepareResponse( | 1174 PrepareResponse( |
| 1142 &factory, ClientDownloadResponse::DANGEROUS, net::HTTP_OK, | 1175 &factory, ClientDownloadResponse::DANGEROUS, net::HTTP_OK, |
| 1143 net::URLRequestStatus::SUCCESS); | 1176 net::URLRequestStatus::SUCCESS); |
| 1144 | 1177 |
| 1145 content::MockDownloadItem item; | 1178 content::MockDownloadItem item; |
| 1146 PrepareBasicDownloadItem( | 1179 PrepareBasicDownloadItem( |
| 1147 &item, | 1180 &item, |
| 1148 {"blob:http://www.evil.com/50b85f60-71e4-11e4-82f8-0800200c9a66"}, | 1181 {"blob:http://www.evil.com/50b85f60-71e4-11e4-82f8-0800200c9a66"}, |
| 1149 "http://www.google.com/", // referrer | 1182 "http://www.google.com/", // referrer |
| 1150 FILE_PATH_LITERAL("a.tmp"), // tmp_path | 1183 FILE_PATH_LITERAL("a.tmp"), // tmp_path |
| 1151 FILE_PATH_LITERAL("a.exe")); // final_path | 1184 FILE_PATH_LITERAL("a.exe")); // final_path |
| 1152 | 1185 |
| 1153 EXPECT_CALL(*sb_service_->mock_database_manager(), | 1186 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 1154 MatchDownloadWhitelistUrl(_)).WillRepeatedly(Return(false)); | 1187 MatchDownloadWhitelistUrl(_)).WillRepeatedly(Return(false)); |
| 1155 EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)) | 1188 EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)) |
| 1156 .Times(1); | 1189 .Times(1); |
| 1157 EXPECT_CALL(*binary_feature_extractor_.get(), | 1190 EXPECT_CALL(*binary_feature_extractor_.get(), |
| 1158 ExtractImageFeatures( | 1191 ExtractImageFeatures( |
| 1159 tmp_path_, BinaryFeatureExtractor::kDefaultOptions, _, _)) | 1192 tmp_path_, BinaryFeatureExtractor::kDefaultOptions, _, _)) |
| 1160 .Times(1); | 1193 .Times(1); |
| 1161 | 1194 |
| 1195 RunLoop run_loop; |
| 1162 download_service_->CheckClientDownload( | 1196 download_service_->CheckClientDownload( |
| 1163 &item, | 1197 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1164 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1198 base::Unretained(this), run_loop.QuitClosure())); |
| 1165 base::Unretained(this))); | 1199 run_loop.Run(); |
| 1166 base::RunLoop().Run(); | |
| 1167 | 1200 |
| 1168 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); | 1201 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); |
| 1169 EXPECT_TRUE(HasClientDownloadRequest()); | 1202 EXPECT_TRUE(HasClientDownloadRequest()); |
| 1170 ClearClientDownloadRequest(); | 1203 ClearClientDownloadRequest(); |
| 1171 } | 1204 } |
| 1172 | 1205 |
| 1173 TEST_F(DownloadProtectionServiceTest, CheckClientDownloadData) { | 1206 TEST_F(DownloadProtectionServiceTest, CheckClientDownloadData) { |
| 1174 net::FakeURLFetcherFactory factory(NULL); | 1207 net::FakeURLFetcherFactory factory(NULL); |
| 1175 PrepareResponse( | 1208 PrepareResponse( |
| 1176 &factory, ClientDownloadResponse::DANGEROUS, net::HTTP_OK, | 1209 &factory, ClientDownloadResponse::DANGEROUS, net::HTTP_OK, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1187 | 1220 |
| 1188 EXPECT_CALL(*sb_service_->mock_database_manager(), | 1221 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 1189 MatchDownloadWhitelistUrl(_)).WillRepeatedly(Return(false)); | 1222 MatchDownloadWhitelistUrl(_)).WillRepeatedly(Return(false)); |
| 1190 EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)) | 1223 EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)) |
| 1191 .Times(1); | 1224 .Times(1); |
| 1192 EXPECT_CALL(*binary_feature_extractor_.get(), | 1225 EXPECT_CALL(*binary_feature_extractor_.get(), |
| 1193 ExtractImageFeatures( | 1226 ExtractImageFeatures( |
| 1194 tmp_path_, BinaryFeatureExtractor::kDefaultOptions, _, _)) | 1227 tmp_path_, BinaryFeatureExtractor::kDefaultOptions, _, _)) |
| 1195 .Times(1); | 1228 .Times(1); |
| 1196 | 1229 |
| 1230 RunLoop run_loop; |
| 1197 download_service_->CheckClientDownload( | 1231 download_service_->CheckClientDownload( |
| 1198 &item, | 1232 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1199 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1233 base::Unretained(this), run_loop.QuitClosure())); |
| 1200 base::Unretained(this))); | 1234 run_loop.Run(); |
| 1201 base::RunLoop().Run(); | |
| 1202 | 1235 |
| 1203 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); | 1236 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); |
| 1204 ASSERT_TRUE(HasClientDownloadRequest()); | 1237 ASSERT_TRUE(HasClientDownloadRequest()); |
| 1205 const ClientDownloadRequest& request = *GetClientDownloadRequest(); | 1238 const ClientDownloadRequest& request = *GetClientDownloadRequest(); |
| 1206 const char kExpectedUrl[] = | 1239 const char kExpectedUrl[] = |
| 1207 "data:application/octet-stream:base64," | 1240 "data:application/octet-stream:base64," |
| 1208 "ACBF6DFC6F907662F566CA0241DFE8690C48661F440BA1BBD0B86C582845CCC8"; | 1241 "ACBF6DFC6F907662F566CA0241DFE8690C48661F440BA1BBD0B86C582845CCC8"; |
| 1209 const char kExpectedRedirect1[] = "data:text/html:base64,"; | 1242 const char kExpectedRedirect1[] = "data:text/html:base64,"; |
| 1210 const char kExpectedRedirect2[] = | 1243 const char kExpectedRedirect2[] = |
| 1211 "data:text/html:base64," | 1244 "data:text/html:base64," |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1235 net::URLRequestStatus::SUCCESS); | 1268 net::URLRequestStatus::SUCCESS); |
| 1236 | 1269 |
| 1237 content::MockDownloadItem item; | 1270 content::MockDownloadItem item; |
| 1238 PrepareBasicDownloadItem( | 1271 PrepareBasicDownloadItem( |
| 1239 &item, | 1272 &item, |
| 1240 {"http://www.evil.com/a.zip"}, // url_chain | 1273 {"http://www.evil.com/a.zip"}, // url_chain |
| 1241 "http://www.google.com/", // referrer | 1274 "http://www.google.com/", // referrer |
| 1242 FILE_PATH_LITERAL("a.tmp"), // tmp_path | 1275 FILE_PATH_LITERAL("a.tmp"), // tmp_path |
| 1243 FILE_PATH_LITERAL("a.zip")); // final_path | 1276 FILE_PATH_LITERAL("a.zip")); // final_path |
| 1244 | 1277 |
| 1245 // Write out a zip archive to the temporary file. In this case, it | 1278 // Write out a zip archive to the temporary file. |
| 1246 // only contains a text file. | |
| 1247 base::ScopedTempDir zip_source_dir; | 1279 base::ScopedTempDir zip_source_dir; |
| 1248 ASSERT_TRUE(zip_source_dir.CreateUniqueTempDir()); | 1280 ASSERT_TRUE(zip_source_dir.CreateUniqueTempDir()); |
| 1249 std::string file_contents = "dummy file"; | 1281 std::string file_contents = "dummy file"; |
| 1250 ASSERT_EQ(static_cast<int>(file_contents.size()), base::WriteFile( | |
| 1251 zip_source_dir.path().Append(FILE_PATH_LITERAL("file.txt")), | |
| 1252 file_contents.data(), file_contents.size())); | |
| 1253 ASSERT_TRUE(zip::Zip(zip_source_dir.path(), tmp_path_, false)); | |
| 1254 | 1282 |
| 1255 download_service_->CheckClientDownload( | 1283 { |
| 1256 &item, | 1284 // In this case, it only contains a text file. |
| 1257 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1285 ASSERT_EQ(static_cast<int>(file_contents.size()), |
| 1258 base::Unretained(this))); | 1286 base::WriteFile( |
| 1259 base::RunLoop().Run(); | 1287 zip_source_dir.path().Append(FILE_PATH_LITERAL("file.txt")), |
| 1260 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); | 1288 file_contents.data(), file_contents.size())); |
| 1261 EXPECT_FALSE(HasClientDownloadRequest()); | 1289 ASSERT_TRUE(zip::Zip(zip_source_dir.path(), tmp_path_, false)); |
| 1262 Mock::VerifyAndClearExpectations(sb_service_.get()); | |
| 1263 Mock::VerifyAndClearExpectations(binary_feature_extractor_.get()); | |
| 1264 | 1290 |
| 1265 // Now check with an executable in the zip file as well. | 1291 RunLoop run_loop; |
| 1266 ASSERT_EQ(static_cast<int>(file_contents.size()), base::WriteFile( | 1292 download_service_->CheckClientDownload( |
| 1267 zip_source_dir.path().Append(FILE_PATH_LITERAL("file.exe")), | 1293 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1268 file_contents.data(), file_contents.size())); | 1294 base::Unretained(this), run_loop.QuitClosure())); |
| 1269 ASSERT_TRUE(zip::Zip(zip_source_dir.path(), tmp_path_, false)); | 1295 run_loop.Run(); |
| 1296 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); |
| 1297 EXPECT_FALSE(HasClientDownloadRequest()); |
| 1298 Mock::VerifyAndClearExpectations(sb_service_.get()); |
| 1299 Mock::VerifyAndClearExpectations(binary_feature_extractor_.get()); |
| 1300 } |
| 1270 | 1301 |
| 1271 EXPECT_CALL(*sb_service_->mock_database_manager(), | 1302 { |
| 1272 MatchDownloadWhitelistUrl(_)) | 1303 // Now check with an executable in the zip file as well. |
| 1273 .WillRepeatedly(Return(false)); | 1304 ASSERT_EQ(static_cast<int>(file_contents.size()), |
| 1305 base::WriteFile( |
| 1306 zip_source_dir.path().Append(FILE_PATH_LITERAL("file.exe")), |
| 1307 file_contents.data(), file_contents.size())); |
| 1308 ASSERT_TRUE(zip::Zip(zip_source_dir.path(), tmp_path_, false)); |
| 1274 | 1309 |
| 1275 download_service_->CheckClientDownload( | 1310 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 1276 &item, | 1311 MatchDownloadWhitelistUrl(_)) |
| 1277 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1312 .WillRepeatedly(Return(false)); |
| 1278 base::Unretained(this))); | |
| 1279 base::RunLoop().Run(); | |
| 1280 | 1313 |
| 1281 EXPECT_TRUE(IsResult(DownloadProtectionService::SAFE)); | 1314 RunLoop run_loop; |
| 1282 EXPECT_TRUE(HasClientDownloadRequest()); | 1315 download_service_->CheckClientDownload( |
| 1283 const ClientDownloadRequest& request = *GetClientDownloadRequest(); | 1316 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1284 EXPECT_TRUE(request.has_download_type()); | 1317 base::Unretained(this), run_loop.QuitClosure())); |
| 1285 EXPECT_EQ(ClientDownloadRequest_DownloadType_ZIPPED_EXECUTABLE, | 1318 run_loop.Run(); |
| 1286 request.download_type()); | |
| 1287 EXPECT_EQ(1, request.archived_binary_size()); | |
| 1288 const ClientDownloadRequest_ArchivedBinary* archived_binary = | |
| 1289 GetRequestArchivedBinary(request, "file.exe"); | |
| 1290 ASSERT_NE(nullptr, archived_binary); | |
| 1291 EXPECT_EQ(ClientDownloadRequest_DownloadType_WIN_EXECUTABLE, | |
| 1292 archived_binary->download_type()); | |
| 1293 EXPECT_EQ(static_cast<int64_t>(file_contents.size()), | |
| 1294 archived_binary->length()); | |
| 1295 ClearClientDownloadRequest(); | |
| 1296 Mock::VerifyAndClearExpectations(binary_feature_extractor_.get()); | |
| 1297 | 1319 |
| 1298 // If the response is dangerous the result should also be marked as | 1320 EXPECT_TRUE(IsResult(DownloadProtectionService::SAFE)); |
| 1299 // dangerous. | 1321 EXPECT_TRUE(HasClientDownloadRequest()); |
| 1300 PrepareResponse( | 1322 const ClientDownloadRequest& request = *GetClientDownloadRequest(); |
| 1301 &factory, ClientDownloadResponse::DANGEROUS, net::HTTP_OK, | 1323 EXPECT_TRUE(request.has_download_type()); |
| 1302 net::URLRequestStatus::SUCCESS); | 1324 EXPECT_EQ(ClientDownloadRequest_DownloadType_ZIPPED_EXECUTABLE, |
| 1325 request.download_type()); |
| 1326 EXPECT_EQ(1, request.archived_binary_size()); |
| 1327 const ClientDownloadRequest_ArchivedBinary* archived_binary = |
| 1328 GetRequestArchivedBinary(request, "file.exe"); |
| 1329 ASSERT_NE(nullptr, archived_binary); |
| 1330 EXPECT_EQ(ClientDownloadRequest_DownloadType_WIN_EXECUTABLE, |
| 1331 archived_binary->download_type()); |
| 1332 EXPECT_EQ(static_cast<int64_t>(file_contents.size()), |
| 1333 archived_binary->length()); |
| 1334 ClearClientDownloadRequest(); |
| 1335 Mock::VerifyAndClearExpectations(binary_feature_extractor_.get()); |
| 1336 } |
| 1303 | 1337 |
| 1304 download_service_->CheckClientDownload( | 1338 { |
| 1305 &item, | 1339 // If the response is dangerous the result should also be marked as |
| 1306 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1340 // dangerous. |
| 1307 base::Unretained(this))); | 1341 PrepareResponse(&factory, ClientDownloadResponse::DANGEROUS, net::HTTP_OK, |
| 1308 base::RunLoop().Run(); | 1342 net::URLRequestStatus::SUCCESS); |
| 1309 | 1343 |
| 1310 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); | 1344 RunLoop run_loop; |
| 1311 EXPECT_TRUE(HasClientDownloadRequest()); | 1345 download_service_->CheckClientDownload( |
| 1312 ClearClientDownloadRequest(); | 1346 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1313 Mock::VerifyAndClearExpectations(binary_feature_extractor_.get()); | 1347 base::Unretained(this), run_loop.QuitClosure())); |
| 1348 run_loop.Run(); |
| 1314 | 1349 |
| 1315 // Repeat the test with an archive inside the zip file in addition to the | 1350 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); |
| 1316 // executable. | 1351 EXPECT_TRUE(HasClientDownloadRequest()); |
| 1317 ASSERT_EQ(static_cast<int>(file_contents.size()), | 1352 ClearClientDownloadRequest(); |
| 1318 base::WriteFile( | 1353 Mock::VerifyAndClearExpectations(binary_feature_extractor_.get()); |
| 1319 zip_source_dir.path().Append(FILE_PATH_LITERAL("file.rar")), | 1354 } |
| 1320 file_contents.data(), file_contents.size())); | |
| 1321 ASSERT_TRUE(zip::Zip(zip_source_dir.path(), tmp_path_, false)); | |
| 1322 | 1355 |
| 1323 download_service_->CheckClientDownload( | 1356 { |
| 1324 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1357 // Repeat the test with an archive inside the zip file in addition to the |
| 1325 base::Unretained(this))); | 1358 // executable. |
| 1326 base::RunLoop().Run(); | 1359 ASSERT_EQ(static_cast<int>(file_contents.size()), |
| 1360 base::WriteFile( |
| 1361 zip_source_dir.path().Append(FILE_PATH_LITERAL("file.rar")), |
| 1362 file_contents.data(), file_contents.size())); |
| 1363 ASSERT_TRUE(zip::Zip(zip_source_dir.path(), tmp_path_, false)); |
| 1327 | 1364 |
| 1328 ASSERT_TRUE(HasClientDownloadRequest()); | 1365 RunLoop run_loop; |
| 1329 EXPECT_EQ(1, GetClientDownloadRequest()->archived_binary_size()); | 1366 download_service_->CheckClientDownload( |
| 1330 EXPECT_TRUE(GetClientDownloadRequest()->has_download_type()); | 1367 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1331 EXPECT_EQ(ClientDownloadRequest_DownloadType_ZIPPED_EXECUTABLE, | 1368 base::Unretained(this), run_loop.QuitClosure())); |
| 1332 GetClientDownloadRequest()->download_type()); | 1369 run_loop.Run(); |
| 1333 ClearClientDownloadRequest(); | |
| 1334 Mock::VerifyAndClearExpectations(binary_feature_extractor_.get()); | |
| 1335 | 1370 |
| 1336 // Repeat the test with just the archive inside the zip file. | 1371 ASSERT_TRUE(HasClientDownloadRequest()); |
| 1337 ASSERT_TRUE( | 1372 EXPECT_EQ(1, GetClientDownloadRequest()->archived_binary_size()); |
| 1338 base::DeleteFile(zip_source_dir.path().AppendASCII("file.exe"), false)); | 1373 EXPECT_TRUE(GetClientDownloadRequest()->has_download_type()); |
| 1339 ASSERT_TRUE(zip::Zip(zip_source_dir.path(), tmp_path_, false)); | 1374 EXPECT_EQ(ClientDownloadRequest_DownloadType_ZIPPED_EXECUTABLE, |
| 1375 GetClientDownloadRequest()->download_type()); |
| 1376 ClearClientDownloadRequest(); |
| 1377 Mock::VerifyAndClearExpectations(binary_feature_extractor_.get()); |
| 1378 } |
| 1340 | 1379 |
| 1341 download_service_->CheckClientDownload( | 1380 { |
| 1342 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1381 // Repeat the test with just the archive inside the zip file. |
| 1343 base::Unretained(this))); | 1382 ASSERT_TRUE( |
| 1344 base::RunLoop().Run(); | 1383 base::DeleteFile(zip_source_dir.path().AppendASCII("file.exe"), false)); |
| 1384 ASSERT_TRUE(zip::Zip(zip_source_dir.path(), tmp_path_, false)); |
| 1345 | 1385 |
| 1346 ASSERT_TRUE(HasClientDownloadRequest()); | 1386 RunLoop run_loop; |
| 1347 EXPECT_EQ(0, GetClientDownloadRequest()->archived_binary_size()); | 1387 download_service_->CheckClientDownload( |
| 1348 EXPECT_TRUE(GetClientDownloadRequest()->has_download_type()); | 1388 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1349 EXPECT_EQ(ClientDownloadRequest_DownloadType_ZIPPED_ARCHIVE, | 1389 base::Unretained(this), run_loop.QuitClosure())); |
| 1350 GetClientDownloadRequest()->download_type()); | 1390 run_loop.Run(); |
| 1351 ClearClientDownloadRequest(); | 1391 |
| 1352 Mock::VerifyAndClearExpectations(binary_feature_extractor_.get()); | 1392 ASSERT_TRUE(HasClientDownloadRequest()); |
| 1393 EXPECT_EQ(0, GetClientDownloadRequest()->archived_binary_size()); |
| 1394 EXPECT_TRUE(GetClientDownloadRequest()->has_download_type()); |
| 1395 EXPECT_EQ(ClientDownloadRequest_DownloadType_ZIPPED_ARCHIVE, |
| 1396 GetClientDownloadRequest()->download_type()); |
| 1397 ClearClientDownloadRequest(); |
| 1398 Mock::VerifyAndClearExpectations(binary_feature_extractor_.get()); |
| 1399 } |
| 1353 } | 1400 } |
| 1354 | 1401 |
| 1355 TEST_F(DownloadProtectionServiceTest, | 1402 TEST_F(DownloadProtectionServiceTest, |
| 1356 CheckClientDownloadReportCorruptZipNormal) { | 1403 CheckClientDownloadReportCorruptZipNormal) { |
| 1357 // !is_extended_reporting && !is_incognito | 1404 // !is_extended_reporting && !is_incognito |
| 1358 CheckClientDownloadReportCorruptArchive(ZIP, false, false); | 1405 CheckClientDownloadReportCorruptArchive(ZIP, false, false); |
| 1359 } | 1406 } |
| 1360 | 1407 |
| 1361 TEST_F(DownloadProtectionServiceTest, | 1408 TEST_F(DownloadProtectionServiceTest, |
| 1362 CheckClientDownloadReportCorruptZipExtended) { | 1409 CheckClientDownloadReportCorruptZipExtended) { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1408 EXPECT_CALL(*sb_service_->mock_database_manager(), | 1455 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 1409 MatchDownloadWhitelistUrl(_)) | 1456 MatchDownloadWhitelistUrl(_)) |
| 1410 .WillRepeatedly(Return(false)); | 1457 .WillRepeatedly(Return(false)); |
| 1411 EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)) | 1458 EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)) |
| 1412 .WillOnce(SetCertificateContents("dummy cert data")); | 1459 .WillOnce(SetCertificateContents("dummy cert data")); |
| 1413 EXPECT_CALL( | 1460 EXPECT_CALL( |
| 1414 *binary_feature_extractor_.get(), | 1461 *binary_feature_extractor_.get(), |
| 1415 ExtractImageFeatures(tmp_path_, BinaryFeatureExtractor::kDefaultOptions, | 1462 ExtractImageFeatures(tmp_path_, BinaryFeatureExtractor::kDefaultOptions, |
| 1416 _, _)) | 1463 _, _)) |
| 1417 .WillOnce(SetDosHeaderContents("dummy dos header")); | 1464 .WillOnce(SetDosHeaderContents("dummy dos header")); |
| 1465 RunLoop run_loop; |
| 1418 download_service_->CheckClientDownload( | 1466 download_service_->CheckClientDownload( |
| 1419 &item, | 1467 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1420 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1468 base::Unretained(this), run_loop.QuitClosure())); |
| 1421 base::Unretained(this))); | |
| 1422 | 1469 |
| 1423 // Run the message loop(s) until SendRequest is called. | 1470 // Run the message loop(s) until SendRequest is called. |
| 1424 FlushThreadMessageLoops(); | 1471 FlushThreadMessageLoops(); |
| 1425 EXPECT_TRUE(HasClientDownloadRequest()); | 1472 EXPECT_TRUE(HasClientDownloadRequest()); |
| 1426 ClearClientDownloadRequest(); | 1473 ClearClientDownloadRequest(); |
| 1427 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); | 1474 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
| 1428 ASSERT_TRUE(fetcher); | 1475 ASSERT_TRUE(fetcher); |
| 1429 ClientDownloadRequest request; | 1476 ClientDownloadRequest request; |
| 1430 EXPECT_TRUE(request.ParseFromString(fetcher->upload_data())); | 1477 EXPECT_TRUE(request.ParseFromString(fetcher->upload_data())); |
| 1431 EXPECT_EQ("http://www.google.com/bla.exe", request.url()); | 1478 EXPECT_EQ("http://www.google.com/bla.exe", request.url()); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1448 ASSERT_EQ(1, chain.element_size()); | 1495 ASSERT_EQ(1, chain.element_size()); |
| 1449 EXPECT_EQ("dummy cert data", chain.element(0).certificate()); | 1496 EXPECT_EQ("dummy cert data", chain.element(0).certificate()); |
| 1450 EXPECT_TRUE(request.has_image_headers()); | 1497 EXPECT_TRUE(request.has_image_headers()); |
| 1451 const ClientDownloadRequest_ImageHeaders& headers = | 1498 const ClientDownloadRequest_ImageHeaders& headers = |
| 1452 request.image_headers(); | 1499 request.image_headers(); |
| 1453 EXPECT_TRUE(headers.has_pe_headers()); | 1500 EXPECT_TRUE(headers.has_pe_headers()); |
| 1454 EXPECT_TRUE(headers.pe_headers().has_dos_header()); | 1501 EXPECT_TRUE(headers.pe_headers().has_dos_header()); |
| 1455 EXPECT_EQ("dummy dos header", headers.pe_headers().dos_header()); | 1502 EXPECT_EQ("dummy dos header", headers.pe_headers().dos_header()); |
| 1456 | 1503 |
| 1457 // Simulate the request finishing. | 1504 // Simulate the request finishing. |
| 1505 |
| 1458 base::ThreadTaskRunnerHandle::Get()->PostTask( | 1506 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 1459 FROM_HERE, | 1507 FROM_HERE, |
| 1460 base::Bind(&DownloadProtectionServiceTest::SendURLFetchComplete, | 1508 base::Bind(&DownloadProtectionServiceTest::SendURLFetchComplete, |
| 1461 base::Unretained(this), fetcher)); | 1509 base::Unretained(this), fetcher)); |
| 1462 base::RunLoop().Run(); | 1510 run_loop.Run(); |
| 1463 } | 1511 } |
| 1464 | 1512 |
| 1465 // Similar to above, but with an unsigned binary. | 1513 // Similar to above, but with an unsigned binary. |
| 1466 TEST_F(DownloadProtectionServiceTest, | 1514 TEST_F(DownloadProtectionServiceTest, |
| 1467 CheckClientDownloadValidateRequestNoSignature) { | 1515 CheckClientDownloadValidateRequestNoSignature) { |
| 1468 net::TestURLFetcherFactory factory; | 1516 net::TestURLFetcherFactory factory; |
| 1469 | 1517 |
| 1470 content::MockDownloadItem item; | 1518 content::MockDownloadItem item; |
| 1471 PrepareBasicDownloadItem( | 1519 PrepareBasicDownloadItem( |
| 1472 &item, | 1520 &item, |
| 1473 {"http://www.google.com/", | 1521 {"http://www.google.com/", |
| 1474 "ftp://www.google.com/bla.exe"}, // url_chain | 1522 "ftp://www.google.com/bla.exe"}, // url_chain |
| 1475 "http://www.google.com/", // referrer | 1523 "http://www.google.com/", // referrer |
| 1476 FILE_PATH_LITERAL("bla.tmp"), // tmp_path | 1524 FILE_PATH_LITERAL("bla.tmp"), // tmp_path |
| 1477 FILE_PATH_LITERAL("bla.exe")); // final_path | 1525 FILE_PATH_LITERAL("bla.exe")); // final_path |
| 1478 std::string remote_address = "10.11.12.13"; | 1526 std::string remote_address = "10.11.12.13"; |
| 1479 EXPECT_CALL(item, GetRemoteAddress()).WillRepeatedly(Return(remote_address)); | 1527 EXPECT_CALL(item, GetRemoteAddress()).WillRepeatedly(Return(remote_address)); |
| 1480 | 1528 |
| 1481 EXPECT_CALL(*sb_service_->mock_database_manager(), | 1529 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 1482 MatchDownloadWhitelistUrl(_)) | 1530 MatchDownloadWhitelistUrl(_)) |
| 1483 .WillRepeatedly(Return(false)); | 1531 .WillRepeatedly(Return(false)); |
| 1484 EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)); | 1532 EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)); |
| 1485 EXPECT_CALL(*binary_feature_extractor_.get(), | 1533 EXPECT_CALL(*binary_feature_extractor_.get(), |
| 1486 ExtractImageFeatures(tmp_path_, | 1534 ExtractImageFeatures(tmp_path_, |
| 1487 BinaryFeatureExtractor::kDefaultOptions, | 1535 BinaryFeatureExtractor::kDefaultOptions, |
| 1488 _, _)); | 1536 _, _)); |
| 1537 RunLoop run_loop; |
| 1489 download_service_->CheckClientDownload( | 1538 download_service_->CheckClientDownload( |
| 1490 &item, | 1539 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1491 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1540 base::Unretained(this), run_loop.QuitClosure())); |
| 1492 base::Unretained(this))); | |
| 1493 | 1541 |
| 1494 // Run the message loop(s) until SendRequest is called. | 1542 // Run the message loop(s) until SendRequest is called. |
| 1495 FlushThreadMessageLoops(); | 1543 FlushThreadMessageLoops(); |
| 1496 EXPECT_TRUE(HasClientDownloadRequest()); | 1544 EXPECT_TRUE(HasClientDownloadRequest()); |
| 1497 ClearClientDownloadRequest(); | 1545 ClearClientDownloadRequest(); |
| 1498 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); | 1546 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
| 1499 ASSERT_TRUE(fetcher); | 1547 ASSERT_TRUE(fetcher); |
| 1500 ClientDownloadRequest request; | 1548 ClientDownloadRequest request; |
| 1501 EXPECT_TRUE(request.ParseFromString(fetcher->upload_data())); | 1549 EXPECT_TRUE(request.ParseFromString(fetcher->upload_data())); |
| 1502 EXPECT_EQ("ftp://www.google.com/bla.exe", request.url()); | 1550 EXPECT_EQ("ftp://www.google.com/bla.exe", request.url()); |
| 1503 EXPECT_EQ(hash_, request.digests().sha256()); | 1551 EXPECT_EQ(hash_, request.digests().sha256()); |
| 1504 EXPECT_EQ(item.GetReceivedBytes(), request.length()); | 1552 EXPECT_EQ(item.GetReceivedBytes(), request.length()); |
| 1505 EXPECT_EQ(item.HasUserGesture(), request.user_initiated()); | 1553 EXPECT_EQ(item.HasUserGesture(), request.user_initiated()); |
| 1506 EXPECT_EQ(2, request.resources_size()); | 1554 EXPECT_EQ(2, request.resources_size()); |
| 1507 EXPECT_TRUE(RequestContainsResource(request, | 1555 EXPECT_TRUE(RequestContainsResource(request, |
| 1508 ClientDownloadRequest::DOWNLOAD_REDIRECT, | 1556 ClientDownloadRequest::DOWNLOAD_REDIRECT, |
| 1509 "http://www.google.com/", "")); | 1557 "http://www.google.com/", "")); |
| 1510 EXPECT_TRUE(RequestContainsResource(request, | 1558 EXPECT_TRUE(RequestContainsResource(request, |
| 1511 ClientDownloadRequest::DOWNLOAD_URL, | 1559 ClientDownloadRequest::DOWNLOAD_URL, |
| 1512 "ftp://www.google.com/bla.exe", | 1560 "ftp://www.google.com/bla.exe", |
| 1513 referrer_.spec())); | 1561 referrer_.spec())); |
| 1514 EXPECT_TRUE(request.has_signature()); | 1562 EXPECT_TRUE(request.has_signature()); |
| 1515 EXPECT_EQ(0, request.signature().certificate_chain_size()); | 1563 EXPECT_EQ(0, request.signature().certificate_chain_size()); |
| 1516 | 1564 |
| 1517 // Simulate the request finishing. | 1565 // Simulate the request finishing. |
| 1518 base::ThreadTaskRunnerHandle::Get()->PostTask( | 1566 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 1519 FROM_HERE, | 1567 FROM_HERE, |
| 1520 base::Bind(&DownloadProtectionServiceTest::SendURLFetchComplete, | 1568 base::Bind(&DownloadProtectionServiceTest::SendURLFetchComplete, |
| 1521 base::Unretained(this), fetcher)); | 1569 base::Unretained(this), fetcher)); |
| 1522 base::RunLoop().Run(); | 1570 run_loop.Run(); |
| 1523 } | 1571 } |
| 1524 | 1572 |
| 1525 // Similar to above, but with tab history. | 1573 // Similar to above, but with tab history. |
| 1526 TEST_F(DownloadProtectionServiceTest, | 1574 TEST_F(DownloadProtectionServiceTest, |
| 1527 CheckClientDownloadValidateRequestTabHistory) { | 1575 CheckClientDownloadValidateRequestTabHistory) { |
| 1528 net::TestURLFetcherFactory factory; | 1576 net::TestURLFetcherFactory factory; |
| 1529 | 1577 |
| 1530 content::MockDownloadItem item; | 1578 content::MockDownloadItem item; |
| 1531 PrepareBasicDownloadItem( | 1579 PrepareBasicDownloadItem( |
| 1532 &item, | 1580 &item, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1551 .WillRepeatedly(SetCertificateContents("dummy cert data")); | 1599 .WillRepeatedly(SetCertificateContents("dummy cert data")); |
| 1552 EXPECT_CALL( | 1600 EXPECT_CALL( |
| 1553 *binary_feature_extractor_.get(), | 1601 *binary_feature_extractor_.get(), |
| 1554 ExtractImageFeatures(tmp_path_, BinaryFeatureExtractor::kDefaultOptions, | 1602 ExtractImageFeatures(tmp_path_, BinaryFeatureExtractor::kDefaultOptions, |
| 1555 _, _)) | 1603 _, _)) |
| 1556 .WillRepeatedly(SetDosHeaderContents("dummy dos header")); | 1604 .WillRepeatedly(SetDosHeaderContents("dummy dos header")); |
| 1557 | 1605 |
| 1558 // First test with no history match for the tab URL. | 1606 // First test with no history match for the tab URL. |
| 1559 { | 1607 { |
| 1560 TestURLFetcherWatcher fetcher_watcher(&factory); | 1608 TestURLFetcherWatcher fetcher_watcher(&factory); |
| 1609 RunLoop run_loop; |
| 1561 download_service_->CheckClientDownload( | 1610 download_service_->CheckClientDownload( |
| 1562 &item, | 1611 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1563 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1612 base::Unretained(this), run_loop.QuitClosure())); |
| 1564 base::Unretained(this))); | |
| 1565 | 1613 |
| 1566 EXPECT_EQ(0, fetcher_watcher.WaitForRequest()); | 1614 EXPECT_EQ(0, fetcher_watcher.WaitForRequest()); |
| 1567 EXPECT_TRUE(HasClientDownloadRequest()); | 1615 EXPECT_TRUE(HasClientDownloadRequest()); |
| 1568 ClearClientDownloadRequest(); | 1616 ClearClientDownloadRequest(); |
| 1569 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); | 1617 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
| 1570 ASSERT_TRUE(fetcher); | 1618 ASSERT_TRUE(fetcher); |
| 1571 ClientDownloadRequest request; | 1619 ClientDownloadRequest request; |
| 1572 EXPECT_TRUE(request.ParseFromString(fetcher->upload_data())); | 1620 EXPECT_TRUE(request.ParseFromString(fetcher->upload_data())); |
| 1573 EXPECT_EQ("http://www.google.com/bla.exe", request.url()); | 1621 EXPECT_EQ("http://www.google.com/bla.exe", request.url()); |
| 1574 EXPECT_EQ(hash_, request.digests().sha256()); | 1622 EXPECT_EQ(hash_, request.digests().sha256()); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1600 request.image_headers(); | 1648 request.image_headers(); |
| 1601 EXPECT_TRUE(headers.has_pe_headers()); | 1649 EXPECT_TRUE(headers.has_pe_headers()); |
| 1602 EXPECT_TRUE(headers.pe_headers().has_dos_header()); | 1650 EXPECT_TRUE(headers.pe_headers().has_dos_header()); |
| 1603 EXPECT_EQ("dummy dos header", headers.pe_headers().dos_header()); | 1651 EXPECT_EQ("dummy dos header", headers.pe_headers().dos_header()); |
| 1604 | 1652 |
| 1605 // Simulate the request finishing. | 1653 // Simulate the request finishing. |
| 1606 base::ThreadTaskRunnerHandle::Get()->PostTask( | 1654 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 1607 FROM_HERE, | 1655 FROM_HERE, |
| 1608 base::Bind(&DownloadProtectionServiceTest::SendURLFetchComplete, | 1656 base::Bind(&DownloadProtectionServiceTest::SendURLFetchComplete, |
| 1609 base::Unretained(this), fetcher)); | 1657 base::Unretained(this), fetcher)); |
| 1610 base::RunLoop().Run(); | 1658 run_loop.Run(); |
| 1611 } | 1659 } |
| 1612 | 1660 |
| 1613 // Now try with a history match. | 1661 // Now try with a history match. |
| 1614 { | 1662 { |
| 1615 history::RedirectList redirects; | 1663 history::RedirectList redirects; |
| 1616 redirects.push_back(GURL("http://tab.com/ref1")); | 1664 redirects.push_back(GURL("http://tab.com/ref1")); |
| 1617 redirects.push_back(GURL("http://tab.com/ref2")); | 1665 redirects.push_back(GURL("http://tab.com/ref2")); |
| 1618 redirects.push_back(tab_url); | 1666 redirects.push_back(tab_url); |
| 1619 HistoryServiceFactory::GetForProfile(profile_.get(), | 1667 HistoryServiceFactory::GetForProfile(profile_.get(), |
| 1620 ServiceAccessType::EXPLICIT_ACCESS) | 1668 ServiceAccessType::EXPLICIT_ACCESS) |
| 1621 ->AddPage(tab_url, | 1669 ->AddPage(tab_url, |
| 1622 base::Time::Now(), | 1670 base::Time::Now(), |
| 1623 reinterpret_cast<history::ContextID>(1), | 1671 reinterpret_cast<history::ContextID>(1), |
| 1624 0, | 1672 0, |
| 1625 GURL(), | 1673 GURL(), |
| 1626 redirects, | 1674 redirects, |
| 1627 ui::PAGE_TRANSITION_TYPED, | 1675 ui::PAGE_TRANSITION_TYPED, |
| 1628 history::SOURCE_BROWSED, | 1676 history::SOURCE_BROWSED, |
| 1629 false); | 1677 false); |
| 1630 | 1678 |
| 1631 TestURLFetcherWatcher fetcher_watcher(&factory); | 1679 TestURLFetcherWatcher fetcher_watcher(&factory); |
| 1680 RunLoop run_loop; |
| 1632 download_service_->CheckClientDownload( | 1681 download_service_->CheckClientDownload( |
| 1633 &item, | 1682 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1634 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1683 base::Unretained(this), run_loop.QuitClosure())); |
| 1635 base::Unretained(this))); | 1684 |
| 1636 EXPECT_EQ(0, fetcher_watcher.WaitForRequest()); | 1685 EXPECT_EQ(0, fetcher_watcher.WaitForRequest()); |
| 1637 EXPECT_TRUE(HasClientDownloadRequest()); | 1686 EXPECT_TRUE(HasClientDownloadRequest()); |
| 1638 ClearClientDownloadRequest(); | 1687 ClearClientDownloadRequest(); |
| 1639 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); | 1688 net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
| 1640 ASSERT_TRUE(fetcher); | 1689 ASSERT_TRUE(fetcher); |
| 1641 ClientDownloadRequest request; | 1690 ClientDownloadRequest request; |
| 1642 EXPECT_TRUE(request.ParseFromString(fetcher->upload_data())); | 1691 EXPECT_TRUE(request.ParseFromString(fetcher->upload_data())); |
| 1643 EXPECT_EQ("http://www.google.com/bla.exe", request.url()); | 1692 EXPECT_EQ("http://www.google.com/bla.exe", request.url()); |
| 1644 EXPECT_EQ(hash_, request.digests().sha256()); | 1693 EXPECT_EQ(hash_, request.digests().sha256()); |
| 1645 EXPECT_EQ(item.GetReceivedBytes(), request.length()); | 1694 EXPECT_EQ(item.GetReceivedBytes(), request.length()); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1672 const ClientDownloadRequest_CertificateChain& chain = | 1721 const ClientDownloadRequest_CertificateChain& chain = |
| 1673 request.signature().certificate_chain(0); | 1722 request.signature().certificate_chain(0); |
| 1674 ASSERT_EQ(1, chain.element_size()); | 1723 ASSERT_EQ(1, chain.element_size()); |
| 1675 EXPECT_EQ("dummy cert data", chain.element(0).certificate()); | 1724 EXPECT_EQ("dummy cert data", chain.element(0).certificate()); |
| 1676 | 1725 |
| 1677 // Simulate the request finishing. | 1726 // Simulate the request finishing. |
| 1678 base::ThreadTaskRunnerHandle::Get()->PostTask( | 1727 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 1679 FROM_HERE, | 1728 FROM_HERE, |
| 1680 base::Bind(&DownloadProtectionServiceTest::SendURLFetchComplete, | 1729 base::Bind(&DownloadProtectionServiceTest::SendURLFetchComplete, |
| 1681 base::Unretained(this), fetcher)); | 1730 base::Unretained(this), fetcher)); |
| 1682 base::RunLoop().Run(); | 1731 run_loop.Run(); |
| 1683 } | 1732 } |
| 1684 } | 1733 } |
| 1685 | 1734 |
| 1686 TEST_F(DownloadProtectionServiceTest, TestCheckDownloadUrl) { | 1735 TEST_F(DownloadProtectionServiceTest, TestCheckDownloadUrl) { |
| 1687 net::TestURLFetcherFactory factory; | 1736 net::TestURLFetcherFactory factory; |
| 1688 | 1737 |
| 1689 std::vector<GURL> url_chain; | 1738 std::vector<GURL> url_chain; |
| 1690 url_chain.push_back(GURL("http://www.google.com/")); | 1739 url_chain.push_back(GURL("http://www.google.com/")); |
| 1691 url_chain.push_back(GURL("http://www.google.com/bla.exe")); | 1740 url_chain.push_back(GURL("http://www.google.com/bla.exe")); |
| 1692 GURL referrer("http://www.google.com/"); | 1741 GURL referrer("http://www.google.com/"); |
| 1693 std::string hash = "hash"; | 1742 std::string hash = "hash"; |
| 1694 | 1743 |
| 1695 content::MockDownloadItem item; | 1744 content::MockDownloadItem item; |
| 1696 EXPECT_CALL(item, GetUrlChain()).WillRepeatedly(ReturnRef(url_chain)); | 1745 EXPECT_CALL(item, GetUrlChain()).WillRepeatedly(ReturnRef(url_chain)); |
| 1697 EXPECT_CALL(item, GetReferrerUrl()).WillRepeatedly(ReturnRef(referrer)); | 1746 EXPECT_CALL(item, GetReferrerUrl()).WillRepeatedly(ReturnRef(referrer)); |
| 1698 EXPECT_CALL(item, GetHash()).WillRepeatedly(ReturnRef(hash)); | 1747 EXPECT_CALL(item, GetHash()).WillRepeatedly(ReturnRef(hash)); |
| 1699 | 1748 |
| 1700 // CheckDownloadURL returns immediately which means the client object callback | 1749 { |
| 1701 // will never be called. Nevertheless the callback provided to | 1750 // CheckDownloadURL returns immediately which means the client object |
| 1702 // CheckClientDownload must still be called. | 1751 // callback |
| 1703 EXPECT_CALL(*sb_service_->mock_database_manager(), | 1752 // will never be called. Nevertheless the callback provided to |
| 1704 CheckDownloadUrl(ContainerEq(url_chain), NotNull())) | 1753 // CheckClientDownload must still be called. |
| 1705 .WillOnce(Return(true)); | 1754 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 1706 download_service_->CheckDownloadUrl( | 1755 CheckDownloadUrl(ContainerEq(url_chain), NotNull())) |
| 1707 item, | 1756 .WillOnce(Return(true)); |
| 1708 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1757 RunLoop run_loop; |
| 1709 base::Unretained(this))); | 1758 download_service_->CheckDownloadUrl( |
| 1710 base::RunLoop().Run(); | 1759 item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1711 EXPECT_TRUE(IsResult(DownloadProtectionService::SAFE)); | 1760 base::Unretained(this), run_loop.QuitClosure())); |
| 1712 Mock::VerifyAndClearExpectations(sb_service_.get()); | 1761 run_loop.Run(); |
| 1762 EXPECT_TRUE(IsResult(DownloadProtectionService::SAFE)); |
| 1763 Mock::VerifyAndClearExpectations(sb_service_.get()); |
| 1764 } |
| 1713 | 1765 |
| 1714 EXPECT_CALL(*sb_service_->mock_database_manager(), | 1766 { |
| 1715 CheckDownloadUrl(ContainerEq(url_chain), NotNull())) | 1767 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 1716 .WillOnce(DoAll(CheckDownloadUrlDone(SB_THREAT_TYPE_SAFE), | 1768 CheckDownloadUrl(ContainerEq(url_chain), NotNull())) |
| 1717 Return(false))); | 1769 .WillOnce( |
| 1718 download_service_->CheckDownloadUrl( | 1770 DoAll(CheckDownloadUrlDone(SB_THREAT_TYPE_SAFE), Return(false))); |
| 1719 item, | 1771 RunLoop run_loop; |
| 1720 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1772 download_service_->CheckDownloadUrl( |
| 1721 base::Unretained(this))); | 1773 item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1722 base::RunLoop().Run(); | 1774 base::Unretained(this), run_loop.QuitClosure())); |
| 1723 EXPECT_TRUE(IsResult(DownloadProtectionService::SAFE)); | 1775 run_loop.Run(); |
| 1724 Mock::VerifyAndClearExpectations(sb_service_.get()); | 1776 EXPECT_TRUE(IsResult(DownloadProtectionService::SAFE)); |
| 1777 Mock::VerifyAndClearExpectations(sb_service_.get()); |
| 1778 } |
| 1725 | 1779 |
| 1726 EXPECT_CALL(*sb_service_->mock_database_manager(), | 1780 { |
| 1727 CheckDownloadUrl(ContainerEq(url_chain), NotNull())) | 1781 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 1728 .WillOnce(DoAll( | 1782 CheckDownloadUrl(ContainerEq(url_chain), NotNull())) |
| 1729 CheckDownloadUrlDone(SB_THREAT_TYPE_URL_MALWARE), | 1783 .WillOnce(DoAll(CheckDownloadUrlDone(SB_THREAT_TYPE_URL_MALWARE), |
| 1730 Return(false))); | 1784 Return(false))); |
| 1731 download_service_->CheckDownloadUrl( | 1785 RunLoop run_loop; |
| 1732 item, | 1786 download_service_->CheckDownloadUrl( |
| 1733 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1787 item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1734 base::Unretained(this))); | 1788 base::Unretained(this), run_loop.QuitClosure())); |
| 1735 base::RunLoop().Run(); | 1789 run_loop.Run(); |
| 1736 EXPECT_TRUE(IsResult(DownloadProtectionService::SAFE)); | 1790 EXPECT_TRUE(IsResult(DownloadProtectionService::SAFE)); |
| 1737 Mock::VerifyAndClearExpectations(sb_service_.get()); | 1791 Mock::VerifyAndClearExpectations(sb_service_.get()); |
| 1792 } |
| 1738 | 1793 |
| 1739 EXPECT_CALL(*sb_service_->mock_database_manager(), | 1794 { |
| 1740 CheckDownloadUrl(ContainerEq(url_chain), | 1795 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 1741 NotNull())) | 1796 CheckDownloadUrl(ContainerEq(url_chain), NotNull())) |
| 1742 .WillOnce(DoAll( | 1797 .WillOnce(DoAll(CheckDownloadUrlDone(SB_THREAT_TYPE_BINARY_MALWARE_URL), |
| 1743 CheckDownloadUrlDone(SB_THREAT_TYPE_BINARY_MALWARE_URL), | 1798 Return(false))); |
| 1744 Return(false))); | 1799 RunLoop run_loop; |
| 1745 download_service_->CheckDownloadUrl( | 1800 download_service_->CheckDownloadUrl( |
| 1746 item, | 1801 item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1747 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1802 base::Unretained(this), run_loop.QuitClosure())); |
| 1748 base::Unretained(this))); | 1803 run_loop.Run(); |
| 1749 base::RunLoop().Run(); | 1804 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); |
| 1750 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); | 1805 } |
| 1751 } | 1806 } |
| 1752 | 1807 |
| 1753 TEST_F(DownloadProtectionServiceTest, TestDownloadRequestTimeout) { | 1808 TEST_F(DownloadProtectionServiceTest, TestDownloadRequestTimeout) { |
| 1754 net::TestURLFetcherFactory factory; | 1809 net::TestURLFetcherFactory factory; |
| 1755 | 1810 |
| 1756 content::MockDownloadItem item; | 1811 content::MockDownloadItem item; |
| 1757 PrepareBasicDownloadItem( | 1812 PrepareBasicDownloadItem( |
| 1758 &item, | 1813 &item, |
| 1759 {"http://www.evil.com/bla.exe"}, // url_chain | 1814 {"http://www.evil.com/bla.exe"}, // url_chain |
| 1760 "http://www.google.com/", // referrer | 1815 "http://www.google.com/", // referrer |
| 1761 FILE_PATH_LITERAL("a.tmp"), // tmp_path | 1816 FILE_PATH_LITERAL("a.tmp"), // tmp_path |
| 1762 FILE_PATH_LITERAL("a.exe")); // final_path | 1817 FILE_PATH_LITERAL("a.exe")); // final_path |
| 1763 | 1818 |
| 1764 EXPECT_CALL(*sb_service_->mock_database_manager(), | 1819 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 1765 MatchDownloadWhitelistUrl(_)) | 1820 MatchDownloadWhitelistUrl(_)) |
| 1766 .WillRepeatedly(Return(false)); | 1821 .WillRepeatedly(Return(false)); |
| 1767 EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)); | 1822 EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)); |
| 1768 EXPECT_CALL(*binary_feature_extractor_.get(), | 1823 EXPECT_CALL(*binary_feature_extractor_.get(), |
| 1769 ExtractImageFeatures(tmp_path_, | 1824 ExtractImageFeatures(tmp_path_, |
| 1770 BinaryFeatureExtractor::kDefaultOptions, | 1825 BinaryFeatureExtractor::kDefaultOptions, |
| 1771 _, _)); | 1826 _, _)); |
| 1772 | 1827 |
| 1773 download_service_->download_request_timeout_ms_ = 10; | 1828 download_service_->download_request_timeout_ms_ = 10; |
| 1829 RunLoop run_loop; |
| 1774 download_service_->CheckClientDownload( | 1830 download_service_->CheckClientDownload( |
| 1775 &item, | 1831 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1776 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1832 base::Unretained(this), run_loop.QuitClosure())); |
| 1777 base::Unretained(this))); | |
| 1778 | 1833 |
| 1779 // The request should time out because the HTTP request hasn't returned | 1834 // The request should time out because the HTTP request hasn't returned |
| 1780 // anything yet. | 1835 // anything yet. |
| 1781 base::RunLoop().Run(); | 1836 run_loop.Run(); |
| 1782 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); | 1837 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); |
| 1783 EXPECT_TRUE(HasClientDownloadRequest()); | 1838 EXPECT_TRUE(HasClientDownloadRequest()); |
| 1784 ClearClientDownloadRequest(); | 1839 ClearClientDownloadRequest(); |
| 1785 } | 1840 } |
| 1786 | 1841 |
| 1787 TEST_F(DownloadProtectionServiceTest, TestDownloadItemDestroyed) { | 1842 TEST_F(DownloadProtectionServiceTest, TestDownloadItemDestroyed) { |
| 1788 { | 1843 { |
| 1789 content::MockDownloadItem item; | 1844 content::MockDownloadItem item; |
| 1790 PrepareBasicDownloadItem( | 1845 PrepareBasicDownloadItem( |
| 1791 &item, | 1846 &item, |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1834 .WillRepeatedly(Invoke([&item](const GURL&) { | 1889 .WillRepeatedly(Invoke([&item](const GURL&) { |
| 1835 item.reset(); | 1890 item.reset(); |
| 1836 return false; | 1891 return false; |
| 1837 })); | 1892 })); |
| 1838 EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)); | 1893 EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)); |
| 1839 EXPECT_CALL(*binary_feature_extractor_.get(), | 1894 EXPECT_CALL(*binary_feature_extractor_.get(), |
| 1840 ExtractImageFeatures(tmp_path_, | 1895 ExtractImageFeatures(tmp_path_, |
| 1841 BinaryFeatureExtractor::kDefaultOptions, | 1896 BinaryFeatureExtractor::kDefaultOptions, |
| 1842 _, _)); | 1897 _, _)); |
| 1843 | 1898 |
| 1899 RunLoop run_loop; |
| 1844 download_service_->CheckClientDownload( | 1900 download_service_->CheckClientDownload( |
| 1845 item.get(), | 1901 item.get(), base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 1846 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 1902 base::Unretained(this), run_loop.QuitClosure())); |
| 1847 base::Unretained(this))); | |
| 1848 | 1903 |
| 1849 base::RunLoop().Run(); | 1904 run_loop.Run(); |
| 1850 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); | 1905 EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); |
| 1851 EXPECT_FALSE(HasClientDownloadRequest()); | 1906 EXPECT_FALSE(HasClientDownloadRequest()); |
| 1852 } | 1907 } |
| 1853 | 1908 |
| 1854 TEST_F(DownloadProtectionServiceTest, GetCertificateWhitelistStrings) { | 1909 TEST_F(DownloadProtectionServiceTest, GetCertificateWhitelistStrings) { |
| 1855 // We'll pass this cert in as the "issuer", even though it isn't really | 1910 // We'll pass this cert in as the "issuer", even though it isn't really |
| 1856 // used to sign the certs below. GetCertificateWhitelistStirngs doesn't care | 1911 // used to sign the certs below. GetCertificateWhitelistStirngs doesn't care |
| 1857 // about this. | 1912 // about this. |
| 1858 scoped_refptr<net::X509Certificate> issuer_cert( | 1913 scoped_refptr<net::X509Certificate> issuer_cert( |
| 1859 ReadTestCertificate("issuer.pem")); | 1914 ReadTestCertificate("issuer.pem")); |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1980 EXPECT_EQ(token, DownloadProtectionService::GetDownloadPingToken(&item)); | 2035 EXPECT_EQ(token, DownloadProtectionService::GetDownloadPingToken(&item)); |
| 1981 | 2036 |
| 1982 DownloadProtectionService::SetDownloadPingToken(&item, std::string()); | 2037 DownloadProtectionService::SetDownloadPingToken(&item, std::string()); |
| 1983 EXPECT_TRUE(DownloadProtectionService::GetDownloadPingToken(&item).empty()); | 2038 EXPECT_TRUE(DownloadProtectionService::GetDownloadPingToken(&item).empty()); |
| 1984 } | 2039 } |
| 1985 | 2040 |
| 1986 TEST_F(DownloadProtectionServiceTest, PPAPIDownloadRequest_Unsupported) { | 2041 TEST_F(DownloadProtectionServiceTest, PPAPIDownloadRequest_Unsupported) { |
| 1987 base::FilePath default_file_path(FILE_PATH_LITERAL("/foo/bar/test.txt")); | 2042 base::FilePath default_file_path(FILE_PATH_LITERAL("/foo/bar/test.txt")); |
| 1988 std::vector<base::FilePath::StringType> alternate_extensions{ | 2043 std::vector<base::FilePath::StringType> alternate_extensions{ |
| 1989 FILE_PATH_LITERAL(".tmp"), FILE_PATH_LITERAL(".asdfasdf")}; | 2044 FILE_PATH_LITERAL(".tmp"), FILE_PATH_LITERAL(".asdfasdf")}; |
| 2045 SetExtendedReportingPreference(false); |
| 1990 download_service_->CheckPPAPIDownloadRequest( | 2046 download_service_->CheckPPAPIDownloadRequest( |
| 1991 GURL("http://example.com/foo"), default_file_path, alternate_extensions, | 2047 GURL("http://example.com/foo"), default_file_path, alternate_extensions, |
| 2048 profile_.get(), |
| 1992 base::Bind(&DownloadProtectionServiceTest::SyncCheckDoneCallback, | 2049 base::Bind(&DownloadProtectionServiceTest::SyncCheckDoneCallback, |
| 1993 base::Unretained(this))); | 2050 base::Unretained(this))); |
| 1994 ASSERT_TRUE(IsResult(DownloadProtectionService::SAFE)); | 2051 ASSERT_TRUE(IsResult(DownloadProtectionService::SAFE)); |
| 1995 } | 2052 } |
| 1996 | 2053 |
| 1997 TEST_F(DownloadProtectionServiceTest, PPAPIDownloadRequest_SupportedDefault) { | 2054 TEST_F(DownloadProtectionServiceTest, PPAPIDownloadRequest_SupportedDefault) { |
| 1998 net::FakeURLFetcherFactory factory(nullptr); | 2055 net::FakeURLFetcherFactory factory(nullptr); |
| 1999 base::FilePath default_file_path(FILE_PATH_LITERAL("/foo/bar/test.crx")); | 2056 base::FilePath default_file_path(FILE_PATH_LITERAL("/foo/bar/test.crx")); |
| 2000 std::vector<base::FilePath::StringType> alternate_extensions; | 2057 std::vector<base::FilePath::StringType> alternate_extensions; |
| 2001 EXPECT_CALL(*sb_service_->mock_database_manager(), | 2058 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2012 DownloadProtectionService::DANGEROUS_HOST}, | 2069 DownloadProtectionService::DANGEROUS_HOST}, |
| 2013 {ClientDownloadResponse::POTENTIALLY_UNWANTED, | 2070 {ClientDownloadResponse::POTENTIALLY_UNWANTED, |
| 2014 DownloadProtectionService::POTENTIALLY_UNWANTED}, | 2071 DownloadProtectionService::POTENTIALLY_UNWANTED}, |
| 2015 {ClientDownloadResponse::UNKNOWN, DownloadProtectionService::UNKNOWN}, | 2072 {ClientDownloadResponse::UNKNOWN, DownloadProtectionService::UNKNOWN}, |
| 2016 }; | 2073 }; |
| 2017 | 2074 |
| 2018 for (const auto& test_case : kExpectedResults) { | 2075 for (const auto& test_case : kExpectedResults) { |
| 2019 factory.ClearFakeResponses(); | 2076 factory.ClearFakeResponses(); |
| 2020 PrepareResponse(&factory, test_case.verdict, net::HTTP_OK, | 2077 PrepareResponse(&factory, test_case.verdict, net::HTTP_OK, |
| 2021 net::URLRequestStatus::SUCCESS); | 2078 net::URLRequestStatus::SUCCESS); |
| 2079 SetExtendedReportingPreference(false); |
| 2080 RunLoop run_loop; |
| 2022 download_service_->CheckPPAPIDownloadRequest( | 2081 download_service_->CheckPPAPIDownloadRequest( |
| 2023 GURL("http://example.com/foo"), default_file_path, alternate_extensions, | 2082 GURL("http://example.com/foo"), default_file_path, alternate_extensions, |
| 2083 profile_.get(), |
| 2024 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 2084 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 2025 base::Unretained(this))); | 2085 base::Unretained(this), run_loop.QuitClosure())); |
| 2026 base::RunLoop().Run(); | 2086 run_loop.Run(); |
| 2027 ASSERT_TRUE(IsResult(test_case.expected_result)); | 2087 ASSERT_TRUE(IsResult(test_case.expected_result)); |
| 2028 } | 2088 } |
| 2029 } | 2089 } |
| 2030 | 2090 |
| 2031 TEST_F(DownloadProtectionServiceTest, PPAPIDownloadRequest_SupportedAlternate) { | 2091 TEST_F(DownloadProtectionServiceTest, PPAPIDownloadRequest_SupportedAlternate) { |
| 2032 net::FakeURLFetcherFactory factory(nullptr); | 2092 net::FakeURLFetcherFactory factory(nullptr); |
| 2033 base::FilePath default_file_path(FILE_PATH_LITERAL("/foo/bar/test.txt")); | 2093 base::FilePath default_file_path(FILE_PATH_LITERAL("/foo/bar/test.txt")); |
| 2034 std::vector<base::FilePath::StringType> alternate_extensions{ | 2094 std::vector<base::FilePath::StringType> alternate_extensions{ |
| 2035 FILE_PATH_LITERAL(".tmp"), FILE_PATH_LITERAL(".crx")}; | 2095 FILE_PATH_LITERAL(".tmp"), FILE_PATH_LITERAL(".crx")}; |
| 2036 PrepareResponse(&factory, ClientDownloadResponse::DANGEROUS, net::HTTP_OK, | 2096 PrepareResponse(&factory, ClientDownloadResponse::DANGEROUS, net::HTTP_OK, |
| 2037 net::URLRequestStatus::SUCCESS); | 2097 net::URLRequestStatus::SUCCESS); |
| 2038 EXPECT_CALL(*sb_service_->mock_database_manager(), | 2098 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 2039 MatchDownloadWhitelistUrl(_)) | 2099 MatchDownloadWhitelistUrl(_)) |
| 2040 .WillRepeatedly(Return(false)); | 2100 .WillRepeatedly(Return(false)); |
| 2101 SetExtendedReportingPreference(false); |
| 2102 RunLoop run_loop; |
| 2041 download_service_->CheckPPAPIDownloadRequest( | 2103 download_service_->CheckPPAPIDownloadRequest( |
| 2042 GURL("http://example.com/foo"), default_file_path, alternate_extensions, | 2104 GURL("http://example.com/foo"), default_file_path, alternate_extensions, |
| 2105 profile_.get(), |
| 2043 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 2106 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 2044 base::Unretained(this))); | 2107 base::Unretained(this), run_loop.QuitClosure())); |
| 2045 base::RunLoop().Run(); | 2108 run_loop.Run(); |
| 2046 | 2109 |
| 2047 ASSERT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); | 2110 ASSERT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); |
| 2048 } | 2111 } |
| 2049 | 2112 |
| 2050 TEST_F(DownloadProtectionServiceTest, PPAPIDownloadRequest_WhitelistedURL) { | 2113 TEST_F(DownloadProtectionServiceTest, |
| 2114 PPAPIDownloadRequest_WhitelistedURLNotExtendedReporting) { |
| 2051 net::FakeURLFetcherFactory factory(nullptr); | 2115 net::FakeURLFetcherFactory factory(nullptr); |
| 2052 base::FilePath default_file_path(FILE_PATH_LITERAL("/foo/bar/test.crx")); | 2116 base::FilePath default_file_path(FILE_PATH_LITERAL("/foo/bar/test.crx")); |
| 2053 std::vector<base::FilePath::StringType> alternate_extensions; | 2117 std::vector<base::FilePath::StringType> alternate_extensions; |
| 2118 // Configs "server" side response to DANGEROUS, in case a request is send out. |
| 2119 PrepareResponse(&factory, ClientDownloadResponse::DANGEROUS, net::HTTP_OK, |
| 2120 net::URLRequestStatus::SUCCESS); |
| 2054 EXPECT_CALL(*sb_service_->mock_database_manager(), | 2121 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 2055 MatchDownloadWhitelistUrl(_)) | 2122 MatchDownloadWhitelistUrl(_)) |
| 2056 .WillRepeatedly(Return(true)); | 2123 .WillRepeatedly(Return(true)); |
| 2124 SetExtendedReportingPreference(false); |
| 2125 // Sets the sample rate to 1.00. |
| 2126 SetWhitelistedDownloadSampleRate(1.00); |
| 2127 RunLoop run_loop; |
| 2057 download_service_->CheckPPAPIDownloadRequest( | 2128 download_service_->CheckPPAPIDownloadRequest( |
| 2058 GURL("http://example.com/foo"), default_file_path, alternate_extensions, | 2129 GURL("http://example.com/foo"), default_file_path, alternate_extensions, |
| 2130 profile_.get(), |
| 2059 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 2131 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 2060 base::Unretained(this))); | 2132 base::Unretained(this), run_loop.QuitClosure())); |
| 2061 base::RunLoop().Run(); | 2133 run_loop.Run(); |
| 2062 | 2134 |
| 2135 // Result should be SAFE, since download matches whitelist but user is not in |
| 2136 // extended reporting group (a.k.a no request sents out). |
| 2063 ASSERT_TRUE(IsResult(DownloadProtectionService::SAFE)); | 2137 ASSERT_TRUE(IsResult(DownloadProtectionService::SAFE)); |
| 2064 } | 2138 } |
| 2065 | 2139 |
| 2140 TEST_F(DownloadProtectionServiceTest, |
| 2141 PPAPIDownloadRequest_WhitelistedURLIncognito) { |
| 2142 net::FakeURLFetcherFactory factory(nullptr); |
| 2143 base::FilePath default_file_path(FILE_PATH_LITERAL("/foo/bar/test.crx")); |
| 2144 std::vector<base::FilePath::StringType> alternate_extensions; |
| 2145 // Configs "server" side response to DANGEROUS, in case a request is send out. |
| 2146 PrepareResponse(&factory, ClientDownloadResponse::DANGEROUS, net::HTTP_OK, |
| 2147 net::URLRequestStatus::SUCCESS); |
| 2148 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 2149 MatchDownloadWhitelistUrl(_)) |
| 2150 .WillRepeatedly(Return(true)); |
| 2151 SetExtendedReportingPreference(true); |
| 2152 RunLoop run_loop; |
| 2153 download_service_->CheckPPAPIDownloadRequest( |
| 2154 GURL("http://example.com/foo"), default_file_path, alternate_extensions, |
| 2155 profile_->GetOffTheRecordProfile(), |
| 2156 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 2157 base::Unretained(this), run_loop.QuitClosure())); |
| 2158 run_loop.Run(); |
| 2159 |
| 2160 // Result should still be SAFE, since download matches whitelist and user is |
| 2161 // in incognito mode. |
| 2162 ASSERT_TRUE(IsResult(DownloadProtectionService::SAFE)); |
| 2163 } |
| 2164 |
| 2165 TEST_F(DownloadProtectionServiceTest, |
| 2166 PPAPIDownloadRequest_SampleWhitelistedURL) { |
| 2167 net::FakeURLFetcherFactory factory(nullptr); |
| 2168 base::FilePath default_file_path(FILE_PATH_LITERAL("/foo/bar/test.crx")); |
| 2169 std::vector<base::FilePath::StringType> alternate_extensions; |
| 2170 // Configs "server" side response to DANGEROUS. |
| 2171 PrepareResponse(&factory, ClientDownloadResponse::DANGEROUS, net::HTTP_OK, |
| 2172 net::URLRequestStatus::SUCCESS); |
| 2173 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 2174 MatchDownloadWhitelistUrl(_)) |
| 2175 .WillRepeatedly(Return(true)); |
| 2176 // Sets the sample rate to 1.00 to trigger ClientDownloadRequest. |
| 2177 SetWhitelistedDownloadSampleRate(1.00); |
| 2178 SetExtendedReportingPreference(true); |
| 2179 RunLoop run_loop; |
| 2180 download_service_->CheckPPAPIDownloadRequest( |
| 2181 GURL("http://example.com/foo"), default_file_path, alternate_extensions, |
| 2182 profile_.get(), |
| 2183 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 2184 base::Unretained(this), run_loop.QuitClosure())); |
| 2185 run_loop.Run(); |
| 2186 |
| 2187 // Result should be Dangerous, since we will sample this download and ping SB |
| 2188 // Server (server returns DANGEROUS verdict). |
| 2189 ASSERT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); |
| 2190 } |
| 2191 |
| 2066 TEST_F(DownloadProtectionServiceTest, PPAPIDownloadRequest_FetchFailed) { | 2192 TEST_F(DownloadProtectionServiceTest, PPAPIDownloadRequest_FetchFailed) { |
| 2067 net::FakeURLFetcherFactory factory(nullptr); | 2193 net::FakeURLFetcherFactory factory(nullptr); |
| 2068 base::FilePath default_file_path(FILE_PATH_LITERAL("/foo/bar/test.crx")); | 2194 base::FilePath default_file_path(FILE_PATH_LITERAL("/foo/bar/test.crx")); |
| 2069 std::vector<base::FilePath::StringType> alternate_extensions; | 2195 std::vector<base::FilePath::StringType> alternate_extensions; |
| 2070 PrepareResponse(&factory, ClientDownloadResponse::DANGEROUS, net::HTTP_OK, | 2196 PrepareResponse(&factory, ClientDownloadResponse::DANGEROUS, net::HTTP_OK, |
| 2071 net::URLRequestStatus::FAILED); | 2197 net::URLRequestStatus::FAILED); |
| 2072 EXPECT_CALL(*sb_service_->mock_database_manager(), | 2198 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 2073 MatchDownloadWhitelistUrl(_)) | 2199 MatchDownloadWhitelistUrl(_)) |
| 2074 .WillRepeatedly(Return(false)); | 2200 .WillRepeatedly(Return(false)); |
| 2201 SetExtendedReportingPreference(false); |
| 2202 RunLoop run_loop; |
| 2075 download_service_->CheckPPAPIDownloadRequest( | 2203 download_service_->CheckPPAPIDownloadRequest( |
| 2076 GURL("http://example.com/foo"), default_file_path, alternate_extensions, | 2204 GURL("http://example.com/foo"), default_file_path, alternate_extensions, |
| 2205 profile_.get(), |
| 2077 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 2206 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 2078 base::Unretained(this))); | 2207 base::Unretained(this), run_loop.QuitClosure())); |
| 2079 base::RunLoop().Run(); | 2208 run_loop.Run(); |
| 2080 | 2209 |
| 2081 ASSERT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); | 2210 ASSERT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); |
| 2082 } | 2211 } |
| 2083 | 2212 |
| 2084 TEST_F(DownloadProtectionServiceTest, PPAPIDownloadRequest_InvalidResponse) { | 2213 TEST_F(DownloadProtectionServiceTest, PPAPIDownloadRequest_InvalidResponse) { |
| 2085 net::FakeURLFetcherFactory factory(nullptr); | 2214 net::FakeURLFetcherFactory factory(nullptr); |
| 2086 base::FilePath default_file_path(FILE_PATH_LITERAL("/foo/bar/test.crx")); | 2215 base::FilePath default_file_path(FILE_PATH_LITERAL("/foo/bar/test.crx")); |
| 2087 std::vector<base::FilePath::StringType> alternate_extensions; | 2216 std::vector<base::FilePath::StringType> alternate_extensions; |
| 2088 factory.SetFakeResponse(DownloadProtectionService::GetDownloadRequestUrl(), | 2217 factory.SetFakeResponse(DownloadProtectionService::GetDownloadRequestUrl(), |
| 2089 "Hello world!", net::HTTP_OK, | 2218 "Hello world!", net::HTTP_OK, |
| 2090 net::URLRequestStatus::SUCCESS); | 2219 net::URLRequestStatus::SUCCESS); |
| 2091 EXPECT_CALL(*sb_service_->mock_database_manager(), | 2220 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 2092 MatchDownloadWhitelistUrl(_)) | 2221 MatchDownloadWhitelistUrl(_)) |
| 2093 .WillRepeatedly(Return(false)); | 2222 .WillRepeatedly(Return(false)); |
| 2223 SetExtendedReportingPreference(false); |
| 2224 RunLoop run_loop; |
| 2094 download_service_->CheckPPAPIDownloadRequest( | 2225 download_service_->CheckPPAPIDownloadRequest( |
| 2095 GURL("http://example.com/foo"), default_file_path, alternate_extensions, | 2226 GURL("http://example.com/foo"), default_file_path, alternate_extensions, |
| 2227 profile_.get(), |
| 2096 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 2228 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 2097 base::Unretained(this))); | 2229 base::Unretained(this), run_loop.QuitClosure())); |
| 2098 base::RunLoop().Run(); | 2230 run_loop.Run(); |
| 2099 | 2231 |
| 2100 ASSERT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); | 2232 ASSERT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); |
| 2101 } | 2233 } |
| 2102 | 2234 |
| 2103 TEST_F(DownloadProtectionServiceTest, PPAPIDownloadRequest_Timeout) { | 2235 TEST_F(DownloadProtectionServiceTest, PPAPIDownloadRequest_Timeout) { |
| 2104 net::FakeURLFetcherFactory factory(nullptr); | 2236 net::FakeURLFetcherFactory factory(nullptr); |
| 2105 base::FilePath default_file_path(FILE_PATH_LITERAL("/foo/bar/test.crx")); | 2237 base::FilePath default_file_path(FILE_PATH_LITERAL("/foo/bar/test.crx")); |
| 2106 std::vector<base::FilePath::StringType> alternate_extensions; | 2238 std::vector<base::FilePath::StringType> alternate_extensions; |
| 2107 EXPECT_CALL(*sb_service_->mock_database_manager(), | 2239 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 2108 MatchDownloadWhitelistUrl(_)) | 2240 MatchDownloadWhitelistUrl(_)) |
| 2109 .WillRepeatedly(Return(false)); | 2241 .WillRepeatedly(Return(false)); |
| 2110 PrepareResponse(&factory, ClientDownloadResponse::SAFE, net::HTTP_OK, | 2242 PrepareResponse(&factory, ClientDownloadResponse::SAFE, net::HTTP_OK, |
| 2111 net::URLRequestStatus::SUCCESS); | 2243 net::URLRequestStatus::SUCCESS); |
| 2112 download_service_->download_request_timeout_ms_ = 0; | 2244 download_service_->download_request_timeout_ms_ = 0; |
| 2245 SetExtendedReportingPreference(false); |
| 2246 RunLoop run_loop; |
| 2113 download_service_->CheckPPAPIDownloadRequest( | 2247 download_service_->CheckPPAPIDownloadRequest( |
| 2114 GURL("http://example.com/foo"), default_file_path, alternate_extensions, | 2248 GURL("http://example.com/foo"), default_file_path, alternate_extensions, |
| 2249 profile_.get(), |
| 2115 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 2250 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 2116 base::Unretained(this))); | 2251 base::Unretained(this), run_loop.QuitClosure())); |
| 2117 base::RunLoop().Run(); | 2252 run_loop.Run(); |
| 2118 | 2253 |
| 2119 ASSERT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); | 2254 ASSERT_TRUE(IsResult(DownloadProtectionService::UNKNOWN)); |
| 2120 } | 2255 } |
| 2121 | 2256 |
| 2122 namespace { | 2257 namespace { |
| 2123 | 2258 |
| 2124 std::unique_ptr<net::FakeURLFetcher> FakeURLFetcherCreatorFunc( | 2259 std::unique_ptr<net::FakeURLFetcher> FakeURLFetcherCreatorFunc( |
| 2125 std::string* upload_data_receiver, | 2260 std::string* upload_data_receiver, |
| 2126 const GURL& url, | 2261 const GURL& url, |
| 2127 net::URLFetcherDelegate* delegate, | 2262 net::URLFetcherDelegate* delegate, |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2163 base::FilePath default_file_path(FILE_PATH_LITERAL("/foo/bar/test.crx")); | 2298 base::FilePath default_file_path(FILE_PATH_LITERAL("/foo/bar/test.crx")); |
| 2164 std::vector<base::FilePath::StringType> alternate_extensions{ | 2299 std::vector<base::FilePath::StringType> alternate_extensions{ |
| 2165 FILE_PATH_LITERAL(".txt"), FILE_PATH_LITERAL(".abc"), | 2300 FILE_PATH_LITERAL(".txt"), FILE_PATH_LITERAL(".abc"), |
| 2166 FILE_PATH_LITERAL(""), FILE_PATH_LITERAL(".sdF")}; | 2301 FILE_PATH_LITERAL(""), FILE_PATH_LITERAL(".sdF")}; |
| 2167 EXPECT_CALL(*sb_service_->mock_database_manager(), | 2302 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 2168 MatchDownloadWhitelistUrl(_)) | 2303 MatchDownloadWhitelistUrl(_)) |
| 2169 .WillRepeatedly(Return(false)); | 2304 .WillRepeatedly(Return(false)); |
| 2170 PrepareResponse(&factory, ClientDownloadResponse::SAFE, net::HTTP_OK, | 2305 PrepareResponse(&factory, ClientDownloadResponse::SAFE, net::HTTP_OK, |
| 2171 net::URLRequestStatus::SUCCESS); | 2306 net::URLRequestStatus::SUCCESS); |
| 2172 const GURL kRequestorUrl("http://example.com/foo"); | 2307 const GURL kRequestorUrl("http://example.com/foo"); |
| 2308 SetExtendedReportingPreference(false); |
| 2309 RunLoop run_loop; |
| 2173 download_service_->CheckPPAPIDownloadRequest( | 2310 download_service_->CheckPPAPIDownloadRequest( |
| 2174 kRequestorUrl, default_file_path, alternate_extensions, | 2311 kRequestorUrl, default_file_path, alternate_extensions, profile_.get(), |
| 2175 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 2312 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 2176 base::Unretained(this))); | 2313 base::Unretained(this), run_loop.QuitClosure())); |
| 2177 base::RunLoop().Run(); | 2314 run_loop.Run(); |
| 2178 | 2315 |
| 2179 ASSERT_FALSE(upload_data.empty()); | 2316 ASSERT_FALSE(upload_data.empty()); |
| 2180 | 2317 |
| 2181 ClientDownloadRequest request; | 2318 ClientDownloadRequest request; |
| 2182 ASSERT_TRUE(request.ParseFromString(upload_data)); | 2319 ASSERT_TRUE(request.ParseFromString(upload_data)); |
| 2183 | 2320 |
| 2184 EXPECT_EQ(ClientDownloadRequest::PPAPI_SAVE_REQUEST, request.download_type()); | 2321 EXPECT_EQ(ClientDownloadRequest::PPAPI_SAVE_REQUEST, request.download_type()); |
| 2185 EXPECT_EQ(kRequestorUrl.spec(), request.url()); | 2322 EXPECT_EQ(kRequestorUrl.spec(), request.url()); |
| 2186 EXPECT_EQ("test.crx", request.file_basename()); | 2323 EXPECT_EQ("test.crx", request.file_basename()); |
| 2187 ASSERT_EQ(3, request.alternate_extensions_size()); | 2324 ASSERT_EQ(3, request.alternate_extensions_size()); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2226 FILE_PATH_LITERAL("a.exe")); // final_path | 2363 FILE_PATH_LITERAL("a.exe")); // final_path |
| 2227 EXPECT_CALL(item, GetHash()).WillRepeatedly(ReturnRef(blacklisted_hash_)); | 2364 EXPECT_CALL(item, GetHash()).WillRepeatedly(ReturnRef(blacklisted_hash_)); |
| 2228 EXPECT_CALL(*sb_service_->mock_database_manager(), | 2365 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 2229 MatchDownloadWhitelistUrl(_)) | 2366 MatchDownloadWhitelistUrl(_)) |
| 2230 .WillRepeatedly(Return(false)); | 2367 .WillRepeatedly(Return(false)); |
| 2231 EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)); | 2368 EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)); |
| 2232 EXPECT_CALL(*binary_feature_extractor_.get(), | 2369 EXPECT_CALL(*binary_feature_extractor_.get(), |
| 2233 ExtractImageFeatures( | 2370 ExtractImageFeatures( |
| 2234 tmp_path_, BinaryFeatureExtractor::kDefaultOptions, _, _)); | 2371 tmp_path_, BinaryFeatureExtractor::kDefaultOptions, _, _)); |
| 2235 | 2372 |
| 2373 RunLoop run_loop; |
| 2236 download_service_->CheckClientDownload( | 2374 download_service_->CheckClientDownload( |
| 2237 &item, | 2375 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 2238 base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 2376 base::Unretained(this), run_loop.QuitClosure())); |
| 2239 base::Unretained(this))); | 2377 run_loop.Run(); |
| 2240 base::RunLoop().Run(); | |
| 2241 | 2378 |
| 2242 EXPECT_FALSE(HasClientDownloadRequest()); | 2379 EXPECT_FALSE(HasClientDownloadRequest()); |
| 2243 // Overriden by flag: | 2380 // Overriden by flag: |
| 2244 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); | 2381 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); |
| 2245 } | 2382 } |
| 2246 | 2383 |
| 2247 // Test a real .zip with a real .exe in it, where the .exe is manually | 2384 // Test a real .zip with a real .exe in it, where the .exe is manually |
| 2248 // blacklisted by hash. | 2385 // blacklisted by hash. |
| 2249 TEST_F(DownloadProtectionServiceFlagTest, | 2386 TEST_F(DownloadProtectionServiceFlagTest, |
| 2250 CheckClientDownloadZipOverridenByFlag) { | 2387 CheckClientDownloadZipOverridenByFlag) { |
| 2251 content::MockDownloadItem item; | 2388 content::MockDownloadItem item; |
| 2252 | 2389 |
| 2253 PrepareBasicDownloadItemWithFullPaths( | 2390 PrepareBasicDownloadItemWithFullPaths( |
| 2254 &item, {"http://www.evil.com/a.exe"}, // url_chain | 2391 &item, {"http://www.evil.com/a.exe"}, // url_chain |
| 2255 "http://www.google.com/", // referrer | 2392 "http://www.google.com/", // referrer |
| 2256 testdata_path_.AppendASCII( | 2393 testdata_path_.AppendASCII( |
| 2257 "zipfile_one_unsigned_binary.zip"), // tmp_path | 2394 "zipfile_one_unsigned_binary.zip"), // tmp_path |
| 2258 temp_dir_.path().Append(FILE_PATH_LITERAL("a.zip"))); // final_path | 2395 temp_dir_.path().Append(FILE_PATH_LITERAL("a.zip"))); // final_path |
| 2259 | 2396 |
| 2260 EXPECT_CALL(*sb_service_->mock_database_manager(), | 2397 EXPECT_CALL(*sb_service_->mock_database_manager(), |
| 2261 MatchDownloadWhitelistUrl(_)) | 2398 MatchDownloadWhitelistUrl(_)) |
| 2262 .WillRepeatedly(Return(false)); | 2399 .WillRepeatedly(Return(false)); |
| 2263 | 2400 |
| 2401 RunLoop run_loop; |
| 2264 download_service_->CheckClientDownload( | 2402 download_service_->CheckClientDownload( |
| 2265 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, | 2403 &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, |
| 2266 base::Unretained(this))); | 2404 base::Unretained(this), run_loop.QuitClosure())); |
| 2267 base::RunLoop().Run(); | 2405 run_loop.Run(); |
| 2268 | 2406 |
| 2269 EXPECT_FALSE(HasClientDownloadRequest()); | 2407 EXPECT_FALSE(HasClientDownloadRequest()); |
| 2270 // Overriden by flag: | 2408 // Overriden by flag: |
| 2271 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); | 2409 EXPECT_TRUE(IsResult(DownloadProtectionService::DANGEROUS)); |
| 2272 } | 2410 } |
| 2273 | 2411 |
| 2274 } // namespace safe_browsing | 2412 } // namespace safe_browsing |
| OLD | NEW |