OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 // |
11 // This test launches safebrowsing test server and issues several update | 11 // This test launches safebrowsing test server and issues several update |
12 // requests against that server. Each update would get different data and after | 12 // requests against that server. Each update would get different data and after |
13 // each update, the test will get a list of URLs from the test server to verify | 13 // each update, the test will get a list of URLs from the test server to verify |
14 // its repository. The test will succeed only if all updates are performed and | 14 // its repository. The test will succeed only if all updates are performed and |
15 // URLs match what the server expected. | 15 // URLs match what the server expected. |
16 | 16 |
17 #include <vector> | 17 #include <vector> |
18 | 18 |
19 #include "base/command_line.h" | 19 #include "base/command_line.h" |
20 #include "base/environment.h" | 20 #include "base/environment.h" |
21 #include "base/path_service.h" | 21 #include "base/path_service.h" |
22 #include "base/process_util.h" | 22 #include "base/process_util.h" |
| 23 #include "base/stringprintf.h" |
23 #include "base/string_number_conversions.h" | 24 #include "base/string_number_conversions.h" |
24 #include "base/string_split.h" | 25 #include "base/string_split.h" |
25 #include "base/string_util.h" | |
26 #include "base/synchronization/lock.h" | 26 #include "base/synchronization/lock.h" |
27 #include "base/test/test_timeouts.h" | 27 #include "base/test/test_timeouts.h" |
28 #include "base/threading/platform_thread.h" | 28 #include "base/threading/platform_thread.h" |
29 #include "base/time.h" | 29 #include "base/time.h" |
30 #include "base/utf_string_conversions.h" | 30 #include "base/utf_string_conversions.h" |
31 #include "chrome/browser/browser_process.h" | 31 #include "chrome/browser/browser_process.h" |
32 #include "chrome/browser/profiles/profile.h" | 32 #include "chrome/browser/profiles/profile.h" |
33 #include "chrome/browser/safe_browsing/protocol_manager.h" | 33 #include "chrome/browser/safe_browsing/protocol_manager.h" |
34 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | 34 #include "chrome/browser/safe_browsing/safe_browsing_service.h" |
35 #include "chrome/common/chrome_switches.h" | 35 #include "chrome/common/chrome_switches.h" |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 } | 134 } |
135 AppendToPythonPath(pyproto_code_dir); | 135 AppendToPythonPath(pyproto_code_dir); |
136 pyproto_code_dir = pyproto_code_dir.Append(FILE_PATH_LITERAL("google")); | 136 pyproto_code_dir = pyproto_code_dir.Append(FILE_PATH_LITERAL("google")); |
137 AppendToPythonPath(pyproto_code_dir); | 137 AppendToPythonPath(pyproto_code_dir); |
138 | 138 |
139 FilePath python_runtime; | 139 FilePath python_runtime; |
140 EXPECT_TRUE(GetPythonRunTime(&python_runtime)); | 140 EXPECT_TRUE(GetPythonRunTime(&python_runtime)); |
141 CommandLine cmd_line(python_runtime); | 141 CommandLine cmd_line(python_runtime); |
142 FilePath datafile = testserver_path.Append(datafile_); | 142 FilePath datafile = testserver_path.Append(datafile_); |
143 cmd_line.AppendArgPath(testserver); | 143 cmd_line.AppendArgPath(testserver); |
144 cmd_line.AppendSwitchASCII("port", StringPrintf("%d", kPort_)); | 144 cmd_line.AppendSwitchASCII("port", base::StringPrintf("%d", kPort_)); |
145 cmd_line.AppendSwitchPath("datafile", datafile); | 145 cmd_line.AppendSwitchPath("datafile", datafile); |
146 | 146 |
147 if (!base::LaunchApp(cmd_line, false, true, &server_handle_)) { | 147 if (!base::LaunchApp(cmd_line, false, true, &server_handle_)) { |
148 LOG(ERROR) << "Failed to launch server: " | 148 LOG(ERROR) << "Failed to launch server: " |
149 << cmd_line.command_line_string(); | 149 << cmd_line.command_line_string(); |
150 return false; | 150 return false; |
151 } | 151 } |
152 return true; | 152 return true; |
153 } | 153 } |
154 | 154 |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
296 command_line->AppendSwitch(switches::kDisableIPv6); | 296 command_line->AppendSwitch(switches::kDisableIPv6); |
297 | 297 |
298 // TODO(lzheng): The test server does not understand download related | 298 // TODO(lzheng): The test server does not understand download related |
299 // requests. We need to fix the server. | 299 // requests. We need to fix the server. |
300 command_line->AppendSwitch(switches::kSbDisableDownloadProtection); | 300 command_line->AppendSwitch(switches::kSbDisableDownloadProtection); |
301 | 301 |
302 // In this test, we fetch SafeBrowsing data and Mac key from the same | 302 // In this test, we fetch SafeBrowsing data and Mac key from the same |
303 // server. Although in real production, they are served from different | 303 // server. Although in real production, they are served from different |
304 // servers. | 304 // servers. |
305 std::string url_prefix = | 305 std::string url_prefix = |
306 StringPrintf("http://%s:%d/safebrowsing", | 306 base::StringPrintf("http://%s:%d/safebrowsing", |
307 SafeBrowsingTestServer::Host(), | 307 SafeBrowsingTestServer::Host(), |
308 SafeBrowsingTestServer::Port()); | 308 SafeBrowsingTestServer::Port()); |
309 command_line->AppendSwitchASCII(switches::kSbInfoURLPrefix, url_prefix); | 309 command_line->AppendSwitchASCII(switches::kSbInfoURLPrefix, url_prefix); |
310 command_line->AppendSwitchASCII(switches::kSbMacKeyURLPrefix, url_prefix); | 310 command_line->AppendSwitchASCII(switches::kSbMacKeyURLPrefix, url_prefix); |
311 } | 311 } |
312 | 312 |
313 void SetTestStep(int step) { | 313 void SetTestStep(int step) { |
314 std::string test_step = StringPrintf("test_step=%d", step); | 314 std::string test_step = base::StringPrintf("test_step=%d", step); |
315 safe_browsing_service_->protocol_manager_->set_additional_query(test_step); | 315 safe_browsing_service_->protocol_manager_->set_additional_query(test_step); |
316 } | 316 } |
317 | 317 |
318 private: | 318 private: |
319 SafeBrowsingService* safe_browsing_service_; | 319 SafeBrowsingService* safe_browsing_service_; |
320 | 320 |
321 // Protects all variables below since they are read on UI thread | 321 // Protects all variables below since they are read on UI thread |
322 // but updated on IO thread or safebrowsing thread. | 322 // but updated on IO thread or safebrowsing thread. |
323 base::Lock update_status_mutex_; | 323 base::Lock update_status_mutex_; |
324 | 324 |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
441 FROM_HERE, | 441 FROM_HERE, |
442 NewRunnableMethod(this, | 442 NewRunnableMethod(this, |
443 &SafeBrowsingServiceTestHelper::CheckStatusOnIOThread), | 443 &SafeBrowsingServiceTestHelper::CheckStatusOnIOThread), |
444 wait_time_msec); | 444 wait_time_msec); |
445 // Will continue after OnWaitForStatusUpdateDone(). | 445 // Will continue after OnWaitForStatusUpdateDone(). |
446 ui_test_utils::RunMessageLoop(); | 446 ui_test_utils::RunMessageLoop(); |
447 } | 447 } |
448 | 448 |
449 void WaitTillServerReady(const char* host, int port) { | 449 void WaitTillServerReady(const char* host, int port) { |
450 response_status_ = net::URLRequestStatus::FAILED; | 450 response_status_ = net::URLRequestStatus::FAILED; |
451 GURL url(StringPrintf("http://%s:%d%s?test_step=0", | 451 GURL url(base::StringPrintf("http://%s:%d%s?test_step=0", |
452 host, port, kDBResetPath)); | 452 host, port, kDBResetPath)); |
453 // TODO(lzheng): We should have a way to reliably tell when a server is | 453 // TODO(lzheng): We should have a way to reliably tell when a server is |
454 // ready so we could get rid of the Sleep and retry loop. | 454 // ready so we could get rid of the Sleep and retry loop. |
455 while (true) { | 455 while (true) { |
456 if (FetchUrl(url) == net::URLRequestStatus::SUCCESS) | 456 if (FetchUrl(url) == net::URLRequestStatus::SUCCESS) |
457 break; | 457 break; |
458 // Wait and try again if last fetch was failed. The loop will hit the | 458 // Wait and try again if last fetch was failed. The loop will hit the |
459 // timeout in OutOfProcTestRunner if the fetch can not get success | 459 // timeout in OutOfProcTestRunner if the fetch can not get success |
460 // response. | 460 // response. |
461 base::PlatformThread::Sleep(TestTimeouts::action_timeout_ms()); | 461 base::PlatformThread::Sleep(TestTimeouts::action_timeout_ms()); |
462 } | 462 } |
463 } | 463 } |
464 | 464 |
465 // Calls test server to fetch database for verification. | 465 // Calls test server to fetch database for verification. |
466 net::URLRequestStatus::Status FetchDBToVerify(const char* host, int port, | 466 net::URLRequestStatus::Status FetchDBToVerify(const char* host, int port, |
467 int test_step) { | 467 int test_step) { |
468 // TODO(lzheng): Remove chunk_type=add once it is not needed by the server. | 468 // TODO(lzheng): Remove chunk_type=add once it is not needed by the server. |
469 GURL url(StringPrintf("http://%s:%d%s?" | 469 GURL url(base::StringPrintf( |
470 "client=chromium&appver=1.0&pver=2.2&test_step=%d&" | 470 "http://%s:%d%s?" |
471 "chunk_type=add", | 471 "client=chromium&appver=1.0&pver=2.2&test_step=%d&" |
472 host, port, kDBVerifyPath, test_step)); | 472 "chunk_type=add", |
| 473 host, port, kDBVerifyPath, test_step)); |
473 return FetchUrl(url); | 474 return FetchUrl(url); |
474 } | 475 } |
475 | 476 |
476 // Calls test server to fetch URLs for verification. | 477 // Calls test server to fetch URLs for verification. |
477 net::URLRequestStatus::Status FetchUrlsToVerify(const char* host, int port, | 478 net::URLRequestStatus::Status FetchUrlsToVerify(const char* host, int port, |
478 int test_step) { | 479 int test_step) { |
479 GURL url(StringPrintf("http://%s:%d%s?" | 480 GURL url(base::StringPrintf( |
480 "client=chromium&appver=1.0&pver=2.2&test_step=%d", | 481 "http://%s:%d%s?" |
481 host, port, kUrlVerifyPath, test_step)); | 482 "client=chromium&appver=1.0&pver=2.2&test_step=%d", |
| 483 host, port, kUrlVerifyPath, test_step)); |
482 return FetchUrl(url); | 484 return FetchUrl(url); |
483 } | 485 } |
484 | 486 |
485 // Calls test server to check if test data is done. E.g.: if there is a | 487 // Calls test server to check if test data is done. E.g.: if there is a |
486 // bad URL that server expects test to fetch full hash but the test didn't, | 488 // bad URL that server expects test to fetch full hash but the test didn't, |
487 // this verification will fail. | 489 // this verification will fail. |
488 net::URLRequestStatus::Status VerifyTestComplete(const char* host, int port, | 490 net::URLRequestStatus::Status VerifyTestComplete(const char* host, int port, |
489 int test_step) { | 491 int test_step) { |
490 GURL url(StringPrintf("http://%s:%d%s?test_step=%d", | 492 GURL url(StringPrintf("http://%s:%d%s?test_step=%d", |
491 host, port, kTestCompletePath, test_step)); | 493 host, port, kTestCompletePath, test_step)); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
558 EXPECT_TRUE(is_database_ready()); | 560 EXPECT_TRUE(is_database_ready()); |
559 EXPECT_TRUE(is_initial_request()); | 561 EXPECT_TRUE(is_initial_request()); |
560 EXPECT_FALSE(is_update_scheduled()); | 562 EXPECT_FALSE(is_update_scheduled()); |
561 EXPECT_TRUE(last_update().is_null()); | 563 EXPECT_TRUE(last_update().is_null()); |
562 // Starts updates. After each update, the test will fetch a list of URLs with | 564 // Starts updates. After each update, the test will fetch a list of URLs with |
563 // expected results to verify with safebrowsing service. If there is no error, | 565 // expected results to verify with safebrowsing service. If there is no error, |
564 // the test moves on to the next step to get more update chunks. | 566 // the test moves on to the next step to get more update chunks. |
565 // This repeats till there is no update data. | 567 // This repeats till there is no update data. |
566 for (int step = 1;; step++) { | 568 for (int step = 1;; step++) { |
567 // Every step should be a fresh start. | 569 // Every step should be a fresh start. |
568 SCOPED_TRACE(StringPrintf("step=%d", step)); | 570 SCOPED_TRACE(base::StringPrintf("step=%d", step)); |
569 EXPECT_TRUE(is_database_ready()); | 571 EXPECT_TRUE(is_database_ready()); |
570 EXPECT_FALSE(is_update_scheduled()); | 572 EXPECT_FALSE(is_update_scheduled()); |
571 | 573 |
572 // Starts safebrowsing update on IO thread. Waits till scheduled | 574 // Starts safebrowsing update on IO thread. Waits till scheduled |
573 // update finishes. Stops waiting after kMaxWaitSecPerStep if the update | 575 // update finishes. Stops waiting after kMaxWaitSecPerStep if the update |
574 // could not finish. | 576 // could not finish. |
575 base::Time now = base::Time::Now(); | 577 base::Time now = base::Time::Now(); |
576 SetTestStep(step); | 578 SetTestStep(step); |
577 safe_browsing_helper->ForceUpdate(); | 579 safe_browsing_helper->ForceUpdate(); |
578 | 580 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
630 } | 632 } |
631 | 633 |
632 // Verifies with server if test is done and waits till server responses. | 634 // Verifies with server if test is done and waits till server responses. |
633 EXPECT_EQ(net::URLRequestStatus::SUCCESS, | 635 EXPECT_EQ(net::URLRequestStatus::SUCCESS, |
634 safe_browsing_helper->VerifyTestComplete(server_host, | 636 safe_browsing_helper->VerifyTestComplete(server_host, |
635 server_port, | 637 server_port, |
636 last_step)); | 638 last_step)); |
637 EXPECT_EQ("yes", safe_browsing_helper->response_data()); | 639 EXPECT_EQ("yes", safe_browsing_helper->response_data()); |
638 test_server.Stop(); | 640 test_server.Stop(); |
639 } | 641 } |
OLD | NEW |