Home | History | Annotate | Download | only in quic
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "net/quic/quic_stream_factory.h"
      6 
      7 #include "base/run_loop.h"
      8 #include "base/strings/string_util.h"
      9 #include "net/base/test_data_directory.h"
     10 #include "net/cert/cert_verifier.h"
     11 #include "net/dns/mock_host_resolver.h"
     12 #include "net/http/http_response_headers.h"
     13 #include "net/http/http_response_info.h"
     14 #include "net/http/http_util.h"
     15 #include "net/http/transport_security_state.h"
     16 #include "net/quic/crypto/crypto_handshake.h"
     17 #include "net/quic/crypto/proof_verifier_chromium.h"
     18 #include "net/quic/crypto/quic_decrypter.h"
     19 #include "net/quic/crypto/quic_encrypter.h"
     20 #include "net/quic/quic_http_stream.h"
     21 #include "net/quic/quic_server_id.h"
     22 #include "net/quic/test_tools/mock_clock.h"
     23 #include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
     24 #include "net/quic/test_tools/mock_random.h"
     25 #include "net/quic/test_tools/quic_test_packet_maker.h"
     26 #include "net/quic/test_tools/quic_test_utils.h"
     27 #include "net/socket/socket_test_util.h"
     28 #include "net/test/cert_test_util.h"
     29 #include "testing/gtest/include/gtest/gtest.h"
     30 
     31 using base::StringPiece;
     32 using std::string;
     33 using std::vector;
     34 
     35 namespace net {
     36 namespace test {
     37 
     38 namespace {
     39 const char kDefaultServerHostName[] = "www.google.com";
     40 const int kDefaultServerPort = 443;
     41 }  // namespace anonymous
     42 
     43 class QuicStreamFactoryPeer {
     44  public:
     45   static QuicCryptoClientConfig* GetCryptoConfig(QuicStreamFactory* factory) {
     46     return &factory->crypto_config_;
     47   }
     48 
     49   static bool HasActiveSession(QuicStreamFactory* factory,
     50                                const HostPortPair& host_port_pair,
     51                                bool is_https) {
     52     QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
     53     return factory->HasActiveSession(server_id);
     54   }
     55 
     56   static QuicClientSession* GetActiveSession(
     57       QuicStreamFactory* factory,
     58       const HostPortPair& host_port_pair,
     59       bool is_https) {
     60     QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
     61     DCHECK(factory->HasActiveSession(server_id));
     62     return factory->active_sessions_[server_id];
     63   }
     64 
     65   static scoped_ptr<QuicHttpStream> CreateIfSessionExists(
     66       QuicStreamFactory* factory,
     67       const HostPortPair& host_port_pair,
     68       bool is_https,
     69       const BoundNetLog& net_log) {
     70     QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
     71     return factory->CreateIfSessionExists(server_id, net_log);
     72   }
     73 
     74   static bool IsLiveSession(QuicStreamFactory* factory,
     75                             QuicClientSession* session) {
     76     for (QuicStreamFactory::SessionIdMap::iterator it =
     77              factory->all_sessions_.begin();
     78          it != factory->all_sessions_.end(); ++it) {
     79       if (it->first == session)
     80         return true;
     81     }
     82     return false;
     83   }
     84 };
     85 
     86 class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> {
     87  protected:
     88   QuicStreamFactoryTest()
     89       : random_generator_(0),
     90         maker_(GetParam(), 0),
     91         clock_(new MockClock()),
     92         cert_verifier_(CertVerifier::CreateDefault()),
     93         factory_(&host_resolver_, &socket_factory_,
     94                  base::WeakPtr<HttpServerProperties>(), cert_verifier_.get(),
     95                  &transport_security_state_,
     96                  &crypto_client_stream_factory_, &random_generator_, clock_,
     97                  kDefaultMaxPacketSize, std::string(),
     98                  SupportedVersions(GetParam()), true, true, true),
     99         host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
    100         is_https_(false),
    101         privacy_mode_(PRIVACY_MODE_DISABLED) {
    102     factory_.set_require_confirmation(false);
    103   }
    104 
    105   scoped_ptr<QuicHttpStream> CreateIfSessionExists(
    106       const HostPortPair& host_port_pair,
    107       const BoundNetLog& net_log) {
    108     return QuicStreamFactoryPeer::CreateIfSessionExists(
    109         &factory_, host_port_pair, false, net_log_);
    110   }
    111 
    112   int GetSourcePortForNewSession(const HostPortPair& destination) {
    113     return GetSourcePortForNewSessionInner(destination, false);
    114   }
    115 
    116   int GetSourcePortForNewSessionAndGoAway(
    117       const HostPortPair& destination) {
    118     return GetSourcePortForNewSessionInner(destination, true);
    119   }
    120 
    121   int GetSourcePortForNewSessionInner(const HostPortPair& destination,
    122                                       bool goaway_received) {
    123     // Should only be called if there is no active session for this destination.
    124     EXPECT_EQ(NULL, CreateIfSessionExists(destination, net_log_).get());
    125     size_t socket_count = socket_factory_.udp_client_sockets().size();
    126 
    127     MockRead reads[] = {
    128       MockRead(ASYNC, OK, 0)  // EOF
    129     };
    130     DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
    131     socket_data.StopAfter(1);
    132     socket_factory_.AddSocketDataProvider(&socket_data);
    133 
    134     QuicStreamRequest request(&factory_);
    135     EXPECT_EQ(ERR_IO_PENDING,
    136               request.Request(destination,
    137                               is_https_,
    138                               privacy_mode_,
    139                               "GET",
    140                               net_log_,
    141                               callback_.callback()));
    142 
    143     EXPECT_EQ(OK, callback_.WaitForResult());
    144     scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
    145     EXPECT_TRUE(stream.get());
    146     stream.reset();
    147 
    148     QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
    149         &factory_, destination, is_https_);
    150 
    151     if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) {
    152       EXPECT_TRUE(false);
    153       return 0;
    154     }
    155 
    156     IPEndPoint endpoint;
    157     socket_factory_.
    158         udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint);
    159     int port = endpoint.port();
    160     if (goaway_received) {
    161       QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
    162       session->OnGoAway(goaway);
    163     }
    164 
    165     factory_.OnSessionClosed(session);
    166     EXPECT_EQ(NULL, CreateIfSessionExists(destination, net_log_).get());
    167     EXPECT_TRUE(socket_data.at_read_eof());
    168     EXPECT_TRUE(socket_data.at_write_eof());
    169     return port;
    170   }
    171 
    172   scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() {
    173     QuicStreamId stream_id = kClientDataStreamId1;
    174     return maker_.MakeRstPacket(
    175         1, true, stream_id,
    176         AdjustErrorForVersion(QUIC_RST_FLOW_CONTROL_ACCOUNTING, GetParam()));
    177   }
    178 
    179   MockHostResolver host_resolver_;
    180   DeterministicMockClientSocketFactory socket_factory_;
    181   MockCryptoClientStreamFactory crypto_client_stream_factory_;
    182   MockRandom random_generator_;
    183   QuicTestPacketMaker maker_;
    184   MockClock* clock_;  // Owned by factory_.
    185   scoped_ptr<CertVerifier> cert_verifier_;
    186   TransportSecurityState transport_security_state_;
    187   QuicStreamFactory factory_;
    188   HostPortPair host_port_pair_;
    189   bool is_https_;
    190   PrivacyMode privacy_mode_;
    191   BoundNetLog net_log_;
    192   TestCompletionCallback callback_;
    193 };
    194 
    195 INSTANTIATE_TEST_CASE_P(Version, QuicStreamFactoryTest,
    196                         ::testing::ValuesIn(QuicSupportedVersions()));
    197 
    198 TEST_P(QuicStreamFactoryTest, CreateIfSessionExists) {
    199   EXPECT_EQ(NULL, CreateIfSessionExists(host_port_pair_, net_log_).get());
    200 }
    201 
    202 TEST_P(QuicStreamFactoryTest, Create) {
    203   MockRead reads[] = {
    204     MockRead(ASYNC, OK, 0)  // EOF
    205   };
    206   DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
    207   socket_factory_.AddSocketDataProvider(&socket_data);
    208   socket_data.StopAfter(1);
    209 
    210   QuicStreamRequest request(&factory_);
    211   EXPECT_EQ(ERR_IO_PENDING,
    212             request.Request(host_port_pair_,
    213                             is_https_,
    214                             privacy_mode_,
    215                             "GET",
    216                             net_log_,
    217                             callback_.callback()));
    218 
    219   EXPECT_EQ(OK, callback_.WaitForResult());
    220   scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
    221   EXPECT_TRUE(stream.get());
    222 
    223   // Will reset stream 3.
    224   stream = CreateIfSessionExists(host_port_pair_, net_log_);
    225   EXPECT_TRUE(stream.get());
    226 
    227   // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
    228   // in streams on different sessions.
    229   QuicStreamRequest request2(&factory_);
    230   EXPECT_EQ(OK,
    231             request2.Request(host_port_pair_,
    232                              is_https_,
    233                              privacy_mode_,
    234                              "GET",
    235                              net_log_,
    236                              callback_.callback()));
    237   stream = request2.ReleaseStream();  // Will reset stream 5.
    238   stream.reset();  // Will reset stream 7.
    239 
    240   EXPECT_TRUE(socket_data.at_read_eof());
    241   EXPECT_TRUE(socket_data.at_write_eof());
    242 }
    243 
    244 TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
    245   MockRead reads[] = {
    246     MockRead(ASYNC, OK, 0)  // EOF
    247   };
    248   DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
    249   socket_factory_.AddSocketDataProvider(&socket_data);
    250   socket_data.StopAfter(1);
    251 
    252   crypto_client_stream_factory_.set_handshake_mode(
    253       MockCryptoClientStream::ZERO_RTT);
    254   host_resolver_.set_synchronous_mode(true);
    255   host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
    256                                            "192.168.0.1", "");
    257 
    258   QuicStreamRequest request(&factory_);
    259   EXPECT_EQ(OK,
    260             request.Request(host_port_pair_,
    261                             is_https_,
    262                             privacy_mode_,
    263                             "GET",
    264                             net_log_,
    265                             callback_.callback()));
    266 
    267   scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
    268   EXPECT_TRUE(stream.get());
    269   EXPECT_TRUE(socket_data.at_read_eof());
    270   EXPECT_TRUE(socket_data.at_write_eof());
    271 }
    272 
    273 TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
    274   MockRead reads[] = {
    275     MockRead(ASYNC, OK, 0)  // EOF
    276   };
    277   DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
    278   socket_factory_.AddSocketDataProvider(&socket_data);
    279   socket_data.StopAfter(1);
    280 
    281   crypto_client_stream_factory_.set_handshake_mode(
    282       MockCryptoClientStream::ZERO_RTT);
    283   host_resolver_.set_synchronous_mode(true);
    284   host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
    285                                            "192.168.0.1", "");
    286 
    287   QuicStreamRequest request(&factory_);
    288   // Posts require handshake confirmation, so this will return asynchronously.
    289   EXPECT_EQ(ERR_IO_PENDING,
    290             request.Request(host_port_pair_,
    291                             is_https_,
    292                             privacy_mode_,
    293                             "POST",
    294                             net_log_,
    295                             callback_.callback()));
    296 
    297   // Confirm the handshake and verify that the stream is created.
    298   crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
    299       QuicSession::HANDSHAKE_CONFIRMED);
    300 
    301   EXPECT_EQ(OK, callback_.WaitForResult());
    302   scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
    303   EXPECT_TRUE(stream.get());
    304   EXPECT_TRUE(socket_data.at_read_eof());
    305   EXPECT_TRUE(socket_data.at_write_eof());
    306 }
    307 
    308 TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) {
    309   MockRead reads[] = {
    310     MockRead(ASYNC, OK, 0)  // EOF
    311   };
    312   DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0);
    313   DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
    314   socket_factory_.AddSocketDataProvider(&socket_data1);
    315   socket_factory_.AddSocketDataProvider(&socket_data2);
    316   socket_data1.StopAfter(1);
    317   socket_data2.StopAfter(1);
    318 
    319   QuicStreamRequest request(&factory_);
    320   EXPECT_EQ(ERR_IO_PENDING,
    321             request.Request(host_port_pair_,
    322                             is_https_,
    323                             privacy_mode_,
    324                             "GET",
    325                             net_log_,
    326                             callback_.callback()));
    327 
    328   EXPECT_EQ(OK, callback_.WaitForResult());
    329   scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
    330   EXPECT_TRUE(stream.get());
    331 
    332   QuicStreamRequest request2(&factory_);
    333   EXPECT_EQ(ERR_IO_PENDING,
    334             request2.Request(host_port_pair_,
    335                              !is_https_,
    336                              privacy_mode_,
    337                              "GET",
    338                              net_log_,
    339                              callback_.callback()));
    340   EXPECT_EQ(OK, callback_.WaitForResult());
    341   stream = request2.ReleaseStream();
    342   EXPECT_TRUE(stream.get());
    343   stream.reset();
    344 
    345   EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
    346                 &factory_, host_port_pair_, is_https_),
    347             QuicStreamFactoryPeer::GetActiveSession(
    348                 &factory_, host_port_pair_, !is_https_));
    349 
    350   EXPECT_TRUE(socket_data1.at_read_eof());
    351   EXPECT_TRUE(socket_data1.at_write_eof());
    352   EXPECT_TRUE(socket_data2.at_read_eof());
    353   EXPECT_TRUE(socket_data2.at_write_eof());
    354 }
    355 
    356 // TODO(rch): re-enable this.
    357 TEST_P(QuicStreamFactoryTest, DISABLED_Pooling) {
    358   MockRead reads[] = {
    359     MockRead(ASYNC, OK, 0)  // EOF
    360   };
    361   DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
    362   socket_factory_.AddSocketDataProvider(&socket_data);
    363   socket_data.StopAfter(1);
    364 
    365   HostPortPair server2("mail.google.com", kDefaultServerPort);
    366   host_resolver_.set_synchronous_mode(true);
    367   host_resolver_.rules()->AddIPLiteralRule(
    368       kDefaultServerHostName, "192.168.0.1", "");
    369   host_resolver_.rules()->AddIPLiteralRule(
    370       "mail.google.com", "192.168.0.1", "");
    371 
    372   QuicStreamRequest request(&factory_);
    373   EXPECT_EQ(OK,
    374             request.Request(host_port_pair_,
    375                             is_https_,
    376                             privacy_mode_,
    377                             "GET",
    378                             net_log_,
    379                             callback_.callback()));
    380   scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
    381   EXPECT_TRUE(stream.get());
    382 
    383   TestCompletionCallback callback;
    384   QuicStreamRequest request2(&factory_);
    385   EXPECT_EQ(OK,
    386             request2.Request(server2,
    387                              is_https_,
    388                              privacy_mode_,
    389                              "GET",
    390                              net_log_,
    391                              callback.callback()));
    392   scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
    393   EXPECT_TRUE(stream2.get());
    394 
    395   EXPECT_EQ(
    396       QuicStreamFactoryPeer::GetActiveSession(
    397           &factory_, host_port_pair_, is_https_),
    398       QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
    399 
    400   EXPECT_TRUE(socket_data.at_read_eof());
    401   EXPECT_TRUE(socket_data.at_write_eof());
    402 }
    403 
    404 TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
    405   MockRead reads[] = {
    406     MockRead(ASYNC, OK, 0)  // EOF
    407   };
    408   DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0);
    409   DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
    410   socket_factory_.AddSocketDataProvider(&socket_data1);
    411   socket_factory_.AddSocketDataProvider(&socket_data2);
    412   socket_data1.StopAfter(1);
    413   socket_data2.StopAfter(1);
    414 
    415   HostPortPair server2("mail.google.com", kDefaultServerPort);
    416   host_resolver_.set_synchronous_mode(true);
    417   host_resolver_.rules()->AddIPLiteralRule(
    418       kDefaultServerHostName, "192.168.0.1", "");
    419   host_resolver_.rules()->AddIPLiteralRule(
    420       "mail.google.com", "192.168.0.1", "");
    421 
    422   QuicStreamRequest request(&factory_);
    423   EXPECT_EQ(OK,
    424             request.Request(host_port_pair_,
    425                             is_https_,
    426                             privacy_mode_,
    427                             "GET",
    428                             net_log_,
    429                             callback_.callback()));
    430   scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
    431   EXPECT_TRUE(stream.get());
    432 
    433   TestCompletionCallback callback;
    434   QuicStreamRequest request2(&factory_);
    435   EXPECT_EQ(OK,
    436             request2.Request(server2,
    437                              is_https_,
    438                              privacy_mode_,
    439                              "GET",
    440                              net_log_,
    441                              callback.callback()));
    442   scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
    443   EXPECT_TRUE(stream2.get());
    444 
    445   factory_.OnSessionGoingAway(QuicStreamFactoryPeer::GetActiveSession(
    446       &factory_, host_port_pair_, is_https_));
    447   EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
    448       &factory_, host_port_pair_, is_https_));
    449   EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
    450       &factory_, server2, is_https_));
    451 
    452   TestCompletionCallback callback3;
    453   QuicStreamRequest request3(&factory_);
    454   EXPECT_EQ(OK,
    455             request3.Request(server2,
    456                              is_https_,
    457                              privacy_mode_,
    458                              "GET",
    459                              net_log_,
    460                              callback3.callback()));
    461   scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
    462   EXPECT_TRUE(stream3.get());
    463 
    464   EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
    465       &factory_, server2, is_https_));
    466 
    467   EXPECT_TRUE(socket_data1.at_read_eof());
    468   EXPECT_TRUE(socket_data1.at_write_eof());
    469   EXPECT_TRUE(socket_data2.at_read_eof());
    470   EXPECT_TRUE(socket_data2.at_write_eof());
    471 }
    472 
    473 // TODO(rch): re-enable this.
    474 TEST_P(QuicStreamFactoryTest, DISABLED_HttpsPooling) {
    475   MockRead reads[] = {
    476     MockRead(ASYNC, OK, 0)  // EOF
    477   };
    478   DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
    479   socket_factory_.AddSocketDataProvider(&socket_data);
    480   socket_data.StopAfter(1);
    481 
    482   HostPortPair server1("www.example.org", 443);
    483   HostPortPair server2("mail.example.org", 443);
    484 
    485   // Load a cert that is valid for:
    486   //   www.example.org (server1)
    487   //   mail.example.org (server2)
    488   //   www.example.com
    489   base::FilePath certs_dir = GetTestCertsDirectory();
    490   scoped_refptr<X509Certificate> test_cert(
    491       ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
    492   ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert);
    493   ProofVerifyDetailsChromium verify_details;
    494   verify_details.cert_verify_result.verified_cert = test_cert;
    495   crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
    496 
    497   host_resolver_.set_synchronous_mode(true);
    498   host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
    499   host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
    500 
    501   QuicStreamRequest request(&factory_);
    502   is_https_ = true;
    503   EXPECT_EQ(OK,
    504             request.Request(server1,
    505                             is_https_,
    506                             privacy_mode_,
    507                             "GET",
    508                             net_log_,
    509                             callback_.callback()));
    510   scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
    511   EXPECT_TRUE(stream.get());
    512 
    513   TestCompletionCallback callback;
    514   QuicStreamRequest request2(&factory_);
    515   EXPECT_EQ(OK,
    516             request2.Request(server2,
    517                              is_https_,
    518                              privacy_mode_,
    519                              "GET",
    520                              net_log_,
    521                              callback_.callback()));
    522   scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
    523   EXPECT_TRUE(stream2.get());
    524 
    525   EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
    526                 &factory_, server1, is_https_),
    527             QuicStreamFactoryPeer::GetActiveSession(
    528                 &factory_, server2, is_https_));
    529 
    530   EXPECT_TRUE(socket_data.at_read_eof());
    531   EXPECT_TRUE(socket_data.at_write_eof());
    532 }
    533 
    534 TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithCertMismatch) {
    535   MockRead reads[] = {
    536     MockRead(ASYNC, OK, 0)  // EOF
    537   };
    538   DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0);
    539   DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
    540   socket_factory_.AddSocketDataProvider(&socket_data1);
    541   socket_factory_.AddSocketDataProvider(&socket_data2);
    542   socket_data1.StopAfter(1);
    543   socket_data2.StopAfter(1);
    544 
    545   HostPortPair server1("www.example.org", 443);
    546   HostPortPair server2("mail.google.com", 443);
    547 
    548   // Load a cert that is valid for:
    549   //   www.example.org (server1)
    550   //   mail.example.org
    551   //   www.example.com
    552   // But is not valid for mail.google.com (server2).
    553   base::FilePath certs_dir = GetTestCertsDirectory();
    554   scoped_refptr<X509Certificate> test_cert(
    555       ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
    556   ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert);
    557   ProofVerifyDetailsChromium verify_details;
    558   verify_details.cert_verify_result.verified_cert = test_cert;
    559   crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
    560 
    561 
    562   host_resolver_.set_synchronous_mode(true);
    563   host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
    564   host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
    565 
    566   QuicStreamRequest request(&factory_);
    567   is_https_ = true;
    568   EXPECT_EQ(OK,
    569             request.Request(server1,
    570                             is_https_,
    571                             privacy_mode_,
    572                             "GET",
    573                             net_log_,
    574                             callback_.callback()));
    575   scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
    576   EXPECT_TRUE(stream.get());
    577 
    578   TestCompletionCallback callback;
    579   QuicStreamRequest request2(&factory_);
    580   EXPECT_EQ(OK,
    581             request2.Request(server2,
    582                              is_https_,
    583                              privacy_mode_,
    584                              "GET",
    585                              net_log_,
    586                              callback_.callback()));
    587   scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
    588   EXPECT_TRUE(stream2.get());
    589 
    590   EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
    591                 &factory_, server1, is_https_),
    592             QuicStreamFactoryPeer::GetActiveSession(
    593                 &factory_, server2, is_https_));
    594 
    595   EXPECT_TRUE(socket_data1.at_read_eof());
    596   EXPECT_TRUE(socket_data1.at_write_eof());
    597   EXPECT_TRUE(socket_data2.at_read_eof());
    598   EXPECT_TRUE(socket_data2.at_write_eof());
    599 }
    600 
    601 TEST_P(QuicStreamFactoryTest, Goaway) {
    602   MockRead reads[] = {
    603     MockRead(ASYNC, OK, 0)  // EOF
    604   };
    605   DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
    606   socket_data.StopAfter(1);
    607   socket_factory_.AddSocketDataProvider(&socket_data);
    608   DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0);
    609   socket_data2.StopAfter(1);
    610   socket_factory_.AddSocketDataProvider(&socket_data2);
    611 
    612   QuicStreamRequest request(&factory_);
    613   EXPECT_EQ(ERR_IO_PENDING,
    614             request.Request(host_port_pair_,
    615                             is_https_,
    616                             privacy_mode_,
    617                             "GET",
    618                             net_log_,
    619                             callback_.callback()));
    620 
    621   EXPECT_EQ(OK, callback_.WaitForResult());
    622   scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
    623   EXPECT_TRUE(stream.get());
    624 
    625   // Mark the session as going away.  Ensure that while it is still alive
    626   // that it is no longer active.
    627   QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
    628       &factory_, host_port_pair_, is_https_);
    629   factory_.OnSessionGoingAway(session);
    630   EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
    631   EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
    632       &factory_, host_port_pair_, is_https_));
    633   EXPECT_EQ(NULL, CreateIfSessionExists(host_port_pair_, net_log_).get());
    634 
    635   // Create a new request for the same destination and verify that a
    636   // new session is created.
    637   QuicStreamRequest request2(&factory_);
    638   EXPECT_EQ(ERR_IO_PENDING,
    639             request2.Request(host_port_pair_,
    640                              is_https_,
    641                              privacy_mode_,
    642                              "GET",
    643                              net_log_,
    644                              callback_.callback()));
    645   EXPECT_EQ(OK, callback_.WaitForResult());
    646   scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
    647   EXPECT_TRUE(stream2.get());
    648 
    649   EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(&factory_,
    650                                                       host_port_pair_,
    651                                                       is_https_));
    652   EXPECT_NE(session,
    653             QuicStreamFactoryPeer::GetActiveSession(
    654                 &factory_, host_port_pair_, is_https_));
    655   EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
    656 
    657   stream2.reset();
    658   stream.reset();
    659 
    660   EXPECT_TRUE(socket_data.at_read_eof());
    661   EXPECT_TRUE(socket_data.at_write_eof());
    662   EXPECT_TRUE(socket_data2.at_read_eof());
    663   EXPECT_TRUE(socket_data2.at_write_eof());
    664 }
    665 
    666 TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
    667   MockRead reads[] = {
    668     MockRead(ASYNC, OK, 0)  // EOF
    669   };
    670   QuicStreamId stream_id = kClientDataStreamId1;
    671   scoped_ptr<QuicEncryptedPacket> rst(
    672       maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
    673   MockWrite writes[] = {
    674     MockWrite(ASYNC, rst->data(), rst->length(), 1),
    675   };
    676   DeterministicSocketData socket_data(reads, arraysize(reads),
    677                                       writes, arraysize(writes));
    678   socket_factory_.AddSocketDataProvider(&socket_data);
    679   socket_data.StopAfter(1);
    680 
    681   HttpRequestInfo request_info;
    682   std::vector<QuicHttpStream*> streams;
    683   // The MockCryptoClientStream sets max_open_streams to be
    684   // 2 * kDefaultMaxStreamsPerConnection.
    685   for (size_t i = 0; i < 2 * kDefaultMaxStreamsPerConnection; i++) {
    686     QuicStreamRequest request(&factory_);
    687     int rv = request.Request(host_port_pair_,
    688                              is_https_,
    689                              privacy_mode_,
    690                              "GET",
    691                              net_log_,
    692                              callback_.callback());
    693     if (i == 0) {
    694       EXPECT_EQ(ERR_IO_PENDING, rv);
    695       EXPECT_EQ(OK, callback_.WaitForResult());
    696     } else {
    697       EXPECT_EQ(OK, rv);
    698     }
    699     scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
    700     EXPECT_TRUE(stream);
    701     EXPECT_EQ(OK, stream->InitializeStream(
    702         &request_info, DEFAULT_PRIORITY, net_log_, CompletionCallback()));
    703     streams.push_back(stream.release());
    704   }
    705 
    706   QuicStreamRequest request(&factory_);
    707   EXPECT_EQ(OK,
    708             request.Request(host_port_pair_,
    709                             is_https_,
    710                             privacy_mode_,
    711                             "GET",
    712                             net_log_,
    713                             CompletionCallback()));
    714   scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
    715   EXPECT_TRUE(stream);
    716   EXPECT_EQ(ERR_IO_PENDING, stream->InitializeStream(
    717         &request_info, DEFAULT_PRIORITY, net_log_, callback_.callback()));
    718 
    719   // Close the first stream.
    720   streams.front()->Close(false);
    721 
    722   ASSERT_TRUE(callback_.have_result());
    723 
    724   EXPECT_EQ(OK, callback_.WaitForResult());
    725 
    726   EXPECT_TRUE(socket_data.at_read_eof());
    727   EXPECT_TRUE(socket_data.at_write_eof());
    728   STLDeleteElements(&streams);
    729 }
    730 
    731 TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
    732   DeterministicSocketData socket_data(NULL, 0, NULL, 0);
    733   socket_factory_.AddSocketDataProvider(&socket_data);
    734 
    735   host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
    736 
    737   QuicStreamRequest request(&factory_);
    738   EXPECT_EQ(ERR_IO_PENDING,
    739             request.Request(host_port_pair_,
    740                             is_https_,
    741                             privacy_mode_,
    742                             "GET",
    743                             net_log_,
    744                             callback_.callback()));
    745 
    746   EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
    747 
    748   EXPECT_TRUE(socket_data.at_read_eof());
    749   EXPECT_TRUE(socket_data.at_write_eof());
    750 }
    751 
    752 TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
    753   MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
    754   DeterministicSocketData socket_data(NULL, 0, NULL, 0);
    755   socket_data.set_connect_data(connect);
    756   socket_factory_.AddSocketDataProvider(&socket_data);
    757   socket_data.StopAfter(1);
    758 
    759   QuicStreamRequest request(&factory_);
    760   EXPECT_EQ(ERR_IO_PENDING,
    761             request.Request(host_port_pair_,
    762                             is_https_,
    763                             privacy_mode_,
    764                             "GET",
    765                             net_log_,
    766                             callback_.callback()));
    767 
    768   EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
    769 
    770   EXPECT_TRUE(socket_data.at_read_eof());
    771   EXPECT_TRUE(socket_data.at_write_eof());
    772 }
    773 
    774 TEST_P(QuicStreamFactoryTest, CancelCreate) {
    775   MockRead reads[] = {
    776     MockRead(ASYNC, OK, 0)  // EOF
    777   };
    778   DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0);
    779   socket_factory_.AddSocketDataProvider(&socket_data);
    780   {
    781     QuicStreamRequest request(&factory_);
    782     EXPECT_EQ(ERR_IO_PENDING,
    783               request.Request(host_port_pair_,
    784                               is_https_,
    785                               privacy_mode_,
    786                               "GET",
    787                               net_log_,
    788                               callback_.callback()));
    789   }
    790 
    791   socket_data.StopAfter(1);
    792   base::RunLoop run_loop;
    793   run_loop.RunUntilIdle();
    794 
    795   scoped_ptr<QuicHttpStream> stream(
    796       CreateIfSessionExists(host_port_pair_, net_log_));
    797   EXPECT_TRUE(stream.get());
    798   stream.reset();
    799 
    800   EXPECT_TRUE(socket_data.at_read_eof());
    801   EXPECT_TRUE(socket_data.at_write_eof());
    802 }
    803 
    804 TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
    805   // Sequentially connect to the default host, then another host, and then the
    806   // default host.  Verify that the default host gets a consistent ephemeral
    807   // port, that is different from the other host's connection.
    808 
    809   std::string other_server_name = "other.google.com";
    810   EXPECT_NE(kDefaultServerHostName, other_server_name);
    811   HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
    812 
    813   int original_port = GetSourcePortForNewSession(host_port_pair_);
    814   EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
    815   EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
    816 }
    817 
    818 TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
    819   // Get a session to the host using the port suggester.
    820   int original_port =
    821       GetSourcePortForNewSessionAndGoAway(host_port_pair_);
    822   // Verify that the port is different after the goaway.
    823   EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
    824   // Since the previous session did not goaway we should see the original port.
    825   EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
    826 }
    827 
    828 TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
    829   MockRead reads[] = {
    830     MockRead(ASYNC, 0, 0)  // EOF
    831   };
    832   scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
    833   std::vector<MockWrite> writes;
    834   writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
    835   DeterministicSocketData socket_data(reads, arraysize(reads),
    836                                       writes.empty() ? NULL  : &writes[0],
    837                                       writes.size());
    838   socket_factory_.AddSocketDataProvider(&socket_data);
    839   socket_data.StopAfter(1);
    840 
    841   MockRead reads2[] = {
    842     MockRead(ASYNC, 0, 0)  // EOF
    843   };
    844   DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0);
    845   socket_factory_.AddSocketDataProvider(&socket_data2);
    846   socket_data2.StopAfter(1);
    847 
    848   QuicStreamRequest request(&factory_);
    849   EXPECT_EQ(ERR_IO_PENDING,
    850             request.Request(host_port_pair_,
    851                             is_https_,
    852                             privacy_mode_,
    853                             "GET",
    854                             net_log_,
    855                             callback_.callback()));
    856 
    857   EXPECT_EQ(OK, callback_.WaitForResult());
    858   scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
    859   HttpRequestInfo request_info;
    860   EXPECT_EQ(OK, stream->InitializeStream(&request_info,
    861                                          DEFAULT_PRIORITY,
    862                                          net_log_, CompletionCallback()));
    863 
    864   // Close the session and verify that stream saw the error.
    865   factory_.CloseAllSessions(ERR_INTERNET_DISCONNECTED);
    866   EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
    867             stream->ReadResponseHeaders(callback_.callback()));
    868 
    869   // Now attempting to request a stream to the same origin should create
    870   // a new session.
    871 
    872   QuicStreamRequest request2(&factory_);
    873   EXPECT_EQ(ERR_IO_PENDING,
    874             request2.Request(host_port_pair_,
    875                              is_https_,
    876                              privacy_mode_,
    877                              "GET",
    878                              net_log_,
    879                              callback_.callback()));
    880 
    881   EXPECT_EQ(OK, callback_.WaitForResult());
    882   stream = request2.ReleaseStream();
    883   stream.reset();  // Will reset stream 3.
    884 
    885   EXPECT_TRUE(socket_data.at_read_eof());
    886   EXPECT_TRUE(socket_data.at_write_eof());
    887   EXPECT_TRUE(socket_data2.at_read_eof());
    888   EXPECT_TRUE(socket_data2.at_write_eof());
    889 }
    890 
    891 TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
    892   MockRead reads[] = {
    893     MockRead(ASYNC, 0, 0)  // EOF
    894   };
    895   scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
    896   std::vector<MockWrite> writes;
    897   writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
    898   DeterministicSocketData socket_data(reads, arraysize(reads),
    899                                       writes.empty() ? NULL  : &writes[0],
    900                                       writes.size());
    901   socket_factory_.AddSocketDataProvider(&socket_data);
    902   socket_data.StopAfter(1);
    903 
    904   MockRead reads2[] = {
    905     MockRead(ASYNC, 0, 0)  // EOF
    906   };
    907   DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0);
    908   socket_factory_.AddSocketDataProvider(&socket_data2);
    909   socket_data2.StopAfter(1);
    910 
    911   QuicStreamRequest request(&factory_);
    912   EXPECT_EQ(ERR_IO_PENDING,
    913             request.Request(host_port_pair_,
    914                             is_https_,
    915                             privacy_mode_,
    916                             "GET",
    917                             net_log_,
    918                             callback_.callback()));
    919 
    920   EXPECT_EQ(OK, callback_.WaitForResult());
    921   scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
    922   HttpRequestInfo request_info;
    923   EXPECT_EQ(OK, stream->InitializeStream(&request_info,
    924                                          DEFAULT_PRIORITY,
    925                                          net_log_, CompletionCallback()));
    926 
    927   // Change the IP address and verify that stream saw the error.
    928   factory_.OnIPAddressChanged();
    929   EXPECT_EQ(ERR_NETWORK_CHANGED,
    930             stream->ReadResponseHeaders(callback_.callback()));
    931   EXPECT_TRUE(factory_.require_confirmation());
    932 
    933   // Now attempting to request a stream to the same origin should create
    934   // a new session.
    935 
    936   QuicStreamRequest request2(&factory_);
    937   EXPECT_EQ(ERR_IO_PENDING,
    938             request2.Request(host_port_pair_,
    939                              is_https_,
    940                              privacy_mode_,
    941                              "GET",
    942                              net_log_,
    943                              callback_.callback()));
    944 
    945   EXPECT_EQ(OK, callback_.WaitForResult());
    946   stream = request2.ReleaseStream();
    947   stream.reset();  // Will reset stream 3.
    948 
    949   EXPECT_TRUE(socket_data.at_read_eof());
    950   EXPECT_TRUE(socket_data.at_write_eof());
    951   EXPECT_TRUE(socket_data2.at_read_eof());
    952   EXPECT_TRUE(socket_data2.at_write_eof());
    953 }
    954 
    955 TEST_P(QuicStreamFactoryTest, OnCertAdded) {
    956   MockRead reads[] = {
    957     MockRead(ASYNC, 0, 0)  // EOF
    958   };
    959   scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
    960   std::vector<MockWrite> writes;
    961   writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
    962   DeterministicSocketData socket_data(reads, arraysize(reads),
    963                                       writes.empty() ? NULL  : &writes[0],
    964                                       writes.size());
    965   socket_factory_.AddSocketDataProvider(&socket_data);
    966   socket_data.StopAfter(1);
    967 
    968   MockRead reads2[] = {
    969     MockRead(ASYNC, 0, 0)  // EOF
    970   };
    971   DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0);
    972   socket_factory_.AddSocketDataProvider(&socket_data2);
    973   socket_data2.StopAfter(1);
    974 
    975   QuicStreamRequest request(&factory_);
    976   EXPECT_EQ(ERR_IO_PENDING,
    977             request.Request(host_port_pair_,
    978                             is_https_,
    979                             privacy_mode_,
    980                             "GET",
    981                             net_log_,
    982                             callback_.callback()));
    983 
    984   EXPECT_EQ(OK, callback_.WaitForResult());
    985   scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
    986   HttpRequestInfo request_info;
    987   EXPECT_EQ(OK, stream->InitializeStream(&request_info,
    988                                          DEFAULT_PRIORITY,
    989                                          net_log_, CompletionCallback()));
    990 
    991   // Add a cert and verify that stream saw the event.
    992   factory_.OnCertAdded(NULL);
    993   EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
    994             stream->ReadResponseHeaders(callback_.callback()));
    995   EXPECT_FALSE(factory_.require_confirmation());
    996 
    997   // Now attempting to request a stream to the same origin should create
    998   // a new session.
    999 
   1000   QuicStreamRequest request2(&factory_);
   1001   EXPECT_EQ(ERR_IO_PENDING,
   1002             request2.Request(host_port_pair_,
   1003                              is_https_,
   1004                              privacy_mode_,
   1005                              "GET",
   1006                              net_log_,
   1007                              callback_.callback()));
   1008 
   1009   EXPECT_EQ(OK, callback_.WaitForResult());
   1010   stream = request2.ReleaseStream();
   1011   stream.reset();  // Will reset stream 3.
   1012 
   1013   EXPECT_TRUE(socket_data.at_read_eof());
   1014   EXPECT_TRUE(socket_data.at_write_eof());
   1015   EXPECT_TRUE(socket_data2.at_read_eof());
   1016   EXPECT_TRUE(socket_data2.at_write_eof());
   1017 }
   1018 
   1019 TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
   1020   MockRead reads[] = {
   1021     MockRead(ASYNC, 0, 0)  // EOF
   1022   };
   1023   scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
   1024   std::vector<MockWrite> writes;
   1025   writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
   1026   DeterministicSocketData socket_data(reads, arraysize(reads),
   1027                                       writes.empty() ? NULL  : &writes[0],
   1028                                       writes.size());
   1029   socket_factory_.AddSocketDataProvider(&socket_data);
   1030   socket_data.StopAfter(1);
   1031 
   1032   MockRead reads2[] = {
   1033     MockRead(ASYNC, 0, 0)  // EOF
   1034   };
   1035   DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0);
   1036   socket_factory_.AddSocketDataProvider(&socket_data2);
   1037   socket_data2.StopAfter(1);
   1038 
   1039   QuicStreamRequest request(&factory_);
   1040   EXPECT_EQ(ERR_IO_PENDING,
   1041             request.Request(host_port_pair_,
   1042                             is_https_,
   1043                             privacy_mode_,
   1044                             "GET",
   1045                             net_log_,
   1046                             callback_.callback()));
   1047 
   1048   EXPECT_EQ(OK, callback_.WaitForResult());
   1049   scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
   1050   HttpRequestInfo request_info;
   1051   EXPECT_EQ(OK, stream->InitializeStream(&request_info,
   1052                                          DEFAULT_PRIORITY,
   1053                                          net_log_, CompletionCallback()));
   1054 
   1055   // Change the CA cert and verify that stream saw the event.
   1056   factory_.OnCACertChanged(NULL);
   1057   EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
   1058             stream->ReadResponseHeaders(callback_.callback()));
   1059   EXPECT_FALSE(factory_.require_confirmation());
   1060 
   1061   // Now attempting to request a stream to the same origin should create
   1062   // a new session.
   1063 
   1064   QuicStreamRequest request2(&factory_);
   1065   EXPECT_EQ(ERR_IO_PENDING,
   1066             request2.Request(host_port_pair_,
   1067                              is_https_,
   1068                              privacy_mode_,
   1069                              "GET",
   1070                              net_log_,
   1071                              callback_.callback()));
   1072 
   1073   EXPECT_EQ(OK, callback_.WaitForResult());
   1074   stream = request2.ReleaseStream();
   1075   stream.reset();  // Will reset stream 3.
   1076 
   1077   EXPECT_TRUE(socket_data.at_read_eof());
   1078   EXPECT_TRUE(socket_data.at_write_eof());
   1079   EXPECT_TRUE(socket_data2.at_read_eof());
   1080   EXPECT_TRUE(socket_data2.at_write_eof());
   1081 }
   1082 
   1083 TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
   1084   vector<string> cannoncial_suffixes;
   1085   cannoncial_suffixes.push_back(string(".c.youtube.com"));
   1086   cannoncial_suffixes.push_back(string(".googlevideo.com"));
   1087 
   1088   for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
   1089     string r1_host_name("r1");
   1090     string r2_host_name("r2");
   1091     r1_host_name.append(cannoncial_suffixes[i]);
   1092     r2_host_name.append(cannoncial_suffixes[i]);
   1093 
   1094     HostPortPair host_port_pair1(r1_host_name, 80);
   1095     QuicCryptoClientConfig* crypto_config =
   1096         QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
   1097     QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
   1098     QuicCryptoClientConfig::CachedState* cached1 =
   1099         crypto_config->LookupOrCreate(server_id1);
   1100     EXPECT_FALSE(cached1->proof_valid());
   1101     EXPECT_TRUE(cached1->source_address_token().empty());
   1102 
   1103     // Mutate the cached1 to have different data.
   1104     // TODO(rtenneti): mutate other members of CachedState.
   1105     cached1->set_source_address_token(r1_host_name);
   1106     cached1->SetProofValid();
   1107 
   1108     HostPortPair host_port_pair2(r2_host_name, 80);
   1109     QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
   1110     QuicCryptoClientConfig::CachedState* cached2 =
   1111         crypto_config->LookupOrCreate(server_id2);
   1112     EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
   1113     EXPECT_TRUE(cached2->proof_valid());
   1114   }
   1115 }
   1116 
   1117 TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
   1118   vector<string> cannoncial_suffixes;
   1119   cannoncial_suffixes.push_back(string(".c.youtube.com"));
   1120   cannoncial_suffixes.push_back(string(".googlevideo.com"));
   1121 
   1122   for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
   1123     string r3_host_name("r3");
   1124     string r4_host_name("r4");
   1125     r3_host_name.append(cannoncial_suffixes[i]);
   1126     r4_host_name.append(cannoncial_suffixes[i]);
   1127 
   1128     HostPortPair host_port_pair1(r3_host_name, 80);
   1129     QuicCryptoClientConfig* crypto_config =
   1130         QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
   1131     QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
   1132     QuicCryptoClientConfig::CachedState* cached1 =
   1133         crypto_config->LookupOrCreate(server_id1);
   1134     EXPECT_FALSE(cached1->proof_valid());
   1135     EXPECT_TRUE(cached1->source_address_token().empty());
   1136 
   1137     // Mutate the cached1 to have different data.
   1138     // TODO(rtenneti): mutate other members of CachedState.
   1139     cached1->set_source_address_token(r3_host_name);
   1140     cached1->SetProofInvalid();
   1141 
   1142     HostPortPair host_port_pair2(r4_host_name, 80);
   1143     QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
   1144     QuicCryptoClientConfig::CachedState* cached2 =
   1145         crypto_config->LookupOrCreate(server_id2);
   1146     EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
   1147     EXPECT_TRUE(cached2->source_address_token().empty());
   1148     EXPECT_FALSE(cached2->proof_valid());
   1149   }
   1150 }
   1151 
   1152 }  // namespace test
   1153 }  // namespace net
   1154