| 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 |