OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "net/http/http_server_properties_impl.h" | 5 #include "net/http/http_server_properties_impl.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
11 #include "base/containers/hash_tables.h" | 11 #include "base/containers/hash_tables.h" |
12 #include "base/logging.h" | 12 #include "base/logging.h" |
13 #include "base/memory/scoped_ptr.h" | 13 #include "base/memory/scoped_ptr.h" |
14 #include "base/values.h" | 14 #include "base/values.h" |
15 #include "net/base/host_port_pair.h" | 15 #include "net/base/host_port_pair.h" |
16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
17 | 17 |
18 namespace base { | 18 namespace base { |
19 class ListValue; | 19 class ListValue; |
20 } | 20 } |
21 | 21 |
22 namespace net { | 22 namespace net { |
23 | 23 |
24 const int kMaxSupportsSpdyServerHosts = 500; | 24 const int kMaxSupportsSpdyServerHosts = 500; |
25 | 25 |
| 26 class HttpServerPropertiesImplPeer { |
| 27 public: |
| 28 static void AddBrokenAlternativeServiceWithExpirationTime( |
| 29 HttpServerPropertiesImpl& impl, |
| 30 AlternativeService alternative_service, |
| 31 base::TimeTicks when) { |
| 32 impl.broken_alternative_services_.insert( |
| 33 std::make_pair(alternative_service, when)); |
| 34 ++impl.recently_broken_alternative_services_[alternative_service]; |
| 35 } |
| 36 |
| 37 static void ExpireBrokenAlternateProtocolMappings( |
| 38 HttpServerPropertiesImpl& impl) { |
| 39 impl.ExpireBrokenAlternateProtocolMappings(); |
| 40 } |
| 41 }; |
| 42 |
26 namespace { | 43 namespace { |
27 | 44 |
28 class HttpServerPropertiesImplTest : public testing::Test { | 45 class HttpServerPropertiesImplTest : public testing::Test { |
29 protected: | 46 protected: |
30 bool HasAlternateProtocol(const HostPortPair& server) { | 47 bool HasAlternateProtocol(const HostPortPair& server) { |
31 const AlternateProtocolInfo alternate = impl_.GetAlternateProtocol(server); | 48 const AlternateProtocolInfo alternate = impl_.GetAlternateProtocol(server); |
32 return alternate.protocol != UNINITIALIZED_ALTERNATE_PROTOCOL; | 49 return alternate.protocol != UNINITIALIZED_ALTERNATE_PROTOCOL; |
33 } | 50 } |
34 | 51 |
35 HttpServerPropertiesImpl impl_; | 52 HttpServerPropertiesImpl impl_; |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 impl_.InitializeAlternateProtocolServers(&alternate_protocol_map); | 300 impl_.InitializeAlternateProtocolServers(&alternate_protocol_map); |
284 | 301 |
285 // Verify test_host_port_pair3 is the MRU server. | 302 // Verify test_host_port_pair3 is the MRU server. |
286 const AlternateProtocolMap& map = impl_.alternate_protocol_map(); | 303 const AlternateProtocolMap& map = impl_.alternate_protocol_map(); |
287 AlternateProtocolMap::const_iterator it = map.begin(); | 304 AlternateProtocolMap::const_iterator it = map.begin(); |
288 EXPECT_TRUE(it->first.Equals(test_host_port_pair3)); | 305 EXPECT_TRUE(it->first.Equals(test_host_port_pair3)); |
289 EXPECT_EQ(1234, it->second.port); | 306 EXPECT_EQ(1234, it->second.port); |
290 EXPECT_EQ(NPN_SPDY_3, it->second.protocol); | 307 EXPECT_EQ(NPN_SPDY_3, it->second.protocol); |
291 | 308 |
292 ASSERT_TRUE(HasAlternateProtocol(test_host_port_pair1)); | 309 ASSERT_TRUE(HasAlternateProtocol(test_host_port_pair1)); |
293 ASSERT_TRUE(HasAlternateProtocol(test_host_port_pair2)); | 310 const AlternativeService alternative_service( |
294 alternate = impl_.GetAlternateProtocol(test_host_port_pair1); | 311 NPN_SPDY_3, test_host_port_pair1.host(), 443); |
295 EXPECT_TRUE(alternate.is_broken); | 312 EXPECT_TRUE(impl_.IsAlternativeServiceBroken(alternative_service)); |
296 alternate = impl_.GetAlternateProtocol(test_host_port_pair2); | 313 alternate = impl_.GetAlternateProtocol(test_host_port_pair2); |
297 EXPECT_EQ(123, alternate.port); | 314 EXPECT_EQ(123, alternate.port); |
298 EXPECT_EQ(NPN_SPDY_3, alternate.protocol); | 315 EXPECT_EQ(NPN_SPDY_3, alternate.protocol); |
299 } | 316 } |
300 | 317 |
301 TEST_F(AlternateProtocolServerPropertiesTest, MRUOfGetAlternateProtocol) { | 318 TEST_F(AlternateProtocolServerPropertiesTest, MRUOfGetAlternateProtocol) { |
302 HostPortPair test_host_port_pair1("foo1", 80); | 319 HostPortPair test_host_port_pair1("foo1", 80); |
303 impl_.SetAlternateProtocol(test_host_port_pair1, 443, NPN_SPDY_3, 1.0); | 320 impl_.SetAlternateProtocol(test_host_port_pair1, 443, NPN_SPDY_3, 1.0); |
304 HostPortPair test_host_port_pair2("foo2", 80); | 321 HostPortPair test_host_port_pair2("foo2", 80); |
305 impl_.SetAlternateProtocol(test_host_port_pair2, 1234, NPN_SPDY_3, 1.0); | 322 impl_.SetAlternateProtocol(test_host_port_pair2, 1234, NPN_SPDY_3, 1.0); |
(...skipping 13 matching lines...) Expand all Loading... |
319 EXPECT_TRUE(it->first.Equals(test_host_port_pair1)); | 336 EXPECT_TRUE(it->first.Equals(test_host_port_pair1)); |
320 EXPECT_EQ(443, it->second.port); | 337 EXPECT_EQ(443, it->second.port); |
321 EXPECT_EQ(NPN_SPDY_3, it->second.protocol); | 338 EXPECT_EQ(NPN_SPDY_3, it->second.protocol); |
322 } | 339 } |
323 | 340 |
324 TEST_F(AlternateProtocolServerPropertiesTest, SetBroken) { | 341 TEST_F(AlternateProtocolServerPropertiesTest, SetBroken) { |
325 HostPortPair test_host_port_pair("foo", 80); | 342 HostPortPair test_host_port_pair("foo", 80); |
326 impl_.SetAlternateProtocol(test_host_port_pair, 443, NPN_SPDY_3, 1.0); | 343 impl_.SetAlternateProtocol(test_host_port_pair, 443, NPN_SPDY_3, 1.0); |
327 impl_.SetBrokenAlternateProtocol(test_host_port_pair); | 344 impl_.SetBrokenAlternateProtocol(test_host_port_pair); |
328 ASSERT_TRUE(HasAlternateProtocol(test_host_port_pair)); | 345 ASSERT_TRUE(HasAlternateProtocol(test_host_port_pair)); |
329 AlternateProtocolInfo alternate = | 346 const AlternativeService alternative_service(NPN_SPDY_3, |
330 impl_.GetAlternateProtocol(test_host_port_pair); | 347 test_host_port_pair.host(), 443); |
331 EXPECT_TRUE(alternate.is_broken); | 348 EXPECT_TRUE(impl_.IsAlternativeServiceBroken(alternative_service)); |
332 | 349 |
333 impl_.SetAlternateProtocol(test_host_port_pair, 1234, NPN_SPDY_3, 1.0); | 350 impl_.SetAlternateProtocol(test_host_port_pair, 1234, NPN_SPDY_3, 1.0); |
334 alternate = impl_.GetAlternateProtocol(test_host_port_pair); | 351 EXPECT_TRUE(impl_.IsAlternativeServiceBroken(alternative_service)); |
335 EXPECT_TRUE(alternate.is_broken) << "Second attempt should be ignored."; | 352 const AlternateProtocolInfo alternate = |
| 353 impl_.GetAlternateProtocol(test_host_port_pair); |
| 354 EXPECT_EQ(1234, alternate.port); |
336 } | 355 } |
337 | 356 |
338 TEST_F(AlternateProtocolServerPropertiesTest, ClearBroken) { | 357 TEST_F(AlternateProtocolServerPropertiesTest, ClearBroken) { |
339 HostPortPair test_host_port_pair("foo", 80); | 358 HostPortPair test_host_port_pair("foo", 80); |
340 impl_.SetAlternateProtocol(test_host_port_pair, 443, NPN_SPDY_3, 1.0); | 359 impl_.SetAlternateProtocol(test_host_port_pair, 443, NPN_SPDY_3, 1.0); |
341 impl_.SetBrokenAlternateProtocol(test_host_port_pair); | 360 impl_.SetBrokenAlternateProtocol(test_host_port_pair); |
342 ASSERT_TRUE(HasAlternateProtocol(test_host_port_pair)); | 361 ASSERT_TRUE(HasAlternateProtocol(test_host_port_pair)); |
343 AlternateProtocolInfo alternate = | 362 const AlternativeService alternative_service(NPN_SPDY_3, |
344 impl_.GetAlternateProtocol(test_host_port_pair); | 363 test_host_port_pair.host(), 443); |
345 EXPECT_TRUE(alternate.is_broken); | 364 EXPECT_TRUE(impl_.IsAlternativeServiceBroken(alternative_service)); |
346 impl_.ClearAlternateProtocol(test_host_port_pair); | 365 impl_.ClearAlternateProtocol(test_host_port_pair); |
347 EXPECT_FALSE(HasAlternateProtocol(test_host_port_pair)); | 366 EXPECT_FALSE(impl_.IsAlternativeServiceBroken(alternative_service)); |
348 } | 367 } |
349 | 368 |
350 TEST_F(AlternateProtocolServerPropertiesTest, Forced) { | 369 TEST_F(AlternateProtocolServerPropertiesTest, Forced) { |
351 // Test forced alternate protocols. | 370 // Test forced alternate protocols. |
352 | 371 |
353 AlternateProtocolInfo default_protocol(1234, NPN_SPDY_3, 1); | 372 AlternateProtocolInfo default_protocol(1234, NPN_SPDY_3, 1); |
354 HttpServerPropertiesImpl::ForceAlternateProtocol(default_protocol); | 373 HttpServerPropertiesImpl::ForceAlternateProtocol(default_protocol); |
355 | 374 |
356 // Verify the forced protocol. | 375 // Verify the forced protocol. |
357 HostPortPair test_host_port_pair("foo", 80); | 376 HostPortPair test_host_port_pair("foo", 80); |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 AlternateProtocolInfo canonical_protocol(1234, QUIC, 1); | 470 AlternateProtocolInfo canonical_protocol(1234, QUIC, 1); |
452 | 471 |
453 impl_.SetAlternateProtocol(canonical_port_pair, canonical_protocol.port, | 472 impl_.SetAlternateProtocol(canonical_port_pair, canonical_protocol.port, |
454 canonical_protocol.protocol, | 473 canonical_protocol.protocol, |
455 canonical_protocol.probability); | 474 canonical_protocol.probability); |
456 | 475 |
457 impl_.SetBrokenAlternateProtocol(canonical_port_pair); | 476 impl_.SetBrokenAlternateProtocol(canonical_port_pair); |
458 EXPECT_FALSE(HasAlternateProtocol(test_host_port_pair)); | 477 EXPECT_FALSE(HasAlternateProtocol(test_host_port_pair)); |
459 } | 478 } |
460 | 479 |
461 TEST_F(AlternateProtocolServerPropertiesTest, CanonicalBroken2) { | |
462 HostPortPair test_host_port_pair("foo.c.youtube.com", 80); | |
463 HostPortPair canonical_port_pair("bar.c.youtube.com", 80); | |
464 | |
465 AlternateProtocolInfo canonical_protocol(1234, QUIC, 1); | |
466 | |
467 impl_.SetAlternateProtocol(canonical_port_pair, canonical_protocol.port, | |
468 canonical_protocol.protocol, | |
469 canonical_protocol.probability); | |
470 | |
471 impl_.SetBrokenAlternateProtocol(test_host_port_pair); | |
472 AlternateProtocolInfo alternate = | |
473 impl_.GetAlternateProtocol(test_host_port_pair); | |
474 EXPECT_TRUE(alternate.is_broken); | |
475 } | |
476 | |
477 TEST_F(AlternateProtocolServerPropertiesTest, ClearWithCanonical) { | 480 TEST_F(AlternateProtocolServerPropertiesTest, ClearWithCanonical) { |
478 HostPortPair test_host_port_pair("foo.c.youtube.com", 80); | 481 HostPortPair test_host_port_pair("foo.c.youtube.com", 80); |
479 HostPortPair canonical_port_pair("bar.c.youtube.com", 80); | 482 HostPortPair canonical_port_pair("bar.c.youtube.com", 80); |
480 | 483 |
481 AlternateProtocolInfo canonical_protocol(1234, QUIC, 1); | 484 AlternateProtocolInfo canonical_protocol(1234, QUIC, 1); |
482 | 485 |
483 impl_.SetAlternateProtocol(canonical_port_pair, canonical_protocol.port, | 486 impl_.SetAlternateProtocol(canonical_port_pair, canonical_protocol.port, |
484 canonical_protocol.protocol, | 487 canonical_protocol.protocol, |
485 canonical_protocol.probability); | 488 canonical_protocol.probability); |
486 | 489 |
487 impl_.Clear(); | 490 impl_.Clear(); |
488 EXPECT_FALSE(HasAlternateProtocol(test_host_port_pair)); | 491 EXPECT_FALSE(HasAlternateProtocol(test_host_port_pair)); |
489 } | 492 } |
490 | 493 |
| 494 TEST_F(AlternateProtocolServerPropertiesTest, |
| 495 ExpireBrokenAlternateProtocolMappings) { |
| 496 HostPortPair host_port_pair("foo", 443); |
| 497 AlternativeService alternative_service(QUIC, "foo", 443); |
| 498 impl_.SetAlternateProtocol(host_port_pair, 443, QUIC, 1.0); |
| 499 EXPECT_TRUE(HasAlternateProtocol(host_port_pair)); |
| 500 EXPECT_FALSE(impl_.IsAlternativeServiceBroken(alternative_service)); |
| 501 EXPECT_FALSE(impl_.WasAlternateProtocolRecentlyBroken(host_port_pair)); |
| 502 |
| 503 base::TimeTicks past = |
| 504 base::TimeTicks::Now() - base::TimeDelta::FromSeconds(42); |
| 505 HttpServerPropertiesImplPeer::AddBrokenAlternativeServiceWithExpirationTime( |
| 506 impl_, alternative_service, past); |
| 507 EXPECT_TRUE(impl_.IsAlternativeServiceBroken(alternative_service)); |
| 508 EXPECT_TRUE(impl_.WasAlternateProtocolRecentlyBroken(host_port_pair)); |
| 509 |
| 510 HttpServerPropertiesImplPeer::ExpireBrokenAlternateProtocolMappings(impl_); |
| 511 EXPECT_FALSE(impl_.IsAlternativeServiceBroken(alternative_service)); |
| 512 // TODO(bnc): Test WasAlternateProtocolRecentlyBroken once it's changed to |
| 513 // take AlternativeService as argument. |
| 514 } |
| 515 |
491 typedef HttpServerPropertiesImplTest SpdySettingsServerPropertiesTest; | 516 typedef HttpServerPropertiesImplTest SpdySettingsServerPropertiesTest; |
492 | 517 |
493 TEST_F(SpdySettingsServerPropertiesTest, Initialize) { | 518 TEST_F(SpdySettingsServerPropertiesTest, Initialize) { |
494 HostPortPair spdy_server_google("www.google.com", 443); | 519 HostPortPair spdy_server_google("www.google.com", 443); |
495 | 520 |
496 // Check by initializing empty spdy settings. | 521 // Check by initializing empty spdy settings. |
497 SpdySettingsMap spdy_settings_map(SpdySettingsMap::NO_AUTO_EVICT); | 522 SpdySettingsMap spdy_settings_map(SpdySettingsMap::NO_AUTO_EVICT); |
498 impl_.InitializeSpdySettingsServers(&spdy_settings_map); | 523 impl_.InitializeSpdySettingsServers(&spdy_settings_map); |
499 EXPECT_TRUE(impl_.GetSpdySettings(spdy_server_google).empty()); | 524 EXPECT_TRUE(impl_.GetSpdySettings(spdy_server_google).empty()); |
500 | 525 |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
752 EXPECT_EQ(100, stats2->bandwidth_estimate.ToBitsPerSecond()); | 777 EXPECT_EQ(100, stats2->bandwidth_estimate.ToBitsPerSecond()); |
753 | 778 |
754 impl_.Clear(); | 779 impl_.Clear(); |
755 const ServerNetworkStats* stats3 = impl_.GetServerNetworkStats(foo_server); | 780 const ServerNetworkStats* stats3 = impl_.GetServerNetworkStats(foo_server); |
756 EXPECT_EQ(NULL, stats3); | 781 EXPECT_EQ(NULL, stats3); |
757 } | 782 } |
758 | 783 |
759 } // namespace | 784 } // namespace |
760 | 785 |
761 } // namespace net | 786 } // namespace net |
OLD | NEW |