| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 // | 4 // |
| 5 // This test uses the safebrowsing test server published at | 5 // This test uses the safebrowsing test server published at |
| 6 // http://code.google.com/p/google-safe-browsing/ to test the safebrowsing | 6 // http://code.google.com/p/google-safe-browsing/ to test the safebrowsing |
| 7 // protocol implemetation. Details of the safebrowsing testing flow is | 7 // protocol implemetation. Details of the safebrowsing testing flow is |
| 8 // documented at | 8 // documented at |
| 9 // http://code.google.com/p/google-safe-browsing/wiki/ProtocolTesting | 9 // http://code.google.com/p/google-safe-browsing/wiki/ProtocolTesting |
| 10 // | 10 // |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 #include "base/test/test_timeouts.h" | 31 #include "base/test/test_timeouts.h" |
| 32 #include "base/threading/platform_thread.h" | 32 #include "base/threading/platform_thread.h" |
| 33 #include "base/threading/thread.h" | 33 #include "base/threading/thread.h" |
| 34 #include "base/time/time.h" | 34 #include "base/time/time.h" |
| 35 #include "chrome/browser/browser_process.h" | 35 #include "chrome/browser/browser_process.h" |
| 36 #include "chrome/browser/chrome_notification_types.h" | 36 #include "chrome/browser/chrome_notification_types.h" |
| 37 #include "chrome/browser/profiles/profile.h" | 37 #include "chrome/browser/profiles/profile.h" |
| 38 #include "chrome/browser/safe_browsing/local_database_manager.h" | 38 #include "chrome/browser/safe_browsing/local_database_manager.h" |
| 39 #include "chrome/browser/safe_browsing/local_safebrowsing_test_server.h" | 39 #include "chrome/browser/safe_browsing/local_safebrowsing_test_server.h" |
| 40 #include "chrome/browser/safe_browsing/protocol_manager.h" | 40 #include "chrome/browser/safe_browsing/protocol_manager.h" |
| 41 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | 41 #include "chrome/browser/safe_browsing/test_safe_browsing_service.h" |
| 42 #include "chrome/browser/ui/browser.h" | 42 #include "chrome/browser/ui/browser.h" |
| 43 #include "chrome/common/chrome_switches.h" | 43 #include "chrome/common/chrome_switches.h" |
| 44 #include "chrome/common/url_constants.h" | 44 #include "chrome/common/url_constants.h" |
| 45 #include "chrome/test/base/in_process_browser_test.h" | 45 #include "chrome/test/base/in_process_browser_test.h" |
| 46 #include "components/safe_browsing_db/database_manager.h" | 46 #include "components/safe_browsing_db/database_manager.h" |
| 47 #include "content/public/browser/browser_context.h" | 47 #include "content/public/browser/browser_context.h" |
| 48 #include "content/public/test/test_browser_thread.h" | 48 #include "content/public/test/test_browser_thread.h" |
| 49 #include "content/public/test/test_utils.h" | 49 #include "content/public/test/test_utils.h" |
| 50 #include "net/base/load_flags.h" | 50 #include "net/base/load_flags.h" |
| 51 #include "net/dns/host_resolver.h" | 51 #include "net/dns/host_resolver.h" |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 108 } else { | 108 } else { |
| 109 LOG(ERROR) << "Unrecognized expectation in " << url_str.as_string() | 109 LOG(ERROR) << "Unrecognized expectation in " << url_str.as_string() |
| 110 << ": " << record_parts[2]; | 110 << ": " << record_parts[2]; |
| 111 return false; | 111 return false; |
| 112 } | 112 } |
| 113 phishing_urls->push_back(phishing_url); | 113 phishing_urls->push_back(phishing_url); |
| 114 } | 114 } |
| 115 return true; | 115 return true; |
| 116 } | 116 } |
| 117 | 117 |
| 118 class FakeSafeBrowsingService : public SafeBrowsingService { | |
| 119 public: | |
| 120 explicit FakeSafeBrowsingService(const std::string& url_prefix) | |
| 121 : url_prefix_(url_prefix) {} | |
| 122 | |
| 123 SafeBrowsingProtocolConfig GetProtocolConfig() const override { | |
| 124 SafeBrowsingProtocolConfig config; | |
| 125 config.url_prefix = url_prefix_; | |
| 126 // Makes sure the auto update is not triggered. The tests will force the | |
| 127 // update when needed. | |
| 128 config.disable_auto_update = true; | |
| 129 config.client_name = "browser_tests"; | |
| 130 return config; | |
| 131 } | |
| 132 | |
| 133 private: | |
| 134 ~FakeSafeBrowsingService() override {} | |
| 135 | |
| 136 std::string url_prefix_; | |
| 137 | |
| 138 DISALLOW_COPY_AND_ASSIGN(FakeSafeBrowsingService); | |
| 139 }; | |
| 140 | |
| 141 // Factory that creates FakeSafeBrowsingService instances. | |
| 142 class TestSafeBrowsingServiceFactory : public SafeBrowsingServiceFactory { | |
| 143 public: | |
| 144 explicit TestSafeBrowsingServiceFactory(const std::string& url_prefix) | |
| 145 : url_prefix_(url_prefix) {} | |
| 146 | |
| 147 SafeBrowsingService* CreateSafeBrowsingService() override { | |
| 148 return new FakeSafeBrowsingService(url_prefix_); | |
| 149 } | |
| 150 | |
| 151 private: | |
| 152 std::string url_prefix_; | |
| 153 }; | |
| 154 | |
| 155 } // namespace | 118 } // namespace |
| 156 | 119 |
| 157 // This starts the browser and keeps status of states related to SafeBrowsing. | 120 // This starts the browser and keeps status of states related to SafeBrowsing. |
| 158 class SafeBrowsingServerTest : public InProcessBrowserTest { | 121 class SafeBrowsingServerTest : public InProcessBrowserTest { |
| 159 public: | 122 public: |
| 160 SafeBrowsingServerTest() | 123 SafeBrowsingServerTest() |
| 161 : safe_browsing_service_(NULL), | 124 : is_database_ready_(true), |
| 162 is_database_ready_(true), | |
| 163 is_update_scheduled_(false), | 125 is_update_scheduled_(false), |
| 164 is_checked_url_in_db_(false), | 126 is_checked_url_in_db_(false), |
| 165 is_checked_url_safe_(false) { | 127 is_checked_url_safe_(false) { |
| 166 } | 128 } |
| 167 | 129 |
| 168 ~SafeBrowsingServerTest() override {} | 130 ~SafeBrowsingServerTest() override {} |
| 169 | 131 |
| 170 void UpdateSafeBrowsingStatus() { | 132 void UpdateSafeBrowsingStatus() { |
| 171 ASSERT_TRUE(safe_browsing_service_); | 133 ASSERT_TRUE(sb_factory_->test_safe_browsing_service()); |
| 172 base::AutoLock lock(update_status_mutex_); | 134 base::AutoLock lock(update_status_mutex_); |
| 173 last_update_ = safe_browsing_service_->protocol_manager_->last_update(); | 135 last_update_ = sb_factory_->test_safe_browsing_service() |
| 136 ->protocol_manager_->last_update(); |
| 174 is_update_scheduled_ = | 137 is_update_scheduled_ = |
| 175 safe_browsing_service_->protocol_manager_->update_timer_.IsRunning(); | 138 sb_factory_->test_safe_browsing_service()->protocol_manager_ |
| 139 ->update_timer_.IsRunning(); |
| 176 } | 140 } |
| 177 | 141 |
| 178 void ForceUpdate() { | 142 void ForceUpdate() { |
| 179 content::WindowedNotificationObserver observer( | 143 content::WindowedNotificationObserver observer( |
| 180 chrome::NOTIFICATION_SAFE_BROWSING_UPDATE_COMPLETE, | 144 chrome::NOTIFICATION_SAFE_BROWSING_UPDATE_COMPLETE, |
| 181 content::Source<SafeBrowsingDatabaseManager>(database_manager())); | 145 content::Source<SafeBrowsingDatabaseManager>(database_manager())); |
| 182 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 146 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 183 base::Bind(&SafeBrowsingServerTest::ForceUpdateOnIOThread, | 147 base::Bind(&SafeBrowsingServerTest::ForceUpdateOnIOThread, |
| 184 this)); | 148 this)); |
| 185 observer.Wait(); | 149 observer.Wait(); |
| 186 } | 150 } |
| 187 | 151 |
| 188 void ForceUpdateOnIOThread() { | 152 void ForceUpdateOnIOThread() { |
| 189 EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 153 EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 190 ASSERT_TRUE(safe_browsing_service_); | 154 ASSERT_TRUE(sb_factory_->test_safe_browsing_service()); |
| 191 safe_browsing_service_->protocol_manager_->ForceScheduleNextUpdate( | 155 sb_factory_->test_safe_browsing_service()->protocol_manager_ |
| 192 base::TimeDelta::FromSeconds(0)); | 156 ->ForceScheduleNextUpdate(base::TimeDelta::FromSeconds(0)); |
| 193 } | 157 } |
| 194 | 158 |
| 195 | 159 |
| 196 void CheckIsDatabaseReady() { | 160 void CheckIsDatabaseReady() { |
| 197 base::AutoLock lock(update_status_mutex_); | 161 base::AutoLock lock(update_status_mutex_); |
| 198 is_database_ready_ = | 162 is_database_ready_ = |
| 199 !local_database_manager()->database_update_in_progress_; | 163 !local_database_manager()->database_update_in_progress_; |
| 200 } | 164 } |
| 201 | 165 |
| 202 void CheckUrl(SafeBrowsingDatabaseManager::Client* helper, const GURL& url) { | 166 void CheckUrl(SafeBrowsingDatabaseManager::Client* helper, const GURL& url) { |
| 203 ASSERT_TRUE(safe_browsing_service_); | 167 ASSERT_TRUE(sb_factory_->test_safe_browsing_service()); |
| 204 base::AutoLock lock(update_status_mutex_); | 168 base::AutoLock lock(update_status_mutex_); |
| 205 if (database_manager()->CheckBrowseUrl(url, helper)) { | 169 if (database_manager()->CheckBrowseUrl(url, helper)) { |
| 206 is_checked_url_in_db_ = false; | 170 is_checked_url_in_db_ = false; |
| 207 is_checked_url_safe_ = true; | 171 is_checked_url_safe_ = true; |
| 208 } else { | 172 } else { |
| 209 // In this case, Safebrowsing service will fetch the full hash | 173 // In this case, Safebrowsing service will fetch the full hash |
| 210 // from the server and examine that. Once it is done, | 174 // from the server and examine that. Once it is done, |
| 211 // set_is_checked_url_safe() will be called via callback. | 175 // set_is_checked_url_safe() will be called via callback. |
| 212 is_checked_url_in_db_ = true; | 176 is_checked_url_in_db_ = true; |
| 213 } | 177 } |
| 214 } | 178 } |
| 215 | 179 |
| 216 SafeBrowsingDatabaseManager* database_manager() { | 180 SafeBrowsingDatabaseManager* database_manager() { |
| 217 return safe_browsing_service_->database_manager().get(); | 181 return sb_factory_->test_safe_browsing_service()->database_manager().get(); |
| 218 } | 182 } |
| 219 | 183 |
| 220 // TODO(nparker): Remove the need for this by wiring in our own | 184 // TODO(nparker): Remove the need for this by wiring in our own |
| 221 // SafeBrowsingDatabaseManager factory and keep a ptr to the subclass. | 185 // SafeBrowsingDatabaseManager factory and keep a ptr to the subclass. |
| 222 LocalSafeBrowsingDatabaseManager* local_database_manager() { | 186 LocalSafeBrowsingDatabaseManager* local_database_manager() { |
| 223 return static_cast<LocalSafeBrowsingDatabaseManager*>(database_manager()); | 187 return static_cast<LocalSafeBrowsingDatabaseManager*>(database_manager()); |
| 224 } | 188 } |
| 225 | 189 |
| 226 | 190 |
| 227 bool is_checked_url_in_db() { | 191 bool is_checked_url_in_db() { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 256 | 220 |
| 257 scoped_refptr<base::SequencedTaskRunner> SafeBrowsingTaskRunner() { | 221 scoped_refptr<base::SequencedTaskRunner> SafeBrowsingTaskRunner() { |
| 258 return local_database_manager()->safe_browsing_task_runner_; | 222 return local_database_manager()->safe_browsing_task_runner_; |
| 259 } | 223 } |
| 260 | 224 |
| 261 const net::SpawnedTestServer& spawned_test_server() const { | 225 const net::SpawnedTestServer& spawned_test_server() const { |
| 262 return *test_server_; | 226 return *test_server_; |
| 263 } | 227 } |
| 264 | 228 |
| 265 protected: | 229 protected: |
| 266 bool InitSafeBrowsingService() { | 230 void SetProtocolConfigURLPrefix(const std::string& url_prefix) { |
| 267 safe_browsing_service_ = g_browser_process->safe_browsing_service(); | 231 SafeBrowsingProtocolConfig config; |
| 268 return safe_browsing_service_ != NULL; | 232 config.url_prefix = url_prefix; |
| 233 // Makes sure the auto update is not triggered. The tests will force the |
| 234 // update when needed. |
| 235 config.disable_auto_update = true; |
| 236 config.client_name = "browser_tests"; |
| 237 sb_factory_->SetTestProtocolConfig(config); |
| 269 } | 238 } |
| 270 | 239 |
| 271 void SetUp() override { | 240 void SetUp() override { |
| 272 base::FilePath datafile_path; | 241 base::FilePath datafile_path; |
| 273 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &datafile_path)); | 242 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &datafile_path)); |
| 274 | 243 |
| 275 datafile_path = datafile_path.Append(FILE_PATH_LITERAL("third_party")) | 244 datafile_path = datafile_path.Append(FILE_PATH_LITERAL("third_party")) |
| 276 .Append(FILE_PATH_LITERAL("safe_browsing")) | 245 .Append(FILE_PATH_LITERAL("safe_browsing")) |
| 277 .Append(FILE_PATH_LITERAL("testing")) | 246 .Append(FILE_PATH_LITERAL("testing")) |
| 278 .Append(kDataFile); | 247 .Append(kDataFile); |
| 279 test_server_.reset(new LocalSafeBrowsingTestServer(datafile_path)); | 248 test_server_.reset(new LocalSafeBrowsingTestServer(datafile_path)); |
| 280 ASSERT_TRUE(test_server_->Start()); | 249 ASSERT_TRUE(test_server_->Start()); |
| 281 LOG(INFO) << "server is " << test_server_->host_port_pair().ToString(); | 250 LOG(INFO) << "server is " << test_server_->host_port_pair().ToString(); |
| 282 | 251 |
| 252 sb_factory_.reset(new TestSafeBrowsingServiceFactory()); |
| 283 // Point to the testing server for all SafeBrowsing requests. | 253 // Point to the testing server for all SafeBrowsing requests. |
| 284 std::string url_prefix = test_server_->GetURL("safebrowsing").spec(); | 254 SetProtocolConfigURLPrefix(test_server_->GetURL("safebrowsing").spec()); |
| 285 sb_factory_.reset(new TestSafeBrowsingServiceFactory(url_prefix)); | |
| 286 SafeBrowsingService::RegisterFactory(sb_factory_.get()); | 255 SafeBrowsingService::RegisterFactory(sb_factory_.get()); |
| 287 | 256 |
| 288 InProcessBrowserTest::SetUp(); | 257 InProcessBrowserTest::SetUp(); |
| 289 } | 258 } |
| 290 | 259 |
| 291 void TearDown() override { | 260 void TearDown() override { |
| 292 InProcessBrowserTest::TearDown(); | 261 InProcessBrowserTest::TearDown(); |
| 293 | 262 |
| 294 SafeBrowsingService::RegisterFactory(NULL); | 263 SafeBrowsingService::RegisterFactory(NULL); |
| 295 } | 264 } |
| 296 | 265 |
| 297 void SetUpCommandLine(base::CommandLine* command_line) override { | 266 void SetUpCommandLine(base::CommandLine* command_line) override { |
| 298 // TODO(lzheng): The test server does not understand download related | 267 // TODO(lzheng): The test server does not understand download related |
| 299 // requests. We need to fix the server. | 268 // requests. We need to fix the server. |
| 300 command_line->AppendSwitch(switches::kSbDisableDownloadProtection); | 269 command_line->AppendSwitch(switches::kSbDisableDownloadProtection); |
| 301 | 270 |
| 302 // TODO(gcasto): Generate new testing data that includes the | 271 // TODO(gcasto): Generate new testing data that includes the |
| 303 // client-side phishing whitelist. | 272 // client-side phishing whitelist. |
| 304 command_line->AppendSwitch( | 273 command_line->AppendSwitch( |
| 305 switches::kDisableClientSidePhishingDetection); | 274 switches::kDisableClientSidePhishingDetection); |
| 306 | 275 |
| 307 // TODO(kalman): Generate new testing data that includes the extension | 276 // TODO(kalman): Generate new testing data that includes the extension |
| 308 // blacklist. | 277 // blacklist. |
| 309 command_line->AppendSwitch(switches::kSbDisableExtensionBlacklist); | 278 command_line->AppendSwitch(switches::kSbDisableExtensionBlacklist); |
| 310 } | 279 } |
| 311 | 280 |
| 312 void SetTestStep(int step) { | 281 void SetTestStep(int step) { |
| 313 std::string test_step = base::StringPrintf("test_step=%d", step); | 282 std::string test_step = base::StringPrintf("test_step=%d", step); |
| 314 safe_browsing_service_->protocol_manager_->set_additional_query(test_step); | 283 sb_factory_->test_safe_browsing_service()->protocol_manager_ |
| 284 ->set_additional_query(test_step); |
| 315 } | 285 } |
| 316 | 286 |
| 317 private: | |
| 318 std::unique_ptr<TestSafeBrowsingServiceFactory> sb_factory_; | 287 std::unique_ptr<TestSafeBrowsingServiceFactory> sb_factory_; |
| 319 | 288 |
| 320 SafeBrowsingService* safe_browsing_service_; | 289 private: |
| 321 | |
| 322 std::unique_ptr<net::SpawnedTestServer> test_server_; | 290 std::unique_ptr<net::SpawnedTestServer> test_server_; |
| 323 | 291 |
| 324 // Protects all variables below since they are read on UI thread | 292 // Protects all variables below since they are read on UI thread |
| 325 // but updated on IO thread or safebrowsing thread. | 293 // but updated on IO thread or safebrowsing thread. |
| 326 base::Lock update_status_mutex_; | 294 base::Lock update_status_mutex_; |
| 327 | 295 |
| 328 // States associated with safebrowsing service updates. | 296 // States associated with safebrowsing service updates. |
| 329 bool is_database_ready_; | 297 bool is_database_ready_; |
| 330 base::Time last_update_; | 298 base::Time last_update_; |
| 331 bool is_update_scheduled_; | 299 bool is_update_scheduled_; |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 494 std::unique_ptr<net::URLFetcher> url_fetcher_; | 462 std::unique_ptr<net::URLFetcher> url_fetcher_; |
| 495 std::string response_data_; | 463 std::string response_data_; |
| 496 net::URLRequestStatus::Status response_status_; | 464 net::URLRequestStatus::Status response_status_; |
| 497 net::URLRequestContextGetter* request_context_; | 465 net::URLRequestContextGetter* request_context_; |
| 498 DISALLOW_COPY_AND_ASSIGN(SafeBrowsingServerTestHelper); | 466 DISALLOW_COPY_AND_ASSIGN(SafeBrowsingServerTestHelper); |
| 499 }; | 467 }; |
| 500 | 468 |
| 501 // TODO(shess): Disabled pending new data for third_party/safe_browsing/testing/ | 469 // TODO(shess): Disabled pending new data for third_party/safe_browsing/testing/ |
| 502 IN_PROC_BROWSER_TEST_F(SafeBrowsingServerTest, | 470 IN_PROC_BROWSER_TEST_F(SafeBrowsingServerTest, |
| 503 DISABLED_SafeBrowsingServerTest) { | 471 DISABLED_SafeBrowsingServerTest) { |
| 504 LOG(INFO) << "Start test"; | 472 ASSERT_TRUE(sb_factory_->test_safe_browsing_service() != NULL); |
| 505 ASSERT_TRUE(InitSafeBrowsingService()); | |
| 506 | 473 |
| 507 net::URLRequestContextGetter* request_context = | 474 net::URLRequestContextGetter* request_context = |
| 508 browser()->profile()->GetRequestContext(); | 475 browser()->profile()->GetRequestContext(); |
| 509 scoped_refptr<SafeBrowsingServerTestHelper> safe_browsing_helper( | 476 scoped_refptr<SafeBrowsingServerTestHelper> safe_browsing_helper( |
| 510 new SafeBrowsingServerTestHelper(this, request_context)); | 477 new SafeBrowsingServerTestHelper(this, request_context)); |
| 511 int last_step = 0; | 478 int last_step = 0; |
| 512 | 479 |
| 513 // Waits and makes sure safebrowsing update is not happening. | 480 // Waits and makes sure safebrowsing update is not happening. |
| 514 // The wait will stop once OnWaitForStatusUpdateDone in | 481 // The wait will stop once OnWaitForStatusUpdateDone in |
| 515 // safe_browsing_helper is called and status from safe_browsing_service_ | 482 // safe_browsing_helper is called and status from test_safe_browsing_service |
| 516 // is checked. | 483 // is checked. |
| 517 safe_browsing_helper->UpdateStatus(); | 484 safe_browsing_helper->UpdateStatus(); |
| 518 EXPECT_TRUE(is_database_ready()); | 485 EXPECT_TRUE(is_database_ready()); |
| 519 EXPECT_FALSE(is_update_scheduled()); | 486 EXPECT_FALSE(is_update_scheduled()); |
| 520 EXPECT_TRUE(last_update().is_null()); | 487 EXPECT_TRUE(last_update().is_null()); |
| 521 // Starts updates. After each update, the test will fetch a list of URLs with | 488 // Starts updates. After each update, the test will fetch a list of URLs with |
| 522 // expected results to verify with safebrowsing service. If there is no error, | 489 // expected results to verify with safebrowsing service. If there is no error, |
| 523 // the test moves on to the next step to get more update chunks. | 490 // the test moves on to the next step to get more update chunks. |
| 524 // This repeats till there is no update data. | 491 // This repeats till there is no update data. |
| 525 for (int step = 1;; step++) { | 492 for (int step = 1;; step++) { |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 582 } | 549 } |
| 583 | 550 |
| 584 // Verifies with server if test is done and waits till server responses. | 551 // Verifies with server if test is done and waits till server responses. |
| 585 EXPECT_EQ(net::URLRequestStatus::SUCCESS, | 552 EXPECT_EQ(net::URLRequestStatus::SUCCESS, |
| 586 safe_browsing_helper->VerifyTestComplete(spawned_test_server(), | 553 safe_browsing_helper->VerifyTestComplete(spawned_test_server(), |
| 587 last_step)); | 554 last_step)); |
| 588 EXPECT_EQ("yes", safe_browsing_helper->response_data()); | 555 EXPECT_EQ("yes", safe_browsing_helper->response_data()); |
| 589 } | 556 } |
| 590 | 557 |
| 591 } // namespace safe_browsing | 558 } // namespace safe_browsing |
| OLD | NEW |