| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/quic_stream_factory.h" | 5 #include "net/quic/quic_stream_factory.h" |
| 6 | 6 |
| 7 #include "base/run_loop.h" | 7 #include "base/run_loop.h" |
| 8 #include "base/strings/string_util.h" | 8 #include "base/strings/string_util.h" |
| 9 #include "base/thread_task_runner_handle.h" | 9 #include "base/thread_task_runner_handle.h" |
| 10 #include "net/base/test_data_directory.h" | 10 #include "net/base/test_data_directory.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 #include "net/quic/crypto/properties_based_quic_server_info.h" | 21 #include "net/quic/crypto/properties_based_quic_server_info.h" |
| 22 #include "net/quic/crypto/quic_crypto_client_config.h" | 22 #include "net/quic/crypto/quic_crypto_client_config.h" |
| 23 #include "net/quic/crypto/quic_decrypter.h" | 23 #include "net/quic/crypto/quic_decrypter.h" |
| 24 #include "net/quic/crypto/quic_encrypter.h" | 24 #include "net/quic/crypto/quic_encrypter.h" |
| 25 #include "net/quic/crypto/quic_server_info.h" | 25 #include "net/quic/crypto/quic_server_info.h" |
| 26 #include "net/quic/quic_http_stream.h" | 26 #include "net/quic/quic_http_stream.h" |
| 27 #include "net/quic/quic_server_id.h" | 27 #include "net/quic/quic_server_id.h" |
| 28 #include "net/quic/test_tools/mock_clock.h" | 28 #include "net/quic/test_tools/mock_clock.h" |
| 29 #include "net/quic/test_tools/mock_crypto_client_stream_factory.h" | 29 #include "net/quic/test_tools/mock_crypto_client_stream_factory.h" |
| 30 #include "net/quic/test_tools/mock_random.h" | 30 #include "net/quic/test_tools/mock_random.h" |
| 31 #include "net/quic/test_tools/quic_stream_factory_peer.h" |
| 31 #include "net/quic/test_tools/quic_test_packet_maker.h" | 32 #include "net/quic/test_tools/quic_test_packet_maker.h" |
| 32 #include "net/quic/test_tools/quic_test_utils.h" | 33 #include "net/quic/test_tools/quic_test_utils.h" |
| 33 #include "net/quic/test_tools/test_task_runner.h" | 34 #include "net/quic/test_tools/test_task_runner.h" |
| 34 #include "net/socket/socket_test_util.h" | 35 #include "net/socket/socket_test_util.h" |
| 35 #include "net/spdy/spdy_session_test_util.h" | 36 #include "net/spdy/spdy_session_test_util.h" |
| 36 #include "net/spdy/spdy_test_utils.h" | 37 #include "net/spdy/spdy_test_utils.h" |
| 37 #include "net/ssl/channel_id_service.h" | 38 #include "net/ssl/channel_id_service.h" |
| 38 #include "net/ssl/default_channel_id_store.h" | 39 #include "net/ssl/default_channel_id_store.h" |
| 39 #include "net/test/cert_test_util.h" | 40 #include "net/test/cert_test_util.h" |
| 40 #include "testing/gtest/include/gtest/gtest.h" | 41 #include "testing/gtest/include/gtest/gtest.h" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 QuicVersionVector all_supported_versions = QuicSupportedVersions(); | 74 QuicVersionVector all_supported_versions = QuicSupportedVersions(); |
| 74 for (const QuicVersion version : all_supported_versions) { | 75 for (const QuicVersion version : all_supported_versions) { |
| 75 params.push_back(TestParams(version, false)); | 76 params.push_back(TestParams(version, false)); |
| 76 params.push_back(TestParams(version, true)); | 77 params.push_back(TestParams(version, true)); |
| 77 } | 78 } |
| 78 return params; | 79 return params; |
| 79 } | 80 } |
| 80 | 81 |
| 81 } // namespace anonymous | 82 } // namespace anonymous |
| 82 | 83 |
| 83 class QuicStreamFactoryPeer { | |
| 84 public: | |
| 85 static const QuicConfig* GetConfig(QuicStreamFactory* factory) { | |
| 86 return &factory->config_; | |
| 87 } | |
| 88 | |
| 89 static QuicCryptoClientConfig* GetCryptoConfig(QuicStreamFactory* factory) { | |
| 90 return &factory->crypto_config_; | |
| 91 } | |
| 92 | |
| 93 static bool HasActiveSession(QuicStreamFactory* factory, | |
| 94 const HostPortPair& host_port_pair) { | |
| 95 QuicServerId server_id(host_port_pair, PRIVACY_MODE_DISABLED); | |
| 96 return factory->HasActiveSession(server_id); | |
| 97 } | |
| 98 | |
| 99 static QuicChromiumClientSession* GetActiveSession( | |
| 100 QuicStreamFactory* factory, | |
| 101 const HostPortPair& host_port_pair) { | |
| 102 QuicServerId server_id(host_port_pair, PRIVACY_MODE_DISABLED); | |
| 103 DCHECK(factory->HasActiveSession(server_id)); | |
| 104 return factory->active_sessions_[server_id]; | |
| 105 } | |
| 106 | |
| 107 static scoped_ptr<QuicHttpStream> CreateFromSession( | |
| 108 QuicStreamFactory* factory, | |
| 109 QuicChromiumClientSession* session) { | |
| 110 return factory->CreateFromSession(session); | |
| 111 } | |
| 112 | |
| 113 static bool IsLiveSession(QuicStreamFactory* factory, | |
| 114 QuicChromiumClientSession* session) { | |
| 115 for (QuicStreamFactory::SessionIdMap::iterator it = | |
| 116 factory->all_sessions_.begin(); | |
| 117 it != factory->all_sessions_.end(); ++it) { | |
| 118 if (it->first == session) | |
| 119 return true; | |
| 120 } | |
| 121 return false; | |
| 122 } | |
| 123 | |
| 124 static void SetTaskRunner(QuicStreamFactory* factory, | |
| 125 base::TaskRunner* task_runner) { | |
| 126 factory->task_runner_ = task_runner; | |
| 127 } | |
| 128 | |
| 129 static int GetNumberOfLossyConnections(QuicStreamFactory* factory, | |
| 130 uint16 port) { | |
| 131 return factory->number_of_lossy_connections_[port]; | |
| 132 } | |
| 133 | |
| 134 static bool IsQuicDisabled(QuicStreamFactory* factory, uint16 port) { | |
| 135 return factory->IsQuicDisabled(port); | |
| 136 } | |
| 137 | |
| 138 static bool GetDelayTcpRace(QuicStreamFactory* factory) { | |
| 139 return factory->delay_tcp_race_; | |
| 140 } | |
| 141 | |
| 142 static void SetDelayTcpRace(QuicStreamFactory* factory, bool delay_tcp_race) { | |
| 143 factory->delay_tcp_race_ = delay_tcp_race; | |
| 144 } | |
| 145 | |
| 146 static void SetYieldAfterPackets(QuicStreamFactory* factory, | |
| 147 int yield_after_packets) { | |
| 148 factory->yield_after_packets_ = yield_after_packets; | |
| 149 } | |
| 150 | |
| 151 static void SetYieldAfterDuration(QuicStreamFactory* factory, | |
| 152 QuicTime::Delta yield_after_duration) { | |
| 153 factory->yield_after_duration_ = yield_after_duration; | |
| 154 } | |
| 155 | |
| 156 static size_t GetNumberOfActiveJobs(QuicStreamFactory* factory, | |
| 157 const QuicServerId& server_id) { | |
| 158 return (factory->active_jobs_[server_id]).size(); | |
| 159 } | |
| 160 | |
| 161 static int GetNumTimeoutsWithOpenStreams(QuicStreamFactory* factory) { | |
| 162 return factory->num_timeouts_with_open_streams_; | |
| 163 } | |
| 164 | |
| 165 static int GetNumPublicResetsPostHandshake(QuicStreamFactory* factory) { | |
| 166 return factory->num_public_resets_post_handshake_; | |
| 167 } | |
| 168 | |
| 169 static void MaybeInitialize(QuicStreamFactory* factory) { | |
| 170 factory->MaybeInitialize(); | |
| 171 } | |
| 172 | |
| 173 static bool HasInitializedData(QuicStreamFactory* factory) { | |
| 174 return factory->has_initialized_data_; | |
| 175 } | |
| 176 | |
| 177 static bool SupportsQuicAtStartUp(QuicStreamFactory* factory, | |
| 178 HostPortPair host_port_pair) { | |
| 179 return ContainsKey(factory->quic_supported_servers_at_startup_, | |
| 180 host_port_pair); | |
| 181 } | |
| 182 | |
| 183 static bool CryptoConfigCacheIsEmpty(QuicStreamFactory* factory, | |
| 184 QuicServerId& quic_server_id) { | |
| 185 return factory->CryptoConfigCacheIsEmpty(quic_server_id); | |
| 186 } | |
| 187 }; | |
| 188 | |
| 189 class MockQuicServerInfo : public QuicServerInfo { | 84 class MockQuicServerInfo : public QuicServerInfo { |
| 190 public: | 85 public: |
| 191 MockQuicServerInfo(const QuicServerId& server_id) | 86 MockQuicServerInfo(const QuicServerId& server_id) |
| 192 : QuicServerInfo(server_id) {} | 87 : QuicServerInfo(server_id) {} |
| 193 ~MockQuicServerInfo() override {} | 88 ~MockQuicServerInfo() override {} |
| 194 | 89 |
| 195 void Start() override {} | 90 void Start() override {} |
| 196 | 91 |
| 197 int WaitForDataReady(const CompletionCallback& callback) override { | 92 int WaitForDataReady(const CompletionCallback& callback) override { |
| 198 return ERR_IO_PENDING; | 93 return ERR_IO_PENDING; |
| (...skipping 2530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2729 crypto_config->LookupOrCreate(quic_server_id); | 2624 crypto_config->LookupOrCreate(quic_server_id); |
| 2730 EXPECT_FALSE(cached->server_config().empty()); | 2625 EXPECT_FALSE(cached->server_config().empty()); |
| 2731 EXPECT_TRUE(cached->GetServerConfig()); | 2626 EXPECT_TRUE(cached->GetServerConfig()); |
| 2732 EXPECT_EQ(server_config, cached->server_config()); | 2627 EXPECT_EQ(server_config, cached->server_config()); |
| 2733 EXPECT_EQ(source_address_token, cached->source_address_token()); | 2628 EXPECT_EQ(source_address_token, cached->source_address_token()); |
| 2734 EXPECT_EQ(signature, cached->signature()); | 2629 EXPECT_EQ(signature, cached->signature()); |
| 2735 ASSERT_EQ(1U, cached->certs().size()); | 2630 ASSERT_EQ(1U, cached->certs().size()); |
| 2736 EXPECT_EQ(test_cert, cached->certs()[0]); | 2631 EXPECT_EQ(test_cert, cached->certs()[0]); |
| 2737 } | 2632 } |
| 2738 | 2633 |
| 2634 TEST_P(QuicStreamFactoryTest, QuicDoingZeroRTT) { |
| 2635 Initialize(); |
| 2636 |
| 2637 factory_->set_require_confirmation(true); |
| 2638 QuicServerId quic_server_id(host_port_pair_, PRIVACY_MODE_DISABLED); |
| 2639 EXPECT_FALSE(factory_->ZeroRTTEnabledFor(quic_server_id)); |
| 2640 |
| 2641 factory_->set_require_confirmation(false); |
| 2642 EXPECT_FALSE(factory_->ZeroRTTEnabledFor(quic_server_id)); |
| 2643 |
| 2644 // Load server config and verify QUIC will do 0RTT. |
| 2645 QuicStreamFactoryPeer::CacheDummyServerConfig(factory_.get(), quic_server_id); |
| 2646 EXPECT_TRUE(factory_->ZeroRTTEnabledFor(quic_server_id)); |
| 2647 } |
| 2648 |
| 2739 TEST_P(QuicStreamFactoryTest, YieldAfterPackets) { | 2649 TEST_P(QuicStreamFactoryTest, YieldAfterPackets) { |
| 2740 Initialize(); | 2650 Initialize(); |
| 2741 QuicStreamFactoryPeer::SetYieldAfterPackets(factory_.get(), 0); | 2651 QuicStreamFactoryPeer::SetYieldAfterPackets(factory_.get(), 0); |
| 2742 | 2652 |
| 2743 scoped_ptr<QuicEncryptedPacket> close_packet( | 2653 scoped_ptr<QuicEncryptedPacket> close_packet( |
| 2744 ConstructConnectionClosePacket(0)); | 2654 ConstructConnectionClosePacket(0)); |
| 2745 vector<MockRead> reads; | 2655 vector<MockRead> reads; |
| 2746 reads.push_back( | 2656 reads.push_back( |
| 2747 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0)); | 2657 MockRead(SYNCHRONOUS, close_packet->data(), close_packet->length(), 0)); |
| 2748 reads.push_back(MockRead(ASYNC, OK, 1)); | 2658 reads.push_back(MockRead(ASYNC, OK, 1)); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2822 EXPECT_EQ(1u, observer.executed_count()); | 2732 EXPECT_EQ(1u, observer.executed_count()); |
| 2823 | 2733 |
| 2824 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | 2734 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); |
| 2825 EXPECT_TRUE(stream.get()); | 2735 EXPECT_TRUE(stream.get()); |
| 2826 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | 2736 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
| 2827 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | 2737 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
| 2828 } | 2738 } |
| 2829 | 2739 |
| 2830 } // namespace test | 2740 } // namespace test |
| 2831 } // namespace net | 2741 } // namespace net |
| OLD | NEW |