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