Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(252)

Side by Side Diff: chrome/browser/safe_browsing/certificate_reporting_service_browsertest.cc

Issue 2503243003: Wire up CertificateReportingService to handle report uploads (Closed)
Patch Set: Fix metrics provider - based on crrev.com/2531023002 Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "chrome/browser/safe_browsing/certificate_reporting_service.h"
6
7 #include "base/base_switches.h"
8 #include "base/command_line.h"
9 #include "base/macros.h"
10 #include "base/test/histogram_tester.h"
11 #include "base/test/simple_test_clock.h"
12 #include "base/test/thread_test_helper.h"
13 #include "base/time/clock.h"
14 #include "base/time/time.h"
15 #include "chrome/browser/profiles/profile.h"
16 #include "chrome/browser/safe_browsing/certificate_reporting_service_factory.h"
17 #include "chrome/browser/safe_browsing/certificate_reporting_service_test_utils. h"
18 #include "chrome/browser/ssl/certificate_reporting_test_utils.h"
19 #include "chrome/browser/ui/browser.h"
20 #include "chrome/browser/ui/tabs/tab_strip_model.h"
21 #include "chrome/common/pref_names.h"
22 #include "chrome/test/base/in_process_browser_test.h"
23 #include "chrome/test/base/ui_test_utils.h"
24 #include "components/certificate_reporting/error_report.h"
25 #include "components/prefs/pref_service.h"
26 #include "components/variations/variations_switches.h"
27 #include "content/public/browser/web_contents.h"
28 #include "content/public/test/browser_test_utils.h"
29 #include "content/public/test/test_utils.h"
30 #include "net/dns/mock_host_resolver.h"
31 #include "net/test/embedded_test_server/embedded_test_server.h"
32 #include "net/url_request/report_sender.h"
33 #include "net/url_request/url_request_context_getter.h"
34 #include "net/url_request/url_request_filter.h"
35 #include "net/url_request/url_request_test_util.h"
36 #include "url/scheme_host_port.h"
37
38 using certificate_reporting_test_utils::CertificateReportingServiceTestHelper;
39 using certificate_reporting_test_utils::ReportExpectation;
40
41 namespace {
42
43 const char* kFailedReportHistogram = "SSL.CertificateErrorReportFailure";
44
45 void CleanUpOnIOThread() {
46 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
47 net::URLRequestFilter::GetInstance()->ClearHandlers();
48 }
49
50 } // namespace
51
52 namespace safe_browsing {
53
54 // These tests check the whole mechanism to send and queue invalid certificate
55 // reports. Each test triggers reports by visiting broken SSL pages. The reports
56 // succeed, fail or hang indefinitely. The test waits for the URL requests
57 // corresponding to the reports to to be created via the URL request
58 // interceptor. When reports are expected to succeed or fail, test teardown
59 // checks that there are no in-flight or pending reports in the
60 // CertificateReportingService queue. When a report is to be delayed, a single
61 // in-flight report is expected in CertificateReportingService. Since the actual
62 // URL requests for reports are sent from the IO thread, the tests wait for the
63 // IO thread to finish before checking the expected report counts.
64 //
65 // Note that these browser tests differ from the unit tests in how they check
66 // expected reports: Unit tests create a network delegate and observe the
67 // destruction of the URL requests, whereas browser tests wait for the URL
68 // requests to be created instead.
69 class CertificateReportingServiceBrowserTest : public InProcessBrowserTest {
70 public:
71 CertificateReportingServiceBrowserTest()
72 : https_server_(net::EmbeddedTestServer::TYPE_HTTPS),
73 expect_delayed_report_on_teardown_(false) {}
74
75 void SetUpOnMainThread() override {
76 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
77 host_resolver()->AddRule("*", "127.0.0.1");
78
79 https_server_.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
80 https_server_.ServeFilesFromSourceDirectory("chrome/test/data");
81 ASSERT_TRUE(https_server_.Start());
82
83 test_helper_.SetUpInterceptor();
84
85 CertificateReportingServiceFactory::GetInstance()
86 ->SetReportEncryptionParamsForTesting(
87 test_helper_.server_public_key(),
88 test_helper_.server_public_key_version());
89 InProcessBrowserTest::SetUpOnMainThread();
90 }
91
92 void TearDownOnMainThread() override {
93 CheckExpectedReportCounts(expect_delayed_report_on_teardown_);
94 content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE,
95 base::Bind(&CleanUpOnIOThread));
96 // Check the histogram as the last thing. This makes sure no in-flight
97 // report is missed.
98 if (num_expected_failed_report_ != 0) {
99 histogram_tester_.ExpectUniqueSample(kFailedReportHistogram,
estark 2016/12/22 00:11:44 nit: I think you can get rid of the conditional? M
meacer 2016/12/22 00:46:26 Unfortunately no. The histogram isn't created unti
100 -net::ERR_SSL_PROTOCOL_ERROR,
101 num_expected_failed_report_);
102 } else {
103 histogram_tester_.ExpectTotalCount(kFailedReportHistogram, 0);
104 }
105 }
106
107 void SetUpCommandLine(base::CommandLine* command_line) override {
108 command_line->AppendSwitchASCII(
109 switches::kForceFieldTrials,
110 "ReportCertificateErrors/ShowAndPossiblySend/");
111 // Setting the sending threshold to 1.0 ensures reporting is enabled.
112 command_line->AppendSwitchASCII(
113 variations::switches::kForceFieldTrialParams,
114 "ReportCertificateErrors.ShowAndPossiblySend:sendingThreshold/1.0");
115 }
116
117 CertificateReportingServiceTestHelper* test_helper() { return &test_helper_; }
118
119 protected:
120 CertificateReportingServiceFactory* factory() {
121 return CertificateReportingServiceFactory::GetInstance();
122 }
123
124 // Sends a report using the provided hostname. Navigates to an interstitial
125 // page on this hostname and away from it to trigger a report.
126 void SendReport(const std::string& hostname) {
127 // Create an HTTPS URL from the hostname. This will resolve to the HTTPS
128 // server and cause an SSL error.
129 const GURL kCertErrorURL(
130 url::SchemeHostPort("https", hostname, https_server_.port()).GetURL());
131
132 // Navigate to the page with SSL error.
133 TabStripModel* tab_strip_model = browser()->tab_strip_model();
134 content::WebContents* contents = tab_strip_model->GetActiveWebContents();
135 ui_test_utils::NavigateToURL(browser(), kCertErrorURL);
136 content::WaitForInterstitialAttach(contents);
137
138 // Navigate away from the interstitial to trigger report upload.
139 ui_test_utils::NavigateToURL(browser(), GURL("about:blank"));
140 content::WaitForInterstitialDetach(contents);
141 WaitForIOThread();
142 }
143
144 void SendPendingReports() { service()->SendPending(); }
145
146 // Checks that there are no outstanding reports.
147 // If |expect_delayed_report_on_teardown| is true, expects a single delayed
148 // report.
149 void CheckNoReports() { CheckExpectedReportCounts(false); }
150
151 // Changes opt-in status and waits for the cert reporting service to reset.
152 // Can only be used after the service is initialized. When changing the
153 // value at the beginning of a test,
154 // certificate_reporting_test_utils::SetCertReportingOptIn should be used
155 // instead since the service is only created upon first SSL error.
156 // Changing the opt-in status synchronously fires
157 // CertificateReportingService::PreferenceObserver::OnPreferenceChanged which
158 // will call CertificateReportingService::SetEnabled() which in turn posts
159 // a task to the IO thread to reset the service. Waiting for the IO thread
160 // ensures that the service is reset before returning from this method.
161 void ChangeOptInAndWait(certificate_reporting_test_utils::OptIn opt_in) {
162 certificate_reporting_test_utils::SetCertReportingOptIn(browser(), opt_in);
163 WaitForIOThread();
164 }
165
166 // Same as ChangeOptInAndWait, but enables/disables SafeBrowsing instead.
167 void ToggleSafeBrowsingAndWaitForServiceReset(bool safebrowsing_enabled) {
168 browser()->profile()->GetPrefs()->SetBoolean(prefs::kSafeBrowsingEnabled,
169 safebrowsing_enabled);
170 WaitForIOThread();
171 }
172
173 void ShutdownServiceAndWait() {
174 service()->Shutdown();
175 WaitForIOThread();
176 }
177
178 // Waits for a number of URL requests to be created for the reports in
179 // |expectation| and checks that the reports in |expectation| matches the
180 // reports observed by URL request interceptor.
181 void WaitForReports(const ReportExpectation& expectation) {
182 test_helper_.interceptor()->WaitForReports(expectation.num_reports());
183 std::set<std::string> expected_hostnames;
184 CheckReports(expectation.successful_reports,
185 test_helper_.interceptor()->successful_reports());
186 CheckReports(expectation.failed_reports,
187 test_helper_.interceptor()->failed_reports());
188 CheckReports(expectation.delayed_reports,
189 test_helper_.interceptor()->delayed_reports());
190 test_helper_.interceptor()->ClearObservedReports();
191 }
192
193 // Resumes the delayed request and waits for the resume task to complete which
194 // in turn means the response starts.
195 void ResumeDelayedRequestAndWait() {
196 base::RunLoop run_loop;
197 test_helper_.ResumeDelayedRequest(run_loop.QuitClosure());
198 run_loop.Run();
199 }
200
201 // Tells the test to expect a delayed report during test teardown. If not set,
202 // the tests expect no in-flight reports during teardown.
203 void SetExpectDelayedReportOnTeardown() {
204 expect_delayed_report_on_teardown_ = true;
205 }
206
207 void SetExpectedHistogramCountOnTeardown(
208 unsigned int num_expected_failed_report) {
209 num_expected_failed_report_ = num_expected_failed_report;
210 }
211
212 private:
213 CertificateReportingService* service() const {
214 return CertificateReportingServiceFactory::GetForBrowserContext(
215 browser()->profile());
216 }
217
218 // Waits for pending tasks on the IO thread to complete.
219 void WaitForIOThread() {
220 scoped_refptr<base::ThreadTestHelper> io_helper(new base::ThreadTestHelper(
221 content::BrowserThread::GetTaskRunnerForThread(
222 content::BrowserThread::IO)
223 .get()));
224 ASSERT_TRUE(io_helper->Run());
225 }
226
227 // Checks that the serialized reports in |received_reports| have the same
228 // hostnames as |expected_hostnames|.
229 void CheckReports(const std::set<std::string>& expected_hostnames,
230 const std::set<std::string>& received_reports) {
231 std::set<std::string> received_hostnames;
232 for (const std::string& serialized_report : received_reports) {
233 certificate_reporting::ErrorReport report;
234 ASSERT_TRUE(report.InitializeFromString(serialized_report));
235 received_hostnames.insert(report.hostname());
236 }
237 EXPECT_EQ(expected_hostnames, received_hostnames);
238 }
239
240 // Checks that there are no remaining successful and failed reports observed
241 // by the interceptor. If |expect_delayed_report| is true, expects a single
242 // delayed report. Otherwise, expects no delayed reports.
243 void CheckExpectedReportCounts(bool expect_delayed_report) {
244 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
245 WaitForIOThread();
estark 2016/12/22 00:11:44 nit: this could use a line of explanation, e.g. //
meacer 2016/12/22 00:46:26 Done.
246 EXPECT_TRUE(test_helper_.interceptor()->successful_reports().empty());
247 EXPECT_TRUE(test_helper_.interceptor()->failed_reports().empty());
248
249 if (expect_delayed_report)
250 EXPECT_EQ(1u, test_helper_.interceptor()->delayed_reports().size());
251 else
252 EXPECT_TRUE(test_helper_.interceptor()->delayed_reports().empty());
253
254 if (service()->GetReporterForTesting()) {
255 // Reporter can be null if reporting is disabled.
256 size_t num_inflight_reports = expect_delayed_report ? 1u : 0u;
257 EXPECT_EQ(num_inflight_reports,
258 service()
259 ->GetReporterForTesting()
260 ->inflight_report_count_for_testing());
261 }
262 }
263
264 net::EmbeddedTestServer https_server_;
265 // If true, the test will expect to see a delayed report during test teardown.
266 bool expect_delayed_report_on_teardown_ = false;
267
268 unsigned int num_expected_failed_report_ = 0;
269
270 CertificateReportingServiceTestHelper test_helper_;
271
272 base::HistogramTester histogram_tester_;
273
274 DISALLOW_COPY_AND_ASSIGN(CertificateReportingServiceBrowserTest);
275 };
276
277 // Tests that report send attempt should be cancelled when extended
278 // reporting is not opted in.
279 IN_PROC_BROWSER_TEST_F(CertificateReportingServiceBrowserTest,
280 NotOptedIn_ShouldNotSendReports) {
281 SetExpectedHistogramCountOnTeardown(0);
282
283 certificate_reporting_test_utils::SetCertReportingOptIn(
284 browser(),
285 certificate_reporting_test_utils::EXTENDED_REPORTING_DO_NOT_OPT_IN);
286 // Send a report. Test teardown checks for created and in-flight requests. If
287 // a report was incorrectly sent, the test will fail.
288 SendReport("no-report");
289 }
290
291 // Tests that report send attempts are not cancelled when extended reporting is
292 // opted in. Goes to an interstitial page and navigates away to force a report
293 // send event.
294 IN_PROC_BROWSER_TEST_F(CertificateReportingServiceBrowserTest,
295 OptedIn_ShouldSendSuccessfulReport) {
296 SetExpectedHistogramCountOnTeardown(0);
297
298 certificate_reporting_test_utils::SetCertReportingOptIn(
299 browser(), certificate_reporting_test_utils::EXTENDED_REPORTING_OPT_IN);
300
301 // Let reports uploads successfully complete.
302 test_helper()->SetFailureMode(certificate_reporting_test_utils::
303 ReportSendingResult::REPORTS_SUCCESSFUL);
304
305 // Reporting is opted in, so the report should succeed.
306 SendReport("report0");
307 WaitForReports(ReportExpectation::Successful({"report0"}));
308 }
309
310 // Tests that report send attempts are not cancelled when extended reporting is
311 // opted in. Goes to an interstitial page and navigate away to force a report
312 // send event. Repeats this three times and checks expected number of reports.
313 IN_PROC_BROWSER_TEST_F(CertificateReportingServiceBrowserTest,
314 OptedIn_ShouldQueueFailedReport) {
315 SetExpectedHistogramCountOnTeardown(2);
316
317 certificate_reporting_test_utils::SetCertReportingOptIn(
318 browser(), certificate_reporting_test_utils::EXTENDED_REPORTING_OPT_IN);
319 // Let all reports fail.
320 test_helper()->SetFailureMode(
321 certificate_reporting_test_utils::ReportSendingResult::REPORTS_FAIL);
322
323 // Send a failed report.
324 SendReport("report0");
325 WaitForReports(ReportExpectation::Failed({"report0"}));
326
327 // Send another failed report.
328 SendReport("report1");
329 WaitForReports(ReportExpectation::Failed({"report1"}));
330
331 // Let all report uploads complete successfully now.
332 test_helper()->SetFailureMode(certificate_reporting_test_utils::
333 ReportSendingResult::REPORTS_SUCCESSFUL);
334
335 // Send another report. This time the report should be successfully sent.
336 SendReport("report2");
337 WaitForReports(ReportExpectation::Successful({"report2"}));
338
339 // Send all pending reports. The two previously failed reports should have
340 // been queued, and now be sent successfully.
341 SendPendingReports();
342 WaitForReports(ReportExpectation::Successful({"report0", "report1"}));
343
344 // Try sending pending reports again. Since there is no pending report,
345 // nothing should be sent this time. If any report is sent, test teardown
346 // will catch it.
347 SendPendingReports();
348 }
349
350 // Opting in then opting out of extended reporting should clear the pending
351 // report queue.
352 IN_PROC_BROWSER_TEST_F(CertificateReportingServiceBrowserTest,
353 OptedIn_ThenOptedOut) {
354 SetExpectedHistogramCountOnTeardown(1);
355
356 certificate_reporting_test_utils::SetCertReportingOptIn(
357 browser(), certificate_reporting_test_utils::EXTENDED_REPORTING_OPT_IN);
358 // Let all reports fail.
359 test_helper()->SetFailureMode(
360 certificate_reporting_test_utils::ReportSendingResult::REPORTS_FAIL);
361
362 // Send a failed report.
363 SendReport("report0");
364 WaitForReports(ReportExpectation::Failed({"report0"}));
365
366 // Disable reporting. This should clear all pending reports.
367 ChangeOptInAndWait(
368 certificate_reporting_test_utils::EXTENDED_REPORTING_DO_NOT_OPT_IN);
369
370 // Send pending reports. No reports should be observed during test teardown.
371 SendPendingReports();
372 }
373
374 // Opting out, then in, then out of extended reporting should work as expected.
375 IN_PROC_BROWSER_TEST_F(CertificateReportingServiceBrowserTest,
376 OptedOut_ThenOptedIn_ThenOptedOut) {
377 SetExpectedHistogramCountOnTeardown(1);
378
379 certificate_reporting_test_utils::SetCertReportingOptIn(
380 browser(),
381 certificate_reporting_test_utils::EXTENDED_REPORTING_DO_NOT_OPT_IN);
382 // Let all reports fail.
383 test_helper()->SetFailureMode(
384 certificate_reporting_test_utils::ReportSendingResult::REPORTS_FAIL);
385
386 // Send attempt should be cancelled since reporting is opted out.
387 SendReport("no-report");
388 CheckNoReports();
389
390 // Enable reporting.
391 ChangeOptInAndWait(
392 certificate_reporting_test_utils::EXTENDED_REPORTING_OPT_IN);
393
394 // A failed report should be observed.
395 SendReport("report0");
396 WaitForReports(ReportExpectation::Failed({"report0"}));
397
398 // Disable reporting. This should reset the reporting service and
399 // clear all pending reports.
400 ChangeOptInAndWait(
401 certificate_reporting_test_utils::EXTENDED_REPORTING_DO_NOT_OPT_IN);
402
403 // Report should be cancelled since reporting is opted out.
404 SendReport("report1");
405 CheckNoReports();
406
407 // Send pending reports. Nothing should be sent since there aren't any
408 // pending reports. If any report is sent, test teardown will catch it.
409 SendPendingReports();
410 }
411
412 // Disabling SafeBrowsing should clear pending reports queue in
413 // CertificateReportingService.
414 IN_PROC_BROWSER_TEST_F(CertificateReportingServiceBrowserTest,
415 DisableSafebrowsing) {
416 SetExpectedHistogramCountOnTeardown(2);
417
418 certificate_reporting_test_utils::SetCertReportingOptIn(
419 browser(), certificate_reporting_test_utils::EXTENDED_REPORTING_OPT_IN);
420 // Let all reports fail.
421 test_helper()->SetFailureMode(
422 certificate_reporting_test_utils::ReportSendingResult::REPORTS_FAIL);
423
424 // Send a failed report.
425 SendReport("report0");
426 WaitForReports(ReportExpectation::Failed({"report0"}));
427
428 // Disable SafeBrowsing. This should clear all pending reports.
429 ToggleSafeBrowsingAndWaitForServiceReset(false);
430
431 // Send pending reports. No reports should be observed.
432 SendPendingReports();
433 CheckNoReports();
434
435 // Re-enable SafeBrowsing and trigger another report which will be queued.
436 ToggleSafeBrowsingAndWaitForServiceReset(true);
437 SendReport("report1");
438 WaitForReports(ReportExpectation::Failed({"report1"}));
439
440 // Queued report should now be successfully sent.
441 test_helper()->SetFailureMode(certificate_reporting_test_utils::
442 ReportSendingResult::REPORTS_SUCCESSFUL);
443 SendPendingReports();
444 WaitForReports(ReportExpectation::Successful({"report1"}));
445 }
446
447 // CertificateReportingService should ignore reports older than the report TTL.
448 IN_PROC_BROWSER_TEST_F(CertificateReportingServiceBrowserTest,
449 DontSendOldReports) {
450 SetExpectedHistogramCountOnTeardown(5);
451
452 base::SimpleTestClock* clock = new base::SimpleTestClock();
453 base::Time reference_time = base::Time::Now();
454 clock->SetNow(reference_time);
455 factory()->SetClockForTesting(std::unique_ptr<base::Clock>(clock));
456
457 // The service should ignore reports older than 24 hours.
458 factory()->SetQueuedReportTTLForTesting(base::TimeDelta::FromHours(24));
459
460 certificate_reporting_test_utils::SetCertReportingOptIn(
461 browser(), certificate_reporting_test_utils::EXTENDED_REPORTING_OPT_IN);
462
463 // Let all reports fail.
464 test_helper()->SetFailureMode(
465 certificate_reporting_test_utils::ReportSendingResult::REPORTS_FAIL);
466
467 // Send a failed report.
468 SendReport("report0");
469 WaitForReports(ReportExpectation::Failed({"report0"}));
470
471 // Advance the clock a bit and trigger another failed report.
472 clock->Advance(base::TimeDelta::FromHours(5));
473 SendReport("report1");
474 WaitForReports(ReportExpectation::Failed({"report1"}));
475
476 // Advance the clock to 20 hours, putting it 25 hours ahead of the reference
477 // time. This makes report0 older than 24 hours. report1 is now 20 hours.
478 clock->Advance(base::TimeDelta::FromHours(20));
479
480 // Send pending reports. report0 should be discarded since it's too old.
481 // report1 should be queued again.
482 SendPendingReports();
483 WaitForReports(ReportExpectation::Failed({"report1"}));
484
485 // Trigger another failed report.
486 SendReport("report2");
487 WaitForReports(ReportExpectation::Failed({"report2"}));
488
489 // Advance the clock 5 hours. report1 will now be 25 hours old.
490 clock->Advance(base::TimeDelta::FromHours(5));
491
492 // Send pending reports. report1 should be discarded since it's too old.
493 // report2 should be queued again.
494 SendPendingReports();
495 WaitForReports(ReportExpectation::Failed({"report2"}));
496
497 // Advance the clock 20 hours again so that report2 is 25 hours old and is
498 // older than max age (24 hours).
499 clock->Advance(base::TimeDelta::FromHours(20));
500
501 // Send pending reports. report2 should be discarded since it's too old. No
502 // other reports remain. If any report is sent, test teardown will catch it.
503 SendPendingReports();
504 }
505
506 // CertificateReportingService should drop old reports from its pending report
507 // queue, if the queue is full.
508 IN_PROC_BROWSER_TEST_F(CertificateReportingServiceBrowserTest,
509 DropOldReportsFromQueue) {
510 SetExpectedHistogramCountOnTeardown(7);
511
512 base::SimpleTestClock* clock = new base::SimpleTestClock();
513 base::Time reference_time = base::Time::Now();
514 clock->SetNow(reference_time);
515 factory()->SetClockForTesting(std::unique_ptr<base::Clock>(clock));
516
517 // The service should queue a maximum of 3 reports and ignore reports older
518 // than 24 hours.
519 factory()->SetQueuedReportTTLForTesting(base::TimeDelta::FromHours(24));
520 factory()->SetMaxQueuedReportCountForTesting(3);
521
522 certificate_reporting_test_utils::SetCertReportingOptIn(
523 browser(), certificate_reporting_test_utils::EXTENDED_REPORTING_OPT_IN);
524
525 // Let all reports fail.
526 test_helper()->SetFailureMode(
527 certificate_reporting_test_utils::ReportSendingResult::REPORTS_FAIL);
528
529 // Trigger a failed report.
530 SendReport("report0");
531 WaitForReports(ReportExpectation::Failed({"report0"}));
532
533 // Trigger three more reports within five hours of each other. After this:
534 // report0 is 0 hours after reference time (15 hours old).
535 // report1 is 5 hours after reference time (10 hours old).
536 // report2 is 10 hours after reference time (5 hours old).
537 // report3 is 15 hours after reference time (0 hours old).
538 clock->Advance(base::TimeDelta::FromHours(5));
539 SendReport("report1");
540
541 clock->Advance(base::TimeDelta::FromHours(5));
542 SendReport("report2");
543
544 clock->Advance(base::TimeDelta::FromHours(5));
545 SendReport("report3");
546
547 WaitForReports(ReportExpectation::Failed({"report1", "report2", "report3"}));
548
549 // Send pending reports. Four reports were generated above, but the service
550 // only queues three reports, so report0 should be dropped since it's the
551 // oldest.
552 SendPendingReports();
553 WaitForReports(ReportExpectation::Failed({"report1", "report2", "report3"}));
554
555 // Let all reports succeed.
556 test_helper()->SetFailureMode(certificate_reporting_test_utils::
557 ReportSendingResult::REPORTS_SUCCESSFUL);
558
559 // Advance the clock 15 hours. Current time is now 30 hours after reference
560 // time, and the ages of reports are now as follows:
561 // report1 is 25 hours old.
562 // report2 is 20 hours old.
563 // report3 is 15 hours old.
564 clock->Advance(base::TimeDelta::FromHours(15));
565
566 // Send pending reports. Only reports 2 and 3 should be sent, report 1
567 // should be ignored because it's too old.
568 SendPendingReports();
569 WaitForReports(ReportExpectation::Successful({"report2", "report3"}));
570 }
571
572 // Resume a delayed report after CertificateReportingService shuts down. Should
573 // not crash.
574 IN_PROC_BROWSER_TEST_F(CertificateReportingServiceBrowserTest,
575 Delayed_NotResumed_ShouldNotCrash) {
576 SetExpectedHistogramCountOnTeardown(0);
577
578 certificate_reporting_test_utils::SetCertReportingOptIn(
579 browser(), certificate_reporting_test_utils::EXTENDED_REPORTING_OPT_IN);
580 // Let reports hang.
581 test_helper()->SetFailureMode(
582 certificate_reporting_test_utils::ReportSendingResult::REPORTS_DELAY);
583
584 // Navigate to and away from an interstitial to trigger a report. The report
585 // is triggered but hangs, so no error or success callbacks should be called.
586 SendReport("no-report");
587
588 SetExpectDelayedReportOnTeardown();
589 }
590
591 IN_PROC_BROWSER_TEST_F(CertificateReportingServiceBrowserTest,
592 Delayed_Resumed) {
593 SetExpectedHistogramCountOnTeardown(0);
594
595 certificate_reporting_test_utils::SetCertReportingOptIn(
596 browser(), certificate_reporting_test_utils::EXTENDED_REPORTING_OPT_IN);
597 // Let all reports fail.
598 test_helper()->SetFailureMode(
599 certificate_reporting_test_utils::ReportSendingResult::REPORTS_DELAY);
600
601 // Trigger a report that hangs.
602 SendReport("report0");
603 WaitForReports(ReportExpectation::Delayed({"report0"}));
604
605 // Resume the report upload. The report upload should successfully complete.
606 // The interceptor only observes request creations and not response
607 // completions, so there is nothing to observe.
608 ResumeDelayedRequestAndWait();
609 }
610
611 // Same as above, but the service is shut down before resuming the delayed
612 // request. Should not crash.
613 IN_PROC_BROWSER_TEST_F(CertificateReportingServiceBrowserTest,
614 Delayed_Resumed_ServiceShutdown) {
615 SetExpectedHistogramCountOnTeardown(0);
616
617 certificate_reporting_test_utils::SetCertReportingOptIn(
618 browser(), certificate_reporting_test_utils::EXTENDED_REPORTING_OPT_IN);
619 // Let all reports fail.
620 test_helper()->SetFailureMode(
621 certificate_reporting_test_utils::ReportSendingResult::REPORTS_DELAY);
622
623 // Trigger a report that hangs.
624 SendReport("report0");
625 WaitForReports(ReportExpectation::Delayed({"report0"}));
626
627 // Shutdown the service. Resuming the delayed request shouldn't crash.
628 ShutdownServiceAndWait();
629
630 // Resume the report upload. The report upload should successfully complete.
631 // The interceptor only observes request creations and not response
632 // completions, so there is nothing to observe.
633 ResumeDelayedRequestAndWait();
634 }
635
636 // Trigger a delayed report, then disable Safebrowsing. Certificate reporting
637 // service should clear its in-flight reports list. Resuming
estark 2016/12/22 00:11:44 nit: extra word or unfinished sentence?
meacer 2016/12/22 00:46:26 Done.
638 IN_PROC_BROWSER_TEST_F(CertificateReportingServiceBrowserTest, Delayed_Reset) {
639 SetExpectedHistogramCountOnTeardown(0);
640
641 certificate_reporting_test_utils::SetCertReportingOptIn(
642 browser(), certificate_reporting_test_utils::EXTENDED_REPORTING_OPT_IN);
643 // Let all reports fail.
644 test_helper()->SetFailureMode(
645 certificate_reporting_test_utils::ReportSendingResult::REPORTS_DELAY);
646
647 // Trigger a report that hangs.
648 SendReport("report0");
649 WaitForReports(ReportExpectation::Delayed({"report0"}));
650
651 // Disable SafeBrowsing. This should clear all pending reports.
652 ToggleSafeBrowsingAndWaitForServiceReset(false);
653
654 // Resume delayed report. No response should be observed since all pending
655 // reports should be cleared.
656 ResumeDelayedRequestAndWait();
657 CheckNoReports();
658
659 // Re-enable SafeBrowsing.
660 ToggleSafeBrowsingAndWaitForServiceReset(true);
661
662 // Trigger a report that hangs.
663 SendReport("report1");
664 WaitForReports(ReportExpectation::Delayed({"report1"}));
665
666 // Resume delayed report. By the time the runloop is finished, the response
667 // will be complete and CertificateReportingService will process the
668 // error/success callback for the report. There will be no inflight reports
669 // remaining.
670 ResumeDelayedRequestAndWait();
671 }
672
673 } // namespace safe_browsing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698