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_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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |