| Index: chrome/browser/safe_browsing/download_protection_service_unittest.cc
|
| diff --git a/chrome/browser/safe_browsing/download_protection_service_unittest.cc b/chrome/browser/safe_browsing/download_protection_service_unittest.cc
|
| index 7da97ec2eecf7f072ee7e5bf655533b2e6ee3195..f54a270502efcb61cadad71db377825bfc1ee498 100644
|
| --- a/chrome/browser/safe_browsing/download_protection_service_unittest.cc
|
| +++ b/chrome/browser/safe_browsing/download_protection_service_unittest.cc
|
| @@ -19,6 +19,7 @@
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/path_service.h"
|
| +#include "base/prefs/pref_service.h"
|
| #include "base/run_loop.h"
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/threading/sequenced_worker_pool.h"
|
| @@ -30,6 +31,7 @@
|
| #include "chrome/browser/safe_browsing/safe_browsing_service.h"
|
| #include "chrome/browser/safe_browsing/test_database_manager.h"
|
| #include "chrome/common/chrome_switches.h"
|
| +#include "chrome/common/pref_names.h"
|
| #include "chrome/common/safe_browsing/binary_feature_extractor.h"
|
| #include "chrome/common/safe_browsing/csd.pb.h"
|
| #include "chrome/test/base/testing_profile.h"
|
| @@ -243,6 +245,12 @@ class DownloadProtectionServiceTest : public testing::Test {
|
| .AppendASCII("data")
|
| .AppendASCII("safe_browsing")
|
| .AppendASCII("download_protection");
|
| +
|
| + // Setup a profile
|
| + ASSERT_TRUE(profile_dir_.CreateUniqueTempDir());
|
| + profile_.reset(new TestingProfile(profile_dir_.path()));
|
| + ASSERT_TRUE(profile_->CreateHistoryService(true /* delete_file */,
|
| + false /* no_db */));
|
| }
|
|
|
| void TearDown() override {
|
| @@ -402,6 +410,11 @@ class DownloadProtectionServiceTest : public testing::Test {
|
| testing::AssertionFailure() << "Expected " << expected <<
|
| ", got " << result_;
|
| }
|
| + // Check scenarios where we should/shouldn't send a report for
|
| + // a corrupted zip.
|
| + void CheckClientDownloadReportCorruptZip(bool is_extended_reporting,
|
| + bool is_incognito);
|
| +
|
|
|
| protected:
|
| scoped_refptr<FakeSafeBrowsingService> sb_service_;
|
| @@ -415,8 +428,91 @@ class DownloadProtectionServiceTest : public testing::Test {
|
| DownloadProtectionService::ClientDownloadRequestSubscription
|
| client_download_request_subscription_;
|
| scoped_ptr<ClientDownloadRequest> last_client_download_request_;
|
| + base::ScopedTempDir profile_dir_;
|
| + scoped_ptr<TestingProfile> profile_;
|
| };
|
|
|
| +
|
| +void DownloadProtectionServiceTest::CheckClientDownloadReportCorruptZip(
|
| + bool is_extended_reporting,
|
| + bool is_incognito) {
|
| + ClientDownloadResponse response;
|
| + response.set_verdict(ClientDownloadResponse::SAFE);
|
| + net::FakeURLFetcherFactory factory(NULL);
|
| + // Empty response means SAFE.
|
| + factory.SetFakeResponse(
|
| + DownloadProtectionService::GetDownloadRequestUrl(),
|
| + response.SerializeAsString(),
|
| + net::HTTP_OK, net::URLRequestStatus::SUCCESS);
|
| +
|
| + base::ScopedTempDir download_dir;
|
| + ASSERT_TRUE(download_dir.CreateUniqueTempDir());
|
| +
|
| + base::FilePath a_tmp(download_dir.path().Append(FILE_PATH_LITERAL("a.tmp")));
|
| + base::FilePath a_zip(FILE_PATH_LITERAL("a.zip"));
|
| + std::vector<GURL> url_chain;
|
| + url_chain.push_back(GURL("http://www.evil.com/a.zip"));
|
| + GURL referrer("http://www.google.com/");
|
| + std::string hash = "hash";
|
| + profile_->GetPrefs()->SetBoolean(prefs::kSafeBrowsingExtendedReportingEnabled,
|
| + is_extended_reporting);
|
| +
|
| + content::MockDownloadItem item;
|
| + EXPECT_CALL(item, GetFullPath()).WillRepeatedly(ReturnRef(a_tmp));
|
| + EXPECT_CALL(item, GetTargetFilePath()).WillRepeatedly(ReturnRef(a_zip));
|
| + EXPECT_CALL(item, GetUrlChain()).WillRepeatedly(ReturnRef(url_chain));
|
| + EXPECT_CALL(item, GetReferrerUrl()).WillRepeatedly(ReturnRef(referrer));
|
| + EXPECT_CALL(item, GetTabUrl()).WillRepeatedly(ReturnRef(GURL::EmptyGURL()));
|
| + EXPECT_CALL(item, GetTabReferrerUrl())
|
| + .WillRepeatedly(ReturnRef(GURL::EmptyGURL()));
|
| + EXPECT_CALL(item, GetHash()).WillRepeatedly(ReturnRef(hash));
|
| + EXPECT_CALL(item, GetReceivedBytes()).WillRepeatedly(Return(100));
|
| + EXPECT_CALL(item, HasUserGesture()).WillRepeatedly(Return(true));
|
| + EXPECT_CALL(item, GetRemoteAddress()).WillRepeatedly(Return(""));
|
| +
|
| + if (is_incognito) {
|
| + EXPECT_CALL(item, GetBrowserContext())
|
| + .WillRepeatedly(Return(profile_->GetOffTheRecordProfile()));
|
| + } else {
|
| + EXPECT_CALL(item, GetBrowserContext())
|
| + .WillRepeatedly(Return(profile_.get()));
|
| + }
|
| +
|
| + std::string file_contents = "corrupt zip file";
|
| + ASSERT_EQ(static_cast<int>(file_contents.size()), base::WriteFile(
|
| + a_tmp, file_contents.data(), file_contents.size()));
|
| +
|
| + download_service_->CheckClientDownload(
|
| + &item,
|
| + base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback,
|
| + base::Unretained(this)));
|
| + MessageLoop::current()->Run();
|
| +
|
| +#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
|
| + const bool expect_request = is_extended_reporting && !is_incognito;
|
| +#else
|
| + // For !(OS_WIN || OS_MACOSX || OS_CHROMEOS),
|
| + // no file types are currently supported.
|
| + const bool expect_request = false;
|
| +#endif
|
| +
|
| + if (expect_request) {
|
| + ASSERT_TRUE(HasClientDownloadRequest());
|
| + EXPECT_EQ(0, GetClientDownloadRequest()->archived_binary_size());
|
| + EXPECT_TRUE(GetClientDownloadRequest()->has_download_type());
|
| + EXPECT_EQ(ClientDownloadRequest_DownloadType_INVALID_ZIP,
|
| + GetClientDownloadRequest()->download_type());
|
| + ClearClientDownloadRequest();
|
| + } else {
|
| + EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN));
|
| + EXPECT_FALSE(HasClientDownloadRequest());
|
| + }
|
| +
|
| + Mock::VerifyAndClearExpectations(sb_service_.get());
|
| + Mock::VerifyAndClearExpectations(binary_feature_extractor_.get());
|
| +}
|
| +
|
| +
|
| TEST_F(DownloadProtectionServiceTest, CheckClientDownloadInvalidUrl) {
|
| base::FilePath a_tmp(FILE_PATH_LITERAL("a.tmp"));
|
| base::FilePath a_exe(FILE_PATH_LITERAL("a.exe"));
|
| @@ -1183,43 +1279,22 @@ TEST_F(DownloadProtectionServiceTest, CheckClientDownloadZip) {
|
| Mock::VerifyAndClearExpectations(binary_feature_extractor_.get());
|
| }
|
|
|
| -TEST_F(DownloadProtectionServiceTest, CheckClientDownloadCorruptZip) {
|
| - base::ScopedTempDir download_dir;
|
| - ASSERT_TRUE(download_dir.CreateUniqueTempDir());
|
| -
|
| - base::FilePath a_tmp(download_dir.path().Append(FILE_PATH_LITERAL("a.tmp")));
|
| - base::FilePath a_zip(FILE_PATH_LITERAL("a.zip"));
|
| - std::vector<GURL> url_chain;
|
| - url_chain.push_back(GURL("http://www.evil.com/a.zip"));
|
| - GURL referrer("http://www.google.com/");
|
| - std::string hash = "hash";
|
| -
|
| - content::MockDownloadItem item;
|
| - EXPECT_CALL(item, GetFullPath()).WillRepeatedly(ReturnRef(a_tmp));
|
| - EXPECT_CALL(item, GetTargetFilePath()).WillRepeatedly(ReturnRef(a_zip));
|
| - EXPECT_CALL(item, GetUrlChain()).WillRepeatedly(ReturnRef(url_chain));
|
| - EXPECT_CALL(item, GetReferrerUrl()).WillRepeatedly(ReturnRef(referrer));
|
| - EXPECT_CALL(item, GetTabUrl()).WillRepeatedly(ReturnRef(GURL::EmptyGURL()));
|
| - EXPECT_CALL(item, GetTabReferrerUrl())
|
| - .WillRepeatedly(ReturnRef(GURL::EmptyGURL()));
|
| - EXPECT_CALL(item, GetHash()).WillRepeatedly(ReturnRef(hash));
|
| - EXPECT_CALL(item, GetReceivedBytes()).WillRepeatedly(Return(100));
|
| - EXPECT_CALL(item, HasUserGesture()).WillRepeatedly(Return(true));
|
| - EXPECT_CALL(item, GetRemoteAddress()).WillRepeatedly(Return(""));
|
| +TEST_F(DownloadProtectionServiceTest,
|
| + CheckClientDownloadReportCorruptZipNormal) {
|
| + // !is_extended_reporting && !is_incognito
|
| + CheckClientDownloadReportCorruptZip(false, false);
|
| +}
|
|
|
| - std::string file_contents = "corrupt zip file";
|
| - ASSERT_EQ(static_cast<int>(file_contents.size()), base::WriteFile(
|
| - a_tmp, file_contents.data(), file_contents.size()));
|
| +TEST_F(DownloadProtectionServiceTest,
|
| + CheckClientDownloadReportCorruptZipExtended) {
|
| + // !is_extended_reporting && !is_incognito
|
| + CheckClientDownloadReportCorruptZip(true, false);
|
| +}
|
|
|
| - download_service_->CheckClientDownload(
|
| - &item,
|
| - base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback,
|
| - base::Unretained(this)));
|
| - MessageLoop::current()->Run();
|
| - EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN));
|
| - EXPECT_FALSE(HasClientDownloadRequest());
|
| - Mock::VerifyAndClearExpectations(sb_service_.get());
|
| - Mock::VerifyAndClearExpectations(binary_feature_extractor_.get());
|
| +TEST_F(DownloadProtectionServiceTest,
|
| + CheckClientDownloadReportCorruptZipIncognito) {
|
| + // is_extended_reporting && is_incognito
|
| + CheckClientDownloadReportCorruptZip(true, true);
|
| }
|
|
|
| TEST_F(DownloadProtectionServiceTest, CheckClientCrxDownloadSuccess) {
|
| @@ -1448,12 +1523,6 @@ TEST_F(DownloadProtectionServiceTest,
|
| CheckClientDownloadValidateRequestTabHistory) {
|
| net::TestURLFetcherFactory factory;
|
|
|
| - base::ScopedTempDir profile_dir;
|
| - ASSERT_TRUE(profile_dir.CreateUniqueTempDir());
|
| - TestingProfile profile(profile_dir.path());
|
| - ASSERT_TRUE(
|
| - profile.CreateHistoryService(true /* delete_file */, false /* no_db */));
|
| -
|
| base::FilePath tmp_path(FILE_PATH_LITERAL("bla.tmp"));
|
| base::FilePath final_path(FILE_PATH_LITERAL("bla.exe"));
|
| std::vector<GURL> url_chain;
|
| @@ -1477,7 +1546,7 @@ TEST_F(DownloadProtectionServiceTest,
|
| EXPECT_CALL(item, GetReceivedBytes()).WillRepeatedly(Return(100));
|
| EXPECT_CALL(item, HasUserGesture()).WillRepeatedly(Return(true));
|
| EXPECT_CALL(item, GetRemoteAddress()).WillRepeatedly(Return(remote_address));
|
| - EXPECT_CALL(item, GetBrowserContext()).WillRepeatedly(Return(&profile));
|
| + EXPECT_CALL(item, GetBrowserContext()).WillRepeatedly(Return(profile_.get()));
|
| EXPECT_CALL(*sb_service_->mock_database_manager(),
|
| MatchDownloadWhitelistUrl(_))
|
| .WillRepeatedly(Return(false));
|
| @@ -1559,7 +1628,7 @@ TEST_F(DownloadProtectionServiceTest,
|
| redirects.push_back(GURL("http://tab.com/ref1"));
|
| redirects.push_back(GURL("http://tab.com/ref2"));
|
| redirects.push_back(tab_url);
|
| - HistoryServiceFactory::GetForProfile(&profile,
|
| + HistoryServiceFactory::GetForProfile(profile_.get(),
|
| ServiceAccessType::EXPLICIT_ACCESS)
|
| ->AddPage(tab_url,
|
| base::Time::Now(),
|
|
|