| Index: net/quic/quic_stream_factory_test.cc
|
| diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc
|
| deleted file mode 100644
|
| index 390508436a288f54bc79828f56c595f34a3b9d4f..0000000000000000000000000000000000000000
|
| --- a/net/quic/quic_stream_factory_test.cc
|
| +++ /dev/null
|
| @@ -1,1703 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "net/quic/quic_stream_factory.h"
|
| -
|
| -#include "base/run_loop.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "net/base/test_data_directory.h"
|
| -#include "net/cert/cert_verifier.h"
|
| -#include "net/dns/mock_host_resolver.h"
|
| -#include "net/http/http_response_headers.h"
|
| -#include "net/http/http_response_info.h"
|
| -#include "net/http/http_util.h"
|
| -#include "net/http/transport_security_state.h"
|
| -#include "net/quic/crypto/crypto_handshake.h"
|
| -#include "net/quic/crypto/proof_verifier_chromium.h"
|
| -#include "net/quic/crypto/quic_decrypter.h"
|
| -#include "net/quic/crypto/quic_encrypter.h"
|
| -#include "net/quic/crypto/quic_server_info.h"
|
| -#include "net/quic/quic_http_stream.h"
|
| -#include "net/quic/quic_server_id.h"
|
| -#include "net/quic/test_tools/mock_clock.h"
|
| -#include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
|
| -#include "net/quic/test_tools/mock_random.h"
|
| -#include "net/quic/test_tools/quic_test_packet_maker.h"
|
| -#include "net/quic/test_tools/quic_test_utils.h"
|
| -#include "net/quic/test_tools/test_task_runner.h"
|
| -#include "net/socket/socket_test_util.h"
|
| -#include "net/spdy/spdy_test_utils.h"
|
| -#include "net/ssl/channel_id_service.h"
|
| -#include "net/ssl/default_channel_id_store.h"
|
| -#include "net/test/cert_test_util.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -using base::StringPiece;
|
| -using std::ostream;
|
| -using std::string;
|
| -using std::vector;
|
| -
|
| -namespace net {
|
| -namespace test {
|
| -
|
| -namespace {
|
| -const char kDefaultServerHostName[] = "www.google.com";
|
| -const int kDefaultServerPort = 443;
|
| -
|
| -// Run all tests with all the combinations of versions and
|
| -// enable_connection_racing.
|
| -struct TestParams {
|
| - TestParams(const QuicVersion version, bool enable_connection_racing)
|
| - : version(version), enable_connection_racing(enable_connection_racing) {}
|
| -
|
| - friend ostream& operator<<(ostream& os, const TestParams& p) {
|
| - os << "{ version: " << QuicVersionToString(p.version);
|
| - os << " enable_connection_racing: " << p.enable_connection_racing << " }";
|
| - return os;
|
| - }
|
| -
|
| - QuicVersion version;
|
| - bool enable_connection_racing;
|
| -};
|
| -
|
| -// Constructs various test permutations.
|
| -vector<TestParams> GetTestParams() {
|
| - vector<TestParams> params;
|
| - QuicVersionVector all_supported_versions = QuicSupportedVersions();
|
| - for (const QuicVersion version : all_supported_versions) {
|
| - params.push_back(TestParams(version, false));
|
| - params.push_back(TestParams(version, true));
|
| - }
|
| - return params;
|
| -}
|
| -
|
| -} // namespace anonymous
|
| -
|
| -class QuicStreamFactoryPeer {
|
| - public:
|
| - static QuicCryptoClientConfig* GetCryptoConfig(QuicStreamFactory* factory) {
|
| - return &factory->crypto_config_;
|
| - }
|
| -
|
| - static bool HasActiveSession(QuicStreamFactory* factory,
|
| - const HostPortPair& host_port_pair,
|
| - bool is_https) {
|
| - QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
|
| - return factory->HasActiveSession(server_id);
|
| - }
|
| -
|
| - static QuicClientSession* GetActiveSession(
|
| - QuicStreamFactory* factory,
|
| - const HostPortPair& host_port_pair,
|
| - bool is_https) {
|
| - QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
|
| - DCHECK(factory->HasActiveSession(server_id));
|
| - return factory->active_sessions_[server_id];
|
| - }
|
| -
|
| - static scoped_ptr<QuicHttpStream> CreateIfSessionExists(
|
| - QuicStreamFactory* factory,
|
| - const HostPortPair& host_port_pair,
|
| - bool is_https,
|
| - const BoundNetLog& net_log) {
|
| - QuicServerId server_id(host_port_pair, is_https, PRIVACY_MODE_DISABLED);
|
| - return factory->CreateIfSessionExists(server_id, net_log);
|
| - }
|
| -
|
| - static bool IsLiveSession(QuicStreamFactory* factory,
|
| - QuicClientSession* session) {
|
| - for (QuicStreamFactory::SessionIdMap::iterator it =
|
| - factory->all_sessions_.begin();
|
| - it != factory->all_sessions_.end(); ++it) {
|
| - if (it->first == session)
|
| - return true;
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - static void DisableConnectionPooling(QuicStreamFactory* factory) {
|
| - factory->disable_connection_pooling_ = true;
|
| - }
|
| -
|
| - static void SetTaskRunner(QuicStreamFactory* factory,
|
| - base::TaskRunner* task_runner) {
|
| - factory->task_runner_ = task_runner;
|
| - }
|
| -
|
| - static void SetLoadServerInfoTimeout(QuicStreamFactory* factory,
|
| - size_t load_server_info_timeout) {
|
| - factory->load_server_info_timeout_ms_ = load_server_info_timeout;
|
| - }
|
| -
|
| - static void SetEnableConnectionRacing(QuicStreamFactory* factory,
|
| - bool enable_connection_racing) {
|
| - factory->enable_connection_racing_ = enable_connection_racing;
|
| - }
|
| -
|
| - static size_t GetNumberOfActiveJobs(QuicStreamFactory* factory,
|
| - const QuicServerId& server_id) {
|
| - return (factory->active_jobs_[server_id]).size();
|
| - }
|
| -};
|
| -
|
| -class MockQuicServerInfo : public QuicServerInfo {
|
| - public:
|
| - MockQuicServerInfo(const QuicServerId& server_id)
|
| - : QuicServerInfo(server_id) {}
|
| - ~MockQuicServerInfo() override {}
|
| -
|
| - void Start() override {}
|
| -
|
| - int WaitForDataReady(const CompletionCallback& callback) override {
|
| - return ERR_IO_PENDING;
|
| - }
|
| -
|
| - void ResetWaitForDataReadyCallback() override {}
|
| -
|
| - void CancelWaitForDataReadyCallback() override {}
|
| -
|
| - bool IsDataReady() override { return false; }
|
| -
|
| - bool IsReadyToPersist() override { return false; }
|
| -
|
| - void Persist() override {}
|
| -
|
| - void OnExternalCacheHit() override {}
|
| -};
|
| -
|
| -class MockQuicServerInfoFactory : public QuicServerInfoFactory {
|
| - public:
|
| - MockQuicServerInfoFactory() {}
|
| - ~MockQuicServerInfoFactory() override {}
|
| -
|
| - QuicServerInfo* GetForServer(const QuicServerId& server_id) override {
|
| - return new MockQuicServerInfo(server_id);
|
| - }
|
| -};
|
| -
|
| -class QuicStreamFactoryTest : public ::testing::TestWithParam<TestParams> {
|
| - protected:
|
| - QuicStreamFactoryTest()
|
| - : random_generator_(0),
|
| - clock_(new MockClock()),
|
| - runner_(new TestTaskRunner(clock_)),
|
| - maker_(GetParam().version, 0, clock_),
|
| - cert_verifier_(CertVerifier::CreateDefault()),
|
| - channel_id_service_(
|
| - new ChannelIDService(new DefaultChannelIDStore(nullptr),
|
| - base::MessageLoopProxy::current())),
|
| - factory_(&host_resolver_,
|
| - &socket_factory_,
|
| - base::WeakPtr<HttpServerProperties>(),
|
| - cert_verifier_.get(),
|
| - channel_id_service_.get(),
|
| - &transport_security_state_,
|
| - &crypto_client_stream_factory_,
|
| - &random_generator_,
|
| - clock_,
|
| - kDefaultMaxPacketSize,
|
| - std::string(),
|
| - SupportedVersions(GetParam().version),
|
| - /*enable_port_selection=*/true,
|
| - /*always_require_handshake_confirmation=*/false,
|
| - /*disable_connection_pooling=*/false,
|
| - /*load_server_info_timeout=*/0u,
|
| - /*load_server_info_timeout_srtt_multiplier=*/0.0f,
|
| - /*enable_truncated_connection_ids=*/true,
|
| - /*enable_connection_racing=*/false,
|
| - QuicTagVector()),
|
| - host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
|
| - is_https_(false),
|
| - privacy_mode_(PRIVACY_MODE_DISABLED) {
|
| - factory_.set_require_confirmation(false);
|
| - clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
|
| - QuicStreamFactoryPeer::SetEnableConnectionRacing(
|
| - &factory_, GetParam().enable_connection_racing);
|
| - }
|
| -
|
| - scoped_ptr<QuicHttpStream> CreateIfSessionExists(
|
| - const HostPortPair& host_port_pair,
|
| - const BoundNetLog& net_log) {
|
| - return QuicStreamFactoryPeer::CreateIfSessionExists(
|
| - &factory_, host_port_pair, false, net_log_);
|
| - }
|
| -
|
| - int GetSourcePortForNewSession(const HostPortPair& destination) {
|
| - return GetSourcePortForNewSessionInner(destination, false);
|
| - }
|
| -
|
| - int GetSourcePortForNewSessionAndGoAway(
|
| - const HostPortPair& destination) {
|
| - return GetSourcePortForNewSessionInner(destination, true);
|
| - }
|
| -
|
| - int GetSourcePortForNewSessionInner(const HostPortPair& destination,
|
| - bool goaway_received) {
|
| - // Should only be called if there is no active session for this destination.
|
| - EXPECT_EQ(nullptr, CreateIfSessionExists(destination, net_log_).get());
|
| - size_t socket_count = socket_factory_.udp_client_sockets().size();
|
| -
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, OK, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
|
| - socket_data.StopAfter(1);
|
| - socket_factory_.AddSocketDataProvider(&socket_data);
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - request.Request(destination,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| -
|
| - EXPECT_EQ(OK, callback_.WaitForResult());
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - EXPECT_TRUE(stream.get());
|
| - stream.reset();
|
| -
|
| - QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
|
| - &factory_, destination, is_https_);
|
| -
|
| - if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) {
|
| - EXPECT_TRUE(false);
|
| - return 0;
|
| - }
|
| -
|
| - IPEndPoint endpoint;
|
| - socket_factory_.
|
| - udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint);
|
| - int port = endpoint.port();
|
| - if (goaway_received) {
|
| - QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, "");
|
| - session->OnGoAway(goaway);
|
| - }
|
| -
|
| - factory_.OnSessionClosed(session);
|
| - EXPECT_EQ(nullptr, CreateIfSessionExists(destination, net_log_).get());
|
| - EXPECT_TRUE(socket_data.at_read_eof());
|
| - EXPECT_TRUE(socket_data.at_write_eof());
|
| - return port;
|
| - }
|
| -
|
| - scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() {
|
| - QuicStreamId stream_id = kClientDataStreamId1;
|
| - return maker_.MakeRstPacket(
|
| - 1, true, stream_id,
|
| - AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam().version));
|
| - }
|
| -
|
| - MockQuicServerInfoFactory quic_server_info_factory_;
|
| - MockHostResolver host_resolver_;
|
| - DeterministicMockClientSocketFactory socket_factory_;
|
| - MockCryptoClientStreamFactory crypto_client_stream_factory_;
|
| - MockRandom random_generator_;
|
| - MockClock* clock_; // Owned by factory_.
|
| - scoped_refptr<TestTaskRunner> runner_;
|
| - QuicTestPacketMaker maker_;
|
| - scoped_ptr<CertVerifier> cert_verifier_;
|
| - scoped_ptr<ChannelIDService> channel_id_service_;
|
| - TransportSecurityState transport_security_state_;
|
| - QuicStreamFactory factory_;
|
| - HostPortPair host_port_pair_;
|
| - bool is_https_;
|
| - PrivacyMode privacy_mode_;
|
| - BoundNetLog net_log_;
|
| - TestCompletionCallback callback_;
|
| -};
|
| -
|
| -INSTANTIATE_TEST_CASE_P(Version,
|
| - QuicStreamFactoryTest,
|
| - ::testing::ValuesIn(GetTestParams()));
|
| -
|
| -TEST_P(QuicStreamFactoryTest, CreateIfSessionExists) {
|
| - EXPECT_EQ(nullptr, CreateIfSessionExists(host_port_pair_, net_log_).get());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, Create) {
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, OK, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
|
| - socket_factory_.AddSocketDataProvider(&socket_data);
|
| - socket_data.StopAfter(1);
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - request.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| -
|
| - EXPECT_EQ(OK, callback_.WaitForResult());
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - EXPECT_TRUE(stream.get());
|
| -
|
| - // Will reset stream 3.
|
| - stream = CreateIfSessionExists(host_port_pair_, net_log_);
|
| - EXPECT_TRUE(stream.get());
|
| -
|
| - // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
|
| - // in streams on different sessions.
|
| - QuicStreamRequest request2(&factory_);
|
| - EXPECT_EQ(OK,
|
| - request2.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| - stream = request2.ReleaseStream(); // Will reset stream 5.
|
| - stream.reset(); // Will reset stream 7.
|
| -
|
| - EXPECT_TRUE(socket_data.at_read_eof());
|
| - EXPECT_TRUE(socket_data.at_write_eof());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, OK, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
|
| - socket_factory_.AddSocketDataProvider(&socket_data);
|
| - socket_data.StopAfter(1);
|
| -
|
| - crypto_client_stream_factory_.set_handshake_mode(
|
| - MockCryptoClientStream::ZERO_RTT);
|
| - host_resolver_.set_synchronous_mode(true);
|
| - host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
|
| - "192.168.0.1", "");
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - EXPECT_EQ(OK,
|
| - request.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| -
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - EXPECT_TRUE(stream.get());
|
| - EXPECT_TRUE(socket_data.at_read_eof());
|
| - EXPECT_TRUE(socket_data.at_write_eof());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, CreateZeroRttPost) {
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, OK, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
|
| - socket_factory_.AddSocketDataProvider(&socket_data);
|
| - socket_data.StopAfter(1);
|
| -
|
| - crypto_client_stream_factory_.set_handshake_mode(
|
| - MockCryptoClientStream::ZERO_RTT);
|
| - host_resolver_.set_synchronous_mode(true);
|
| - host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
|
| - "192.168.0.1", "");
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - // Posts require handshake confirmation, so this will return asynchronously.
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - request.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "POST",
|
| - net_log_,
|
| - callback_.callback()));
|
| -
|
| - // Confirm the handshake and verify that the stream is created.
|
| - crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
|
| - QuicSession::HANDSHAKE_CONFIRMED);
|
| -
|
| - EXPECT_EQ(OK, callback_.WaitForResult());
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - EXPECT_TRUE(stream.get());
|
| - EXPECT_TRUE(socket_data.at_read_eof());
|
| - EXPECT_TRUE(socket_data.at_write_eof());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) {
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, OK, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
|
| - DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
|
| - socket_factory_.AddSocketDataProvider(&socket_data1);
|
| - socket_factory_.AddSocketDataProvider(&socket_data2);
|
| - socket_data1.StopAfter(1);
|
| - socket_data2.StopAfter(1);
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - request.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| -
|
| - EXPECT_EQ(OK, callback_.WaitForResult());
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - EXPECT_TRUE(stream.get());
|
| -
|
| - QuicStreamRequest request2(&factory_);
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - request2.Request(host_port_pair_,
|
| - !is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| - EXPECT_EQ(OK, callback_.WaitForResult());
|
| - stream = request2.ReleaseStream();
|
| - EXPECT_TRUE(stream.get());
|
| - stream.reset();
|
| -
|
| - EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
|
| - &factory_, host_port_pair_, is_https_),
|
| - QuicStreamFactoryPeer::GetActiveSession(
|
| - &factory_, host_port_pair_, !is_https_));
|
| -
|
| - EXPECT_TRUE(socket_data1.at_read_eof());
|
| - EXPECT_TRUE(socket_data1.at_write_eof());
|
| - EXPECT_TRUE(socket_data2.at_read_eof());
|
| - EXPECT_TRUE(socket_data2.at_write_eof());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, Pooling) {
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, OK, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
|
| - socket_factory_.AddSocketDataProvider(&socket_data);
|
| - socket_data.StopAfter(1);
|
| -
|
| - HostPortPair server2("mail.google.com", kDefaultServerPort);
|
| - host_resolver_.set_synchronous_mode(true);
|
| - host_resolver_.rules()->AddIPLiteralRule(
|
| - kDefaultServerHostName, "192.168.0.1", "");
|
| - host_resolver_.rules()->AddIPLiteralRule(
|
| - "mail.google.com", "192.168.0.1", "");
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - EXPECT_EQ(OK,
|
| - request.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - EXPECT_TRUE(stream.get());
|
| -
|
| - TestCompletionCallback callback;
|
| - QuicStreamRequest request2(&factory_);
|
| - EXPECT_EQ(OK,
|
| - request2.Request(server2,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback.callback()));
|
| - scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
|
| - EXPECT_TRUE(stream2.get());
|
| -
|
| - EXPECT_EQ(
|
| - QuicStreamFactoryPeer::GetActiveSession(
|
| - &factory_, host_port_pair_, is_https_),
|
| - QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
|
| -
|
| - EXPECT_TRUE(socket_data.at_read_eof());
|
| - EXPECT_TRUE(socket_data.at_write_eof());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, OK, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
|
| - DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
|
| - socket_factory_.AddSocketDataProvider(&socket_data1);
|
| - socket_factory_.AddSocketDataProvider(&socket_data2);
|
| - socket_data1.StopAfter(1);
|
| - socket_data2.StopAfter(1);
|
| -
|
| - HostPortPair server2("mail.google.com", kDefaultServerPort);
|
| - host_resolver_.set_synchronous_mode(true);
|
| - host_resolver_.rules()->AddIPLiteralRule(
|
| - kDefaultServerHostName, "192.168.0.1", "");
|
| - host_resolver_.rules()->AddIPLiteralRule(
|
| - "mail.google.com", "192.168.0.1", "");
|
| -
|
| - // Disable connection pooling.
|
| - QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - EXPECT_EQ(OK,
|
| - request.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - EXPECT_TRUE(stream.get());
|
| -
|
| - TestCompletionCallback callback;
|
| - QuicStreamRequest request2(&factory_);
|
| - EXPECT_EQ(OK,
|
| - request2.Request(server2,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback.callback()));
|
| - scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
|
| - EXPECT_TRUE(stream2.get());
|
| -
|
| - EXPECT_NE(
|
| - QuicStreamFactoryPeer::GetActiveSession(
|
| - &factory_, host_port_pair_, is_https_),
|
| - QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_));
|
| -
|
| - EXPECT_TRUE(socket_data1.at_read_eof());
|
| - EXPECT_TRUE(socket_data1.at_write_eof());
|
| - EXPECT_TRUE(socket_data2.at_read_eof());
|
| - EXPECT_TRUE(socket_data2.at_write_eof());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, OK, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
|
| - DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
|
| - socket_factory_.AddSocketDataProvider(&socket_data1);
|
| - socket_factory_.AddSocketDataProvider(&socket_data2);
|
| - socket_data1.StopAfter(1);
|
| - socket_data2.StopAfter(1);
|
| -
|
| - HostPortPair server2("mail.google.com", kDefaultServerPort);
|
| - host_resolver_.set_synchronous_mode(true);
|
| - host_resolver_.rules()->AddIPLiteralRule(
|
| - kDefaultServerHostName, "192.168.0.1", "");
|
| - host_resolver_.rules()->AddIPLiteralRule(
|
| - "mail.google.com", "192.168.0.1", "");
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - EXPECT_EQ(OK,
|
| - request.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - EXPECT_TRUE(stream.get());
|
| -
|
| - TestCompletionCallback callback;
|
| - QuicStreamRequest request2(&factory_);
|
| - EXPECT_EQ(OK,
|
| - request2.Request(server2,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback.callback()));
|
| - scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
|
| - EXPECT_TRUE(stream2.get());
|
| -
|
| - factory_.OnSessionGoingAway(QuicStreamFactoryPeer::GetActiveSession(
|
| - &factory_, host_port_pair_, is_https_));
|
| - EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
|
| - &factory_, host_port_pair_, is_https_));
|
| - EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
|
| - &factory_, server2, is_https_));
|
| -
|
| - TestCompletionCallback callback3;
|
| - QuicStreamRequest request3(&factory_);
|
| - EXPECT_EQ(OK,
|
| - request3.Request(server2,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback3.callback()));
|
| - scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
|
| - EXPECT_TRUE(stream3.get());
|
| -
|
| - EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(
|
| - &factory_, server2, is_https_));
|
| -
|
| - EXPECT_TRUE(socket_data1.at_read_eof());
|
| - EXPECT_TRUE(socket_data1.at_write_eof());
|
| - EXPECT_TRUE(socket_data2.at_read_eof());
|
| - EXPECT_TRUE(socket_data2.at_write_eof());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, HttpsPooling) {
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, OK, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
|
| - socket_factory_.AddSocketDataProvider(&socket_data);
|
| - socket_data.StopAfter(1);
|
| -
|
| - HostPortPair server1("www.example.org", 443);
|
| - HostPortPair server2("mail.example.org", 443);
|
| -
|
| - // Load a cert that is valid for:
|
| - // www.example.org (server1)
|
| - // mail.example.org (server2)
|
| - // www.example.com
|
| - base::FilePath certs_dir = GetTestCertsDirectory();
|
| - scoped_refptr<X509Certificate> test_cert(
|
| - ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
|
| - ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
|
| - ProofVerifyDetailsChromium verify_details;
|
| - verify_details.cert_verify_result.verified_cert = test_cert;
|
| - verify_details.cert_verify_result.is_issued_by_known_root = true;
|
| - crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
|
| -
|
| - host_resolver_.set_synchronous_mode(true);
|
| - host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
|
| - host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - is_https_ = true;
|
| - EXPECT_EQ(OK,
|
| - request.Request(server1,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - EXPECT_TRUE(stream.get());
|
| -
|
| - TestCompletionCallback callback;
|
| - QuicStreamRequest request2(&factory_);
|
| - EXPECT_EQ(OK,
|
| - request2.Request(server2,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| - scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
|
| - EXPECT_TRUE(stream2.get());
|
| -
|
| - EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
|
| - &factory_, server1, is_https_),
|
| - QuicStreamFactoryPeer::GetActiveSession(
|
| - &factory_, server2, is_https_));
|
| -
|
| - EXPECT_TRUE(socket_data.at_read_eof());
|
| - EXPECT_TRUE(socket_data.at_write_eof());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, NoHttpsPoolingIfDisabled) {
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, OK, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
|
| - DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
|
| - socket_factory_.AddSocketDataProvider(&socket_data1);
|
| - socket_factory_.AddSocketDataProvider(&socket_data2);
|
| - socket_data1.StopAfter(1);
|
| - socket_data2.StopAfter(1);
|
| -
|
| - HostPortPair server1("www.example.org", 443);
|
| - HostPortPair server2("mail.example.org", 443);
|
| -
|
| - // Load a cert that is valid for:
|
| - // www.example.org (server1)
|
| - // mail.example.org (server2)
|
| - // www.example.com
|
| - base::FilePath certs_dir = GetTestCertsDirectory();
|
| - scoped_refptr<X509Certificate> test_cert(
|
| - ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
|
| - ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
|
| - ProofVerifyDetailsChromium verify_details;
|
| - verify_details.cert_verify_result.verified_cert = test_cert;
|
| - verify_details.cert_verify_result.is_issued_by_known_root = true;
|
| - crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
|
| -
|
| - host_resolver_.set_synchronous_mode(true);
|
| - host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
|
| - host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
|
| -
|
| - // Disable connection pooling.
|
| - QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - is_https_ = true;
|
| - EXPECT_EQ(OK,
|
| - request.Request(server1,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - EXPECT_TRUE(stream.get());
|
| -
|
| - TestCompletionCallback callback;
|
| - QuicStreamRequest request2(&factory_);
|
| - EXPECT_EQ(OK,
|
| - request2.Request(server2,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| - scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
|
| - EXPECT_TRUE(stream2.get());
|
| -
|
| - EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
|
| - &factory_, server1, is_https_),
|
| - QuicStreamFactoryPeer::GetActiveSession(
|
| - &factory_, server2, is_https_));
|
| -
|
| - EXPECT_TRUE(socket_data1.at_read_eof());
|
| - EXPECT_TRUE(socket_data1.at_write_eof());
|
| - EXPECT_TRUE(socket_data2.at_read_eof());
|
| - EXPECT_TRUE(socket_data2.at_write_eof());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithCertMismatch) {
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, OK, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
|
| - DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
|
| - socket_factory_.AddSocketDataProvider(&socket_data1);
|
| - socket_factory_.AddSocketDataProvider(&socket_data2);
|
| - socket_data1.StopAfter(1);
|
| - socket_data2.StopAfter(1);
|
| -
|
| - HostPortPair server1("www.example.org", 443);
|
| - HostPortPair server2("mail.google.com", 443);
|
| -
|
| - // Load a cert that is valid for:
|
| - // www.example.org (server1)
|
| - // mail.example.org
|
| - // www.example.com
|
| - // But is not valid for mail.google.com (server2).
|
| - base::FilePath certs_dir = GetTestCertsDirectory();
|
| - scoped_refptr<X509Certificate> test_cert(
|
| - ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
|
| - ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
|
| - ProofVerifyDetailsChromium verify_details;
|
| - verify_details.cert_verify_result.verified_cert = test_cert;
|
| - crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
|
| -
|
| -
|
| - host_resolver_.set_synchronous_mode(true);
|
| - host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
|
| - host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - is_https_ = true;
|
| - EXPECT_EQ(OK,
|
| - request.Request(server1,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - EXPECT_TRUE(stream.get());
|
| -
|
| - TestCompletionCallback callback;
|
| - QuicStreamRequest request2(&factory_);
|
| - EXPECT_EQ(OK,
|
| - request2.Request(server2,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| - scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
|
| - EXPECT_TRUE(stream2.get());
|
| -
|
| - EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
|
| - &factory_, server1, is_https_),
|
| - QuicStreamFactoryPeer::GetActiveSession(
|
| - &factory_, server2, is_https_));
|
| -
|
| - EXPECT_TRUE(socket_data1.at_read_eof());
|
| - EXPECT_TRUE(socket_data1.at_write_eof());
|
| - EXPECT_TRUE(socket_data2.at_read_eof());
|
| - EXPECT_TRUE(socket_data2.at_write_eof());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, OK, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
|
| - socket_factory_.AddSocketDataProvider(&socket_data);
|
| - socket_data.StopAfter(1);
|
| -
|
| - HostPortPair server1("www.example.org", 443);
|
| - HostPortPair server2("mail.example.org", 443);
|
| - uint8 primary_pin = 1;
|
| - uint8 backup_pin = 2;
|
| - test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
|
| - backup_pin);
|
| -
|
| - // Load a cert that is valid for:
|
| - // www.example.org (server1)
|
| - // mail.example.org (server2)
|
| - base::FilePath certs_dir = GetTestCertsDirectory();
|
| - scoped_refptr<X509Certificate> test_cert(
|
| - ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
|
| - ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
|
| - ProofVerifyDetailsChromium verify_details;
|
| - verify_details.cert_verify_result.verified_cert = test_cert;
|
| - verify_details.cert_verify_result.is_issued_by_known_root = true;
|
| - verify_details.cert_verify_result.public_key_hashes.push_back(
|
| - test::GetTestHashValue(primary_pin));
|
| - crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
|
| -
|
| -
|
| - host_resolver_.set_synchronous_mode(true);
|
| - host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
|
| - host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - is_https_ = true;
|
| - EXPECT_EQ(OK,
|
| - request.Request(server1,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - EXPECT_TRUE(stream.get());
|
| -
|
| - TestCompletionCallback callback;
|
| - QuicStreamRequest request2(&factory_);
|
| - EXPECT_EQ(OK,
|
| - request2.Request(server2,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| - scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
|
| - EXPECT_TRUE(stream2.get());
|
| -
|
| - EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(
|
| - &factory_, server1, is_https_),
|
| - QuicStreamFactoryPeer::GetActiveSession(
|
| - &factory_, server2, is_https_));
|
| -
|
| - EXPECT_TRUE(socket_data.at_read_eof());
|
| - EXPECT_TRUE(socket_data.at_write_eof());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithMatchingPinsIfDisabled) {
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, OK, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
|
| - DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
|
| - socket_factory_.AddSocketDataProvider(&socket_data1);
|
| - socket_factory_.AddSocketDataProvider(&socket_data2);
|
| - socket_data1.StopAfter(1);
|
| - socket_data2.StopAfter(1);
|
| -
|
| - HostPortPair server1("www.example.org", 443);
|
| - HostPortPair server2("mail.example.org", 443);
|
| - uint8 primary_pin = 1;
|
| - uint8 backup_pin = 2;
|
| - test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
|
| - backup_pin);
|
| -
|
| - // Load a cert that is valid for:
|
| - // www.example.org (server1)
|
| - // mail.example.org (server2)
|
| - base::FilePath certs_dir = GetTestCertsDirectory();
|
| - scoped_refptr<X509Certificate> test_cert(
|
| - ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
|
| - ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
|
| - ProofVerifyDetailsChromium verify_details;
|
| - verify_details.cert_verify_result.verified_cert = test_cert;
|
| - verify_details.cert_verify_result.is_issued_by_known_root = true;
|
| - verify_details.cert_verify_result.public_key_hashes.push_back(
|
| - test::GetTestHashValue(primary_pin));
|
| - crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
|
| -
|
| -
|
| - host_resolver_.set_synchronous_mode(true);
|
| - host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
|
| - host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
|
| -
|
| - // Disable connection pooling.
|
| - QuicStreamFactoryPeer::DisableConnectionPooling(&factory_);
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - is_https_ = true;
|
| - EXPECT_EQ(OK,
|
| - request.Request(server1,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - EXPECT_TRUE(stream.get());
|
| -
|
| - TestCompletionCallback callback;
|
| - QuicStreamRequest request2(&factory_);
|
| - EXPECT_EQ(OK,
|
| - request2.Request(server2,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| - scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
|
| - EXPECT_TRUE(stream2.get());
|
| -
|
| - EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
|
| - &factory_, server1, is_https_),
|
| - QuicStreamFactoryPeer::GetActiveSession(
|
| - &factory_, server2, is_https_));
|
| -
|
| - EXPECT_TRUE(socket_data1.at_read_eof());
|
| - EXPECT_TRUE(socket_data1.at_write_eof());
|
| - EXPECT_TRUE(socket_data2.at_read_eof());
|
| - EXPECT_TRUE(socket_data2.at_write_eof());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, OK, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
|
| - DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
|
| - socket_factory_.AddSocketDataProvider(&socket_data1);
|
| - socket_factory_.AddSocketDataProvider(&socket_data2);
|
| - socket_data1.StopAfter(1);
|
| - socket_data2.StopAfter(1);
|
| -
|
| - HostPortPair server1("www.example.org", 443);
|
| - HostPortPair server2("mail.example.org", 443);
|
| - uint8 primary_pin = 1;
|
| - uint8 backup_pin = 2;
|
| - uint8 bad_pin = 3;
|
| - test::AddPin(&transport_security_state_, "mail.example.org", primary_pin,
|
| - backup_pin);
|
| -
|
| - // Load a cert that is valid for:
|
| - // www.example.org (server1)
|
| - // mail.example.org (server2)
|
| - base::FilePath certs_dir = GetTestCertsDirectory();
|
| - scoped_refptr<X509Certificate> test_cert(
|
| - ImportCertFromFile(certs_dir, "spdy_pooling.pem"));
|
| - ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
|
| - ProofVerifyDetailsChromium verify_details;
|
| - verify_details.cert_verify_result.verified_cert = test_cert;
|
| - verify_details.cert_verify_result.is_issued_by_known_root = true;
|
| - verify_details.cert_verify_result.public_key_hashes.push_back(
|
| - test::GetTestHashValue(bad_pin));
|
| - crypto_client_stream_factory_.set_proof_verify_details(&verify_details);
|
| -
|
| -
|
| - host_resolver_.set_synchronous_mode(true);
|
| - host_resolver_.rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
|
| - host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - is_https_ = true;
|
| - EXPECT_EQ(OK,
|
| - request.Request(server1,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - EXPECT_TRUE(stream.get());
|
| -
|
| - TestCompletionCallback callback;
|
| - QuicStreamRequest request2(&factory_);
|
| - EXPECT_EQ(OK,
|
| - request2.Request(server2,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| - scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
|
| - EXPECT_TRUE(stream2.get());
|
| -
|
| - EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(
|
| - &factory_, server1, is_https_),
|
| - QuicStreamFactoryPeer::GetActiveSession(
|
| - &factory_, server2, is_https_));
|
| -
|
| - EXPECT_TRUE(socket_data1.at_read_eof());
|
| - EXPECT_TRUE(socket_data1.at_write_eof());
|
| - EXPECT_TRUE(socket_data2.at_read_eof());
|
| - EXPECT_TRUE(socket_data2.at_write_eof());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, Goaway) {
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, OK, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
|
| - socket_data.StopAfter(1);
|
| - socket_factory_.AddSocketDataProvider(&socket_data);
|
| - DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
|
| - socket_data2.StopAfter(1);
|
| - socket_factory_.AddSocketDataProvider(&socket_data2);
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - request.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| -
|
| - EXPECT_EQ(OK, callback_.WaitForResult());
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - EXPECT_TRUE(stream.get());
|
| -
|
| - // Mark the session as going away. Ensure that while it is still alive
|
| - // that it is no longer active.
|
| - QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
|
| - &factory_, host_port_pair_, is_https_);
|
| - factory_.OnSessionGoingAway(session);
|
| - EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
|
| - EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(
|
| - &factory_, host_port_pair_, is_https_));
|
| - EXPECT_EQ(nullptr, CreateIfSessionExists(host_port_pair_, net_log_).get());
|
| -
|
| - // Create a new request for the same destination and verify that a
|
| - // new session is created.
|
| - QuicStreamRequest request2(&factory_);
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - request2.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| - EXPECT_EQ(OK, callback_.WaitForResult());
|
| - scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
|
| - EXPECT_TRUE(stream2.get());
|
| -
|
| - EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(&factory_,
|
| - host_port_pair_,
|
| - is_https_));
|
| - EXPECT_NE(session,
|
| - QuicStreamFactoryPeer::GetActiveSession(
|
| - &factory_, host_port_pair_, is_https_));
|
| - EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session));
|
| -
|
| - stream2.reset();
|
| - stream.reset();
|
| -
|
| - EXPECT_TRUE(socket_data.at_read_eof());
|
| - EXPECT_TRUE(socket_data.at_write_eof());
|
| - EXPECT_TRUE(socket_data2.at_read_eof());
|
| - EXPECT_TRUE(socket_data2.at_write_eof());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, OK, 0) // EOF
|
| - };
|
| - QuicStreamId stream_id = kClientDataStreamId1;
|
| - scoped_ptr<QuicEncryptedPacket> rst(
|
| - maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_CANCELLED));
|
| - MockWrite writes[] = {
|
| - MockWrite(ASYNC, rst->data(), rst->length(), 1),
|
| - };
|
| - DeterministicSocketData socket_data(reads, arraysize(reads),
|
| - writes, arraysize(writes));
|
| - socket_factory_.AddSocketDataProvider(&socket_data);
|
| - socket_data.StopAfter(1);
|
| -
|
| - HttpRequestInfo request_info;
|
| - std::vector<QuicHttpStream*> streams;
|
| - // The MockCryptoClientStream sets max_open_streams to be
|
| - // kDefaultMaxStreamsPerConnection / 2.
|
| - for (size_t i = 0; i < kDefaultMaxStreamsPerConnection / 2; i++) {
|
| - QuicStreamRequest request(&factory_);
|
| - int rv = request.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback());
|
| - if (i == 0) {
|
| - EXPECT_EQ(ERR_IO_PENDING, rv);
|
| - EXPECT_EQ(OK, callback_.WaitForResult());
|
| - } else {
|
| - EXPECT_EQ(OK, rv);
|
| - }
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - EXPECT_TRUE(stream);
|
| - EXPECT_EQ(OK, stream->InitializeStream(
|
| - &request_info, DEFAULT_PRIORITY, net_log_, CompletionCallback()));
|
| - streams.push_back(stream.release());
|
| - }
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - EXPECT_EQ(OK,
|
| - request.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - CompletionCallback()));
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - EXPECT_TRUE(stream);
|
| - EXPECT_EQ(ERR_IO_PENDING, stream->InitializeStream(
|
| - &request_info, DEFAULT_PRIORITY, net_log_, callback_.callback()));
|
| -
|
| - // Close the first stream.
|
| - streams.front()->Close(false);
|
| -
|
| - ASSERT_TRUE(callback_.have_result());
|
| -
|
| - EXPECT_EQ(OK, callback_.WaitForResult());
|
| -
|
| - EXPECT_TRUE(socket_data.at_read_eof());
|
| - EXPECT_TRUE(socket_data.at_write_eof());
|
| - STLDeleteElements(&streams);
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
|
| - DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
|
| - socket_factory_.AddSocketDataProvider(&socket_data);
|
| -
|
| - host_resolver_.rules()->AddSimulatedFailure(kDefaultServerHostName);
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - request.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| -
|
| - EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
|
| -
|
| - EXPECT_TRUE(socket_data.at_read_eof());
|
| - EXPECT_TRUE(socket_data.at_write_eof());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
|
| - MockConnect connect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
|
| - DeterministicSocketData socket_data(nullptr, 0, nullptr, 0);
|
| - socket_data.set_connect_data(connect);
|
| - socket_factory_.AddSocketDataProvider(&socket_data);
|
| - socket_data.StopAfter(1);
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - request.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| -
|
| - EXPECT_EQ(ERR_ADDRESS_IN_USE, callback_.WaitForResult());
|
| -
|
| - EXPECT_TRUE(socket_data.at_read_eof());
|
| - EXPECT_TRUE(socket_data.at_write_eof());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, CancelCreate) {
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, OK, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
|
| - socket_factory_.AddSocketDataProvider(&socket_data);
|
| - {
|
| - QuicStreamRequest request(&factory_);
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - request.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| - }
|
| -
|
| - socket_data.StopAfter(1);
|
| - base::RunLoop run_loop;
|
| - run_loop.RunUntilIdle();
|
| -
|
| - scoped_ptr<QuicHttpStream> stream(
|
| - CreateIfSessionExists(host_port_pair_, net_log_));
|
| - EXPECT_TRUE(stream.get());
|
| - stream.reset();
|
| -
|
| - EXPECT_TRUE(socket_data.at_read_eof());
|
| - EXPECT_TRUE(socket_data.at_write_eof());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) {
|
| - // Sequentially connect to the default host, then another host, and then the
|
| - // default host. Verify that the default host gets a consistent ephemeral
|
| - // port, that is different from the other host's connection.
|
| -
|
| - std::string other_server_name = "other.google.com";
|
| - EXPECT_NE(kDefaultServerHostName, other_server_name);
|
| - HostPortPair host_port_pair2(other_server_name, kDefaultServerPort);
|
| -
|
| - int original_port = GetSourcePortForNewSession(host_port_pair_);
|
| - EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair2));
|
| - EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, GoAwayDisablesConsistentEphemeralPort) {
|
| - // Get a session to the host using the port suggester.
|
| - int original_port =
|
| - GetSourcePortForNewSessionAndGoAway(host_port_pair_);
|
| - // Verify that the port is different after the goaway.
|
| - EXPECT_NE(original_port, GetSourcePortForNewSession(host_port_pair_));
|
| - // Since the previous session did not goaway we should see the original port.
|
| - EXPECT_EQ(original_port, GetSourcePortForNewSession(host_port_pair_));
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, 0, 0) // EOF
|
| - };
|
| - scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
|
| - std::vector<MockWrite> writes;
|
| - writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
|
| - DeterministicSocketData socket_data(reads, arraysize(reads),
|
| - writes.empty() ? nullptr : &writes[0],
|
| - writes.size());
|
| - socket_factory_.AddSocketDataProvider(&socket_data);
|
| - socket_data.StopAfter(1);
|
| -
|
| - MockRead reads2[] = {
|
| - MockRead(ASYNC, 0, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
|
| - socket_factory_.AddSocketDataProvider(&socket_data2);
|
| - socket_data2.StopAfter(1);
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - request.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| -
|
| - EXPECT_EQ(OK, callback_.WaitForResult());
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - HttpRequestInfo request_info;
|
| - EXPECT_EQ(OK, stream->InitializeStream(&request_info,
|
| - DEFAULT_PRIORITY,
|
| - net_log_, CompletionCallback()));
|
| -
|
| - // Close the session and verify that stream saw the error.
|
| - factory_.CloseAllSessions(ERR_INTERNET_DISCONNECTED);
|
| - EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
|
| - stream->ReadResponseHeaders(callback_.callback()));
|
| -
|
| - // Now attempting to request a stream to the same origin should create
|
| - // a new session.
|
| -
|
| - QuicStreamRequest request2(&factory_);
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - request2.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| -
|
| - EXPECT_EQ(OK, callback_.WaitForResult());
|
| - stream = request2.ReleaseStream();
|
| - stream.reset(); // Will reset stream 3.
|
| -
|
| - EXPECT_TRUE(socket_data.at_read_eof());
|
| - EXPECT_TRUE(socket_data.at_write_eof());
|
| - EXPECT_TRUE(socket_data2.at_read_eof());
|
| - EXPECT_TRUE(socket_data2.at_write_eof());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, 0, 0) // EOF
|
| - };
|
| - scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
|
| - std::vector<MockWrite> writes;
|
| - writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
|
| - DeterministicSocketData socket_data(reads, arraysize(reads),
|
| - writes.empty() ? nullptr : &writes[0],
|
| - writes.size());
|
| - socket_factory_.AddSocketDataProvider(&socket_data);
|
| - socket_data.StopAfter(1);
|
| -
|
| - MockRead reads2[] = {
|
| - MockRead(ASYNC, 0, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
|
| - socket_factory_.AddSocketDataProvider(&socket_data2);
|
| - socket_data2.StopAfter(1);
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - request.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| -
|
| - EXPECT_EQ(OK, callback_.WaitForResult());
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - HttpRequestInfo request_info;
|
| - EXPECT_EQ(OK, stream->InitializeStream(&request_info,
|
| - DEFAULT_PRIORITY,
|
| - net_log_, CompletionCallback()));
|
| -
|
| - // Change the IP address and verify that stream saw the error.
|
| - factory_.OnIPAddressChanged();
|
| - EXPECT_EQ(ERR_NETWORK_CHANGED,
|
| - stream->ReadResponseHeaders(callback_.callback()));
|
| - EXPECT_TRUE(factory_.require_confirmation());
|
| -
|
| - // Now attempting to request a stream to the same origin should create
|
| - // a new session.
|
| -
|
| - QuicStreamRequest request2(&factory_);
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - request2.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| -
|
| - EXPECT_EQ(OK, callback_.WaitForResult());
|
| - stream = request2.ReleaseStream();
|
| - stream.reset(); // Will reset stream 3.
|
| -
|
| - EXPECT_TRUE(socket_data.at_read_eof());
|
| - EXPECT_TRUE(socket_data.at_write_eof());
|
| - EXPECT_TRUE(socket_data2.at_read_eof());
|
| - EXPECT_TRUE(socket_data2.at_write_eof());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, OnCertAdded) {
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, 0, 0) // EOF
|
| - };
|
| - scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
|
| - std::vector<MockWrite> writes;
|
| - writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
|
| - DeterministicSocketData socket_data(reads, arraysize(reads),
|
| - writes.empty() ? nullptr : &writes[0],
|
| - writes.size());
|
| - socket_factory_.AddSocketDataProvider(&socket_data);
|
| - socket_data.StopAfter(1);
|
| -
|
| - MockRead reads2[] = {
|
| - MockRead(ASYNC, 0, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
|
| - socket_factory_.AddSocketDataProvider(&socket_data2);
|
| - socket_data2.StopAfter(1);
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - request.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| -
|
| - EXPECT_EQ(OK, callback_.WaitForResult());
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - HttpRequestInfo request_info;
|
| - EXPECT_EQ(OK, stream->InitializeStream(&request_info,
|
| - DEFAULT_PRIORITY,
|
| - net_log_, CompletionCallback()));
|
| -
|
| - // Add a cert and verify that stream saw the event.
|
| - factory_.OnCertAdded(nullptr);
|
| - EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
|
| - stream->ReadResponseHeaders(callback_.callback()));
|
| - EXPECT_FALSE(factory_.require_confirmation());
|
| -
|
| - // Now attempting to request a stream to the same origin should create
|
| - // a new session.
|
| -
|
| - QuicStreamRequest request2(&factory_);
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - request2.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| -
|
| - EXPECT_EQ(OK, callback_.WaitForResult());
|
| - stream = request2.ReleaseStream();
|
| - stream.reset(); // Will reset stream 3.
|
| -
|
| - EXPECT_TRUE(socket_data.at_read_eof());
|
| - EXPECT_TRUE(socket_data.at_write_eof());
|
| - EXPECT_TRUE(socket_data2.at_read_eof());
|
| - EXPECT_TRUE(socket_data2.at_write_eof());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, OnCACertChanged) {
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, 0, 0) // EOF
|
| - };
|
| - scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket());
|
| - std::vector<MockWrite> writes;
|
| - writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1));
|
| - DeterministicSocketData socket_data(reads, arraysize(reads),
|
| - writes.empty() ? nullptr : &writes[0],
|
| - writes.size());
|
| - socket_factory_.AddSocketDataProvider(&socket_data);
|
| - socket_data.StopAfter(1);
|
| -
|
| - MockRead reads2[] = {
|
| - MockRead(ASYNC, 0, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
|
| - socket_factory_.AddSocketDataProvider(&socket_data2);
|
| - socket_data2.StopAfter(1);
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - request.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| -
|
| - EXPECT_EQ(OK, callback_.WaitForResult());
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - HttpRequestInfo request_info;
|
| - EXPECT_EQ(OK, stream->InitializeStream(&request_info,
|
| - DEFAULT_PRIORITY,
|
| - net_log_, CompletionCallback()));
|
| -
|
| - // Change the CA cert and verify that stream saw the event.
|
| - factory_.OnCACertChanged(nullptr);
|
| - EXPECT_EQ(ERR_CERT_DATABASE_CHANGED,
|
| - stream->ReadResponseHeaders(callback_.callback()));
|
| - EXPECT_FALSE(factory_.require_confirmation());
|
| -
|
| - // Now attempting to request a stream to the same origin should create
|
| - // a new session.
|
| -
|
| - QuicStreamRequest request2(&factory_);
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - request2.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| -
|
| - EXPECT_EQ(OK, callback_.WaitForResult());
|
| - stream = request2.ReleaseStream();
|
| - stream.reset(); // Will reset stream 3.
|
| -
|
| - EXPECT_TRUE(socket_data.at_read_eof());
|
| - EXPECT_TRUE(socket_data.at_write_eof());
|
| - EXPECT_TRUE(socket_data2.at_read_eof());
|
| - EXPECT_TRUE(socket_data2.at_write_eof());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
|
| - vector<string> cannoncial_suffixes;
|
| - cannoncial_suffixes.push_back(string(".c.youtube.com"));
|
| - cannoncial_suffixes.push_back(string(".googlevideo.com"));
|
| -
|
| - for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
|
| - string r1_host_name("r1");
|
| - string r2_host_name("r2");
|
| - r1_host_name.append(cannoncial_suffixes[i]);
|
| - r2_host_name.append(cannoncial_suffixes[i]);
|
| -
|
| - HostPortPair host_port_pair1(r1_host_name, 80);
|
| - QuicCryptoClientConfig* crypto_config =
|
| - QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
|
| - QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
|
| - QuicCryptoClientConfig::CachedState* cached1 =
|
| - crypto_config->LookupOrCreate(server_id1);
|
| - EXPECT_FALSE(cached1->proof_valid());
|
| - EXPECT_TRUE(cached1->source_address_token().empty());
|
| -
|
| - // Mutate the cached1 to have different data.
|
| - // TODO(rtenneti): mutate other members of CachedState.
|
| - cached1->set_source_address_token(r1_host_name);
|
| - cached1->SetProofValid();
|
| -
|
| - HostPortPair host_port_pair2(r2_host_name, 80);
|
| - QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
|
| - QuicCryptoClientConfig::CachedState* cached2 =
|
| - crypto_config->LookupOrCreate(server_id2);
|
| - EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
|
| - EXPECT_TRUE(cached2->proof_valid());
|
| - }
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
|
| - vector<string> cannoncial_suffixes;
|
| - cannoncial_suffixes.push_back(string(".c.youtube.com"));
|
| - cannoncial_suffixes.push_back(string(".googlevideo.com"));
|
| -
|
| - for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) {
|
| - string r3_host_name("r3");
|
| - string r4_host_name("r4");
|
| - r3_host_name.append(cannoncial_suffixes[i]);
|
| - r4_host_name.append(cannoncial_suffixes[i]);
|
| -
|
| - HostPortPair host_port_pair1(r3_host_name, 80);
|
| - QuicCryptoClientConfig* crypto_config =
|
| - QuicStreamFactoryPeer::GetCryptoConfig(&factory_);
|
| - QuicServerId server_id1(host_port_pair1, is_https_, privacy_mode_);
|
| - QuicCryptoClientConfig::CachedState* cached1 =
|
| - crypto_config->LookupOrCreate(server_id1);
|
| - EXPECT_FALSE(cached1->proof_valid());
|
| - EXPECT_TRUE(cached1->source_address_token().empty());
|
| -
|
| - // Mutate the cached1 to have different data.
|
| - // TODO(rtenneti): mutate other members of CachedState.
|
| - cached1->set_source_address_token(r3_host_name);
|
| - cached1->SetProofInvalid();
|
| -
|
| - HostPortPair host_port_pair2(r4_host_name, 80);
|
| - QuicServerId server_id2(host_port_pair2, is_https_, privacy_mode_);
|
| - QuicCryptoClientConfig::CachedState* cached2 =
|
| - crypto_config->LookupOrCreate(server_id2);
|
| - EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
|
| - EXPECT_TRUE(cached2->source_address_token().empty());
|
| - EXPECT_FALSE(cached2->proof_valid());
|
| - }
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, CancelWaitForDataReady) {
|
| - // Don't race quic connections when testing cancel reading of server config
|
| - // from disk cache.
|
| - if (GetParam().enable_connection_racing)
|
| - return;
|
| - factory_.set_quic_server_info_factory(&quic_server_info_factory_);
|
| - QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
|
| - const size_t kLoadServerInfoTimeoutMs = 50;
|
| - QuicStreamFactoryPeer::SetLoadServerInfoTimeout(
|
| - &factory_, kLoadServerInfoTimeoutMs);
|
| -
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, OK, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
|
| - socket_factory_.AddSocketDataProvider(&socket_data);
|
| - socket_data.StopAfter(1);
|
| -
|
| - crypto_client_stream_factory_.set_handshake_mode(
|
| - MockCryptoClientStream::ZERO_RTT);
|
| - host_resolver_.set_synchronous_mode(true);
|
| - host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
|
| - "192.168.0.1", "");
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - request.Request(host_port_pair_,
|
| - is_https_,
|
| - privacy_mode_,
|
| - "GET",
|
| - net_log_,
|
| - callback_.callback()));
|
| -
|
| - // Verify that the CancelWaitForDataReady task has been posted.
|
| - ASSERT_EQ(1u, runner_->GetPostedTasks().size());
|
| - EXPECT_EQ(base::TimeDelta::FromMilliseconds(kLoadServerInfoTimeoutMs),
|
| - runner_->GetPostedTasks()[0].delay);
|
| -
|
| - runner_->RunNextTask();
|
| - ASSERT_EQ(0u, runner_->GetPostedTasks().size());
|
| -
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - EXPECT_TRUE(stream.get());
|
| - EXPECT_TRUE(socket_data.at_read_eof());
|
| - EXPECT_TRUE(socket_data.at_write_eof());
|
| -}
|
| -
|
| -TEST_P(QuicStreamFactoryTest, RacingConnections) {
|
| - if (!GetParam().enable_connection_racing)
|
| - return;
|
| - factory_.set_quic_server_info_factory(&quic_server_info_factory_);
|
| - QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
|
| - const size_t kLoadServerInfoTimeoutMs = 50;
|
| - QuicStreamFactoryPeer::SetLoadServerInfoTimeout(&factory_,
|
| - kLoadServerInfoTimeoutMs);
|
| -
|
| - MockRead reads[] = {
|
| - MockRead(ASYNC, OK, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
|
| - socket_factory_.AddSocketDataProvider(&socket_data);
|
| - socket_data.StopAfter(1);
|
| -
|
| - MockRead reads2[] = {
|
| - MockRead(ASYNC, 0, 0) // EOF
|
| - };
|
| - DeterministicSocketData socket_data2(reads2, arraysize(reads2), nullptr, 0);
|
| - socket_factory_.AddSocketDataProvider(&socket_data2);
|
| - socket_data2.StopAfter(1);
|
| -
|
| - crypto_client_stream_factory_.set_handshake_mode(
|
| - MockCryptoClientStream::ZERO_RTT);
|
| - host_resolver_.set_synchronous_mode(true);
|
| - host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
|
| - "192.168.0.1", "");
|
| -
|
| - QuicStreamRequest request(&factory_);
|
| - QuicServerId server_id(host_port_pair_, is_https_, privacy_mode_);
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - request.Request(host_port_pair_, is_https_, privacy_mode_, "GET",
|
| - net_log_, callback_.callback()));
|
| - EXPECT_EQ(2u,
|
| - QuicStreamFactoryPeer::GetNumberOfActiveJobs(&factory_, server_id));
|
| -
|
| - runner_->RunNextTask();
|
| -
|
| - scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
|
| - EXPECT_TRUE(stream.get());
|
| - EXPECT_TRUE(socket_data.at_read_eof());
|
| - EXPECT_TRUE(socket_data.at_write_eof());
|
| - EXPECT_EQ(0u,
|
| - QuicStreamFactoryPeer::GetNumberOfActiveJobs(&factory_, server_id));
|
| -}
|
| -
|
| -} // namespace test
|
| -} // namespace net
|
|
|