12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/quic_stream_factory.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/run_loop.h" 85e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/base/test_data_directory.h" 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "net/cert/cert_verifier.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/http_response_headers.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/http_response_info.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/http_util.h" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/http/transport_security_state.h" 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/quic/crypto/crypto_handshake.h" 1723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "net/quic/crypto/proof_verifier_chromium.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/crypto/quic_decrypter.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/crypto/quic_encrypter.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/quic_http_stream.h" 21e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "net/quic/quic_server_id.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/test_tools/mock_clock.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/test_tools/mock_crypto_client_stream_factory.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/test_tools/mock_random.h" 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/test_tools/quic_test_packet_maker.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/test_tools/quic_test_utils.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/socket/socket_test_util.h" 2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "net/spdy/spdy_test_utils.h" 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/ssl/channel_id_service.h" 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/ssl/default_channel_id_store.h" 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/test/cert_test_util.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using base::StringPiece; 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using std::string; 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using std::vector; 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace test { 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kDefaultServerHostName[] = "www.google.com"; 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int kDefaultServerPort = 443; 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace anonymous 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class QuicStreamFactoryPeer { 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static QuicCryptoClientConfig* GetCryptoConfig(QuicStreamFactory* factory) { 49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return &factory->crypto_config_; 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static bool HasActiveSession(QuicStreamFactory* factory, 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const HostPortPair& host_port_pair, 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool is_https) { 55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED); 56e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return factory->HasActiveSession(server_id); 578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static QuicClientSession* GetActiveSession( 608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) QuicStreamFactory* factory, 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const HostPortPair& host_port_pair, 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool is_https) { 63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED); 64e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DCHECK(factory->HasActiveSession(server_id)); 65e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return factory->active_sessions_[server_id]; 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static scoped_ptr<QuicHttpStream> CreateIfSessionExists( 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) QuicStreamFactory* factory, 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const HostPortPair& host_port_pair, 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool is_https, 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const BoundNetLog& net_log) { 73e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED); 74e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return factory->CreateIfSessionExists(server_id, net_log); 758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static bool IsLiveSession(QuicStreamFactory* factory, 788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) QuicClientSession* session) { 79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (QuicStreamFactory::SessionIdMap::iterator it = 808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) factory->all_sessions_.begin(); 818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) it != factory->all_sessions_.end(); ++it) { 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (it->first == session) 838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return true; 848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return false; 868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static void DisableConnectionPooling(QuicStreamFactory* factory) { 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci factory->disable_connection_pooling_ = true; 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> { 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicStreamFactoryTest() 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : random_generator_(0), 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) clock_(new MockClock()), 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci maker_(GetParam(), 0, clock_), 99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch cert_verifier_(CertVerifier::CreateDefault()), 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci channel_id_service_( 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new ChannelIDService(new DefaultChannelIDStore(NULL), 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::MessageLoopProxy::current())), 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci factory_(&host_resolver_, 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &socket_factory_, 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::WeakPtr<HttpServerProperties>(), 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cert_verifier_.get(), 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci channel_id_service_.get(), 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &transport_security_state_, 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &crypto_client_stream_factory_, 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &random_generator_, 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci clock_, 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kDefaultMaxPacketSize, 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string(), 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SupportedVersions(GetParam()), 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /*enable_port_selection=*/true, 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /*enable_time_based_loss_detection=*/true, 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /*always_require_handshake_confirmation=*/false, 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /*disable_connection_pooling=*/false, 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci QuicTagVector()), 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) host_port_pair_(kDefaultServerHostName, kDefaultServerPort), 1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch is_https_(false), 122e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch privacy_mode_(PRIVACY_MODE_DISABLED) { 1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) factory_.set_require_confirmation(false); 12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<QuicHttpStream> CreateIfSessionExists( 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const HostPortPair& host_port_pair, 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const BoundNetLog& net_log) { 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return QuicStreamFactoryPeer::CreateIfSessionExists( 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &factory_, host_port_pair, false, net_log_); 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int GetSourcePortForNewSession(const HostPortPair& destination) { 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GetSourcePortForNewSessionInner(destination, false); 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int GetSourcePortForNewSessionAndGoAway( 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const HostPortPair& destination) { 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GetSourcePortForNewSessionInner(destination, true); 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int GetSourcePortForNewSessionInner(const HostPortPair& destination, 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool goaway_received) { 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Should only be called if there is no active session for this destination. 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(NULL, CreateIfSessionExists(destination, net_log_).get()); 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t socket_count = socket_factory_.udp_client_sockets().size(); 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockRead reads[] = { 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockRead(ASYNC, OK, 0) // EOF 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) socket_data.StopAfter(1); 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data); 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicStreamRequest request(&factory_); 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request.Request(destination, 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 160effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.callback())); 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(OK, callback_.WaitForResult()); 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(stream.get()); 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) stream.reset(); 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession( 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &factory_, destination, is_https_); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) { 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(false); 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 0; 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPEndPoint endpoint; 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) socket_factory_. 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint); 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int port = endpoint.port(); 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (goaway_received) { 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, ""); 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) session->OnGoAway(goaway); 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) factory_.OnSessionClosed(session); 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(NULL, CreateIfSessionExists(destination, net_log_).get()); 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(socket_data.at_read_eof()); 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(socket_data.at_write_eof()); 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return port; 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() { 195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) QuicStreamId stream_id = kClientDataStreamId1; 1960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return maker_.MakeRstPacket( 1970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1, true, stream_id, 1980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch AdjustErrorForVersion(QUIC_RST_FLOW_CONTROL_ACCOUNTING, GetParam())); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockHostResolver host_resolver_; 202b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DeterministicMockClientSocketFactory socket_factory_; 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockCryptoClientStreamFactory crypto_client_stream_factory_; 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockRandom random_generator_; 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockClock* clock_; // Owned by factory_. 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci QuicTestPacketMaker maker_; 207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<CertVerifier> cert_verifier_; 2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<ChannelIDService> channel_id_service_; 2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TransportSecurityState transport_security_state_; 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicStreamFactory factory_; 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) HostPortPair host_port_pair_; 2127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool is_https_; 213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PrivacyMode privacy_mode_; 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BoundNetLog net_log_; 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestCompletionCallback callback_; 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(Version, QuicStreamFactoryTest, 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ::testing::ValuesIn(QuicSupportedVersions())); 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_P(QuicStreamFactoryTest, CreateIfSessionExists) { 222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(NULL, CreateIfSessionExists(host_port_pair_, net_log_).get()); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_P(QuicStreamFactoryTest, Create) { 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockRead reads[] = { 227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MockRead(ASYNC, OK, 0) // EOF 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data); 231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) socket_data.StopAfter(1); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicStreamRequest request(&factory_); 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, 235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request.Request(host_port_pair_, 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.callback())); 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(OK, callback_.WaitForResult()); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 244b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(stream.get()); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Will reset stream 3. 247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) stream = CreateIfSessionExists(host_port_pair_, net_log_); 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(stream.get()); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result 2517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // in streams on different sessions. 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicStreamRequest request2(&factory_); 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(OK, 254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request2.Request(host_port_pair_, 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.callback())); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stream = request2.ReleaseStream(); // Will reset stream 5. 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stream.reset(); // Will reset stream 7. 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(socket_data.at_read_eof()); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(socket_data.at_write_eof()); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 267effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_P(QuicStreamFactoryTest, CreateZeroRtt) { 268effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch MockRead reads[] = { 269effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch MockRead(ASYNC, OK, 0) // EOF 270effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch }; 271effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); 272effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch socket_factory_.AddSocketDataProvider(&socket_data); 273effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch socket_data.StopAfter(1); 274effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 275effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch crypto_client_stream_factory_.set_handshake_mode( 276effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch MockCryptoClientStream::ZERO_RTT); 277effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch host_resolver_.set_synchronous_mode(true); 278effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), 279effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "192.168.0.1", ""); 280effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 281effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch QuicStreamRequest request(&factory_); 282effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(OK, 283effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch request.Request(host_port_pair_, 284effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch is_https_, 285effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 286effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "GET", 287effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch net_log_, 288effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch callback_.callback())); 289effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 290effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 291effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(stream.get()); 292effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(socket_data.at_read_eof()); 293effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(socket_data.at_write_eof()); 294effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 295effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 296effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_P(QuicStreamFactoryTest, CreateZeroRttPost) { 297effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch MockRead reads[] = { 298effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch MockRead(ASYNC, OK, 0) // EOF 299effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch }; 300effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); 301effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch socket_factory_.AddSocketDataProvider(&socket_data); 302effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch socket_data.StopAfter(1); 303effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 304effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch crypto_client_stream_factory_.set_handshake_mode( 305effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch MockCryptoClientStream::ZERO_RTT); 306effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch host_resolver_.set_synchronous_mode(true); 307effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), 308effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "192.168.0.1", ""); 309effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 310effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch QuicStreamRequest request(&factory_); 311effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Posts require handshake confirmation, so this will return asynchronously. 312effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(ERR_IO_PENDING, 313effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch request.Request(host_port_pair_, 314effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch is_https_, 315effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 316effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "POST", 317effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch net_log_, 318effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch callback_.callback())); 319effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 320effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Confirm the handshake and verify that the stream is created. 321effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( 322effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch QuicSession::HANDSHAKE_CONFIRMED); 323effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 324effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(OK, callback_.WaitForResult()); 325effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 326effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(stream.get()); 327effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(socket_data.at_read_eof()); 328effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(socket_data.at_write_eof()); 329effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 330effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) { 332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MockRead reads[] = { 333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MockRead(ASYNC, OK, 0) // EOF 334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }; 335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0); 336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0); 337a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data1); 338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data2); 339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_data1.StopAfter(1); 340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_data2.StopAfter(1); 341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) QuicStreamRequest request(&factory_); 343a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, 344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request.Request(host_port_pair_, 345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) is_https_, 346effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 347a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "GET", 348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net_log_, 349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) callback_.callback())); 350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(OK, callback_.WaitForResult()); 352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(stream.get()); 354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) QuicStreamRequest request2(&factory_); 356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, 357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request2.Request(host_port_pair_, 358a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) !is_https_, 359effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "GET", 361a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net_log_, 362a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) callback_.callback())); 363a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(OK, callback_.WaitForResult()); 364a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) stream = request2.ReleaseStream(); 365a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(stream.get()); 366a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) stream.reset(); 367a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 368a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession( 369a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &factory_, host_port_pair_, is_https_), 370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) QuicStreamFactoryPeer::GetActiveSession( 371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &factory_, host_port_pair_, !is_https_)); 372a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 373a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(socket_data1.at_read_eof()); 374a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(socket_data1.at_write_eof()); 375a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(socket_data2.at_read_eof()); 376a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(socket_data2.at_write_eof()); 377a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 378a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 37903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_P(QuicStreamFactoryTest, Pooling) { 3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockRead reads[] = { 3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockRead(ASYNC, OK, 0) // EOF 3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data); 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) socket_data.StopAfter(1); 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) HostPortPair server2("mail.google.com", kDefaultServerPort); 3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_resolver_.set_synchronous_mode(true); 3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_resolver_.rules()->AddIPLiteralRule( 3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kDefaultServerHostName, "192.168.0.1", ""); 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_resolver_.rules()->AddIPLiteralRule( 3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "mail.google.com", "192.168.0.1", ""); 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicStreamRequest request(&factory_); 3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(OK, 396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request.Request(host_port_pair_, 3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 398effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.callback())); 4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(stream.get()); 4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestCompletionCallback callback; 4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicStreamRequest request2(&factory_); 4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(OK, 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request2.Request(server2, 4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 410effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback.callback())); 4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); 4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(stream2.get()); 4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ( 418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) QuicStreamFactoryPeer::GetActiveSession( 419a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &factory_, host_port_pair_, is_https_), 420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_)); 4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(socket_data.at_read_eof()); 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(socket_data.at_write_eof()); 4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) { 4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MockRead reads[] = { 4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MockRead(ASYNC, OK, 0) // EOF 4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0); 4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0); 4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci socket_factory_.AddSocketDataProvider(&socket_data1); 4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci socket_factory_.AddSocketDataProvider(&socket_data2); 4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci socket_data1.StopAfter(1); 4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci socket_data2.StopAfter(1); 4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HostPortPair server2("mail.google.com", kDefaultServerPort); 4381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_resolver_.set_synchronous_mode(true); 4391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_resolver_.rules()->AddIPLiteralRule( 4401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kDefaultServerHostName, "192.168.0.1", ""); 4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_resolver_.rules()->AddIPLiteralRule( 4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "mail.google.com", "192.168.0.1", ""); 4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Disable connection pooling. 4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci QuicStreamFactoryPeer::DisableConnectionPooling(&factory_); 4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci QuicStreamRequest request(&factory_); 4481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(OK, 4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci request.Request(host_port_pair_, 4501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci is_https_, 4511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci privacy_mode_, 4521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "GET", 4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net_log_, 4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback_.callback())); 4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(stream.get()); 4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestCompletionCallback callback; 4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci QuicStreamRequest request2(&factory_); 4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(OK, 4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci request2.Request(server2, 4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci is_https_, 4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci privacy_mode_, 4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "GET", 4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net_log_, 4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback.callback())); 4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); 4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(stream2.get()); 4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_NE( 4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci QuicStreamFactoryPeer::GetActiveSession( 4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &factory_, host_port_pair_, is_https_), 4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_)); 4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(socket_data1.at_read_eof()); 4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(socket_data1.at_write_eof()); 4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(socket_data2.at_read_eof()); 4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(socket_data2.at_write_eof()); 4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) { 4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockRead reads[] = { 4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockRead(ASYNC, OK, 0) // EOF 4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0); 4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0); 4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data1); 4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data2); 4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) socket_data1.StopAfter(1); 4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) socket_data2.StopAfter(1); 4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 492a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) HostPortPair server2("mail.google.com", kDefaultServerPort); 4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_resolver_.set_synchronous_mode(true); 4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_resolver_.rules()->AddIPLiteralRule( 4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kDefaultServerHostName, "192.168.0.1", ""); 4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_resolver_.rules()->AddIPLiteralRule( 4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "mail.google.com", "192.168.0.1", ""); 4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicStreamRequest request(&factory_); 5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(OK, 501a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request.Request(host_port_pair_, 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 503effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.callback())); 5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(stream.get()); 5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestCompletionCallback callback; 5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicStreamRequest request2(&factory_); 5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(OK, 5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request2.Request(server2, 5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 515effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback.callback())); 5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); 5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(stream2.get()); 5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 522a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) factory_.OnSessionGoingAway(QuicStreamFactoryPeer::GetActiveSession( 523a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &factory_, host_port_pair_, is_https_)); 524a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession( 525a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &factory_, host_port_pair_, is_https_)); 526a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession( 527a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &factory_, server2, is_https_)); 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestCompletionCallback callback3; 5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicStreamRequest request3(&factory_); 5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(OK, 5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request3.Request(server2, 5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 534effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback3.callback())); 5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream(); 5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(stream3.get()); 5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 541a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession( 542a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &factory_, server2, is_https_)); 5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(socket_data1.at_read_eof()); 5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(socket_data1.at_write_eof()); 5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(socket_data2.at_read_eof()); 5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(socket_data2.at_write_eof()); 5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_P(QuicStreamFactoryTest, HttpsPooling) { 5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockRead reads[] = { 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockRead(ASYNC, OK, 0) // EOF 5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); 5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data); 5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) socket_data.StopAfter(1); 5575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 558a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) HostPortPair server1("www.example.org", 443); 559a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) HostPortPair server2("mail.example.org", 443); 5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Load a cert that is valid for: 5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // www.example.org (server1) 5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // mail.example.org (server2) 5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // www.example.com 5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath certs_dir = GetTestCertsDirectory(); 5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<X509Certificate> test_cert( 5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ImportCertFromFile(certs_dir, "spdy_pooling.pem")); 5681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); 56923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ProofVerifyDetailsChromium verify_details; 57023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) verify_details.cert_verify_result.verified_cert = test_cert; 57103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) verify_details.cert_verify_result.is_issued_by_known_root = true; 57223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) crypto_client_stream_factory_.set_proof_verify_details(&verify_details); 5735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_resolver_.set_synchronous_mode(true); 575a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", ""); 576a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); 5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicStreamRequest request(&factory_); 5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_ = true; 5805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(OK, 5815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request.Request(server1, 5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 583effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.callback())); 5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 5885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(stream.get()); 5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestCompletionCallback callback; 5915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicStreamRequest request2(&factory_); 5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(OK, 5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request2.Request(server2, 5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 595effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.callback())); 5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); 6005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(stream2.get()); 6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 602a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession( 603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &factory_, server1, is_https_), 604a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) QuicStreamFactoryPeer::GetActiveSession( 605a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &factory_, server2, is_https_)); 6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(socket_data.at_read_eof()); 6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(socket_data.at_write_eof()); 6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) { 6121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MockRead reads[] = { 6131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MockRead(ASYNC, OK, 0) // EOF 6141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 6151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0); 6161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0); 6171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci socket_factory_.AddSocketDataProvider(&socket_data1); 6181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci socket_factory_.AddSocketDataProvider(&socket_data2); 6191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci socket_data1.StopAfter(1); 6201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci socket_data2.StopAfter(1); 6211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HostPortPair server1("www.example.org", 443); 6231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HostPortPair server2("mail.example.org", 443); 6241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Load a cert that is valid for: 6261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // www.example.org (server1) 6271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // mail.example.org (server2) 6281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // www.example.com 6291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::FilePath certs_dir = GetTestCertsDirectory(); 6301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<X509Certificate> test_cert( 6311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ImportCertFromFile(certs_dir, "spdy_pooling.pem")); 6321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); 6331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProofVerifyDetailsChromium verify_details; 6341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci verify_details.cert_verify_result.verified_cert = test_cert; 6351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci verify_details.cert_verify_result.is_issued_by_known_root = true; 6361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci crypto_client_stream_factory_.set_proof_verify_details(&verify_details); 6371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_resolver_.set_synchronous_mode(true); 6391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", ""); 6401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); 6411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Disable connection pooling. 6431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci QuicStreamFactoryPeer::DisableConnectionPooling(&factory_); 6441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci QuicStreamRequest request(&factory_); 6461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci is_https_ = true; 6471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(OK, 6481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci request.Request(server1, 6491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci is_https_, 6501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci privacy_mode_, 6511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "GET", 6521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net_log_, 6531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback_.callback())); 6541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 6551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(stream.get()); 6561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestCompletionCallback callback; 6581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci QuicStreamRequest request2(&factory_); 6591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(OK, 6601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci request2.Request(server2, 6611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci is_https_, 6621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci privacy_mode_, 6631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "GET", 6641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net_log_, 6651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback_.callback())); 6661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); 6671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(stream2.get()); 6681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession( 6701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &factory_, server1, is_https_), 6711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci QuicStreamFactoryPeer::GetActiveSession( 6721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &factory_, server2, is_https_)); 6731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(socket_data1.at_read_eof()); 6751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(socket_data1.at_write_eof()); 6761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(socket_data2.at_read_eof()); 6771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(socket_data2.at_write_eof()); 6781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 6791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithCertMismatch) { 6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockRead reads[] = { 6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockRead(ASYNC, OK, 0) // EOF 6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0); 6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0); 6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data1); 6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data2); 6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) socket_data1.StopAfter(1); 6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) socket_data2.StopAfter(1); 6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 691a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) HostPortPair server1("www.example.org", 443); 692a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) HostPortPair server2("mail.google.com", 443); 6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Load a cert that is valid for: 6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // www.example.org (server1) 6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // mail.example.org 6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // www.example.com 6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // But is not valid for mail.google.com (server2). 6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath certs_dir = GetTestCertsDirectory(); 7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<X509Certificate> test_cert( 7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ImportCertFromFile(certs_dir, "spdy_pooling.pem")); 7021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); 70323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ProofVerifyDetailsChromium verify_details; 70423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) verify_details.cert_verify_result.verified_cert = test_cert; 70523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) crypto_client_stream_factory_.set_proof_verify_details(&verify_details); 70623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_resolver_.set_synchronous_mode(true); 709a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", ""); 710a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); 7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicStreamRequest request(&factory_); 7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_ = true; 7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(OK, 7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request.Request(server1, 7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 717effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.callback())); 7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 7225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(stream.get()); 7235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestCompletionCallback callback; 7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicStreamRequest request2(&factory_); 7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(OK, 7275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request2.Request(server2, 7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 729effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 7305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 73103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) net_log_, 73203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) callback_.callback())); 73303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); 73403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(stream2.get()); 73503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 73603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession( 73703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) &factory_, server1, is_https_), 73803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) QuicStreamFactoryPeer::GetActiveSession( 73903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) &factory_, server2, is_https_)); 74003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 74103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(socket_data1.at_read_eof()); 74203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(socket_data1.at_write_eof()); 74303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(socket_data2.at_read_eof()); 74403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(socket_data2.at_write_eof()); 74503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 74603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 74703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) { 74803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MockRead reads[] = { 74903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MockRead(ASYNC, OK, 0) // EOF 75003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) }; 75103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); 75203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data); 75303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) socket_data.StopAfter(1); 75403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 75503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) HostPortPair server1("www.example.org", 443); 75603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) HostPortPair server2("mail.example.org", 443); 75703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) uint8 primary_pin = 1; 75803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) uint8 backup_pin = 2; 75903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) test::AddPin(&transport_security_state_, "mail.example.org", primary_pin, 76003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) backup_pin); 76103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 76203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Load a cert that is valid for: 76303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // www.example.org (server1) 76403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // mail.example.org (server2) 76503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::FilePath certs_dir = GetTestCertsDirectory(); 76603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<X509Certificate> test_cert( 76703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ImportCertFromFile(certs_dir, "spdy_pooling.pem")); 7681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); 76903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ProofVerifyDetailsChromium verify_details; 77003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) verify_details.cert_verify_result.verified_cert = test_cert; 77103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) verify_details.cert_verify_result.is_issued_by_known_root = true; 77203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) verify_details.cert_verify_result.public_key_hashes.push_back( 77303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) test::GetTestHashValue(primary_pin)); 77403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) crypto_client_stream_factory_.set_proof_verify_details(&verify_details); 77503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 77603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 77703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) host_resolver_.set_synchronous_mode(true); 77803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", ""); 77903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); 78003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 78103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) QuicStreamRequest request(&factory_); 78203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) is_https_ = true; 78303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(OK, 78403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) request.Request(server1, 78503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) is_https_, 78603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) privacy_mode_, 78703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "GET", 78803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) net_log_, 78903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) callback_.callback())); 79003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 79103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(stream.get()); 79203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 79303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TestCompletionCallback callback; 79403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) QuicStreamRequest request2(&factory_); 79503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(OK, 79603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) request2.Request(server2, 79703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) is_https_, 79803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) privacy_mode_, 79903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "GET", 80003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) net_log_, 80103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) callback_.callback())); 80203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); 80303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(stream2.get()); 80403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 80503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession( 80603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) &factory_, server1, is_https_), 80703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) QuicStreamFactoryPeer::GetActiveSession( 80803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) &factory_, server2, is_https_)); 80903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 81003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(socket_data.at_read_eof()); 81103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(socket_data.at_write_eof()); 81203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 81303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 8141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) { 8151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MockRead reads[] = { 8161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MockRead(ASYNC, OK, 0) // EOF 8171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 8181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0); 8191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0); 8201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci socket_factory_.AddSocketDataProvider(&socket_data1); 8211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci socket_factory_.AddSocketDataProvider(&socket_data2); 8221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci socket_data1.StopAfter(1); 8231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci socket_data2.StopAfter(1); 8241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HostPortPair server1("www.example.org", 443); 8261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HostPortPair server2("mail.example.org", 443); 8271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uint8 primary_pin = 1; 8281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uint8 backup_pin = 2; 8291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci test::AddPin(&transport_security_state_, "mail.example.org", primary_pin, 8301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci backup_pin); 8311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Load a cert that is valid for: 8331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // www.example.org (server1) 8341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // mail.example.org (server2) 8351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::FilePath certs_dir = GetTestCertsDirectory(); 8361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<X509Certificate> test_cert( 8371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ImportCertFromFile(certs_dir, "spdy_pooling.pem")); 8381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); 8391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProofVerifyDetailsChromium verify_details; 8401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci verify_details.cert_verify_result.verified_cert = test_cert; 8411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci verify_details.cert_verify_result.is_issued_by_known_root = true; 8421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci verify_details.cert_verify_result.public_key_hashes.push_back( 8431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci test::GetTestHashValue(primary_pin)); 8441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci crypto_client_stream_factory_.set_proof_verify_details(&verify_details); 8451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_resolver_.set_synchronous_mode(true); 8481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", ""); 8491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); 8501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Disable connection pooling. 8521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci QuicStreamFactoryPeer::DisableConnectionPooling(&factory_); 8531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci QuicStreamRequest request(&factory_); 8551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci is_https_ = true; 8561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(OK, 8571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci request.Request(server1, 8581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci is_https_, 8591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci privacy_mode_, 8601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "GET", 8611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net_log_, 8621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback_.callback())); 8631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 8641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(stream.get()); 8651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestCompletionCallback callback; 8671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci QuicStreamRequest request2(&factory_); 8681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(OK, 8691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci request2.Request(server2, 8701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci is_https_, 8711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci privacy_mode_, 8721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "GET", 8731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net_log_, 8741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback_.callback())); 8751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); 8761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(stream2.get()); 8771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession( 8791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &factory_, server1, is_https_), 8801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci QuicStreamFactoryPeer::GetActiveSession( 8811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &factory_, server2, is_https_)); 8821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(socket_data1.at_read_eof()); 8841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(socket_data1.at_write_eof()); 8851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(socket_data2.at_read_eof()); 8861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(socket_data2.at_write_eof()); 8871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 8881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 88903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) { 89003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MockRead reads[] = { 89103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MockRead(ASYNC, OK, 0) // EOF 89203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) }; 89303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0); 89403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0); 89503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data1); 89603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data2); 89703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) socket_data1.StopAfter(1); 89803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) socket_data2.StopAfter(1); 89903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 90003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) HostPortPair server1("www.example.org", 443); 90103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) HostPortPair server2("mail.example.org", 443); 90203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) uint8 primary_pin = 1; 90303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) uint8 backup_pin = 2; 90403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) uint8 bad_pin = 3; 90503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) test::AddPin(&transport_security_state_, "mail.example.org", primary_pin, 90603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) backup_pin); 90703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 90803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Load a cert that is valid for: 90903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // www.example.org (server1) 91003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // mail.example.org (server2) 91103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::FilePath certs_dir = GetTestCertsDirectory(); 91203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<X509Certificate> test_cert( 91303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ImportCertFromFile(certs_dir, "spdy_pooling.pem")); 9141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get()); 91503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ProofVerifyDetailsChromium verify_details; 91603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) verify_details.cert_verify_result.verified_cert = test_cert; 91703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) verify_details.cert_verify_result.is_issued_by_known_root = true; 91803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) verify_details.cert_verify_result.public_key_hashes.push_back( 91903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) test::GetTestHashValue(bad_pin)); 92003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) crypto_client_stream_factory_.set_proof_verify_details(&verify_details); 92103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 92203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 92303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) host_resolver_.set_synchronous_mode(true); 92403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", ""); 92503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", ""); 92603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 92703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) QuicStreamRequest request(&factory_); 92803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) is_https_ = true; 92903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(OK, 93003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) request.Request(server1, 93103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) is_https_, 93203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) privacy_mode_, 93303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "GET", 93403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) net_log_, 93503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) callback_.callback())); 93603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 93703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(stream.get()); 93803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 93903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TestCompletionCallback callback; 94003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) QuicStreamRequest request2(&factory_); 94103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(OK, 94203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) request2.Request(server2, 94303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) is_https_, 94403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) privacy_mode_, 94503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "GET", 9465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 9475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.callback())); 9485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); 9495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(stream2.get()); 9505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 951a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession( 952a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &factory_, server1, is_https_), 953a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) QuicStreamFactoryPeer::GetActiveSession( 954a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &factory_, server2, is_https_)); 9555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(socket_data1.at_read_eof()); 9575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(socket_data1.at_write_eof()); 9585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(socket_data2.at_read_eof()); 9595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(socket_data2.at_write_eof()); 9605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 9615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_P(QuicStreamFactoryTest, Goaway) { 9638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead reads[] = { 9648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MockRead(ASYNC, OK, 0) // EOF 9658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) }; 9668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); 9678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) socket_data.StopAfter(1); 9688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data); 9698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0); 9708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) socket_data2.StopAfter(1); 9718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data2); 9728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 9738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) QuicStreamRequest request(&factory_); 9745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, 975a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request.Request(host_port_pair_, 9765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 977effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 9785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 9795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 9805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.callback())); 9818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 9828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(OK, callback_.WaitForResult()); 9838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 9848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_TRUE(stream.get()); 9858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 9868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Mark the session as going away. Ensure that while it is still alive 9878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // that it is no longer active. 9888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession( 989a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &factory_, host_port_pair_, is_https_); 9908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) factory_.OnSessionGoingAway(session); 9918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session)); 992a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession( 993a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &factory_, host_port_pair_, is_https_)); 994a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(NULL, CreateIfSessionExists(host_port_pair_, net_log_).get()); 9958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 9968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Create a new request for the same destination and verify that a 9978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // new session is created. 9988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) QuicStreamRequest request2(&factory_); 9995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, 1000a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request2.Request(host_port_pair_, 10015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 1002effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 10035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 10045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 10055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.callback())); 10068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(OK, callback_.WaitForResult()); 10078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); 10088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_TRUE(stream2.get()); 10098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 10108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(&factory_, 1011a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) host_port_pair_, 1012a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) is_https_)); 10138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_NE(session, 10148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) QuicStreamFactoryPeer::GetActiveSession( 1015a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &factory_, host_port_pair_, is_https_)); 10168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session)); 10178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 10188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) stream2.reset(); 10198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) stream.reset(); 10208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 10218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_TRUE(socket_data.at_read_eof()); 10228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_TRUE(socket_data.at_write_eof()); 10235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(socket_data2.at_read_eof()); 10245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(socket_data2.at_write_eof()); 10258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 10268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 10275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_P(QuicStreamFactoryTest, MaxOpenStream) { 1028a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MockRead reads[] = { 1029a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MockRead(ASYNC, OK, 0) // EOF 1030a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }; 1031cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) QuicStreamId stream_id = kClientDataStreamId1; 10325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<QuicEncryptedPacket> rst( 10335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED)); 1034424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) MockWrite writes[] = { 1035424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) MockWrite(ASYNC, rst->data(), rst->length(), 1), 1036424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) }; 1037424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DeterministicSocketData socket_data(reads, arraysize(reads), 1038424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) writes, arraysize(writes)); 1039a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data); 1040a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) socket_data.StopAfter(1); 1041a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1042a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) HttpRequestInfo request_info; 1043a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::vector<QuicHttpStream*> streams; 1044a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The MockCryptoClientStream sets max_open_streams to be 1045a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // 2 * kDefaultMaxStreamsPerConnection. 1046a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) for (size_t i = 0; i < 2 * kDefaultMaxStreamsPerConnection; i++) { 1047a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) QuicStreamRequest request(&factory_); 1048a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int rv = request.Request(host_port_pair_, 10495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 1050effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 10515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 10525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 1053a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) callback_.callback()); 1054a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (i == 0) { 1055a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 1056a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(OK, callback_.WaitForResult()); 1057a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } else { 1058a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(OK, rv); 1059a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1060a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 1061a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(stream); 1062a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(OK, stream->InitializeStream( 1063a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &request_info, DEFAULT_PRIORITY, net_log_, CompletionCallback())); 1064a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) streams.push_back(stream.release()); 1065a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1066a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1067a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) QuicStreamRequest request(&factory_); 10685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(OK, 1069a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request.Request(host_port_pair_, 10705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 1071effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 10725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 10735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 10745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompletionCallback())); 1075a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 1076a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(stream); 1077a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, stream->InitializeStream( 1078a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &request_info, DEFAULT_PRIORITY, net_log_, callback_.callback())); 1079a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1080a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Close the first stream. 1081a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) streams.front()->Close(false); 1082a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1083a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(callback_.have_result()); 1084a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1085a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(OK, callback_.WaitForResult()); 1086a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1087a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(socket_data.at_read_eof()); 1088a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(socket_data.at_write_eof()); 1089a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) STLDeleteElements(&streams); 1090a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 1091a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 10925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) { 1093b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DeterministicSocketData socket_data(NULL, 0, NULL, 0); 10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data); 10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName); 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicStreamRequest request(&factory_); 10995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, 1100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request.Request(host_port_pair_, 11015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 1102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 11035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 11045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 11055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.callback())); 11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult()); 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(socket_data.at_read_eof()); 11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(socket_data.at_write_eof()); 11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) { 11145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE); 11155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeterministicSocketData socket_data(NULL, 0, NULL, 0); 11165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) socket_data.set_connect_data(connect); 11175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data); 11185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) socket_data.StopAfter(1); 11195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicStreamRequest request(&factory_); 11215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, 1122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request.Request(host_port_pair_, 11235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 1124effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 11255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 11265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 11275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.callback())); 11285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult()); 11305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(socket_data.at_read_eof()); 11325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(socket_data.at_write_eof()); 11335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 11345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_P(QuicStreamFactoryTest, CancelCreate) { 11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockRead reads[] = { 1137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MockRead(ASYNC, OK, 0) // EOF 11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 1139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); 11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data); 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicStreamRequest request(&factory_); 11435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, 1144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request.Request(host_port_pair_, 11455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 1146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 11475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 11485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 11495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.callback())); 11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) socket_data.StopAfter(1); 11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::RunLoop run_loop; 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) run_loop.RunUntilIdle(); 11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<QuicHttpStream> stream( 1157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CreateIfSessionExists(host_port_pair_, net_log_)); 11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(stream.get()); 11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stream.reset(); 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(socket_data.at_read_eof()); 11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(socket_data.at_write_eof()); 11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) { 11665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Sequentially connect to the default host, then another host, and then the 11675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // default host. Verify that the default host gets a consistent ephemeral 11685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // port, that is different from the other host's connection. 11695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string other_server_name = "other.google.com"; 11715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_NE(kDefaultServerHostName, other_server_name); 11725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) HostPortPair host_port_pair2(other_server_name, kDefaultServerPort); 11735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int original_port = GetSourcePortForNewSession(host_port_pair_); 1175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2)); 1176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_)); 1177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) { 1180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Get a session to the host using the port suggester. 1181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int original_port = 1182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetSourcePortForNewSessionAndGoAway(host_port_pair_); 1183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Verify that the port is different after the goaway. 1184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_)); 1185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Since the previous session did not goaway we should see the original port. 1186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_)); 11875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 11885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_P(QuicStreamFactoryTest, CloseAllSessions) { 11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockRead reads[] = { 1191b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MockRead(ASYNC, 0, 0) // EOF 11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 11935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); 11945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<MockWrite> writes; 11955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); 11965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeterministicSocketData socket_data(reads, arraysize(reads), 11975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) writes.empty() ? NULL : &writes[0], 11985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) writes.size()); 11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data); 1200b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) socket_data.StopAfter(1); 12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockRead reads2[] = { 1203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MockRead(ASYNC, 0, 0) // EOF 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 1205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0); 12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data2); 1207b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) socket_data2.StopAfter(1); 12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicStreamRequest request(&factory_); 12105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, 1211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request.Request(host_port_pair_, 12125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 1213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 12145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 12155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 12165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.callback())); 12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(OK, callback_.WaitForResult()); 12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 1220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) HttpRequestInfo request_info; 1221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(OK, stream->InitializeStream(&request_info, 1222a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DEFAULT_PRIORITY, 1223a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) net_log_, CompletionCallback())); 12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Close the session and verify that stream saw the error. 12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) factory_.CloseAllSessions(ERR_INTERNET_DISCONNECTED); 12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ERR_INTERNET_DISCONNECTED, 12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stream->ReadResponseHeaders(callback_.callback())); 12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now attempting to request a stream to the same origin should create 12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a new session. 12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicStreamRequest request2(&factory_); 12345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, 1235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request2.Request(host_port_pair_, 12365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 1237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 12385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 12395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 12405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.callback())); 12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(OK, callback_.WaitForResult()); 12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stream = request2.ReleaseStream(); 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stream.reset(); // Will reset stream 3. 12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(socket_data.at_read_eof()); 12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(socket_data.at_write_eof()); 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(socket_data2.at_read_eof()); 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(socket_data2.at_write_eof()); 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) { 1253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockRead reads[] = { 1254b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MockRead(ASYNC, 0, 0) // EOF 1255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 12565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); 12575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<MockWrite> writes; 12585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); 12595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeterministicSocketData socket_data(reads, arraysize(reads), 12605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) writes.empty() ? NULL : &writes[0], 12615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) writes.size()); 1262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data); 1263b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) socket_data.StopAfter(1); 1264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockRead reads2[] = { 1266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MockRead(ASYNC, 0, 0) // EOF 1267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 1268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0); 1269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data2); 1270b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) socket_data2.StopAfter(1); 1271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicStreamRequest request(&factory_); 12735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, 1274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request.Request(host_port_pair_, 12755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 1276effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 12775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 12785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 12795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.callback())); 1280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(OK, callback_.WaitForResult()); 1282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 1283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) HttpRequestInfo request_info; 1284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(OK, stream->InitializeStream(&request_info, 1285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DEFAULT_PRIORITY, 1286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) net_log_, CompletionCallback())); 1287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Change the IP address and verify that stream saw the error. 1289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) factory_.OnIPAddressChanged(); 1290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(ERR_NETWORK_CHANGED, 1291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) stream->ReadResponseHeaders(callback_.callback())); 12923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(factory_.require_confirmation()); 1293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Now attempting to request a stream to the same origin should create 1295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // a new session. 1296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicStreamRequest request2(&factory_); 12985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, 1299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request2.Request(host_port_pair_, 13005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 1301effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 13025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 13035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 13045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.callback())); 1305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(OK, callback_.WaitForResult()); 1307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) stream = request2.ReleaseStream(); 1308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) stream.reset(); // Will reset stream 3. 1309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(socket_data.at_read_eof()); 1311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(socket_data.at_write_eof()); 1312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(socket_data2.at_read_eof()); 1313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(socket_data2.at_write_eof()); 1314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 13165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_P(QuicStreamFactoryTest, OnCertAdded) { 1317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MockRead reads[] = { 1318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MockRead(ASYNC, 0, 0) // EOF 1319f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }; 13205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); 13215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<MockWrite> writes; 13225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); 13235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeterministicSocketData socket_data(reads, arraysize(reads), 13245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) writes.empty() ? NULL : &writes[0], 13255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) writes.size()); 1326f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data); 1327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) socket_data.StopAfter(1); 1328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MockRead reads2[] = { 1330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MockRead(ASYNC, 0, 0) // EOF 1331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }; 1332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0); 1333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data2); 1334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) socket_data2.StopAfter(1); 1335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) QuicStreamRequest request(&factory_); 13375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, 1338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request.Request(host_port_pair_, 13395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 1340effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 13415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 13425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 13435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.callback())); 1344f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(OK, callback_.WaitForResult()); 1346f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 1347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) HttpRequestInfo request_info; 1348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(OK, stream->InitializeStream(&request_info, 1349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DEFAULT_PRIORITY, 1350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net_log_, CompletionCallback())); 1351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Add a cert and verify that stream saw the event. 1353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory_.OnCertAdded(NULL); 1354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(ERR_CERT_DATABASE_CHANGED, 1355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) stream->ReadResponseHeaders(callback_.callback())); 1356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(factory_.require_confirmation()); 1357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Now attempting to request a stream to the same origin should create 1359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // a new session. 1360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) QuicStreamRequest request2(&factory_); 13625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, 1363a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request2.Request(host_port_pair_, 13645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 1365effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 13665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 13675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 13685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.callback())); 1369f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1370f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(OK, callback_.WaitForResult()); 1371f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) stream = request2.ReleaseStream(); 1372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) stream.reset(); // Will reset stream 3. 1373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1374f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(socket_data.at_read_eof()); 1375f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(socket_data.at_write_eof()); 1376f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(socket_data2.at_read_eof()); 1377f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(socket_data2.at_write_eof()); 1378f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 1379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 13805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_P(QuicStreamFactoryTest, OnCACertChanged) { 1381f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MockRead reads[] = { 1382f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MockRead(ASYNC, 0, 0) // EOF 1383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }; 13845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); 13855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<MockWrite> writes; 13865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); 13875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeterministicSocketData socket_data(reads, arraysize(reads), 13885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) writes.empty() ? NULL : &writes[0], 13895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) writes.size()); 1390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data); 1391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) socket_data.StopAfter(1); 1392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MockRead reads2[] = { 1394f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MockRead(ASYNC, 0, 0) // EOF 1395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }; 1396f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0); 1397f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) socket_factory_.AddSocketDataProvider(&socket_data2); 1398f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) socket_data2.StopAfter(1); 1399f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) QuicStreamRequest request(&factory_); 14015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, 1402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request.Request(host_port_pair_, 14035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 1404effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 14055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 14065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 14075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.callback())); 1408f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1409f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(OK, callback_.WaitForResult()); 1410f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); 1411f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) HttpRequestInfo request_info; 1412f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(OK, stream->InitializeStream(&request_info, 1413f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DEFAULT_PRIORITY, 1414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net_log_, CompletionCallback())); 1415f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Change the CA cert and verify that stream saw the event. 1417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) factory_.OnCACertChanged(NULL); 1418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(ERR_CERT_DATABASE_CHANGED, 1419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) stream->ReadResponseHeaders(callback_.callback())); 1420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(factory_.require_confirmation()); 1421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Now attempting to request a stream to the same origin should create 1423f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // a new session. 1424f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) QuicStreamRequest request2(&factory_); 14265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, 1427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) request2.Request(host_port_pair_, 14285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_https_, 1429effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch privacy_mode_, 14305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GET", 14315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net_log_, 14325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.callback())); 1433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1434f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(OK, callback_.WaitForResult()); 1435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) stream = request2.ReleaseStream(); 1436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) stream.reset(); // Will reset stream 3. 1437f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(socket_data.at_read_eof()); 1439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(socket_data.at_write_eof()); 1440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(socket_data2.at_read_eof()); 1441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(socket_data2.at_write_eof()); 1442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 1443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 14445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) { 1445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) vector<string> cannoncial_suffixes; 1446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cannoncial_suffixes.push_back(string(".c.youtube.com")); 1447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cannoncial_suffixes.push_back(string(".googlevideo.com")); 1448f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) { 1450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) string r1_host_name("r1"); 1451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) string r2_host_name("r2"); 1452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) r1_host_name.append(cannoncial_suffixes[i]); 1453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) r2_host_name.append(cannoncial_suffixes[i]); 1454f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) HostPortPair host_port_pair1(r1_host_name, 80); 1456effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch QuicCryptoClientConfig* crypto_config = 1457effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch QuicStreamFactoryPeer::GetCryptoConfig(&factory_); 1458e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_); 1459f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) QuicCryptoClientConfig::CachedState* cached1 = 1460e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch crypto_config->LookupOrCreate(server_id1); 1461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(cached1->proof_valid()); 1462f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(cached1->source_address_token().empty()); 1463f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1464f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Mutate the cached1 to have different data. 1465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(rtenneti): mutate other members of CachedState. 1466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cached1->set_source_address_token(r1_host_name); 1467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cached1->SetProofValid(); 1468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) HostPortPair host_port_pair2(r2_host_name, 80); 1470e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_); 1471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) QuicCryptoClientConfig::CachedState* cached2 = 1472e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch crypto_config->LookupOrCreate(server_id2); 1473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token()); 1474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(cached2->proof_valid()); 1475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 14761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 14771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 14785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) { 1479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) vector<string> cannoncial_suffixes; 1480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cannoncial_suffixes.push_back(string(".c.youtube.com")); 1481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cannoncial_suffixes.push_back(string(".googlevideo.com")); 1482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) { 1484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) string r3_host_name("r3"); 1485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) string r4_host_name("r4"); 1486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) r3_host_name.append(cannoncial_suffixes[i]); 1487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) r4_host_name.append(cannoncial_suffixes[i]); 1488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) HostPortPair host_port_pair1(r3_host_name, 80); 1490effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch QuicCryptoClientConfig* crypto_config = 1491effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch QuicStreamFactoryPeer::GetCryptoConfig(&factory_); 1492e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_); 1493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) QuicCryptoClientConfig::CachedState* cached1 = 1494e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch crypto_config->LookupOrCreate(server_id1); 1495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(cached1->proof_valid()); 1496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(cached1->source_address_token().empty()); 1497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Mutate the cached1 to have different data. 1499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(rtenneti): mutate other members of CachedState. 1500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cached1->set_source_address_token(r3_host_name); 1501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cached1->SetProofInvalid(); 1502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) HostPortPair host_port_pair2(r4_host_name, 80); 1504e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_); 1505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) QuicCryptoClientConfig::CachedState* cached2 = 1506e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch crypto_config->LookupOrCreate(server_id2); 1507f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_NE(cached1->source_address_token(), cached2->source_address_token()); 1508f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(cached2->source_address_token().empty()); 1509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(cached2->proof_valid()); 1510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 15114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 15124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace test 15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace net 1515