| Index: net/spdy/spdy_session_pool_unittest.cc
|
| diff --git a/net/spdy/spdy_session_pool_unittest.cc b/net/spdy/spdy_session_pool_unittest.cc
|
| index e78409460f59a676661b35ff1f6ece1c89b31a8a..c275684676042ef6ac2b4961a165b89a43b72b30 100644
|
| --- a/net/spdy/spdy_session_pool_unittest.cc
|
| +++ b/net/spdy/spdy_session_pool_unittest.cc
|
| @@ -12,12 +12,15 @@
|
| #include "base/memory/ptr_util.h"
|
| #include "base/memory/ref_counted.h"
|
| #include "base/run_loop.h"
|
| +#include "base/test/histogram_tester.h"
|
| #include "base/trace_event/memory_allocator_dump.h"
|
| #include "base/trace_event/process_memory_dump.h"
|
| #include "base/trace_event/trace_event_argument.h"
|
| #include "net/dns/host_cache.h"
|
| #include "net/http/http_network_session.h"
|
| #include "net/log/net_log_with_source.h"
|
| +#include "net/log/test_net_log.h"
|
| +#include "net/log/test_net_log_entry.h"
|
| #include "net/socket/client_socket_handle.h"
|
| #include "net/socket/transport_client_socket_pool.h"
|
| #include "net/spdy/spdy_session.h"
|
| @@ -509,6 +512,85 @@ TEST_F(SpdySessionPoolTest, IPPoolingCloseIdleSessions) {
|
| RunIPPoolingTest(SPDY_POOL_CLOSE_IDLE_SESSIONS);
|
| }
|
|
|
| +// Regression test for https://crbug.com/643025.
|
| +TEST_F(SpdySessionPoolTest, IPPoolingNetLog) {
|
| + // Define two hosts with identical IP address.
|
| + const int kTestPort = 443;
|
| + struct TestHosts {
|
| + std::string name;
|
| + std::string iplist;
|
| + SpdySessionKey key;
|
| + AddressList addresses;
|
| + std::unique_ptr<HostResolver::Request> request;
|
| + } test_hosts[] = {
|
| + {"www.example.org", "192.168.0.1"}, {"mail.example.org", "192.168.0.1"},
|
| + };
|
| +
|
| + // Populate the HostResolver cache.
|
| + session_deps_.host_resolver->set_synchronous_mode(true);
|
| + for (size_t i = 0; i < arraysize(test_hosts); i++) {
|
| + session_deps_.host_resolver->rules()->AddIPLiteralRule(
|
| + test_hosts[i].name, test_hosts[i].iplist, std::string());
|
| +
|
| + HostResolver::RequestInfo info(HostPortPair(test_hosts[i].name, kTestPort));
|
| + session_deps_.host_resolver->Resolve(
|
| + info, DEFAULT_PRIORITY, &test_hosts[i].addresses, CompletionCallback(),
|
| + &test_hosts[i].request, NetLogWithSource());
|
| +
|
| + test_hosts[i].key =
|
| + SpdySessionKey(HostPortPair(test_hosts[i].name, kTestPort),
|
| + ProxyServer::Direct(), PRIVACY_MODE_DISABLED);
|
| + }
|
| +
|
| + MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING)};
|
| + StaticSocketDataProvider data(reads, arraysize(reads), nullptr, 0);
|
| + MockConnect connect_data(SYNCHRONOUS, OK);
|
| + data.set_connect_data(connect_data);
|
| +
|
| + session_deps_.socket_factory->AddSocketDataProvider(&data);
|
| + AddSSLSocketData();
|
| +
|
| + CreateNetworkSession();
|
| +
|
| + // Open SpdySession to the first host.
|
| + base::WeakPtr<SpdySession> session0 = CreateSecureSpdySession(
|
| + http_session_.get(), test_hosts[0].key, NetLogWithSource());
|
| +
|
| + // A request to the second host should pool to the existing connection.
|
| + BoundTestNetLog net_log;
|
| + base::HistogramTester histogram_tester;
|
| + base::WeakPtr<SpdySession> session1 =
|
| + spdy_session_pool_->FindAvailableSession(test_hosts[1].key, GURL(),
|
| + net_log.bound());
|
| + EXPECT_EQ(session0.get(), session1.get());
|
| +
|
| + ASSERT_EQ(1u, net_log.GetSize());
|
| + histogram_tester.ExpectTotalCount("Net.SpdySessionGet", 1);
|
| +
|
| + // A request to the second host should still pool to the existing connection.
|
| + session1 = spdy_session_pool_->FindAvailableSession(test_hosts[1].key, GURL(),
|
| + net_log.bound());
|
| + EXPECT_EQ(session0.get(), session1.get());
|
| +
|
| + ASSERT_EQ(2u, net_log.GetSize());
|
| + histogram_tester.ExpectTotalCount("Net.SpdySessionGet", 2);
|
| +
|
| + // Both FindAvailableSession() calls should log netlog events
|
| + // indicating IP pooling.
|
| + TestNetLogEntry::List entry_list;
|
| + net_log.GetEntries(&entry_list);
|
| + EXPECT_EQ(
|
| + NetLogEventType::HTTP2_SESSION_POOL_FOUND_EXISTING_SESSION_FROM_IP_POOL,
|
| + entry_list[0].type);
|
| + EXPECT_EQ(
|
| + NetLogEventType::HTTP2_SESSION_POOL_FOUND_EXISTING_SESSION_FROM_IP_POOL,
|
| + entry_list[1].type);
|
| +
|
| + // Both FindAvailableSession() calls should log histogram entries
|
| + // indicating IP pooling.
|
| + histogram_tester.ExpectUniqueSample("Net.SpdySessionGet", 2, 2);
|
| +}
|
| +
|
| // Construct a Pool with SpdySessions in various availability states. Simulate
|
| // an IP address change. Ensure sessions gracefully shut down. Regression test
|
| // for crbug.com/379469.
|
|
|