OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "components/domain_reliability/monitor.h" | 5 #include "components/domain_reliability/monitor.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <map> | 9 #include <map> |
10 #include <memory> | 10 #include <memory> |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 pref_task_runner_, | 63 pref_task_runner_, |
64 network_task_runner_, | 64 network_task_runner_, |
65 std::unique_ptr<MockableTime>(time_)) { | 65 std::unique_ptr<MockableTime>(time_)) { |
66 monitor_.MoveToNetworkThread(); | 66 monitor_.MoveToNetworkThread(); |
67 monitor_.InitURLRequestContext(url_request_context_getter_); | 67 monitor_.InitURLRequestContext(url_request_context_getter_); |
68 monitor_.SetDiscardUploads(false); | 68 monitor_.SetDiscardUploads(false); |
69 } | 69 } |
70 | 70 |
71 static RequestInfo MakeRequestInfo() { | 71 static RequestInfo MakeRequestInfo() { |
72 RequestInfo request; | 72 RequestInfo request; |
73 request.status = net::URLRequestStatus(); | 73 request.net_error = net::OK; |
74 request.response_info.socket_address = | 74 request.response_info.socket_address = |
75 net::HostPortPair::FromString("12.34.56.78:80"); | 75 net::HostPortPair::FromString("12.34.56.78:80"); |
76 request.response_info.headers = MakeHttpResponseHeaders( | 76 request.response_info.headers = MakeHttpResponseHeaders( |
77 "HTTP/1.1 200 OK\n\n"); | 77 "HTTP/1.1 200 OK\n\n"); |
78 request.response_info.was_cached = false; | 78 request.response_info.was_cached = false; |
79 request.response_info.network_accessed = true; | 79 request.response_info.network_accessed = true; |
80 request.response_info.was_fetched_via_proxy = false; | 80 request.response_info.was_fetched_via_proxy = false; |
81 request.load_flags = 0; | 81 request.load_flags = 0; |
82 request.upload_depth = 0; | 82 request.upload_depth = 0; |
83 return request; | 83 return request; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 OnRequestLegComplete(request); | 120 OnRequestLegComplete(request); |
121 | 121 |
122 EXPECT_EQ(0u, CountQueuedBeacons(context)); | 122 EXPECT_EQ(0u, CountQueuedBeacons(context)); |
123 } | 123 } |
124 | 124 |
125 TEST_F(DomainReliabilityMonitorTest, NetworkFailure) { | 125 TEST_F(DomainReliabilityMonitorTest, NetworkFailure) { |
126 DomainReliabilityContext* context = CreateAndAddContext(); | 126 DomainReliabilityContext* context = CreateAndAddContext(); |
127 | 127 |
128 RequestInfo request = MakeRequestInfo(); | 128 RequestInfo request = MakeRequestInfo(); |
129 request.url = GURL("http://example/"); | 129 request.url = GURL("http://example/"); |
130 request.status = net::URLRequestStatus::FromError(net::ERR_CONNECTION_RESET); | 130 request.net_error = net::ERR_CONNECTION_RESET; |
131 request.response_info.headers = nullptr; | 131 request.response_info.headers = nullptr; |
132 OnRequestLegComplete(request); | 132 OnRequestLegComplete(request); |
133 | 133 |
134 EXPECT_EQ(1u, CountQueuedBeacons(context)); | 134 EXPECT_EQ(1u, CountQueuedBeacons(context)); |
135 } | 135 } |
136 | 136 |
137 TEST_F(DomainReliabilityMonitorTest, GoAwayWithPortMigrationDetected) { | 137 TEST_F(DomainReliabilityMonitorTest, GoAwayWithPortMigrationDetected) { |
138 DomainReliabilityContext* context = CreateAndAddContext(); | 138 DomainReliabilityContext* context = CreateAndAddContext(); |
139 | 139 |
140 RequestInfo request = MakeRequestInfo(); | 140 RequestInfo request = MakeRequestInfo(); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 | 181 |
182 EXPECT_EQ(0u, CountQueuedBeacons(context)); | 182 EXPECT_EQ(0u, CountQueuedBeacons(context)); |
183 } | 183 } |
184 | 184 |
185 // Make sure the monitor does not log a network-local error. | 185 // Make sure the monitor does not log a network-local error. |
186 TEST_F(DomainReliabilityMonitorTest, LocalError) { | 186 TEST_F(DomainReliabilityMonitorTest, LocalError) { |
187 DomainReliabilityContext* context = CreateAndAddContext(); | 187 DomainReliabilityContext* context = CreateAndAddContext(); |
188 | 188 |
189 RequestInfo request = MakeRequestInfo(); | 189 RequestInfo request = MakeRequestInfo(); |
190 request.url = GURL("http://example/"); | 190 request.url = GURL("http://example/"); |
191 request.status = | 191 request.net_error = net::ERR_PROXY_CONNECTION_FAILED; |
192 net::URLRequestStatus::FromError(net::ERR_PROXY_CONNECTION_FAILED); | |
193 OnRequestLegComplete(request); | 192 OnRequestLegComplete(request); |
194 | 193 |
195 EXPECT_EQ(0u, CountQueuedBeacons(context)); | 194 EXPECT_EQ(0u, CountQueuedBeacons(context)); |
196 } | 195 } |
197 | 196 |
198 // Make sure the monitor does not log the proxy's IP if one was used. | 197 // Make sure the monitor does not log the proxy's IP if one was used. |
199 TEST_F(DomainReliabilityMonitorTest, WasFetchedViaProxy) { | 198 TEST_F(DomainReliabilityMonitorTest, WasFetchedViaProxy) { |
200 DomainReliabilityContext* context = CreateAndAddContext(); | 199 DomainReliabilityContext* context = CreateAndAddContext(); |
201 | 200 |
202 RequestInfo request = MakeRequestInfo(); | 201 RequestInfo request = MakeRequestInfo(); |
203 request.url = GURL("http://example/"); | 202 request.url = GURL("http://example/"); |
204 request.status = net::URLRequestStatus::FromError(net::ERR_CONNECTION_RESET); | 203 request.net_error = net::ERR_CONNECTION_RESET; |
205 request.response_info.socket_address = | 204 request.response_info.socket_address = |
206 net::HostPortPair::FromString("127.0.0.1:3128"); | 205 net::HostPortPair::FromString("127.0.0.1:3128"); |
207 request.response_info.was_fetched_via_proxy = true; | 206 request.response_info.was_fetched_via_proxy = true; |
208 OnRequestLegComplete(request); | 207 OnRequestLegComplete(request); |
209 | 208 |
210 BeaconVector beacons; | 209 BeaconVector beacons; |
211 context->GetQueuedBeaconsForTesting(&beacons); | 210 context->GetQueuedBeaconsForTesting(&beacons); |
212 EXPECT_EQ(1u, beacons.size()); | 211 EXPECT_EQ(1u, beacons.size()); |
213 EXPECT_TRUE(beacons[0]->server_ip.empty()); | 212 EXPECT_TRUE(beacons[0]->server_ip.empty()); |
214 } | 213 } |
(...skipping 19 matching lines...) Expand all Loading... |
234 } | 233 } |
235 | 234 |
236 // Make sure the monitor does not log the cached IP returned with a failed | 235 // Make sure the monitor does not log the cached IP returned with a failed |
237 // cache revalidation request. | 236 // cache revalidation request. |
238 TEST_F(DomainReliabilityMonitorTest, NoCachedIPFromFailedRevalidationRequest) { | 237 TEST_F(DomainReliabilityMonitorTest, NoCachedIPFromFailedRevalidationRequest) { |
239 DomainReliabilityContext* context = CreateAndAddContext(); | 238 DomainReliabilityContext* context = CreateAndAddContext(); |
240 | 239 |
241 RequestInfo request = MakeRequestInfo(); | 240 RequestInfo request = MakeRequestInfo(); |
242 request.url = GURL("http://example/"); | 241 request.url = GURL("http://example/"); |
243 request.response_info.was_cached = true; | 242 request.response_info.was_cached = true; |
244 request.status = | 243 request.net_error = net::ERR_NAME_RESOLUTION_FAILED; |
245 net::URLRequestStatus::FromError(net::ERR_NAME_RESOLUTION_FAILED); | |
246 OnRequestLegComplete(request); | 244 OnRequestLegComplete(request); |
247 | 245 |
248 BeaconVector beacons; | 246 BeaconVector beacons; |
249 context->GetQueuedBeaconsForTesting(&beacons); | 247 context->GetQueuedBeaconsForTesting(&beacons); |
250 EXPECT_EQ(1u, beacons.size()); | 248 EXPECT_EQ(1u, beacons.size()); |
251 EXPECT_TRUE(beacons[0]->server_ip.empty()); | 249 EXPECT_TRUE(beacons[0]->server_ip.empty()); |
252 } | 250 } |
253 | 251 |
254 TEST_F(DomainReliabilityMonitorTest, AtLeastOneBakedInConfig) { | 252 TEST_F(DomainReliabilityMonitorTest, AtLeastOneBakedInConfig) { |
255 DCHECK(kBakedInJsonConfigs[0] != nullptr); | 253 DCHECK(kBakedInJsonConfigs[0] != nullptr); |
(...skipping 25 matching lines...) Expand all Loading... |
281 TEST_F(DomainReliabilityMonitorTest, ClearBeacons) { | 279 TEST_F(DomainReliabilityMonitorTest, ClearBeacons) { |
282 DomainReliabilityContext* context = CreateAndAddContext(); | 280 DomainReliabilityContext* context = CreateAndAddContext(); |
283 | 281 |
284 // Initially the monitor should have just the test context, with no beacons. | 282 // Initially the monitor should have just the test context, with no beacons. |
285 EXPECT_EQ(1u, monitor_.contexts_size_for_testing()); | 283 EXPECT_EQ(1u, monitor_.contexts_size_for_testing()); |
286 EXPECT_EQ(0u, CountQueuedBeacons(context)); | 284 EXPECT_EQ(0u, CountQueuedBeacons(context)); |
287 | 285 |
288 // Add a beacon. | 286 // Add a beacon. |
289 RequestInfo request = MakeRequestInfo(); | 287 RequestInfo request = MakeRequestInfo(); |
290 request.url = GURL("http://example/"); | 288 request.url = GURL("http://example/"); |
291 request.status = net::URLRequestStatus::FromError(net::ERR_CONNECTION_RESET); | 289 request.net_error = net::ERR_CONNECTION_RESET; |
292 OnRequestLegComplete(request); | 290 OnRequestLegComplete(request); |
293 | 291 |
294 // Make sure it was added. | 292 // Make sure it was added. |
295 EXPECT_EQ(1u, CountQueuedBeacons(context)); | 293 EXPECT_EQ(1u, CountQueuedBeacons(context)); |
296 | 294 |
297 monitor_.ClearBrowsingData( | 295 monitor_.ClearBrowsingData( |
298 CLEAR_BEACONS, base::Callback<bool(const GURL&)>()); | 296 CLEAR_BEACONS, base::Callback<bool(const GURL&)>()); |
299 | 297 |
300 // Make sure the beacon was cleared, but not the contexts. | 298 // Make sure the beacon was cleared, but not the contexts. |
301 EXPECT_EQ(1u, monitor_.contexts_size_for_testing()); | 299 EXPECT_EQ(1u, monitor_.contexts_size_for_testing()); |
302 EXPECT_EQ(0u, CountQueuedBeacons(context)); | 300 EXPECT_EQ(0u, CountQueuedBeacons(context)); |
303 } | 301 } |
304 | 302 |
305 TEST_F(DomainReliabilityMonitorTest, ClearBeaconsWithFilter) { | 303 TEST_F(DomainReliabilityMonitorTest, ClearBeaconsWithFilter) { |
306 // Create two contexts, each with one beacon. | 304 // Create two contexts, each with one beacon. |
307 GURL origin1("http://example.com/"); | 305 GURL origin1("http://example.com/"); |
308 GURL origin2("http://example.org/"); | 306 GURL origin2("http://example.org/"); |
309 | 307 |
310 DomainReliabilityContext* context1 = | 308 DomainReliabilityContext* context1 = |
311 CreateAndAddContextForOrigin(origin1, false); | 309 CreateAndAddContextForOrigin(origin1, false); |
312 RequestInfo request = MakeRequestInfo(); | 310 RequestInfo request = MakeRequestInfo(); |
313 request.url = origin1; | 311 request.url = origin1; |
314 request.status = | 312 request.net_error = net::ERR_CONNECTION_RESET; |
315 net::URLRequestStatus::FromError(net::ERR_CONNECTION_RESET); | |
316 OnRequestLegComplete(request); | 313 OnRequestLegComplete(request); |
317 | 314 |
318 DomainReliabilityContext* context2 = | 315 DomainReliabilityContext* context2 = |
319 CreateAndAddContextForOrigin(origin2, false); | 316 CreateAndAddContextForOrigin(origin2, false); |
320 request = MakeRequestInfo(); | 317 request = MakeRequestInfo(); |
321 request.url = origin2; | 318 request.url = origin2; |
322 request.status = | 319 request.net_error = net::ERR_CONNECTION_RESET; |
323 net::URLRequestStatus::FromError(net::ERR_CONNECTION_RESET); | |
324 OnRequestLegComplete(request); | 320 OnRequestLegComplete(request); |
325 | 321 |
326 // Delete the beacons for |origin1|. | 322 // Delete the beacons for |origin1|. |
327 monitor_.ClearBrowsingData( | 323 monitor_.ClearBrowsingData( |
328 CLEAR_BEACONS, | 324 CLEAR_BEACONS, |
329 base::Bind(&GURL::operator==, base::Unretained(&origin1))); | 325 base::Bind(&GURL::operator==, base::Unretained(&origin1))); |
330 | 326 |
331 // Beacons for |context1| were cleared. Beacons for |context2| and | 327 // Beacons for |context1| were cleared. Beacons for |context2| and |
332 // the contexts themselves were not. | 328 // the contexts themselves were not. |
333 EXPECT_EQ(2u, monitor_.contexts_size_for_testing()); | 329 EXPECT_EQ(2u, monitor_.contexts_size_for_testing()); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
365 // Only one of the contexts should have been deleted. | 361 // Only one of the contexts should have been deleted. |
366 EXPECT_EQ(1u, monitor_.contexts_size_for_testing()); | 362 EXPECT_EQ(1u, monitor_.contexts_size_for_testing()); |
367 } | 363 } |
368 | 364 |
369 TEST_F(DomainReliabilityMonitorTest, WildcardMatchesSelf) { | 365 TEST_F(DomainReliabilityMonitorTest, WildcardMatchesSelf) { |
370 DomainReliabilityContext* context = | 366 DomainReliabilityContext* context = |
371 CreateAndAddContextForOrigin(GURL("https://wildcard/"), true); | 367 CreateAndAddContextForOrigin(GURL("https://wildcard/"), true); |
372 | 368 |
373 RequestInfo request = MakeRequestInfo(); | 369 RequestInfo request = MakeRequestInfo(); |
374 request.url = GURL("http://wildcard/"); | 370 request.url = GURL("http://wildcard/"); |
375 request.status = net::URLRequestStatus::FromError(net::ERR_CONNECTION_RESET); | 371 request.net_error = net::ERR_CONNECTION_RESET; |
376 OnRequestLegComplete(request); | 372 OnRequestLegComplete(request); |
377 | 373 |
378 EXPECT_EQ(1u, CountQueuedBeacons(context)); | 374 EXPECT_EQ(1u, CountQueuedBeacons(context)); |
379 } | 375 } |
380 | 376 |
381 TEST_F(DomainReliabilityMonitorTest, WildcardMatchesSubdomain) { | 377 TEST_F(DomainReliabilityMonitorTest, WildcardMatchesSubdomain) { |
382 DomainReliabilityContext* context = | 378 DomainReliabilityContext* context = |
383 CreateAndAddContextForOrigin(GURL("https://wildcard/"), true); | 379 CreateAndAddContextForOrigin(GURL("https://wildcard/"), true); |
384 | 380 |
385 RequestInfo request = MakeRequestInfo(); | 381 RequestInfo request = MakeRequestInfo(); |
386 request.url = GURL("http://test.wildcard/"); | 382 request.url = GURL("http://test.wildcard/"); |
387 request.status = net::URLRequestStatus::FromError(net::ERR_CONNECTION_RESET); | 383 request.net_error = net::ERR_CONNECTION_RESET; |
388 OnRequestLegComplete(request); | 384 OnRequestLegComplete(request); |
389 | 385 |
390 EXPECT_EQ(1u, CountQueuedBeacons(context)); | 386 EXPECT_EQ(1u, CountQueuedBeacons(context)); |
391 } | 387 } |
392 | 388 |
393 TEST_F(DomainReliabilityMonitorTest, WildcardDoesntMatchSubsubdomain) { | 389 TEST_F(DomainReliabilityMonitorTest, WildcardDoesntMatchSubsubdomain) { |
394 DomainReliabilityContext* context = | 390 DomainReliabilityContext* context = |
395 CreateAndAddContextForOrigin(GURL("https://wildcard/"), true); | 391 CreateAndAddContextForOrigin(GURL("https://wildcard/"), true); |
396 | 392 |
397 RequestInfo request = MakeRequestInfo(); | 393 RequestInfo request = MakeRequestInfo(); |
398 request.url = GURL("http://test.test.wildcard/"); | 394 request.url = GURL("http://test.test.wildcard/"); |
399 request.status = net::URLRequestStatus::FromError(net::ERR_CONNECTION_RESET); | 395 request.net_error = net::ERR_CONNECTION_RESET; |
400 OnRequestLegComplete(request); | 396 OnRequestLegComplete(request); |
401 | 397 |
402 EXPECT_EQ(0u, CountQueuedBeacons(context)); | 398 EXPECT_EQ(0u, CountQueuedBeacons(context)); |
403 } | 399 } |
404 | 400 |
405 TEST_F(DomainReliabilityMonitorTest, WildcardPrefersSelfToParentWildcard) { | 401 TEST_F(DomainReliabilityMonitorTest, WildcardPrefersSelfToParentWildcard) { |
406 DomainReliabilityContext* context1 = | 402 DomainReliabilityContext* context1 = |
407 CreateAndAddContextForOrigin(GURL("https://test.wildcard/"), false); | 403 CreateAndAddContextForOrigin(GURL("https://test.wildcard/"), false); |
408 DomainReliabilityContext* context2 = | 404 DomainReliabilityContext* context2 = |
409 CreateAndAddContextForOrigin(GURL("https://wildcard/"), true); | 405 CreateAndAddContextForOrigin(GURL("https://wildcard/"), true); |
410 | 406 |
411 RequestInfo request = MakeRequestInfo(); | 407 RequestInfo request = MakeRequestInfo(); |
412 request.url = GURL("http://test.wildcard/"); | 408 request.url = GURL("http://test.wildcard/"); |
413 request.status = net::URLRequestStatus::FromError(net::ERR_CONNECTION_RESET); | 409 request.net_error = net::ERR_CONNECTION_RESET; |
414 OnRequestLegComplete(request); | 410 OnRequestLegComplete(request); |
415 | 411 |
416 EXPECT_EQ(1u, CountQueuedBeacons(context1)); | 412 EXPECT_EQ(1u, CountQueuedBeacons(context1)); |
417 EXPECT_EQ(0u, CountQueuedBeacons(context2)); | 413 EXPECT_EQ(0u, CountQueuedBeacons(context2)); |
418 } | 414 } |
419 | 415 |
420 TEST_F(DomainReliabilityMonitorTest, | 416 TEST_F(DomainReliabilityMonitorTest, |
421 WildcardPrefersSelfWildcardToParentWildcard) { | 417 WildcardPrefersSelfWildcardToParentWildcard) { |
422 DomainReliabilityContext* context1 = | 418 DomainReliabilityContext* context1 = |
423 CreateAndAddContextForOrigin(GURL("https://test.wildcard/"), true); | 419 CreateAndAddContextForOrigin(GURL("https://test.wildcard/"), true); |
424 DomainReliabilityContext* context2 = | 420 DomainReliabilityContext* context2 = |
425 CreateAndAddContextForOrigin(GURL("https://wildcard/"), true); | 421 CreateAndAddContextForOrigin(GURL("https://wildcard/"), true); |
426 | 422 |
427 RequestInfo request = MakeRequestInfo(); | 423 RequestInfo request = MakeRequestInfo(); |
428 request.url = GURL("http://test.wildcard/"); | 424 request.url = GURL("http://test.wildcard/"); |
429 request.status = net::URLRequestStatus::FromError(net::ERR_CONNECTION_RESET); | 425 request.net_error = net::ERR_CONNECTION_RESET; |
430 OnRequestLegComplete(request); | 426 OnRequestLegComplete(request); |
431 | 427 |
432 EXPECT_EQ(1u, CountQueuedBeacons(context1)); | 428 EXPECT_EQ(1u, CountQueuedBeacons(context1)); |
433 EXPECT_EQ(0u, CountQueuedBeacons(context2)); | 429 EXPECT_EQ(0u, CountQueuedBeacons(context2)); |
434 } | 430 } |
435 | 431 |
436 } // namespace | 432 } // namespace |
437 | 433 |
438 } // namespace domain_reliability | 434 } // namespace domain_reliability |
OLD | NEW |