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