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

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

Powered by Google App Engine
This is Rietveld 408576698