15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test creates a safebrowsing service using test safebrowsing database 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and a test protocol manager. It is used to test logics in safebrowsing 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// service. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/command_line.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/metrics/field_trial.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/thread_test_helper.h" 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/profiles/startup_task_runner_service.h" 281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/profiles/startup_task_runner_service_factory.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/client_side_detection_service.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/safe_browsing/database_manager.h" 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/safe_browsing/metadata.pb.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/protocol_manager.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_database.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_service.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_util.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/safe_browsing/ui_manager.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_store.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/connection.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/statement.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS) 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chromeos/chromeos_switches.h" 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::InterstitialPage; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Mock; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrictMock; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InvokeFullHashCallback( 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingProtocolManager::FullHashCallback callback, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<SBFullHashResult>& result) { 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(result, base::TimeDelta::FromMinutes(45)); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass FakeSafeBrowsingService : public SafeBrowsingService { 70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public: 71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch explicit FakeSafeBrowsingService(const std::string& url_prefix) 72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch : url_prefix_(url_prefix) {} 73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual SafeBrowsingProtocolConfig GetProtocolConfig() const OVERRIDE { 75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SafeBrowsingProtocolConfig config; 76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch config.url_prefix = url_prefix_; 77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Makes sure the auto update is not triggered. The tests will force the 78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // update when needed. 79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch config.disable_auto_update = true; 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_ANDROID) 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch config.disable_connection_check = true; 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch config.client_name = "browser_tests"; 84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return config; 85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch private: 88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual ~FakeSafeBrowsingService() {} 89a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch std::string url_prefix_; 91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DISALLOW_COPY_AND_ASSIGN(FakeSafeBrowsingService); 93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}; 94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Factory that creates FakeSafeBrowsingService instances. 96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass TestSafeBrowsingServiceFactory : public SafeBrowsingServiceFactory { 97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public: 98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch explicit TestSafeBrowsingServiceFactory(const std::string& url_prefix) 99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch : url_prefix_(url_prefix) {} 100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 101a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual SafeBrowsingService* CreateSafeBrowsingService() OVERRIDE { 102a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return new FakeSafeBrowsingService(url_prefix_); 103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 104a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch private: 106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch std::string url_prefix_; 107a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A SafeBrowingDatabase class that allows us to inject the malicious URLs. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSafeBrowsingDatabase : public SafeBrowsingDatabase { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestSafeBrowsingDatabase() {} 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestSafeBrowsingDatabase() {} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initializes the database with the given filename. 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Init(const base::FilePath& filename) OVERRIDE {} 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deletes the current database and creates a new one. 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool ResetDatabase() OVERRIDE { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) badurls_.clear(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called on the IO thread to check if the given URL is safe or not. If we 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can synchronously determine that the URL is safe, CheckUrl returns true, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // otherwise it returns false. 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool ContainsBrowseUrl( 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& url, 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<SBPrefix>* prefix_hits, 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<SBFullHashResult>* cache_hits) OVERRIDE { 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cache_hits->clear(); 1330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return ContainsUrl(safe_browsing_util::MALWARE, 1340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch safe_browsing_util::PHISH, 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<GURL>(1, url), 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) prefix_hits); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool ContainsDownloadUrl( 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<GURL>& urls, 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<SBPrefix>* prefix_hits) OVERRIDE { 1410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool found = ContainsUrl(safe_browsing_util::BINURL, 1420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch safe_browsing_util::BINURL, 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) urls, 144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) prefix_hits); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!found) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LE(1U, prefix_hits->size()); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool ContainsCsdWhitelistedUrl(const GURL& url) OVERRIDE { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool ContainsDownloadWhitelistedString( 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& str) OVERRIDE { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool ContainsDownloadWhitelistedUrl(const GURL& url) OVERRIDE { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool ContainsExtensionPrefixes( 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<SBPrefix>& prefixes, 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<SBPrefix>* prefix_hits) OVERRIDE { 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool ContainsSideEffectFreeWhitelistUrl(const GURL& url) OVERRIDE { 16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return true; 16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 1680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) virtual bool ContainsMalwareIP(const std::string& ip_address) OVERRIDE { 1690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return true; 1700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool UpdateStarted(std::vector<SBListChunkRanges>* lists) OVERRIDE { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << "Not implemented."; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void InsertChunks( 176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& list_name, 177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::vector<SBChunkData*>& chunks) OVERRIDE { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << "Not implemented."; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DeleteChunks( 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<SBChunkDelete>& chunk_deletes) OVERRIDE { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << "Not implemented."; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void UpdateFinished(bool update_succeeded) OVERRIDE { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << "Not implemented."; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void CacheHashResults( 188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::vector<SBPrefix>& prefixes, 189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::vector<SBFullHashResult>& cache_hits, 190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::TimeDelta& cache_lifetime) OVERRIDE { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do nothing for the cache. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch virtual bool IsMalwareIPMatchKillSwitchOn() OVERRIDE { 19458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch return false; 19558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch } 196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool IsCsdWhitelistKillSwitchOn() OVERRIDE { 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fill up the database with test URL. 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddUrl(const GURL& url, 2020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int list_id, 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::vector<SBPrefix>& prefix_hits) { 2040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch badurls_[url.spec()].list_id = list_id; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) badurls_[url.spec()].prefix_hits = prefix_hits; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fill up the database with test hash digest. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddDownloadPrefix(SBPrefix prefix) { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_digest_prefix_.insert(prefix); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Hits { 2150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int list_id; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<SBPrefix> prefix_hits; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool ContainsUrl(int list_id0, 2200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int list_id1, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<GURL>& urls, 222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<SBPrefix>* prefix_hits) { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool hit = false; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < urls.size(); ++i) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url = urls[i]; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::hash_map<std::string, Hits>::const_iterator 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) badurls_it = badurls_.find(url.spec()); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (badurls_it == badurls_.end()) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (badurls_it->second.list_id == list_id0 || 2330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch badurls_it->second.list_id == list_id1) { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefix_hits->insert(prefix_hits->end(), 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) badurls_it->second.prefix_hits.begin(), 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) badurls_it->second.prefix_hits.end()); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hit = true; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hit; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::hash_map<std::string, Hits> badurls_; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::hash_set<SBPrefix> download_digest_prefix_; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Factory that creates TestSafeBrowsingDatabase instances. 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSafeBrowsingDatabaseFactory : public SafeBrowsingDatabaseFactory { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestSafeBrowsingDatabaseFactory() : db_(NULL) {} 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestSafeBrowsingDatabaseFactory() {} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SafeBrowsingDatabase* CreateSafeBrowsingDatabase( 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool enable_download_protection, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool enable_client_side_whitelist, 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool enable_download_whitelist, 25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool enable_extension_blacklist, 2580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) bool enable_side_effect_free_whitelist, 2590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) bool enable_ip_blacklist) OVERRIDE { 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_ = new TestSafeBrowsingDatabase(); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return db_; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestSafeBrowsingDatabase* GetDb() { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return db_; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Owned by the SafebrowsingService. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestSafeBrowsingDatabase* db_; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A TestProtocolManager that could return fixed responses from 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// safebrowsing server for testing purpose. 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestProtocolManager : public SafeBrowsingProtocolManager { 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestProtocolManager(SafeBrowsingProtocolManagerDelegate* delegate, 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequestContextGetter* request_context_getter, 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SafeBrowsingProtocolConfig& config) 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : SafeBrowsingProtocolManager(delegate, request_context_getter, config) { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) create_count_++; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~TestProtocolManager() { 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete_count_++; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This function is called when there is a prefix hit in local safebrowsing 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // database and safebrowsing service issues a get hash request to backends. 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We return a result from the prefilled full_hashes_ hash_map to simulate 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // server's response. At the same time, latency is added to simulate real 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // life network issues. 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetFullHash( 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<SBPrefix>& prefixes, 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingProtocolManager::FullHashCallback callback, 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_download) OVERRIDE { 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostDelayedTask( 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(InvokeFullHashCallback, callback, full_hashes_), 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delay_); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prepare the GetFullHash results for the next request. 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetGetFullHashResponse(const SBFullHashResult& full_hash_result) { 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) full_hashes_.clear(); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) full_hashes_.push_back(full_hash_result); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void IntroduceDelay(const base::TimeDelta& delay) { 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delay_ = delay; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int create_count() { 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return create_count_; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int delete_count() { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delete_count_; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<SBFullHashResult> full_hashes_; 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta delay_; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int create_count_; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int delete_count_; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int TestProtocolManager::create_count_ = 0; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int TestProtocolManager::delete_count_ = 0; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Factory that creates TestProtocolManager instances. 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSBProtocolManagerFactory : public SBProtocolManagerFactory { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestSBProtocolManagerFactory() : pm_(NULL) {} 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestSBProtocolManagerFactory() {} 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SafeBrowsingProtocolManager* CreateProtocolManager( 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingProtocolManagerDelegate* delegate, 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequestContextGetter* request_context_getter, 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SafeBrowsingProtocolConfig& config) OVERRIDE { 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pm_ = new TestProtocolManager(delegate, request_context_getter, config); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pm_; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestProtocolManager* GetProtocolManager() { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pm_; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Owned by the SafebrowsingService. 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestProtocolManager* pm_; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockObserver : public SafeBrowsingUIManager::Observer { 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockObserver() {} 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockObserver() {} 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(OnSafeBrowsingHit, 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void(const SafeBrowsingUIManager::UnsafeResource&)); 360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MOCK_METHOD1(OnSafeBrowsingMatch, 361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void(const SafeBrowsingUIManager::UnsafeResource&)); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P(IsUnsafeResourceFor, url, "") { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (arg.url.spec() == url.spec() && 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg.threat_type != SB_THREAT_TYPE_SAFE); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 369a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} // namespace 370a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests the safe browsing blocking page in a browser. 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SafeBrowsingServiceTest : public InProcessBrowserTest { 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingServiceTest() { 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void GenUrlFullhashResult(const GURL& url, 3780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int list_id, 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SBFullHashResult* full_hash) { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string host; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string path; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_browsing_util::CanonicalizeUrl(url, &host, &path, NULL); 383a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) full_hash->hash = SBFullHashForString(host + path); 3840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch full_hash->list_id = list_id; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InProcessBrowserTest::SetUp() instantiates SafebrowsingService and 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RegisterFactory has to be called before SafeBrowsingService is created. 390a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch sb_factory_.reset(new TestSafeBrowsingServiceFactory( 391a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "https://definatelynotarealdomain/safebrowsing")); 392a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SafeBrowsingService::RegisterFactory(sb_factory_.get()); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingDatabase::RegisterFactory(&db_factory_); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingProtocolManager::RegisterFactory(&pm_factory_); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InProcessBrowserTest::SetUp(); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InProcessBrowserTest::TearDown(); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unregister test factories after InProcessBrowserTest::TearDown 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (which destructs SafeBrowsingService). 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingDatabase::RegisterFactory(NULL); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingProtocolManager::RegisterFactory(NULL); 405a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SafeBrowsingService::RegisterFactory(NULL); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 408cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 409cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Makes sure the auto update is not triggered during the test. 410cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This test will fill up the database using testing prefixes 411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // and urls. 412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) command_line->AppendSwitch(switches::kSbDisableAutoUpdate); 413cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS) 414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) command_line->AppendSwitch( 415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) chromeos::switches::kIgnoreUserProfileMappingForTests); 416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 418cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpInProcessBrowserTestFixture() { 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This will setup the "url" prefix in database and prepare protocol manager 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to response with |full_hash| for get full hash request. 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetupResponseForUrl(const GURL& url, const SBFullHashResult& full_hash) { 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<SBPrefix> prefix_hits; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefix_hits.push_back(full_hash.hash.prefix); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the full hits is empty unless we need to test the 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // full hash is hit in database's local cache. 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestSafeBrowsingDatabase* db = db_factory_.GetDb(); 432cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) db->AddUrl(url, full_hash.list_id, prefix_hits); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestProtocolManager* pm = pm_factory_.GetProtocolManager(); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pm->SetGetFullHashResponse(full_hash); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ShowingInterstitialPage() { 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* contents = 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InterstitialPage* interstitial_page = contents->GetInterstitialPage(); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return interstitial_page != NULL; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void IntroduceGetHashDelay(const base::TimeDelta& delay) { 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pm_factory_.GetProtocolManager()->IntroduceDelay(delay); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta GetCheckTimeout(SafeBrowsingService* sb_service) { 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return sb_service->database_manager()->check_timeout_; 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetCheckTimeout(SafeBrowsingService* sb_service, 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::TimeDelta& delay) { 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sb_service->database_manager()->check_timeout_ = delay; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateCSDService() { 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_browsing::ClientSideDetectionService* csd_service = 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_browsing::ClientSideDetectionService::Create(NULL); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingService* sb_service = 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_browser_process->safe_browsing_service(); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sb_service->csd_service_.reset(csd_service); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sb_service->RefreshState(); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void ProceedAndWhitelist( 468a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const SafeBrowsingUIManager::UnsafeResource& resource) { 469a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<SafeBrowsingUIManager::UnsafeResource> resources; 470a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) resources.push_back(resource); 471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) BrowserThread::PostTask( 472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 473a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&SafeBrowsingUIManager::OnBlockingPageDone, 474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) g_browser_process->safe_browsing_service()->ui_manager(), 475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) resources, true)); 476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WaitForIOThread(); 477a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 478a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrictMock<MockObserver> observer_; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Temporary profile dir for test cases that create a second profile. This is 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // owned by the SafeBrowsingServiceTest object so that it will not get 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destructed until after the test Browser has been torn down, since the 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ImportantFileWriter may still be modifying it after the Profile object has 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // been destroyed. 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_profile_dir_; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Waits for pending tasks on the IO thread to complete. This is useful 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to wait for the SafeBrowsingService to finish loading/stopping. 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForIOThread() { 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::ThreadTestHelper> io_helper(new base::ThreadTestHelper( 4937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO).get())); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(io_helper->Run()); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 498a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch scoped_ptr<TestSafeBrowsingServiceFactory> sb_factory_; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestSafeBrowsingDatabaseFactory db_factory_; 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestSBProtocolManagerFactory pm_factory_; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SafeBrowsingServiceTest); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccienum MalwareMetadataTestType { 5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci METADATA_NONE, 5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci METADATA_LANDING, 5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci METADATA_DISTRIBUTION, 5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass SafeBrowsingServiceMetadataTest 5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : public SafeBrowsingServiceTest, 5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public ::testing::WithParamInterface<MalwareMetadataTestType> { 5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SafeBrowsingServiceMetadataTest() {} 5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void SetUpOnMainThread() OVERRIDE { 5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SafeBrowsingServiceTest::SetUpOnMainThread(); 5191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci g_browser_process->safe_browsing_service()->ui_manager()->AddObserver( 5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &observer_); 5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void TearDownOnMainThread() OVERRIDE { 5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci g_browser_process->safe_browsing_service()->ui_manager()->RemoveObserver( 5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &observer_); 5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SafeBrowsingServiceTest::TearDownOnMainThread(); 5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void GenUrlFullhashResultWithMetadata(const GURL& url, 5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SBFullHashResult* full_hash) { 5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GenUrlFullhashResult(url, safe_browsing_util::MALWARE, full_hash); 5321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci safe_browsing::MalwarePatternType proto; 5341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (GetParam()) { 5351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case METADATA_NONE: 5361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci full_hash->metadata = std::string(); 5371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 5381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case METADATA_LANDING: 5391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci proto.set_pattern_type(safe_browsing::MalwarePatternType::LANDING); 5401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci full_hash->metadata = proto.SerializeAsString(); 5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 5421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case METADATA_DISTRIBUTION: 5431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci proto.set_pattern_type(safe_browsing::MalwarePatternType::DISTRIBUTION); 5441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci full_hash->metadata = proto.SerializeAsString(); 5451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 5461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 5471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 5481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 5501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(SafeBrowsingServiceMetadataTest); 5511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 5521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kEmptyPage[] = "files/empty.html"; 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMalwareFile[] = "files/downloads/dangerous/dangerous.exe"; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMalwarePage[] = "files/safe_browsing/malware.html"; 5581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kMalwareIFrame[] = "files/safe_browsing/malware_iframe.html"; 5591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kMalwareImg[] = "files/safe_browsing/malware_image.png"; 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test goes through DownloadResourceHandler. 5621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_P(SafeBrowsingServiceMetadataTest, MalwareMainFrame) { 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL(kEmptyPage); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After adding the url to safebrowsing database and getfullhash result, 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we should see the interstitial page. 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SBFullHashResult malware_full_hash; 5681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GenUrlFullhashResultWithMetadata(url, &malware_full_hash); 569a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_CALL(observer_, 570a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) OnSafeBrowsingMatch(IsUnsafeResourceFor(url))).Times(1); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(observer_, OnSafeBrowsingHit(IsUnsafeResourceFor(url))).Times(1); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetupResponseForUrl(url, malware_full_hash); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url); 5741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // All types should show the interstitial. 5751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(ShowingInterstitialPage()); 5761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 5771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_P(SafeBrowsingServiceMetadataTest, MalwareIFrame) { 5791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL main_url = test_server()->GetURL(kMalwarePage); 5801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL iframe_url = test_server()->GetURL(kMalwareIFrame); 5811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Add the iframe url as malware and then load the parent page. 5831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SBFullHashResult malware_full_hash; 5841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GenUrlFullhashResultWithMetadata(iframe_url, &malware_full_hash); 5851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(observer_, OnSafeBrowsingMatch(IsUnsafeResourceFor(iframe_url))) 5861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .Times(1); 5871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(observer_, OnSafeBrowsingHit(IsUnsafeResourceFor(iframe_url))) 5881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .Times(1); 5891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetupResponseForUrl(iframe_url, malware_full_hash); 5901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui_test_utils::NavigateToURL(browser(), main_url); 5911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // All types should show the interstitial. 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ShowingInterstitialPage()); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_P(SafeBrowsingServiceMetadataTest, MalwareImg) { 5961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL main_url = test_server()->GetURL(kMalwarePage); 5971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL img_url = test_server()->GetURL(kMalwareImg); 5981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Add the img url as malware and then load the parent page. 6001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SBFullHashResult malware_full_hash; 6011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GenUrlFullhashResultWithMetadata(img_url, &malware_full_hash); 6021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (GetParam()) { 6031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case METADATA_NONE: 6041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case METADATA_DISTRIBUTION: 6051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(observer_, OnSafeBrowsingMatch(IsUnsafeResourceFor(img_url))) 6061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .Times(1); 6071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(observer_, OnSafeBrowsingHit(IsUnsafeResourceFor(img_url))) 6081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .Times(1); 6091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 6101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case METADATA_LANDING: 6111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // No interstitial shown, so no notifications expected. 6121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 6131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 6141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetupResponseForUrl(img_url, malware_full_hash); 6151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui_test_utils::NavigateToURL(browser(), main_url); 6161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Subresource which is tagged as a landing page should not show an 6171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // interstitial, the other types should. 6181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (GetParam()) { 6191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case METADATA_NONE: 6201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case METADATA_DISTRIBUTION: 6211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(ShowingInterstitialPage()); 6221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 6231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case METADATA_LANDING: 6241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(ShowingInterstitialPage()); 6251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 6261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 6271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 6281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciINSTANTIATE_TEST_CASE_P(MaybeSetMetadata, 6301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SafeBrowsingServiceMetadataTest, 6311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci testing::Values(METADATA_NONE, 6321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci METADATA_LANDING, 6331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci METADATA_DISTRIBUTION)); 6341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 635a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SafeBrowsingServiceTest, DISABLED_MalwareWithWhitelist) { 636a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GURL url = test_server()->GetURL(kEmptyPage); 637a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) g_browser_process->safe_browsing_service()-> 638a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui_manager()->AddObserver(&observer_); 639a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 640a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // After adding the url to safebrowsing database and getfullhash result, 641a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // we should see the interstitial page. 642a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SBFullHashResult malware_full_hash; 6430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GenUrlFullhashResult(url, safe_browsing_util::MALWARE, &malware_full_hash); 644a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_CALL(observer_, 645a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) OnSafeBrowsingMatch(IsUnsafeResourceFor(url))).Times(1); 646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_CALL(observer_, OnSafeBrowsingHit(IsUnsafeResourceFor(url))).Times(1) 647a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) .WillOnce(testing::Invoke( 648a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) this, &SafeBrowsingServiceTest::ProceedAndWhitelist)); 649a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetupResponseForUrl(url, malware_full_hash); 650a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 651a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url); 652a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Mock calls OnBlockingPageDone set to proceed, so the interstitial 653a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // is removed. 654a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(ShowingInterstitialPage()); 655a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 656a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 657a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Navigate back to kEmptyPage -- should hit the whitelist, and send a match 658a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // call, but no hit call. 659a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_CALL(observer_, 660a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) OnSafeBrowsingMatch(IsUnsafeResourceFor(url))).Times(1); 661a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_CALL(observer_, OnSafeBrowsingHit(IsUnsafeResourceFor(url))).Times(0); 662a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url); 663a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(ShowingInterstitialPage()); 664a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 665a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) g_browser_process->safe_browsing_service()-> 666a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui_manager()->RemoveObserver(&observer_); 667a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 668a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPrefetchMalwarePage[] = "files/safe_browsing/prefetch_malware.html"; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test confirms that prefetches don't themselves get the 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interstitial treatment. 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SafeBrowsingServiceTest, Prefetch) { 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL(kPrefetchMalwarePage); 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL malware_url = test_server()->GetURL(kMalwarePage); 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_browser_process->safe_browsing_service()-> 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_manager()->AddObserver(&observer_); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class SetPrefetchForTest { 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit SetPrefetchForTest(bool prefetch) 6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : old_prerender_mode_(prerender::PrerenderManager::GetMode()) { 6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string exp_group = prefetch ? "ExperimentYes" : "ExperimentNo"; 6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FieldTrialList::CreateFieldTrial("Prefetch", exp_group); 6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender::PrerenderManager::SetMode( 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender::PrerenderManager::PRERENDER_MODE_DISABLED); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~SetPrefetchForTest() { 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender::PrerenderManager::SetMode(old_prerender_mode_); 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender::PrerenderManager::PrerenderManagerMode old_prerender_mode_; 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } set_prefetch_for_test(true); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Even though we have added this uri to the safebrowsing database and 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // getfullhash result, we should not see the interstitial page since the 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // only malware was a prefetch target. 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SBFullHashResult malware_full_hash; 7020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GenUrlFullhashResult(malware_url, safe_browsing_util::MALWARE, 7030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch &malware_full_hash); 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetupResponseForUrl(malware_url, malware_full_hash); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url); 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ShowingInterstitialPage()); 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mock::VerifyAndClear(&observer_); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // However, when we navigate to the malware page, we should still get 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the interstitial. 711a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_CALL(observer_, OnSafeBrowsingMatch(IsUnsafeResourceFor(malware_url))) 712a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) .Times(1); 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(observer_, OnSafeBrowsingHit(IsUnsafeResourceFor(malware_url))) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), malware_url); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ShowingInterstitialPage()); 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mock::VerifyAndClear(&observer_); 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_browser_process->safe_browsing_service()-> 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_manager()->RemoveObserver(&observer_); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSBClient 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public base::RefCountedThreadSafe<TestSBClient>, 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public SafeBrowsingDatabaseManager::Client { 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestSBClient() 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : threat_type_(SB_THREAT_TYPE_SAFE), 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_browsing_service_(g_browser_process->safe_browsing_service()) { 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SBThreatType GetThreatType() const { 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return threat_type_; 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckDownloadUrl(const std::vector<GURL>& url_chain) { 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TestSBClient::CheckDownloadUrlOnIOThread, 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, url_chain)); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); // Will stop in OnCheckDownloadUrlResult. 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCountedThreadSafe<TestSBClient>; 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestSBClient() {} 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckDownloadUrlOnIOThread(const std::vector<GURL>& url_chain) { 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) safe_browsing_service_->database_manager()-> 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckDownloadUrl(url_chain, this); 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the result of checking a download URL is known. 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnCheckDownloadUrlResult(const std::vector<GURL>& url_chain, 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SBThreatType threat_type) OVERRIDE { 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) threat_type_ = threat_type; 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TestSBClient::DownloadCheckDone, this)); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DownloadCheckDone() { 76390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI::current()->Quit(); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SBThreatType threat_type_; 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingService* safe_browsing_service_; 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestSBClient); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These tests use SafeBrowsingService::Client to directly interact with 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SafeBrowsingService. 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SafeBrowsingServiceTest, CheckDownloadUrl) { 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL badbin_url = test_server()->GetURL(kMalwareFile); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> badbin_urls(1, badbin_url); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<TestSBClient> client(new TestSBClient); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client->CheckDownloadUrl(badbin_urls); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since badbin_url is not in database, it is considered to be safe. 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SB_THREAT_TYPE_SAFE, client->GetThreatType()); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SBFullHashResult full_hash_result; 7870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GenUrlFullhashResult(badbin_url, safe_browsing_util::BINURL, 7880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch &full_hash_result); 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetupResponseForUrl(badbin_url, full_hash_result); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client->CheckDownloadUrl(badbin_urls); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now, the badbin_url is not safe since it is added to download database. 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SB_THREAT_TYPE_BINARY_MALWARE_URL, client->GetThreatType()); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SafeBrowsingServiceTest, CheckDownloadUrlRedirects) { 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL original_url = test_server()->GetURL(kEmptyPage); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL badbin_url = test_server()->GetURL(kMalwareFile); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL final_url = test_server()->GetURL(kEmptyPage); 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> badbin_urls; 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) badbin_urls.push_back(original_url); 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) badbin_urls.push_back(badbin_url); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) badbin_urls.push_back(final_url); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<TestSBClient> client(new TestSBClient); 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client->CheckDownloadUrl(badbin_urls); 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since badbin_url is not in database, it is considered to be safe. 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SB_THREAT_TYPE_SAFE, client->GetThreatType()); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SBFullHashResult full_hash_result; 8130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GenUrlFullhashResult(badbin_url, safe_browsing_util::BINURL, 8140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch &full_hash_result); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetupResponseForUrl(badbin_url, full_hash_result); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client->CheckDownloadUrl(badbin_urls); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now, the badbin_url is not safe since it is added to download database. 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SB_THREAT_TYPE_BINARY_MALWARE_URL, client->GetThreatType()); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(OS_WIN) 8245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://crbug.com/396409 8255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define MAYBE_CheckDownloadUrlTimedOut DISABLED_CheckDownloadUrlTimedOut 8265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else 8275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define MAYBE_CheckDownloadUrlTimedOut CheckDownloadUrlTimedOut 8285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 8295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SafeBrowsingServiceTest, 8305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MAYBE_CheckDownloadUrlTimedOut) { 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL badbin_url = test_server()->GetURL(kMalwareFile); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> badbin_urls(1, badbin_url); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<TestSBClient> client(new TestSBClient); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SBFullHashResult full_hash_result; 8360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GenUrlFullhashResult(badbin_url, safe_browsing_util::BINURL, 8370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch &full_hash_result); 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetupResponseForUrl(badbin_url, full_hash_result); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client->CheckDownloadUrl(badbin_urls); 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // badbin_url is not safe since it is added to download database. 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SB_THREAT_TYPE_BINARY_MALWARE_URL, client->GetThreatType()); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now introducing delays and we should hit timeout. 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingService* sb_service = g_browser_process->safe_browsing_service(); 848cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeDelta default_urlcheck_timeout = GetCheckTimeout(sb_service); 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IntroduceGetHashDelay(base::TimeDelta::FromSeconds(1)); 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetCheckTimeout(sb_service, base::TimeDelta::FromMilliseconds(1)); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client->CheckDownloadUrl(badbin_urls); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There should be a timeout and the hash would be considered as safe. 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SB_THREAT_TYPE_SAFE, client->GetThreatType()); 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Need to set the timeout back to the default value. 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetCheckTimeout(sb_service, default_urlcheck_timeout); 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SafeBrowsingServiceTest, StartAndStop) { 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateCSDService(); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingService* sb_service = g_browser_process->safe_browsing_service(); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_browsing::ClientSideDetectionService* csd_service = 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sb_service->safe_browsing_detection_service(); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* pref_service = browser()->profile()->GetPrefs(); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(sb_service != NULL); 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(csd_service != NULL); 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(pref_service != NULL); 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pref_service->GetBoolean(prefs::kSafeBrowsingEnabled)); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SBS might still be starting, make sure this doesn't flake. 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForIOThread(); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(sb_service->enabled()); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(csd_service->enabled()); 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a new Profile. SBS should keep running. 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_profile_dir_.CreateUniqueTempDir()); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Profile> profile2(Profile::CreateProfile( 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_profile_dir_.path(), NULL, Profile::CREATE_MODE_SYNCHRONOUS)); 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile2.get() != NULL); 8831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) StartupTaskRunnerServiceFactory::GetForProfile(profile2.get())-> 8841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) StartDeferredTaskRunners(); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* pref_service2 = profile2->GetPrefs(); 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pref_service2->GetBoolean(prefs::kSafeBrowsingEnabled)); 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't expect the state to have changed, but if it did, wait for it. 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForIOThread(); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(sb_service->enabled()); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(csd_service->enabled()); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change one of the prefs. SBS should keep running. 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_service->SetBoolean(prefs::kSafeBrowsingEnabled, false); 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForIOThread(); 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(sb_service->enabled()); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(csd_service->enabled()); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change the other pref. SBS should stop now. 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_service2->SetBoolean(prefs::kSafeBrowsingEnabled, false); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForIOThread(); 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(sb_service->enabled()); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(csd_service->enabled()); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Turn it back on. SBS comes back. 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_service2->SetBoolean(prefs::kSafeBrowsingEnabled, true); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForIOThread(); 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(sb_service->enabled()); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(csd_service->enabled()); 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the Profile. SBS stops again. 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_service2 = NULL; 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile2.reset(); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForIOThread(); 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(sb_service->enabled()); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(csd_service->enabled()); 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SafeBrowsingServiceShutdownTest : public SafeBrowsingServiceTest { 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Browser should be fully torn down by now, so we can safely check these 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // counters. 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, TestProtocolManager::create_count()); 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, TestProtocolManager::delete_count()); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingServiceTest::TearDown(); 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An observer that returns back to test code after a new profile is 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initialized. 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnUnblockOnProfileCreation(Profile* profile, 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::CreateStatus status) { 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (status == Profile::CREATE_STATUS_INITIALIZED) { 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile2_ = profile; 93790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile2_; 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SafeBrowsingServiceShutdownTest, 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DontStartAfterShutdown) { 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateCSDService(); 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingService* sb_service = g_browser_process->safe_browsing_service(); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_browsing::ClientSideDetectionService* csd_service = 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sb_service->safe_browsing_detection_service(); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* pref_service = browser()->profile()->GetPrefs(); 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(sb_service != NULL); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(csd_service != NULL); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(pref_service != NULL); 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pref_service->GetBoolean(prefs::kSafeBrowsingEnabled)); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SBS might still be starting, make sure this doesn't flake. 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForIOThread(); 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, TestProtocolManager::create_count()); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, TestProtocolManager::delete_count()); 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create an additional profile. We need to use the ProfileManager so that 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the profile will get destroyed in the normal browser shutdown process. 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* profile_manager = g_browser_process->profile_manager(); 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_profile_dir_.CreateUniqueTempDir()); 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager->CreateProfileAsync( 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_profile_dir_.path(), 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&SafeBrowsingServiceShutdownTest::OnUnblockOnProfileCreation, 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this), 972a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16(), base::string16(), std::string()); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Spin to allow profile creation to take place, loop is terminated 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by OnUnblockOnProfileCreation when the profile is created. 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* pref_service2 = profile2_->GetPrefs(); 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pref_service2->GetBoolean(prefs::kSafeBrowsingEnabled)); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't expect the state to have changed, but if it did, wait for it. 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForIOThread(); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, TestProtocolManager::create_count()); 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, TestProtocolManager::delete_count()); 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // End the test, shutting down the browser. 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SafeBrowsingServiceShutdownTest::TearDown will check the create_count and 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // delete_count again. 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SafeBrowsingDatabaseManagerCookieTest : public InProcessBrowserTest { 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SafeBrowsingDatabaseManagerCookieTest() {} 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void SetUp() OVERRIDE { 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to start the test server to get the host&port in the url. 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Point to the testing server for all SafeBrowsing requests. 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_prefix = test_server()->GetURL( 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "expect-and-set-cookie?expect=a%3db" 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "&set=c%3dd%3b%20Expires=Fri,%2001%20Jan%202038%2001:01:01%20GMT" 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "&data=foo#"); 1004a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch sb_factory_.reset(new TestSafeBrowsingServiceFactory(url_prefix.spec())); 1005a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SafeBrowsingService::RegisterFactory(sb_factory_.get()); 1006a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 1007a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InProcessBrowserTest::SetUp(); 1008a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 1009a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 1010a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void TearDown() OVERRIDE { 1011a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InProcessBrowserTest::TearDown(); 1012a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 1013a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SafeBrowsingService::RegisterFactory(NULL); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool SetUpUserDataDirectory() OVERRIDE { 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath cookie_path( 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SafeBrowsingService::GetCookieFilePathForTesting()); 10197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(base::PathExists(cookie_path)); 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_dir; 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(chrome::DIR_TEST_DATA, &test_dir)) { 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(false); 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize the SafeBrowsing cookies with a pre-created cookie store. It 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // contains a single cookie, for domain 127.0.0.1, with value a=b, and 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expires in 2038. 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath initial_cookies = test_dir.AppendASCII("safe_browsing") 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .AppendASCII("Safe Browsing Cookies"); 10327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::CopyFile(initial_cookies, cookie_path)) { 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(false); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Connection db; 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!db.Open(cookie_path)) { 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(false); 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure the host value in the cookie file matches the test server we will 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be connecting to. 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Statement smt(db.GetUniqueStatement( 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "UPDATE cookies SET host_key = ?")); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!smt.is_valid()) { 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(false); 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!smt.BindString(0, test_server()->host_port_pair().host())) { 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(false); 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!smt.Run()) { 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(false); 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InProcessBrowserTest::SetUpUserDataDirectory(); 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TearDownInProcessBrowserTestFixture() OVERRIDE { 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InProcessBrowserTest::TearDownInProcessBrowserTestFixture(); 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Connection db; 10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath cookie_path( 10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SafeBrowsingService::GetCookieFilePathForTesting()); 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(db.Open(cookie_path)); 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Statement smt(db.GetUniqueStatement( 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "SELECT name, value FROM cookies ORDER BY name")); 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(smt.is_valid()); 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(smt.Step()); 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("a", smt.ColumnString(0)); 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("b", smt.ColumnString(1)); 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(smt.Step()); 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("c", smt.ColumnString(0)); 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("d", smt.ColumnString(1)); 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(smt.Step()); 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sb_service_ = g_browser_process->safe_browsing_service(); 1085868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(sb_service_.get() != NULL); 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void TearDownOnMainThread() OVERRIDE { 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sb_service_ = NULL; 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ForceUpdate() { 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sb_service_->protocol_manager()->ForceScheduleNextUpdate( 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromSeconds(0)); 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<SafeBrowsingService> sb_service_; 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch scoped_ptr<TestSafeBrowsingServiceFactory> sb_factory_; 1101a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SafeBrowsingDatabaseManagerCookieTest); 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that a Safe Browsing database update request both sends cookies and can 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// save cookies. 11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(SafeBrowsingDatabaseManagerCookieTest, 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestSBUpdateCookies) { 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver observer( 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_SAFE_BROWSING_UPDATE_COMPLETE, 11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::Source<SafeBrowsingDatabaseManager>( 1112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) sb_service_->database_manager().get())); 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 1114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) BrowserThread::IO, 1115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FROM_HERE, 11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&SafeBrowsingDatabaseManagerCookieTest::ForceUpdate, this)); 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.Wait(); 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1119