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