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

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

Issue 2605403002: Fix flaky CertificateReportingService browser tests. (Closed)
Patch Set: estark comments Created 3 years, 11 months 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
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_test_utils. h" 5 #include "chrome/browser/safe_browsing/certificate_reporting_service_test_utils. h"
6 6
7 #include "base/threading/thread_task_runner_handle.h" 7 #include "base/threading/thread_task_runner_handle.h"
8 #include "components/certificate_reporting/encrypted_cert_logger.pb.h" 8 #include "components/certificate_reporting/encrypted_cert_logger.pb.h"
9 #include "components/certificate_reporting/error_report.h"
9 #include "content/public/browser/browser_thread.h" 10 #include "content/public/browser/browser_thread.h"
10 #include "content/public/test/test_utils.h" 11 #include "content/public/test/test_utils.h"
11 #include "crypto/curve25519.h" 12 #include "crypto/curve25519.h"
12 #include "net/base/upload_bytes_element_reader.h" 13 #include "net/base/upload_bytes_element_reader.h"
13 #include "net/base/upload_data_stream.h" 14 #include "net/base/upload_data_stream.h"
14 #include "net/test/url_request/url_request_failed_job.h"
15 #include "net/test/url_request/url_request_mock_data_job.h"
16 #include "net/url_request/url_request_filter.h" 15 #include "net/url_request/url_request_filter.h"
17 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
18 17
19 namespace { 18 namespace {
20 19
21 const uint32_t kServerPublicKeyTestVersion = 16; 20 const uint32_t kServerPublicKeyTestVersion = 16;
22 21
23 void SetUpURLHandlersOnIOThread( 22 void SetUpURLHandlersOnIOThread(
24 std::unique_ptr<net::URLRequestInterceptor> url_request_interceptor) { 23 std::unique_ptr<net::URLRequestInterceptor> url_request_interceptor) {
25 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 24 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
(...skipping 22 matching lines...) Expand all
48 encrypted_request.server_public_key_version()); 47 encrypted_request.server_public_key_version());
49 EXPECT_EQ(certificate_reporting::EncryptedCertLoggerRequest:: 48 EXPECT_EQ(certificate_reporting::EncryptedCertLoggerRequest::
50 AEAD_ECDH_AES_128_CTR_HMAC_SHA256, 49 AEAD_ECDH_AES_128_CTR_HMAC_SHA256,
51 encrypted_request.algorithm()); 50 encrypted_request.algorithm());
52 std::string decrypted_report; 51 std::string decrypted_report;
53 certificate_reporting::ErrorReporter::DecryptErrorReport( 52 certificate_reporting::ErrorReporter::DecryptErrorReport(
54 server_private_key, encrypted_request, &decrypted_report); 53 server_private_key, encrypted_request, &decrypted_report);
55 return decrypted_report; 54 return decrypted_report;
56 } 55 }
57 56
57 // Checks that the serialized reports in |observed_reports| have the same
58 // hostnames as |expected_hostnames|.
59 void CompareHostnames(const std::set<std::string>& expected_hostnames,
60 const std::set<std::string>& observed_reports,
61 const std::string& comparison_type) {
62 std::set<std::string> observed_hostnames;
63 for (const std::string& serialized_report : observed_reports) {
64 certificate_reporting::ErrorReport report;
65 ASSERT_TRUE(report.InitializeFromString(serialized_report));
66 observed_hostnames.insert(report.hostname());
67 }
68 EXPECT_EQ(expected_hostnames, observed_hostnames)
69 << "Comparison failed for " << comparison_type << " reports.";
70 }
71
72 void WaitReports(
73 certificate_reporting_test_utils::RequestObserver* observer,
74 const certificate_reporting_test_utils::ReportExpectation& expectation) {
75 observer->Wait(expectation.num_reports());
76 CompareHostnames(expectation.successful_reports,
77 observer->successful_reports(), "successful");
78 CompareHostnames(expectation.failed_reports, observer->failed_reports(),
79 "failed");
80 CompareHostnames(expectation.delayed_reports, observer->delayed_reports(),
81 "delayed");
82 observer->ClearObservedReports();
83 }
84
58 } // namespace 85 } // namespace
59 86
60 namespace certificate_reporting_test_utils { 87 namespace certificate_reporting_test_utils {
61 88
89 RequestObserver::RequestObserver()
90 : num_events_to_wait_for_(0u), num_received_events_(0u) {}
91 RequestObserver::~RequestObserver() {}
92
93 void RequestObserver::Wait(unsigned int num_events_to_wait_for) {
94 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
95 DCHECK(!run_loop_);
96 ASSERT_LE(num_received_events_, num_events_to_wait_for)
97 << "Observed unexpected report";
98
99 if (num_received_events_ < num_events_to_wait_for) {
100 num_events_to_wait_for_ = num_events_to_wait_for;
101 run_loop_.reset(new base::RunLoop());
102 run_loop_->Run();
103 run_loop_.reset(nullptr);
104 EXPECT_EQ(0u, num_received_events_);
105 EXPECT_EQ(0u, num_events_to_wait_for_);
106 } else if (num_received_events_ == num_events_to_wait_for) {
107 num_received_events_ = 0u;
108 num_events_to_wait_for_ = 0u;
109 }
110 }
111
112 void RequestObserver::OnRequest(const std::string& serialized_report,
113 ReportSendingResult report_type) {
114 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
115 switch (report_type) {
116 case REPORTS_SUCCESSFUL:
117 successful_reports_.insert(serialized_report);
118 break;
119 case REPORTS_FAIL:
120 failed_reports_.insert(serialized_report);
121 break;
122 case REPORTS_DELAY:
123 delayed_reports_.insert(serialized_report);
124 break;
125 }
126
127 num_received_events_++;
128 if (!run_loop_) {
129 return;
130 }
131 ASSERT_LE(num_received_events_, num_events_to_wait_for_)
132 << "Observed unexpected report";
133
134 if (num_received_events_ == num_events_to_wait_for_) {
135 num_events_to_wait_for_ = 0u;
136 num_received_events_ = 0u;
137 run_loop_->Quit();
138 }
139 }
140
141 const std::set<std::string>& RequestObserver::successful_reports() const {
142 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
143 return successful_reports_;
144 }
145
146 const std::set<std::string>& RequestObserver::failed_reports() const {
147 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
148 return failed_reports_;
149 }
150
151 const std::set<std::string>& RequestObserver::delayed_reports() const {
152 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
153 return delayed_reports_;
154 }
155
156 void RequestObserver::ClearObservedReports() {
157 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
158 successful_reports_.clear();
159 failed_reports_.clear();
160 delayed_reports_.clear();
161 }
162
62 DelayableCertReportURLRequestJob::DelayableCertReportURLRequestJob( 163 DelayableCertReportURLRequestJob::DelayableCertReportURLRequestJob(
164 bool delayed,
165 bool should_fail,
63 net::URLRequest* request, 166 net::URLRequest* request,
64 net::NetworkDelegate* network_delegate) 167 net::NetworkDelegate* network_delegate,
65 : net::URLRequestJob(request, network_delegate), weak_factory_(this) {} 168 const base::Callback<void()>& destruction_callback)
169 : net::URLRequestJob(request, network_delegate),
170 delayed_(delayed),
171 should_fail_(should_fail),
172 started_(false),
173 destruction_callback_(destruction_callback),
174 weak_factory_(this) {}
66 175
67 DelayableCertReportURLRequestJob::~DelayableCertReportURLRequestJob() {} 176 DelayableCertReportURLRequestJob::~DelayableCertReportURLRequestJob() {
177 content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
178 destruction_callback_);
179 }
68 180
69 base::WeakPtr<DelayableCertReportURLRequestJob> 181 base::WeakPtr<DelayableCertReportURLRequestJob>
70 DelayableCertReportURLRequestJob::GetWeakPtr() { 182 DelayableCertReportURLRequestJob::GetWeakPtr() {
71 return weak_factory_.GetWeakPtr(); 183 return weak_factory_.GetWeakPtr();
72 } 184 }
73 185
74 void DelayableCertReportURLRequestJob::Start() { 186 void DelayableCertReportURLRequestJob::Start() {
75 started_ = true; 187 started_ = true;
76 if (delayed_) { 188 if (delayed_) {
77 // Do nothing until Resume() is called. 189 // Do nothing until Resume() is called.
(...skipping 13 matching lines...) Expand all
91 return 200; 203 return 200;
92 } 204 }
93 205
94 void DelayableCertReportURLRequestJob::GetResponseInfo( 206 void DelayableCertReportURLRequestJob::GetResponseInfo(
95 net::HttpResponseInfo* info) { 207 net::HttpResponseInfo* info) {
96 // Report sender ignores responses. Return empty response. 208 // Report sender ignores responses. Return empty response.
97 } 209 }
98 210
99 void DelayableCertReportURLRequestJob::Resume() { 211 void DelayableCertReportURLRequestJob::Resume() {
100 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 212 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
101 DCHECK(delayed_);
102 if (!started_) { 213 if (!started_) {
103 // If Start() hasn't been called yet, then unset |delayed_| so 214 // If Start() hasn't been called yet, then unset |delayed_| so that when
104 // that when Start() is called, the request will begin 215 // Start() is called, the request will begin immediately.
105 // immediately.
106 delayed_ = false; 216 delayed_ = false;
107 return; 217 return;
108 } 218 }
219 if (should_fail_) {
220 NotifyStartError(net::URLRequestStatus(net::URLRequestStatus::FAILED,
221 net::ERR_SSL_PROTOCOL_ERROR));
222 return;
223 }
109 // Start reading asynchronously as would a normal network request. 224 // Start reading asynchronously as would a normal network request.
110 base::ThreadTaskRunnerHandle::Get()->PostTask( 225 base::ThreadTaskRunnerHandle::Get()->PostTask(
111 FROM_HERE, 226 FROM_HERE,
112 base::Bind(&DelayableCertReportURLRequestJob::NotifyHeadersComplete, 227 base::Bind(&DelayableCertReportURLRequestJob::NotifyHeadersComplete,
113 weak_factory_.GetWeakPtr())); 228 weak_factory_.GetWeakPtr()));
114 } 229 }
115 230
116 CertReportJobInterceptor::CertReportJobInterceptor( 231 CertReportJobInterceptor::CertReportJobInterceptor(
117 ReportSendingResult expected_report_result, 232 ReportSendingResult expected_report_result,
118 const uint8_t* server_private_key) 233 const uint8_t* server_private_key)
(...skipping 10 matching lines...) Expand all
129 244
130 const std::string uploaded_report = 245 const std::string uploaded_report =
131 GetReportContents(request, server_private_key_); 246 GetReportContents(request, server_private_key_);
132 content::BrowserThread::PostTask( 247 content::BrowserThread::PostTask(
133 content::BrowserThread::UI, FROM_HERE, 248 content::BrowserThread::UI, FROM_HERE,
134 base::Bind(&CertReportJobInterceptor::RequestCreated, 249 base::Bind(&CertReportJobInterceptor::RequestCreated,
135 weak_factory_.GetWeakPtr(), uploaded_report, 250 weak_factory_.GetWeakPtr(), uploaded_report,
136 expected_report_result_)); 251 expected_report_result_));
137 252
138 if (expected_report_result_ == REPORTS_FAIL) { 253 if (expected_report_result_ == REPORTS_FAIL) {
139 return new net::URLRequestFailedJob(request, network_delegate, 254 return new DelayableCertReportURLRequestJob(
140 net::ERR_SSL_PROTOCOL_ERROR); 255 false, true, request, network_delegate,
256 base::Bind(&CertReportJobInterceptor::RequestDestructed,
257 base::Unretained(this), uploaded_report,
258 expected_report_result_));
259
141 } else if (expected_report_result_ == REPORTS_DELAY) { 260 } else if (expected_report_result_ == REPORTS_DELAY) {
142 DCHECK(!delayed_request_) << "Supports only one delayed request at a time"; 261 DCHECK(!delayed_request_) << "Supports only one delayed request at a time";
143 DelayableCertReportURLRequestJob* job = 262 DelayableCertReportURLRequestJob* job =
144 new DelayableCertReportURLRequestJob(request, network_delegate); 263 new DelayableCertReportURLRequestJob(
264 true, false, request, network_delegate,
265 base::Bind(&CertReportJobInterceptor::RequestDestructed,
266 base::Unretained(this), uploaded_report,
267 expected_report_result_));
145 delayed_request_ = job->GetWeakPtr(); 268 delayed_request_ = job->GetWeakPtr();
146 return job; 269 return job;
147 } 270 }
148 // Successful url request job. 271 // Successful url request job.
149 return new net::URLRequestMockDataJob(request, network_delegate, "some data", 272 return new DelayableCertReportURLRequestJob(
150 1, false); 273 false, false, request, network_delegate,
274 base::Bind(&CertReportJobInterceptor::RequestDestructed,
275 base::Unretained(this), uploaded_report,
276 expected_report_result_));
151 } 277 }
152 278
153 void CertReportJobInterceptor::SetFailureMode( 279 void CertReportJobInterceptor::SetFailureMode(
154 ReportSendingResult expected_report_result) { 280 ReportSendingResult expected_report_result) {
155 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 281 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
156 content::BrowserThread::PostTask( 282 content::BrowserThread::PostTask(
157 content::BrowserThread::IO, FROM_HERE, 283 content::BrowserThread::IO, FROM_HERE,
158 base::Bind(&CertReportJobInterceptor::SetFailureModeOnIOThread, 284 base::Bind(&CertReportJobInterceptor::SetFailureModeOnIOThread,
159 weak_factory_.GetWeakPtr(), expected_report_result)); 285 weak_factory_.GetWeakPtr(), expected_report_result));
160 } 286 }
161 287
162 void CertReportJobInterceptor::Resume(const base::Callback<void()>& callback) { 288 void CertReportJobInterceptor::Resume() {
163 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 289 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
164 content::BrowserThread::PostTaskAndReply( 290 content::BrowserThread::PostTask(
165 content::BrowserThread::IO, FROM_HERE, 291 content::BrowserThread::IO, FROM_HERE,
166 base::Bind(&CertReportJobInterceptor::ResumeOnIOThread, 292 base::Bind(&CertReportJobInterceptor::ResumeOnIOThread,
167 base::Unretained(this)), 293 base::Unretained(this)));
168 callback);
169 } 294 }
170 295
171 const std::set<std::string>& CertReportJobInterceptor::successful_reports() 296 RequestObserver* CertReportJobInterceptor::request_created_observer() const {
172 const {
173 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 297 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
174 return successful_reports_; 298 return &request_created_observer_;
175 } 299 }
176 300
177 const std::set<std::string>& CertReportJobInterceptor::failed_reports() const { 301 RequestObserver* CertReportJobInterceptor::request_destroyed_observer() const {
178 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 302 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
179 return failed_reports_; 303 return &request_destroyed_observer_;
180 }
181
182 const std::set<std::string>& CertReportJobInterceptor::delayed_reports() const {
183 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
184 return delayed_reports_;
185 }
186
187 void CertReportJobInterceptor::ClearObservedReports() {
188 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
189 successful_reports_.clear();
190 failed_reports_.clear();
191 delayed_reports_.clear();
192 }
193
194 void CertReportJobInterceptor::WaitForReports(int num_reports) {
195 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
196 wait_helper_.Wait(num_reports);
197 } 304 }
198 305
199 void CertReportJobInterceptor::SetFailureModeOnIOThread( 306 void CertReportJobInterceptor::SetFailureModeOnIOThread(
200 ReportSendingResult expected_report_result) { 307 ReportSendingResult expected_report_result) {
201 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 308 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
202 expected_report_result_ = expected_report_result; 309 expected_report_result_ = expected_report_result;
203 } 310 }
204 311
205 void CertReportJobInterceptor::ResumeOnIOThread() { 312 void CertReportJobInterceptor::ResumeOnIOThread() {
206 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 313 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
207 EXPECT_EQ(REPORTS_DELAY, expected_report_result_); 314 EXPECT_EQ(REPORTS_DELAY, expected_report_result_);
208 if (delayed_request_) 315 if (delayed_request_)
209 delayed_request_->Resume(); 316 delayed_request_->Resume();
210 } 317 }
211 318
212 void CertReportJobInterceptor::RequestCreated( 319 void CertReportJobInterceptor::RequestCreated(
213 const std::string& uploaded_report, 320 const std::string& uploaded_report,
214 ReportSendingResult expected_report_result) { 321 ReportSendingResult expected_report_result) const {
215 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 322 request_created_observer_.OnRequest(uploaded_report, expected_report_result);
216 switch (expected_report_result) { 323 }
217 case REPORTS_SUCCESSFUL: 324
218 successful_reports_.insert(uploaded_report); 325 void CertReportJobInterceptor::RequestDestructed(
219 break; 326 const std::string& uploaded_report,
220 case REPORTS_FAIL: 327 ReportSendingResult expected_report_result) const {
221 failed_reports_.insert(uploaded_report); 328 request_destroyed_observer_.OnRequest(uploaded_report,
222 break; 329 expected_report_result);
223 case REPORTS_DELAY:
224 delayed_reports_.insert(uploaded_report);
225 break;
226 }
227 wait_helper_.OnEvent();
228 } 330 }
229 331
230 ReportExpectation::ReportExpectation() {} 332 ReportExpectation::ReportExpectation() {}
231 333
232 ReportExpectation::ReportExpectation(const ReportExpectation& other) = default; 334 ReportExpectation::ReportExpectation(const ReportExpectation& other) = default;
233 335
234 ReportExpectation::~ReportExpectation() {} 336 ReportExpectation::~ReportExpectation() {}
235 337
236 // static 338 // static
237 ReportExpectation ReportExpectation::Successful( 339 ReportExpectation ReportExpectation::Successful(
(...skipping 17 matching lines...) Expand all
255 ReportExpectation expectation; 357 ReportExpectation expectation;
256 expectation.delayed_reports = reports; 358 expectation.delayed_reports = reports;
257 return expectation; 359 return expectation;
258 } 360 }
259 361
260 int ReportExpectation::num_reports() const { 362 int ReportExpectation::num_reports() const {
261 return successful_reports.size() + failed_reports.size() + 363 return successful_reports.size() + failed_reports.size() +
262 delayed_reports.size(); 364 delayed_reports.size();
263 } 365 }
264 366
367 CertificateReportingServiceObserver::CertificateReportingServiceObserver() {}
368
369 CertificateReportingServiceObserver::~CertificateReportingServiceObserver() {}
370
371 void CertificateReportingServiceObserver::Clear() {
372 did_reset_ = false;
373 }
374
375 void CertificateReportingServiceObserver::WaitForReset() {
376 DCHECK(!run_loop_);
377 if (did_reset_)
378 return;
379 run_loop_.reset(new base::RunLoop());
380 run_loop_->Run();
381 run_loop_.reset();
382 }
383
384 void CertificateReportingServiceObserver::OnServiceReset() {
385 did_reset_ = true;
386 if (run_loop_)
387 run_loop_->Quit();
388 }
389
265 CertificateReportingServiceTestHelper::CertificateReportingServiceTestHelper() { 390 CertificateReportingServiceTestHelper::CertificateReportingServiceTestHelper() {
266 memset(server_private_key_, 1, sizeof(server_private_key_)); 391 memset(server_private_key_, 1, sizeof(server_private_key_));
267 crypto::curve25519::ScalarBaseMult(server_private_key_, server_public_key_); 392 crypto::curve25519::ScalarBaseMult(server_private_key_, server_public_key_);
268 } 393 }
269 394
270 CertificateReportingServiceTestHelper:: 395 CertificateReportingServiceTestHelper::
271 ~CertificateReportingServiceTestHelper() {} 396 ~CertificateReportingServiceTestHelper() {}
272 397
273 void CertificateReportingServiceTestHelper::SetUpInterceptor() { 398 void CertificateReportingServiceTestHelper::SetUpInterceptor() {
274 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 399 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
275 url_request_interceptor_ = 400 url_request_interceptor_ =
276 new CertReportJobInterceptor(REPORTS_FAIL, server_private_key_); 401 new CertReportJobInterceptor(REPORTS_FAIL, server_private_key_);
277 content::BrowserThread::PostTask( 402 content::BrowserThread::PostTask(
278 content::BrowserThread::IO, FROM_HERE, 403 content::BrowserThread::IO, FROM_HERE,
279 base::Bind(&SetUpURLHandlersOnIOThread, 404 base::Bind(&SetUpURLHandlersOnIOThread,
280 base::Passed(std::unique_ptr<net::URLRequestInterceptor>( 405 base::Passed(std::unique_ptr<net::URLRequestInterceptor>(
281 url_request_interceptor_)))); 406 url_request_interceptor_))));
282 } 407 }
283 408
284 // Changes the behavior of report uploads to fail or succeed.
285 void CertificateReportingServiceTestHelper::SetFailureMode( 409 void CertificateReportingServiceTestHelper::SetFailureMode(
286 ReportSendingResult expected_report_result) { 410 ReportSendingResult expected_report_result) {
287 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 411 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
288 url_request_interceptor_->SetFailureMode(expected_report_result); 412 url_request_interceptor_->SetFailureMode(expected_report_result);
289 } 413 }
290 414
291 void CertificateReportingServiceTestHelper::ResumeDelayedRequest( 415 void CertificateReportingServiceTestHelper::ResumeDelayedRequest() {
292 const base::Callback<void()>& callback) {
293 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 416 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
294 url_request_interceptor_->Resume(callback); 417 url_request_interceptor_->Resume();
295 } 418 }
296 419
297 uint8_t* CertificateReportingServiceTestHelper::server_public_key() { 420 uint8_t* CertificateReportingServiceTestHelper::server_public_key() {
298 return server_public_key_; 421 return server_public_key_;
299 } 422 }
300 423
301 uint32_t CertificateReportingServiceTestHelper::server_public_key_version() 424 uint32_t CertificateReportingServiceTestHelper::server_public_key_version()
302 const { 425 const {
303 return kServerPublicKeyTestVersion; 426 return kServerPublicKeyTestVersion;
304 } 427 }
305 428
306 ReportWaitHelper::ReportWaitHelper() 429 void CertificateReportingServiceTestHelper::WaitForRequestsCreated(
307 : num_events_to_wait_for_(0), num_received_events_(0) {} 430 const ReportExpectation& expectation) {
308 ReportWaitHelper::~ReportWaitHelper() {} 431 WaitReports(interceptor()->request_created_observer(), expectation);
432 }
309 433
310 void ReportWaitHelper::Wait(int num_events_to_wait_for) { 434 void CertificateReportingServiceTestHelper::WaitForRequestsDestroyed(
435 const ReportExpectation& expectation) {
436 WaitReports(interceptor()->request_destroyed_observer(), expectation);
437 }
438
439 void CertificateReportingServiceTestHelper::ExpectNoRequests(
440 CertificateReportingService* service) {
311 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 441 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
312 DCHECK(!run_loop_); 442 // Check that all requests have been destroyed.
313 ASSERT_LE(num_received_events_, num_events_to_wait_for) 443 EXPECT_TRUE(interceptor()
314 << "Observed unexpected report"; 444 ->request_destroyed_observer()
445 ->successful_reports()
446 .empty());
447 EXPECT_TRUE(
448 interceptor()->request_destroyed_observer()->failed_reports().empty());
449 EXPECT_TRUE(
450 interceptor()->request_destroyed_observer()->delayed_reports().empty());
315 451
316 if (num_received_events_ < num_events_to_wait_for) { 452 if (service->GetReporterForTesting()) {
317 num_events_to_wait_for_ = num_events_to_wait_for; 453 // Reporter can be null if reporting is disabled.
318 run_loop_.reset(new base::RunLoop()); 454 EXPECT_EQ(
319 run_loop_->Run(); 455 0u,
320 run_loop_.reset(nullptr); 456 service->GetReporterForTesting()->inflight_report_count_for_testing());
321 EXPECT_EQ(0, num_received_events_);
322 EXPECT_EQ(0, num_events_to_wait_for_);
323 } else if (num_received_events_ == num_events_to_wait_for) {
324 num_received_events_ = 0;
325 num_events_to_wait_for_ = 0;
326 } 457 }
327 } 458 }
328 459
329 void ReportWaitHelper::OnEvent() {
330 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
331 num_received_events_++;
332 if (!run_loop_) {
333 return;
334 }
335 ASSERT_LE(num_received_events_, num_events_to_wait_for_)
336 << "Observed unexpected report";
337 if (num_received_events_ == num_events_to_wait_for_) {
338 num_events_to_wait_for_ = 0;
339 num_received_events_ = 0;
340 run_loop_->Quit();
341 }
342 }
343
344 } // namespace certificate_reporting_test_utils 460 } // namespace certificate_reporting_test_utils
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698