| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 #include "chrome/browser/safe_browsing/certificate_reporting_service.h" | 5 #include "chrome/browser/safe_browsing/certificate_reporting_service.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/atomic_sequence_num.h" |
| 9 #include "base/bind.h" | 10 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
| 11 #include "base/run_loop.h" | 12 #include "base/run_loop.h" |
| 12 #include "base/single_thread_task_runner.h" | 13 #include "base/single_thread_task_runner.h" |
| 13 #include "base/test/histogram_tester.h" | 14 #include "base/test/histogram_tester.h" |
| 14 #include "base/test/simple_test_clock.h" | 15 #include "base/test/simple_test_clock.h" |
| 15 #include "base/test/thread_test_helper.h" | 16 #include "base/test/thread_test_helper.h" |
| 16 #include "base/time/clock.h" | 17 #include "base/time/clock.h" |
| 17 #include "base/time/time.h" | 18 #include "base/time/time.h" |
| 18 #include "chrome/browser/safe_browsing/certificate_reporting_service_test_utils.
h" | 19 #include "chrome/browser/safe_browsing/certificate_reporting_service_test_utils.
h" |
| 19 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | 20 #include "chrome/browser/safe_browsing/safe_browsing_service.h" |
| 20 #include "chrome/browser/safe_browsing/test_safe_browsing_service.h" | 21 #include "chrome/browser/safe_browsing/test_safe_browsing_service.h" |
| 21 #include "chrome/test/base/testing_profile.h" | 22 #include "chrome/test/base/testing_profile.h" |
| 23 #include "components/certificate_reporting/error_report.h" |
| 22 #include "content/public/browser/browser_thread.h" | 24 #include "content/public/browser/browser_thread.h" |
| 23 #include "content/public/test/test_browser_thread.h" | 25 #include "content/public/test/test_browser_thread.h" |
| 24 #include "content/public/test/test_browser_thread_bundle.h" | 26 #include "content/public/test/test_browser_thread_bundle.h" |
| 25 #include "net/base/network_delegate_impl.h" | 27 #include "crypto/rsa_private_key.h" |
| 28 #include "net/cert/x509_certificate.h" |
| 29 #include "net/cert/x509_util.h" |
| 30 #include "net/ssl/ssl_info.h" |
| 26 #include "net/test/url_request/url_request_failed_job.h" | 31 #include "net/test/url_request/url_request_failed_job.h" |
| 27 #include "net/test/url_request/url_request_mock_data_job.h" | 32 #include "net/test/url_request/url_request_mock_data_job.h" |
| 28 #include "net/url_request/url_request_filter.h" | 33 #include "net/url_request/url_request_filter.h" |
| 29 #include "net/url_request/url_request_test_util.h" | 34 #include "net/url_request/url_request_test_util.h" |
| 30 #include "testing/gtest/include/gtest/gtest.h" | 35 #include "testing/gtest/include/gtest/gtest.h" |
| 31 | 36 |
| 32 using certificate_reporting_test_utils::CertificateReportingServiceTestHelper; | 37 using certificate_reporting_test_utils::CertificateReportingServiceTestHelper; |
| 38 using certificate_reporting_test_utils::CertificateReportingServiceObserver; |
| 33 using certificate_reporting_test_utils::ReportExpectation; | 39 using certificate_reporting_test_utils::ReportExpectation; |
| 34 | 40 |
| 35 namespace { | 41 namespace { |
| 36 | 42 |
| 37 // Maximum number of reports kept in the certificate reporting service's retry | 43 // Maximum number of reports kept in the certificate reporting service's retry |
| 38 // queue. | 44 // queue. |
| 39 const size_t kMaxReportCountInQueue = 3; | 45 const size_t kMaxReportCountInQueue = 3; |
| 40 | 46 |
| 41 const char* kFailedReportHistogram = "SSL.CertificateErrorReportFailure"; | 47 const char* kFailedReportHistogram = "SSL.CertificateErrorReportFailure"; |
| 42 | 48 |
| 49 // NSS requires that serial numbers be unique even for the same issuer; |
| 50 // as all fake certificates will contain the same issuer name, it's |
| 51 // necessary to ensure the serial number is unique, as otherwise |
| 52 // NSS will fail to parse. |
| 53 base::StaticAtomicSequenceNumber g_serial_number; |
| 54 |
| 55 scoped_refptr<net::X509Certificate> CreateFakeCert() { |
| 56 std::unique_ptr<crypto::RSAPrivateKey> unused_key; |
| 57 std::string cert_der; |
| 58 if (!net::x509_util::CreateKeyAndSelfSignedCert( |
| 59 "CN=Error", static_cast<uint32_t>(g_serial_number.GetNext()), |
| 60 base::Time::Now() - base::TimeDelta::FromMinutes(5), |
| 61 base::Time::Now() + base::TimeDelta::FromMinutes(5), &unused_key, |
| 62 &cert_der)) { |
| 63 return nullptr; |
| 64 } |
| 65 return net::X509Certificate::CreateFromBytes(cert_der.data(), |
| 66 cert_der.size()); |
| 67 } |
| 68 |
| 69 std::string MakeReport(const std::string& hostname) { |
| 70 net::SSLInfo ssl_info; |
| 71 ssl_info.cert = ssl_info.unverified_cert = CreateFakeCert(); |
| 72 |
| 73 certificate_reporting::ErrorReport report(hostname, ssl_info); |
| 74 std::string serialized_report; |
| 75 EXPECT_TRUE(report.Serialize(&serialized_report)); |
| 76 return serialized_report; |
| 77 } |
| 78 |
| 43 void ClearURLHandlers() { | 79 void ClearURLHandlers() { |
| 44 net::URLRequestFilter::GetInstance()->ClearHandlers(); | 80 net::URLRequestFilter::GetInstance()->ClearHandlers(); |
| 45 } | 81 } |
| 46 | 82 |
| 47 // A network delegate used to observe URL request destructions. The tests check | 83 // Class for histogram testing. The failed report histogram is checked once |
| 48 // that no outstanding URL request is present during tear down. | |
| 49 class TestNetworkDelegate : public net::NetworkDelegateImpl { | |
| 50 public: | |
| 51 TestNetworkDelegate( | |
| 52 const base::Callback<void()>& url_request_destroyed_callback) | |
| 53 : url_request_destroyed_callback_(url_request_destroyed_callback) {} | |
| 54 | |
| 55 ~TestNetworkDelegate() override {} | |
| 56 | |
| 57 // net::NetworkDelegate method: | |
| 58 void OnURLRequestDestroyed(net::URLRequest* request) override { | |
| 59 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | |
| 60 content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, | |
| 61 url_request_destroyed_callback_); | |
| 62 } | |
| 63 | |
| 64 private: | |
| 65 base::Callback<void()> url_request_destroyed_callback_; | |
| 66 }; | |
| 67 | |
| 68 // Base class for histogram testing. The failed report histogram is checked once | |
| 69 // after teardown to ensure all in flight requests have completed. | 84 // after teardown to ensure all in flight requests have completed. |
| 70 class ReportHistogramTestHelper { | 85 class ReportHistogramTestHelper { |
| 71 public: | 86 public: |
| 72 // Sets the expected histogram value to be checked during teardown. | 87 // Sets the expected histogram value to be checked during teardown. |
| 73 void SetExpectedFailedReportCount(unsigned int num_expected_failed_report) { | 88 void SetExpectedFailedReportCount(unsigned int num_expected_failed_report) { |
| 74 num_expected_failed_report_ = num_expected_failed_report; | 89 num_expected_failed_report_ = num_expected_failed_report; |
| 75 } | 90 } |
| 76 | 91 |
| 77 void CheckHistogram() { | 92 void CheckHistogram() { |
| 78 if (num_expected_failed_report_ != 0) { | 93 if (num_expected_failed_report_ != 0) { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 // Adding a third report removes the oldest report (report1) from the list. | 130 // Adding a third report removes the oldest report (report1) from the list. |
| 116 list.Add(CertificateReportingService::Report( | 131 list.Add(CertificateReportingService::Report( |
| 117 3, base::Time::Now(), std::string("report3_zero_minutes_old"))); | 132 3, base::Time::Now(), std::string("report3_zero_minutes_old"))); |
| 118 EXPECT_EQ(2u, list.items().size()); | 133 EXPECT_EQ(2u, list.items().size()); |
| 119 EXPECT_EQ("report3_zero_minutes_old", list.items()[0].serialized_report); | 134 EXPECT_EQ("report3_zero_minutes_old", list.items()[0].serialized_report); |
| 120 EXPECT_EQ("report2_five_minutes_old", list.items()[1].serialized_report); | 135 EXPECT_EQ("report2_five_minutes_old", list.items()[1].serialized_report); |
| 121 | 136 |
| 122 // Adding a report older than the oldest report in the list (report2) is | 137 // Adding a report older than the oldest report in the list (report2) is |
| 123 // a no-op. | 138 // a no-op. |
| 124 list.Add(CertificateReportingService::Report( | 139 list.Add(CertificateReportingService::Report( |
| 125 0, base::Time::Now() - base::TimeDelta::FromMinutes( | 140 0, base::Time::Now() - base::TimeDelta::FromMinutes(10), |
| 126 10) /* 5 minutes older than report2 */, | |
| 127 std::string("report0_ten_minutes_old"))); | 141 std::string("report0_ten_minutes_old"))); |
| 128 EXPECT_EQ(2u, list.items().size()); | 142 EXPECT_EQ(2u, list.items().size()); |
| 129 EXPECT_EQ("report3_zero_minutes_old", list.items()[0].serialized_report); | 143 EXPECT_EQ("report3_zero_minutes_old", list.items()[0].serialized_report); |
| 130 EXPECT_EQ("report2_five_minutes_old", list.items()[1].serialized_report); | 144 EXPECT_EQ("report2_five_minutes_old", list.items()[1].serialized_report); |
| 131 } | 145 } |
| 132 | 146 |
| 133 class CertificateReportingServiceReporterOnIOThreadTest | 147 class CertificateReportingServiceReporterOnIOThreadTest |
| 134 : public ::testing::Test { | 148 : public ::testing::Test { |
| 135 public: | 149 public: |
| 136 void SetUp() override { | 150 void SetUp() override { |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 318 class CertificateReportingServiceTest : public ::testing::Test { | 332 class CertificateReportingServiceTest : public ::testing::Test { |
| 319 public: | 333 public: |
| 320 CertificateReportingServiceTest() | 334 CertificateReportingServiceTest() |
| 321 : thread_bundle_(content::TestBrowserThreadBundle::REAL_IO_THREAD), | 335 : thread_bundle_(content::TestBrowserThreadBundle::REAL_IO_THREAD), |
| 322 io_task_runner_(content::BrowserThread::GetTaskRunnerForThread( | 336 io_task_runner_(content::BrowserThread::GetTaskRunnerForThread( |
| 323 content::BrowserThread::IO)) {} | 337 content::BrowserThread::IO)) {} |
| 324 | 338 |
| 325 ~CertificateReportingServiceTest() override {} | 339 ~CertificateReportingServiceTest() override {} |
| 326 | 340 |
| 327 void SetUp() override { | 341 void SetUp() override { |
| 342 service_observer_.Clear(); |
| 328 test_helper_.SetUpInterceptor(); | 343 test_helper_.SetUpInterceptor(); |
| 329 WaitForIOThread(); | 344 WaitForIOThread(); |
| 330 | 345 |
| 331 content::BrowserThread::PostTask( | 346 content::BrowserThread::PostTask( |
| 332 content::BrowserThread::IO, FROM_HERE, | 347 content::BrowserThread::IO, FROM_HERE, |
| 333 base::Bind( | 348 base::Bind( |
| 334 &CertificateReportingServiceTest::SetUpURLRequestContextOnIOThread, | 349 &CertificateReportingServiceTest::SetUpURLRequestContextOnIOThread, |
| 335 base::Unretained(this))); | 350 base::Unretained(this))); |
| 336 WaitForIOThread(); | 351 WaitForIOThread(); |
| 337 | 352 |
| 338 safe_browsing::SafeBrowsingService::RegisterFactory(&sb_service_factory); | 353 safe_browsing::SafeBrowsingService::RegisterFactory(&sb_service_factory); |
| 339 sb_service_ = sb_service_factory.CreateSafeBrowsingService(); | 354 sb_service_ = sb_service_factory.CreateSafeBrowsingService(); |
| 340 | 355 |
| 341 clock_.reset(new base::SimpleTestClock()); | 356 clock_.reset(new base::SimpleTestClock()); |
| 342 service_.reset(new CertificateReportingService( | 357 service_.reset(new CertificateReportingService( |
| 343 sb_service_.get(), url_request_context_getter(), &profile_, | 358 sb_service_.get(), url_request_context_getter(), &profile_, |
| 344 test_helper_.server_public_key(), | 359 test_helper_.server_public_key(), |
| 345 test_helper_.server_public_key_version(), kMaxReportCountInQueue, | 360 test_helper_.server_public_key_version(), kMaxReportCountInQueue, |
| 346 base::TimeDelta::FromHours(24), clock_.get())); | 361 base::TimeDelta::FromHours(24), clock_.get(), |
| 347 // Wait for service reset. | 362 base::Bind(&CertificateReportingServiceObserver::OnServiceReset, |
| 348 WaitForIOThread(); | 363 base::Unretained(&service_observer_)))); |
| 364 service_observer_.WaitForReset(); |
| 349 } | 365 } |
| 350 | 366 |
| 351 void TearDown() override { | 367 void TearDown() override { |
| 352 WaitForIOThread(); | 368 WaitForIOThread(); |
| 353 EXPECT_TRUE(test_helper_.interceptor()->successful_reports().empty()); | 369 test_helper()->ExpectNoRequests(service()); |
| 354 EXPECT_TRUE(test_helper_.interceptor()->failed_reports().empty()); | |
| 355 EXPECT_TRUE(test_helper_.interceptor()->delayed_reports().empty()); | |
| 356 EXPECT_EQ(0u, service() | |
| 357 ->GetReporterForTesting() | |
| 358 ->inflight_report_count_for_testing()); | |
| 359 | 370 |
| 360 service_->Shutdown(); | 371 service_->Shutdown(); |
| 361 WaitForIOThread(); | 372 WaitForIOThread(); |
| 362 service_.reset(nullptr); | 373 service_.reset(nullptr); |
| 363 | 374 |
| 364 content::BrowserThread::PostTask( | 375 content::BrowserThread::PostTask( |
| 365 content::BrowserThread::IO, FROM_HERE, | 376 content::BrowserThread::IO, FROM_HERE, |
| 366 base::Bind(&CertificateReportingServiceTest::TearDownOnIOThread, | 377 base::Bind(&CertificateReportingServiceTest::TearDownOnIOThread, |
| 367 base::Unretained(this))); | 378 base::Unretained(this))); |
| 368 content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE, | 379 content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE, |
| 369 base::Bind(&ClearURLHandlers)); | 380 base::Bind(&ClearURLHandlers)); |
| 370 WaitForIOThread(); | 381 WaitForIOThread(); |
| 371 | 382 |
| 372 histogram_test_helper_.CheckHistogram(); | 383 histogram_test_helper_.CheckHistogram(); |
| 373 } | 384 } |
| 374 | 385 |
| 375 protected: | 386 protected: |
| 376 void WaitForRequestsDestroyed(const ReportExpectation& expectation) { | |
| 377 wait_helper_.Wait(expectation.num_reports()); | |
| 378 EXPECT_EQ(expectation.successful_reports, | |
| 379 test_helper_.interceptor()->successful_reports()); | |
| 380 EXPECT_EQ(expectation.failed_reports, | |
| 381 test_helper_.interceptor()->failed_reports()); | |
| 382 EXPECT_EQ(expectation.delayed_reports, | |
| 383 test_helper_.interceptor()->delayed_reports()); | |
| 384 test_helper_.interceptor()->ClearObservedReports(); | |
| 385 } | |
| 386 | |
| 387 net::URLRequestContextGetter* url_request_context_getter() { | 387 net::URLRequestContextGetter* url_request_context_getter() { |
| 388 return url_request_context_getter_.get(); | 388 return url_request_context_getter_.get(); |
| 389 } | 389 } |
| 390 | 390 |
| 391 void WaitForIOThread() { | 391 void WaitForIOThread() { |
| 392 scoped_refptr<base::ThreadTestHelper> io_helper( | 392 scoped_refptr<base::ThreadTestHelper> io_helper( |
| 393 new base::ThreadTestHelper(io_task_runner_)); | 393 new base::ThreadTestHelper(io_task_runner_)); |
| 394 ASSERT_TRUE(io_helper->Run()); | 394 ASSERT_TRUE(io_helper->Run()); |
| 395 } | 395 } |
| 396 | 396 |
| 397 CertificateReportingService* service() { return service_.get(); } | 397 CertificateReportingService* service() { return service_.get(); } |
| 398 | 398 |
| 399 // Sets service enabled state and waits for a reset event. | 399 // Sets service enabled state and waits for a reset event. |
| 400 void SetServiceEnabledAndWait(bool enabled) { | 400 void SetServiceEnabledAndWait(bool enabled) { |
| 401 service_observer_.Clear(); |
| 401 service()->SetEnabled(enabled); | 402 service()->SetEnabled(enabled); |
| 402 WaitForIOThread(); | 403 service_observer_.WaitForReset(); |
| 403 } | 404 } |
| 404 | 405 |
| 405 void AdvanceClock(base::TimeDelta delta) { | 406 void AdvanceClock(base::TimeDelta delta) { |
| 406 content::BrowserThread::PostTask( | 407 content::BrowserThread::PostTask( |
| 407 content::BrowserThread::IO, FROM_HERE, | 408 content::BrowserThread::IO, FROM_HERE, |
| 408 base::Bind(&base::SimpleTestClock::Advance, | 409 base::Bind(&base::SimpleTestClock::Advance, |
| 409 base::Unretained(clock_.get()), delta)); | 410 base::Unretained(clock_.get()), delta)); |
| 410 } | 411 } |
| 411 | 412 |
| 412 void SetNow(base::Time now) { | 413 void SetNow(base::Time now) { |
| 413 content::BrowserThread::PostTask( | 414 content::BrowserThread::PostTask( |
| 414 content::BrowserThread::IO, FROM_HERE, | 415 content::BrowserThread::IO, FROM_HERE, |
| 415 base::Bind(&base::SimpleTestClock::SetNow, | 416 base::Bind(&base::SimpleTestClock::SetNow, |
| 416 base::Unretained(clock_.get()), now)); | 417 base::Unretained(clock_.get()), now)); |
| 417 } | 418 } |
| 418 | 419 |
| 419 void SetExpectedFailedReportCountOnTearDown(unsigned int count) { | 420 void SetExpectedFailedReportCountOnTearDown(unsigned int count) { |
| 420 histogram_test_helper_.SetExpectedFailedReportCount(count); | 421 histogram_test_helper_.SetExpectedFailedReportCount(count); |
| 421 } | 422 } |
| 422 | 423 |
| 423 CertificateReportingServiceTestHelper* test_helper() { return &test_helper_; } | 424 CertificateReportingServiceTestHelper* test_helper() { return &test_helper_; } |
| 424 | 425 |
| 425 private: | 426 private: |
| 426 void SetUpURLRequestContextOnIOThread() { | 427 void SetUpURLRequestContextOnIOThread() { |
| 427 network_delegate_.reset(new TestNetworkDelegate( | |
| 428 base::Bind(&CertificateReportingServiceTest::OnURLRequestDestroyed, | |
| 429 base::Unretained(this)))); | |
| 430 | |
| 431 std::unique_ptr<net::TestURLRequestContext> url_request_context( | 428 std::unique_ptr<net::TestURLRequestContext> url_request_context( |
| 432 new net::TestURLRequestContext(true)); | 429 new net::TestURLRequestContext(false)); |
| 433 url_request_context->set_network_delegate(network_delegate_.get()); | |
| 434 url_request_context->Init(); | |
| 435 url_request_context_getter_ = new net::TestURLRequestContextGetter( | 430 url_request_context_getter_ = new net::TestURLRequestContextGetter( |
| 436 io_task_runner_, std::move(url_request_context)); | 431 io_task_runner_, std::move(url_request_context)); |
| 437 } | 432 } |
| 438 | 433 |
| 439 void TearDownOnIOThread() { | 434 void TearDownOnIOThread() { |
| 440 url_request_context_getter_ = nullptr; | 435 url_request_context_getter_ = nullptr; |
| 441 network_delegate_.reset(nullptr); | |
| 442 } | |
| 443 | |
| 444 void OnURLRequestDestroyed() { | |
| 445 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | |
| 446 wait_helper_.OnEvent(); | |
| 447 } | 436 } |
| 448 | 437 |
| 449 // Must be initialized before url_request_context_getter_ | 438 // Must be initialized before url_request_context_getter_ |
| 450 content::TestBrowserThreadBundle thread_bundle_; | 439 content::TestBrowserThreadBundle thread_bundle_; |
| 451 | 440 |
| 452 std::unique_ptr<TestNetworkDelegate> network_delegate_; | |
| 453 certificate_reporting_test_utils::ReportWaitHelper wait_helper_; | |
| 454 | |
| 455 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; | 441 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; |
| 456 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_; | 442 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_; |
| 457 | 443 |
| 458 std::unique_ptr<CertificateReportingService> service_; | 444 std::unique_ptr<CertificateReportingService> service_; |
| 459 std::unique_ptr<base::SimpleTestClock> clock_; | 445 std::unique_ptr<base::SimpleTestClock> clock_; |
| 460 | 446 |
| 461 scoped_refptr<safe_browsing::SafeBrowsingService> sb_service_; | 447 scoped_refptr<safe_browsing::SafeBrowsingService> sb_service_; |
| 462 safe_browsing::TestSafeBrowsingServiceFactory sb_service_factory; | 448 safe_browsing::TestSafeBrowsingServiceFactory sb_service_factory; |
| 463 TestingProfile profile_; | 449 TestingProfile profile_; |
| 464 | 450 |
| 465 CertificateReportingServiceTestHelper test_helper_; | 451 CertificateReportingServiceTestHelper test_helper_; |
| 466 ReportHistogramTestHelper histogram_test_helper_; | 452 ReportHistogramTestHelper histogram_test_helper_; |
| 453 CertificateReportingServiceObserver service_observer_; |
| 467 }; | 454 }; |
| 468 | 455 |
| 469 TEST_F(CertificateReportingServiceTest, Send) { | 456 TEST_F(CertificateReportingServiceTest, Send) { |
| 470 SetExpectedFailedReportCountOnTearDown(4); | 457 SetExpectedFailedReportCountOnTearDown(4); |
| 471 | 458 |
| 472 // Let all reports fail. | 459 // Let all reports fail. |
| 473 test_helper()->SetFailureMode( | 460 test_helper()->SetFailureMode( |
| 474 certificate_reporting_test_utils::ReportSendingResult::REPORTS_FAIL); | 461 certificate_reporting_test_utils::ReportSendingResult::REPORTS_FAIL); |
| 475 | 462 |
| 476 // Send two reports. Both should fail and get queued. | 463 // Send two reports. Both should fail and get queued. |
| 477 service()->Send("report0"); | 464 service()->Send(MakeReport("report0")); |
| 478 WaitForRequestsDestroyed(ReportExpectation::Failed({"report0"})); | 465 service()->Send(MakeReport("report1")); |
| 466 test_helper()->WaitForRequestsDestroyed( |
| 467 ReportExpectation::Failed({"report0", "report1"})); |
| 479 | 468 |
| 480 service()->Send("report1"); | 469 // Send pending reports. Previously queued reports should be queued again. |
| 481 WaitForRequestsDestroyed(ReportExpectation::Failed({"report1"})); | |
| 482 | |
| 483 // Send pending reports. Previously queued reports should be observed. They | |
| 484 // will also be queued again. | |
| 485 service()->SendPending(); | 470 service()->SendPending(); |
| 486 WaitForRequestsDestroyed(ReportExpectation::Failed({"report0", "report1"})); | 471 test_helper()->WaitForRequestsDestroyed( |
| 472 ReportExpectation::Failed({"report0", "report1"})); |
| 487 | 473 |
| 488 // Let all reports succeed. | 474 // Let all reports succeed. |
| 489 test_helper()->SetFailureMode(certificate_reporting_test_utils:: | 475 test_helper()->SetFailureMode(certificate_reporting_test_utils:: |
| 490 ReportSendingResult::REPORTS_SUCCESSFUL); | 476 ReportSendingResult::REPORTS_SUCCESSFUL); |
| 491 | 477 |
| 492 // Send a third report. This should not be queued. | 478 // Send a third report. This should not be queued. |
| 493 service()->Send("report2"); | 479 service()->Send(MakeReport("report2")); |
| 494 WaitForRequestsDestroyed(ReportExpectation::Successful({"report2"})); | 480 test_helper()->WaitForRequestsDestroyed( |
| 481 ReportExpectation::Successful({"report2"})); |
| 495 | 482 |
| 496 // Send pending reports. Previously failed and queued two reports should be | 483 // Send pending reports. Previously failed and queued two reports should be |
| 497 // observed. | 484 // observed. |
| 498 service()->SendPending(); | 485 service()->SendPending(); |
| 499 WaitForRequestsDestroyed( | 486 test_helper()->WaitForRequestsDestroyed( |
| 500 ReportExpectation::Successful({"report0", "report1"})); | 487 ReportExpectation::Successful({"report0", "report1"})); |
| 501 } | 488 } |
| 502 | 489 |
| 503 TEST_F(CertificateReportingServiceTest, Disabled_ShouldNotSend) { | 490 TEST_F(CertificateReportingServiceTest, Disabled_ShouldNotSend) { |
| 504 SetExpectedFailedReportCountOnTearDown(0); | 491 SetExpectedFailedReportCountOnTearDown(0); |
| 505 | 492 |
| 506 // Let all reports succeed. | 493 // Let all reports succeed. |
| 507 test_helper()->SetFailureMode(certificate_reporting_test_utils:: | 494 test_helper()->SetFailureMode(certificate_reporting_test_utils:: |
| 508 ReportSendingResult::REPORTS_SUCCESSFUL); | 495 ReportSendingResult::REPORTS_SUCCESSFUL); |
| 509 | 496 |
| 510 // Disable the service. | 497 // Disable the service. |
| 511 SetServiceEnabledAndWait(false); | 498 SetServiceEnabledAndWait(false); |
| 512 | 499 |
| 513 // Send a report. Report attempt should be cancelled and no sent reports | 500 // Send a report. Report attempt should be cancelled and no sent reports |
| 514 // should be observed. | 501 // should be observed. |
| 515 service()->Send("report0"); | 502 service()->Send(MakeReport("report0")); |
| 516 | 503 |
| 517 // Enable the service and send a report again. It should be sent successfully. | 504 // Enable the service and send a report again. It should be sent successfully. |
| 518 SetServiceEnabledAndWait(true); | 505 SetServiceEnabledAndWait(true); |
| 519 | 506 |
| 520 service()->Send("report1"); | 507 service()->Send(MakeReport("report1")); |
| 521 WaitForRequestsDestroyed(ReportExpectation::Successful({"report1"})); | 508 test_helper()->WaitForRequestsDestroyed( |
| 509 ReportExpectation::Successful({"report1"})); |
| 522 } | 510 } |
| 523 | 511 |
| 524 TEST_F(CertificateReportingServiceTest, Disabled_ShouldClearPendingReports) { | 512 TEST_F(CertificateReportingServiceTest, Disabled_ShouldClearPendingReports) { |
| 525 SetExpectedFailedReportCountOnTearDown(1); | 513 SetExpectedFailedReportCountOnTearDown(1); |
| 526 | 514 |
| 527 // Let all reports fail. | 515 // Let all reports fail. |
| 528 test_helper()->SetFailureMode( | 516 test_helper()->SetFailureMode( |
| 529 certificate_reporting_test_utils::ReportSendingResult::REPORTS_FAIL); | 517 certificate_reporting_test_utils::ReportSendingResult::REPORTS_FAIL); |
| 530 | 518 |
| 531 service()->Send("report0"); | 519 service()->Send(MakeReport("report0")); |
| 532 WaitForRequestsDestroyed(ReportExpectation::Failed({"report0"})); | 520 test_helper()->WaitForRequestsDestroyed( |
| 521 ReportExpectation::Failed({"report0"})); |
| 533 | 522 |
| 534 // Disable the service. | 523 // Disable the service. |
| 535 SetServiceEnabledAndWait(false); | 524 SetServiceEnabledAndWait(false); |
| 536 | 525 |
| 537 // Sending has no effect while disabled. | 526 // Sending has no effect while disabled. |
| 538 service()->SendPending(); | 527 service()->SendPending(); |
| 539 | 528 |
| 540 // Re-enable the service and send pending reports. Pending reports should have | 529 // Re-enable the service and send pending reports. Pending reports should have |
| 541 // been cleared when the service was disabled, so no report should be seen. | 530 // been cleared when the service was disabled, so no report should be seen. |
| 542 SetServiceEnabledAndWait(true); | 531 SetServiceEnabledAndWait(true); |
| 543 | 532 |
| 544 // Sending with empty queue has no effect. | 533 // Sending with empty queue has no effect. |
| 545 service()->SendPending(); | 534 service()->SendPending(); |
| 546 } | 535 } |
| 547 | 536 |
| 548 TEST_F(CertificateReportingServiceTest, DontSendOldReports) { | 537 TEST_F(CertificateReportingServiceTest, DontSendOldReports) { |
| 549 SetExpectedFailedReportCountOnTearDown(5); | 538 SetExpectedFailedReportCountOnTearDown(5); |
| 550 | 539 |
| 551 SetNow(base::Time::Now()); | 540 SetNow(base::Time::Now()); |
| 552 // Let all reports fail. | 541 // Let all reports fail. |
| 553 test_helper()->SetFailureMode( | 542 test_helper()->SetFailureMode( |
| 554 certificate_reporting_test_utils::ReportSendingResult::REPORTS_FAIL); | 543 certificate_reporting_test_utils::ReportSendingResult::REPORTS_FAIL); |
| 555 | 544 |
| 556 // Send a report. | 545 // Send a report, then advance the clock and send another report. |
| 557 service()->Send("report0"); | 546 service()->Send(MakeReport("report0")); |
| 558 WaitForRequestsDestroyed(ReportExpectation::Failed({"report0"})); | |
| 559 | |
| 560 // Advance the clock a bit and trigger another report. | |
| 561 AdvanceClock(base::TimeDelta::FromHours(5)); | 547 AdvanceClock(base::TimeDelta::FromHours(5)); |
| 562 | 548 service()->Send(MakeReport("report1")); |
| 563 service()->Send("report1"); | 549 test_helper()->WaitForRequestsDestroyed( |
| 564 WaitForRequestsDestroyed(ReportExpectation::Failed({"report1"})); | 550 ReportExpectation::Failed({"report0", "report1"})); |
| 565 | 551 |
| 566 // Advance the clock to 20 hours, putting it 25 hours ahead of the reference | 552 // Advance the clock to 20 hours, putting it 25 hours ahead of the reference |
| 567 // time. This makes the report0 older than max age (24 hours). The report1 is | 553 // time. This makes the report0 older than max age (24 hours). The report1 is |
| 568 // now 20 hours old. | 554 // now 20 hours old. |
| 569 AdvanceClock(base::TimeDelta::FromHours(20)); | 555 AdvanceClock(base::TimeDelta::FromHours(20)); |
| 570 // Send pending reports. report0 should be discarded since it's too old. | 556 // Send pending reports. report0 should be discarded since it's too old. |
| 571 // report1 should be queued again. | 557 // report1 should be queued again. |
| 572 service()->SendPending(); | 558 service()->SendPending(); |
| 573 WaitForRequestsDestroyed(ReportExpectation::Failed({"report1"})); | 559 test_helper()->WaitForRequestsDestroyed( |
| 560 ReportExpectation::Failed({"report1"})); |
| 574 | 561 |
| 575 // Send a third report. | 562 // Send a third report. |
| 576 service()->Send("report2"); | 563 service()->Send(MakeReport("report2")); |
| 577 WaitForRequestsDestroyed(ReportExpectation::Failed({"report2"})); | 564 test_helper()->WaitForRequestsDestroyed( |
| 565 ReportExpectation::Failed({"report2"})); |
| 578 | 566 |
| 579 // Advance the clock 5 hours. The report1 will now be 25 hours old. | 567 // Advance the clock 5 hours. The report1 will now be 25 hours old. |
| 580 AdvanceClock(base::TimeDelta::FromHours(5)); | 568 AdvanceClock(base::TimeDelta::FromHours(5)); |
| 581 // Send pending reports. report1 should be discarded since it's too old. | 569 // Send pending reports. report1 should be discarded since it's too old. |
| 582 // report2 should be queued again. | 570 // report2 should be queued again. |
| 583 service()->SendPending(); | 571 service()->SendPending(); |
| 584 WaitForRequestsDestroyed(ReportExpectation::Failed({"report2"})); | 572 test_helper()->WaitForRequestsDestroyed( |
| 573 ReportExpectation::Failed({"report2"})); |
| 585 | 574 |
| 586 // Advance the clock 20 hours again so that report2 is 25 hours old and is | 575 // Advance the clock 20 hours again so that report2 is 25 hours old and is |
| 587 // older than max age (24 hours) | 576 // older than max age (24 hours) |
| 588 AdvanceClock(base::TimeDelta::FromHours(20)); | 577 AdvanceClock(base::TimeDelta::FromHours(20)); |
| 589 // Send pending reports. report2 should be discarded since it's too old. No | 578 // Send pending reports. report2 should be discarded since it's too old. No |
| 590 // other reports remain. | 579 // other reports remain. |
| 591 service()->SendPending(); | 580 service()->SendPending(); |
| 592 } | 581 } |
| 593 | 582 |
| 594 TEST_F(CertificateReportingServiceTest, DiscardOldReports) { | 583 TEST_F(CertificateReportingServiceTest, DiscardOldReports) { |
| 595 SetExpectedFailedReportCountOnTearDown(7); | 584 SetExpectedFailedReportCountOnTearDown(7); |
| 596 | 585 |
| 597 SetNow(base::Time::Now()); | 586 SetNow(base::Time::Now()); |
| 598 // Let all reports fail. | 587 // Let all reports fail. |
| 599 test_helper()->SetFailureMode( | 588 test_helper()->SetFailureMode( |
| 600 certificate_reporting_test_utils::ReportSendingResult::REPORTS_FAIL); | 589 certificate_reporting_test_utils::ReportSendingResult::REPORTS_FAIL); |
| 601 | 590 |
| 602 // Send a failed report. | |
| 603 service()->Send("report0"); | |
| 604 WaitForRequestsDestroyed(ReportExpectation::Failed({"report0"})); | |
| 605 | |
| 606 // Send three more reports within five hours of each other. After this: | 591 // Send three more reports within five hours of each other. After this: |
| 607 // report0 is 0 hours after reference time (15 hours old). | 592 // report0 is 0 hours after reference time (15 hours old). |
| 608 // report1 is 5 hours after reference time (10 hours old). | 593 // report1 is 5 hours after reference time (10 hours old). |
| 609 // report2 is 10 hours after reference time (5 hours old). | 594 // report2 is 10 hours after reference time (5 hours old). |
| 610 // report3 is 15 hours after reference time (0 hours old). | 595 // report3 is 15 hours after reference time (0 hours old). |
| 611 AdvanceClock(base::TimeDelta::FromHours(5)); | 596 service()->Send(MakeReport("report0")); |
| 612 service()->Send("report1"); | |
| 613 | 597 |
| 614 AdvanceClock(base::TimeDelta::FromHours(5)); | 598 AdvanceClock(base::TimeDelta::FromHours(5)); |
| 615 service()->Send("report2"); | 599 service()->Send(MakeReport("report1")); |
| 616 | 600 |
| 617 AdvanceClock(base::TimeDelta::FromHours(5)); | 601 AdvanceClock(base::TimeDelta::FromHours(5)); |
| 618 service()->Send("report3"); | 602 service()->Send(MakeReport("report2")); |
| 619 WaitForRequestsDestroyed( | 603 |
| 620 ReportExpectation::Failed({"report1", "report2", "report3"})); | 604 AdvanceClock(base::TimeDelta::FromHours(5)); |
| 605 service()->Send(MakeReport("report3")); |
| 606 test_helper()->WaitForRequestsDestroyed( |
| 607 ReportExpectation::Failed({"report0", "report1", "report2", "report3"})); |
| 621 | 608 |
| 622 // Send pending reports. Four reports were generated above, but the service | 609 // Send pending reports. Four reports were generated above, but the service |
| 623 // only queues three reports, so the very first one should be dropped since | 610 // only queues three reports, so the very first one should be dropped since |
| 624 // it's the oldest. | 611 // it's the oldest. |
| 625 service()->SendPending(); | 612 service()->SendPending(); |
| 626 WaitForRequestsDestroyed( | 613 test_helper()->WaitForRequestsDestroyed( |
| 627 ReportExpectation::Failed({"report1", "report2", "report3"})); | 614 ReportExpectation::Failed({"report1", "report2", "report3"})); |
| 628 | 615 |
| 629 // Let all reports succeed. | 616 // Let all reports succeed. |
| 630 test_helper()->SetFailureMode(certificate_reporting_test_utils:: | 617 test_helper()->SetFailureMode(certificate_reporting_test_utils:: |
| 631 ReportSendingResult::REPORTS_SUCCESSFUL); | 618 ReportSendingResult::REPORTS_SUCCESSFUL); |
| 632 | 619 |
| 633 // Advance the clock by 15 hours. Current time is now 30 hours after reference | 620 // Advance the clock by 15 hours. Current time is now 30 hours after reference |
| 634 // time. The ages of reports are now as follows: | 621 // time. The ages of reports are now as follows: |
| 635 // report1 is 25 hours old. | 622 // report1 is 25 hours old. |
| 636 // report2 is 20 hours old. | 623 // report2 is 20 hours old. |
| 637 // report3 is 15 hours old. | 624 // report3 is 15 hours old. |
| 638 AdvanceClock(base::TimeDelta::FromHours(15)); | 625 AdvanceClock(base::TimeDelta::FromHours(15)); |
| 639 // Send pending reports. Only report2 and report3 should be sent, report1 | 626 // Send pending reports. Only report2 and report3 should be sent, report1 |
| 640 // should be ignored because it's too old. | 627 // should be ignored because it's too old. |
| 641 service()->SendPending(); | 628 service()->SendPending(); |
| 642 WaitForRequestsDestroyed( | 629 test_helper()->WaitForRequestsDestroyed( |
| 643 ReportExpectation::Successful({"report2", "report3"})); | 630 ReportExpectation::Successful({"report2", "report3"})); |
| 644 | 631 |
| 645 // Do a final send. No reports should be sent. | 632 // Do a final send. No reports should be sent. |
| 646 service()->SendPending(); | 633 service()->SendPending(); |
| 647 } | 634 } |
| 648 | 635 |
| 649 // A delayed report should successfully upload when it's resumed. | 636 // A delayed report should successfully upload when it's resumed. |
| 650 TEST_F(CertificateReportingServiceTest, Delayed_Resumed) { | 637 TEST_F(CertificateReportingServiceTest, Delayed_Resumed) { |
| 651 SetExpectedFailedReportCountOnTearDown(0); | 638 SetExpectedFailedReportCountOnTearDown(0); |
| 652 | 639 |
| 653 // Let reports hang. | 640 // Let reports hang. |
| 654 test_helper()->SetFailureMode( | 641 test_helper()->SetFailureMode( |
| 655 certificate_reporting_test_utils::ReportSendingResult::REPORTS_DELAY); | 642 certificate_reporting_test_utils::ReportSendingResult::REPORTS_DELAY); |
| 656 // Send a report. The report upload hangs, so no error or success callbacks | 643 // Send a report. The report upload hangs, so no error or success callbacks |
| 657 // should be called. | 644 // should be called. |
| 658 service()->Send("report0"); | 645 service()->Send(MakeReport("report0")); |
| 659 | 646 |
| 660 // Resume the report upload and run the callbacks. The report should be | 647 // Resume the report upload and run the callbacks. The report should be |
| 661 // successfully sent. | 648 // successfully sent. |
| 662 test_helper()->ResumeDelayedRequest(base::Bind(&base::DoNothing)); | 649 test_helper()->ResumeDelayedRequest(); |
| 663 WaitForRequestsDestroyed(ReportExpectation::Delayed({"report0"})); | 650 test_helper()->WaitForRequestsDestroyed( |
| 651 ReportExpectation::Delayed({"report0"})); |
| 664 } | 652 } |
| 665 | 653 |
| 666 // Delayed reports should cleaned when the service is reset. | 654 // Delayed reports should cleaned when the service is reset. |
| 667 TEST_F(CertificateReportingServiceTest, Delayed_Reset) { | 655 TEST_F(CertificateReportingServiceTest, Delayed_Reset) { |
| 668 SetExpectedFailedReportCountOnTearDown(0); | 656 SetExpectedFailedReportCountOnTearDown(0); |
| 669 | 657 |
| 670 // Let reports hang. | 658 // Let reports hang. |
| 671 test_helper()->SetFailureMode( | 659 test_helper()->SetFailureMode( |
| 672 certificate_reporting_test_utils::ReportSendingResult::REPORTS_DELAY); | 660 certificate_reporting_test_utils::ReportSendingResult::REPORTS_DELAY); |
| 673 // Send a report. The report is triggered but hangs, so no error or success | 661 // Send a report. The report is triggered but hangs, so no error or success |
| 674 // callbacks should be called. | 662 // callbacks should be called. |
| 675 service()->Send("report0"); | 663 service()->Send(MakeReport("report0")); |
| 676 | 664 |
| 677 // Disable the service. This should reset the reporting service and | 665 // Disable the service. This should reset the reporting service and |
| 678 // clear all pending reports. | 666 // clear all pending reports. |
| 679 SetServiceEnabledAndWait(false); | 667 SetServiceEnabledAndWait(false); |
| 680 | 668 |
| 681 // Resume delayed report. No report should be observed since the service | 669 // Resume delayed report. No report should be observed since the service |
| 682 // should have reset and all pending reports should be cleared. If any report | 670 // should have reset and all pending reports should be cleared. If any report |
| 683 // is observed, the next WaitForRequestsDestroyed() will fail. | 671 // is observed, the next test_helper()->WaitForRequestsDestroyed() will fail. |
| 684 test_helper()->ResumeDelayedRequest(base::Bind(&base::DoNothing)); | 672 test_helper()->ResumeDelayedRequest(); |
| 685 | 673 |
| 686 // Enable the service. | 674 // Enable the service. |
| 687 SetServiceEnabledAndWait(true); | 675 SetServiceEnabledAndWait(true); |
| 688 | 676 |
| 689 // Send a report. The report is triggered but hangs, so no error or success | 677 // Send a report. The report is triggered but hangs, so no error or success |
| 690 // callbacks should be called. The report id is again 0 since the pending | 678 // callbacks should be called. The report id is again 0 since the pending |
| 691 // report queue has been cleared above. | 679 // report queue has been cleared above. |
| 692 service()->Send("report1"); | 680 service()->Send(MakeReport("report1")); |
| 693 | 681 |
| 694 // Resume delayed report. Two reports are successfully sent. | 682 // Resume delayed report. Two reports are successfully sent. |
| 695 test_helper()->ResumeDelayedRequest(base::Bind(&base::DoNothing)); | 683 test_helper()->ResumeDelayedRequest(); |
| 696 WaitForRequestsDestroyed(ReportExpectation::Delayed({"report0", "report1"})); | 684 test_helper()->WaitForRequestsDestroyed( |
| 685 ReportExpectation::Delayed({"report0", "report1"})); |
| 697 } | 686 } |
| OLD | NEW |