Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(859)

Side by Side Diff: net/quic/quic_chromium_client_session_test.cc

Issue 1327923002: Migrates QUIC sessions to a new network when old network is (about to be) disconnected. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@home
Patch Set: Rebase. Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/quic_chromium_client_session.cc ('k') | net/quic/quic_connection.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_chromium_client_session.h" 5 #include "net/quic/quic_chromium_client_session.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/base64.h" 9 #include "base/base64.h"
10 #include "base/files/file_path.h" 10 #include "base/files/file_path.h"
11 #include "base/rand_util.h" 11 #include "base/rand_util.h"
12 #include "base/thread_task_runner_handle.h" 12 #include "base/thread_task_runner_handle.h"
13 #include "net/base/socket_performance_watcher.h" 13 #include "net/base/socket_performance_watcher.h"
14 #include "net/base/test_completion_callback.h" 14 #include "net/base/test_completion_callback.h"
15 #include "net/base/test_data_directory.h" 15 #include "net/base/test_data_directory.h"
16 #include "net/cert/cert_verify_result.h" 16 #include "net/cert/cert_verify_result.h"
17 #include "net/http/transport_security_state.h" 17 #include "net/http/transport_security_state.h"
18 #include "net/log/test_net_log.h" 18 #include "net/log/test_net_log.h"
19 #include "net/quic/crypto/aes_128_gcm_12_encrypter.h" 19 #include "net/quic/crypto/aes_128_gcm_12_encrypter.h"
20 #include "net/quic/crypto/crypto_protocol.h" 20 #include "net/quic/crypto/crypto_protocol.h"
21 #include "net/quic/crypto/proof_verifier_chromium.h" 21 #include "net/quic/crypto/proof_verifier_chromium.h"
22 #include "net/quic/crypto/quic_decrypter.h" 22 #include "net/quic/crypto/quic_decrypter.h"
23 #include "net/quic/crypto/quic_encrypter.h" 23 #include "net/quic/crypto/quic_encrypter.h"
24 #include "net/quic/crypto/quic_server_info.h" 24 #include "net/quic/crypto/quic_server_info.h"
25 #include "net/quic/quic_connection_helper.h"
25 #include "net/quic/quic_crypto_client_stream_factory.h" 26 #include "net/quic/quic_crypto_client_stream_factory.h"
27 #include "net/quic/quic_default_packet_writer.h"
26 #include "net/quic/quic_flags.h" 28 #include "net/quic/quic_flags.h"
29 #include "net/quic/quic_http_utils.h"
27 #include "net/quic/quic_packet_reader.h" 30 #include "net/quic/quic_packet_reader.h"
31 #include "net/quic/quic_packet_writer.h"
28 #include "net/quic/quic_protocol.h" 32 #include "net/quic/quic_protocol.h"
29 #include "net/quic/test_tools/crypto_test_utils.h" 33 #include "net/quic/test_tools/crypto_test_utils.h"
34 #include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
30 #include "net/quic/test_tools/quic_chromium_client_session_peer.h" 35 #include "net/quic/test_tools/quic_chromium_client_session_peer.h"
31 #include "net/quic/test_tools/quic_spdy_session_peer.h" 36 #include "net/quic/test_tools/quic_spdy_session_peer.h"
37 #include "net/quic/test_tools/quic_test_packet_maker.h"
32 #include "net/quic/test_tools/quic_test_utils.h" 38 #include "net/quic/test_tools/quic_test_utils.h"
33 #include "net/quic/test_tools/simple_quic_framer.h" 39 #include "net/quic/test_tools/simple_quic_framer.h"
34 #include "net/socket/socket_test_util.h" 40 #include "net/socket/socket_test_util.h"
35 #include "net/spdy/spdy_test_utils.h" 41 #include "net/spdy/spdy_test_utils.h"
36 #include "net/test/cert_test_util.h" 42 #include "net/test/cert_test_util.h"
37 #include "net/udp/datagram_client_socket.h" 43 #include "net/udp/datagram_client_socket.h"
38 44
39 using testing::_; 45 using testing::_;
40 46
41 namespace net { 47 namespace net {
42 namespace test { 48 namespace test {
43 namespace { 49 namespace {
44 50
51 const IPEndPoint kIpEndPoint(IPAddressNumber(kIPv4AddressSize, 0), 0);
45 const char kServerHostname[] = "test.example.com"; 52 const char kServerHostname[] = "test.example.com";
46 const uint16_t kServerPort = 443; 53 const uint16_t kServerPort = 443;
54 const size_t kMaxReadersPerQuicSession = 5;
55
56 class DefaultPacketWriterFactory : public QuicConnection::PacketWriterFactory {
57 public:
58 explicit DefaultPacketWriterFactory(DatagramClientSocket* socket)
59 : socket_(socket) {}
60 ~DefaultPacketWriterFactory() override {}
61
62 QuicPacketWriter* Create(QuicConnection* connection) const override {
63 scoped_ptr<net::QuicDefaultPacketWriter> writer(
64 new net::QuicDefaultPacketWriter(socket_));
65 writer->SetConnection(connection);
66 return writer.release();
67 }
68
69 private:
70 DatagramClientSocket* socket_;
71 };
47 72
48 class QuicChromiumClientSessionTest 73 class QuicChromiumClientSessionTest
49 : public ::testing::TestWithParam<QuicVersion> { 74 : public ::testing::TestWithParam<QuicVersion> {
50 protected: 75 protected:
51 QuicChromiumClientSessionTest() 76 QuicChromiumClientSessionTest()
52 : crypto_config_(CryptoTestUtils::ProofVerifierForTesting()), 77 : crypto_config_(CryptoTestUtils::ProofVerifierForTesting()),
53 connection_(new PacketSavingConnection(&helper_, 78 default_read_(new MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)),
54 Perspective::IS_CLIENT, 79 socket_data_(
55 SupportedVersions(GetParam()))), 80 new SequencedSocketData(default_read_.get(), 1, nullptr, 0)),
56 session_( 81 random_(0),
57 connection_, 82 helper_(base::ThreadTaskRunnerHandle::Get().get(), &clock_, &random_),
58 GetSocket(), 83 maker_(GetParam(), 0, &clock_, kServerHostname) {}
59 /*stream_factory=*/nullptr, 84
60 QuicCryptoClientStreamFactory::GetDefaultFactory(), 85 void Initialize() {
61 &clock_, 86 socket_factory_.AddSocketDataProvider(socket_data_.get());
62 &transport_security_state_, 87 scoped_ptr<DatagramClientSocket> socket =
63 make_scoped_ptr((QuicServerInfo*)nullptr), 88 socket_factory_.CreateDatagramClientSocket(DatagramSocket::DEFAULT_BIND,
64 QuicServerId(kServerHostname, kServerPort, PRIVACY_MODE_DISABLED), 89 base::Bind(&base::RandInt),
65 kQuicYieldAfterPacketsRead, 90 &net_log_, NetLog::Source());
66 QuicTime::Delta::FromMilliseconds( 91 socket->Connect(kIpEndPoint);
67 kQuicYieldAfterDurationMilliseconds), 92 DefaultPacketWriterFactory writer_factory(socket.get());
68 /*cert_verify_flags=*/0, 93 QuicConnection* connection = new QuicConnection(
69 DefaultQuicConfig(), 94 0, kIpEndPoint, &helper_, writer_factory, true, Perspective::IS_CLIENT,
70 &crypto_config_, 95 SupportedVersions(GetParam()));
71 "CONNECTION_UNKNOWN", 96 session_.reset(new QuicChromiumClientSession(
72 base::TimeTicks::Now(), 97 connection, std::move(socket),
73 base::ThreadTaskRunnerHandle::Get().get(), 98 /*stream_factory=*/nullptr, &crypto_client_stream_factory_, &clock_,
74 /*socket_performance_watcher=*/nullptr, 99 &transport_security_state_, make_scoped_ptr((QuicServerInfo*)nullptr),
75 &net_log_) { 100 QuicServerId(kServerHostname, kServerPort, PRIVACY_MODE_DISABLED),
76 session_.Initialize(); 101 kQuicYieldAfterPacketsRead,
102 QuicTime::Delta::FromMilliseconds(kQuicYieldAfterDurationMilliseconds),
103 /*cert_verify_flags=*/0, DefaultQuicConfig(), &crypto_config_,
104 "CONNECTION_UNKNOWN", base::TimeTicks::Now(),
105 base::ThreadTaskRunnerHandle::Get().get(),
106 /*socket_performance_watcher=*/nullptr, &net_log_));
107
108 scoped_refptr<X509Certificate> cert(
109 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
110 verify_details_.cert_verify_result.verified_cert = cert;
111 verify_details_.cert_verify_result.is_issued_by_known_root = true;
77 // Advance the time, because timers do not like uninitialized times. 112 // Advance the time, because timers do not like uninitialized times.
78 connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); 113 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
114 session_->Initialize();
115 session_->StartReading();
79 } 116 }
80 117
81 void TearDown() override { 118 void TearDown() override {
82 session_.CloseSessionOnError(ERR_ABORTED, QUIC_INTERNAL_ERROR); 119 session_->CloseSessionOnError(ERR_ABORTED, QUIC_INTERNAL_ERROR);
83 }
84
85 scoped_ptr<DatagramClientSocket> GetSocket() {
86 socket_factory_.AddSocketDataProvider(&socket_data_);
87 return socket_factory_.CreateDatagramClientSocket(
88 DatagramSocket::DEFAULT_BIND, base::Bind(&base::RandInt), &net_log_,
89 NetLog::Source());
90 } 120 }
91 121
92 void CompleteCryptoHandshake() { 122 void CompleteCryptoHandshake() {
93 ASSERT_EQ(ERR_IO_PENDING, 123 ASSERT_EQ(OK, session_->CryptoConnect(false, callback_.callback()));
94 session_.CryptoConnect(false, callback_.callback()));
95 CryptoTestUtils::FakeServerOptions server_options;
96 CryptoTestUtils::HandshakeWithFakeServer(
97 &helper_, connection_, session_.GetCryptoStream(), server_options);
98 ASSERT_EQ(OK, callback_.WaitForResult());
99 } 124 }
100 125
101 MockConnectionHelper helper_; 126 QuicPacketWriter* CreateQuicPacketWriter(DatagramClientSocket* socket,
127 QuicConnection* connection) const {
128 scoped_ptr<QuicDefaultPacketWriter> writer(
129 new QuicDefaultPacketWriter(socket));
130 writer->SetConnection(connection);
131 return writer.release();
132 }
133
102 QuicCryptoClientConfig crypto_config_; 134 QuicCryptoClientConfig crypto_config_;
103 PacketSavingConnection* connection_;
104 TestNetLog net_log_; 135 TestNetLog net_log_;
136 BoundTestNetLog bound_net_log_;
105 MockClientSocketFactory socket_factory_; 137 MockClientSocketFactory socket_factory_;
106 StaticSocketDataProvider socket_data_; 138 scoped_ptr<MockRead> default_read_;
107 TransportSecurityState transport_security_state_; 139 scoped_ptr<SequencedSocketData> socket_data_;
108 QuicChromiumClientSession session_;
109 MockClock clock_; 140 MockClock clock_;
110 MockRandom random_; 141 MockRandom random_;
142 QuicConnectionHelper helper_;
143 scoped_ptr<DefaultPacketWriterFactory> writer_factory_;
144 TransportSecurityState transport_security_state_;
145 MockCryptoClientStreamFactory crypto_client_stream_factory_;
146 scoped_ptr<QuicChromiumClientSession> session_;
111 QuicConnectionVisitorInterface* visitor_; 147 QuicConnectionVisitorInterface* visitor_;
112 TestCompletionCallback callback_; 148 TestCompletionCallback callback_;
149 QuicTestPacketMaker maker_;
150 ProofVerifyDetailsChromium verify_details_;
113 }; 151 };
114 152
115 INSTANTIATE_TEST_CASE_P(Tests, 153 INSTANTIATE_TEST_CASE_P(Tests,
116 QuicChromiumClientSessionTest, 154 QuicChromiumClientSessionTest,
117 ::testing::ValuesIn(QuicSupportedVersions())); 155 ::testing::ValuesIn(QuicSupportedVersions()));
118 156
119 TEST_P(QuicChromiumClientSessionTest, CryptoConnect) { 157 TEST_P(QuicChromiumClientSessionTest, CryptoConnect) {
158 Initialize();
120 CompleteCryptoHandshake(); 159 CompleteCryptoHandshake();
121 } 160 }
122 161
123 TEST_P(QuicChromiumClientSessionTest, MaxNumStreams) { 162 TEST_P(QuicChromiumClientSessionTest, MaxNumStreams) {
163 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
164 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
165 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
166 MockWrite writes[] = {
167 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1)};
168 socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes,
169 arraysize(writes)));
170
171 Initialize();
124 CompleteCryptoHandshake(); 172 CompleteCryptoHandshake();
173 const size_t kMaxOpenStreams = session_->get_max_open_streams();
125 174
126 std::vector<QuicReliableClientStream*> streams; 175 std::vector<QuicReliableClientStream*> streams;
127 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection; i++) { 176 for (size_t i = 0; i < kMaxOpenStreams; i++) {
128 QuicReliableClientStream* stream = 177 QuicReliableClientStream* stream =
129 session_.CreateOutgoingDynamicStream(kDefaultPriority); 178 session_->CreateOutgoingDynamicStream(kDefaultPriority);
130 EXPECT_TRUE(stream); 179 EXPECT_TRUE(stream);
131 streams.push_back(stream); 180 streams.push_back(stream);
132 } 181 }
133 EXPECT_FALSE(session_.CreateOutgoingDynamicStream(kDefaultPriority)); 182 EXPECT_FALSE(session_->CreateOutgoingDynamicStream(kDefaultPriority));
134 183
135 EXPECT_EQ(kDefaultMaxStreamsPerConnection, 184 EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams());
136 session_.GetNumOpenOutgoingStreams());
137 185
138 // Close a stream and ensure I can now open a new one. 186 // Close a stream and ensure I can now open a new one.
139 QuicStreamId stream_id = streams[0]->id(); 187 QuicStreamId stream_id = streams[0]->id();
140 session_.CloseStream(stream_id); 188 session_->CloseStream(stream_id);
141 189
142 EXPECT_FALSE(session_.CreateOutgoingDynamicStream(kDefaultPriority)); 190 EXPECT_FALSE(session_->CreateOutgoingDynamicStream(kDefaultPriority));
143 QuicRstStreamFrame rst1(stream_id, QUIC_STREAM_NO_ERROR, 0); 191 QuicRstStreamFrame rst1(stream_id, QUIC_STREAM_NO_ERROR, 0);
144 session_.OnRstStream(rst1); 192 session_->OnRstStream(rst1);
145 EXPECT_EQ(kDefaultMaxStreamsPerConnection - 1, 193 EXPECT_EQ(kMaxOpenStreams - 1, session_->GetNumOpenOutgoingStreams());
146 session_.GetNumOpenOutgoingStreams()); 194 EXPECT_TRUE(session_->CreateOutgoingDynamicStream(kDefaultPriority));
147 EXPECT_TRUE(session_.CreateOutgoingDynamicStream(kDefaultPriority));
148 } 195 }
149 196
150 TEST_P(QuicChromiumClientSessionTest, MaxNumStreamsViaRequest) { 197 TEST_P(QuicChromiumClientSessionTest, MaxNumStreamsViaRequest) {
198 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
199 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket(
200 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
201 MockWrite writes[] = {
202 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1)};
203 socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes,
204 arraysize(writes)));
205
206 Initialize();
151 CompleteCryptoHandshake(); 207 CompleteCryptoHandshake();
208 const size_t kMaxOpenStreams = session_->get_max_open_streams();
152 209
153 std::vector<QuicReliableClientStream*> streams; 210 std::vector<QuicReliableClientStream*> streams;
154 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection; i++) { 211 for (size_t i = 0; i < kMaxOpenStreams; i++) {
155 QuicReliableClientStream* stream = 212 QuicReliableClientStream* stream =
156 session_.CreateOutgoingDynamicStream(kDefaultPriority); 213 session_->CreateOutgoingDynamicStream(kDefaultPriority);
157 EXPECT_TRUE(stream); 214 EXPECT_TRUE(stream);
158 streams.push_back(stream); 215 streams.push_back(stream);
159 } 216 }
160 217
161 QuicReliableClientStream* stream; 218 QuicReliableClientStream* stream;
162 QuicChromiumClientSession::StreamRequest stream_request; 219 QuicChromiumClientSession::StreamRequest stream_request;
163 TestCompletionCallback callback; 220 TestCompletionCallback callback;
164 ASSERT_EQ(ERR_IO_PENDING, 221 ASSERT_EQ(ERR_IO_PENDING,
165 stream_request.StartRequest(session_.GetWeakPtr(), &stream, 222 stream_request.StartRequest(session_->GetWeakPtr(), &stream,
166 callback.callback())); 223 callback.callback()));
167 224
168 // Close a stream and ensure I can now open a new one. 225 // Close a stream and ensure I can now open a new one.
169 QuicStreamId stream_id = streams[0]->id(); 226 QuicStreamId stream_id = streams[0]->id();
170 session_.CloseStream(stream_id); 227 session_->CloseStream(stream_id);
171 QuicRstStreamFrame rst1(stream_id, QUIC_STREAM_NO_ERROR, 0); 228 QuicRstStreamFrame rst1(stream_id, QUIC_STREAM_NO_ERROR, 0);
172 session_.OnRstStream(rst1); 229 session_->OnRstStream(rst1);
173 ASSERT_TRUE(callback.have_result()); 230 ASSERT_TRUE(callback.have_result());
174 EXPECT_EQ(OK, callback.WaitForResult()); 231 EXPECT_EQ(OK, callback.WaitForResult());
175 EXPECT_TRUE(stream != nullptr); 232 EXPECT_TRUE(stream != nullptr);
176 } 233 }
177 234
178 TEST_P(QuicChromiumClientSessionTest, GoAwayReceived) { 235 TEST_P(QuicChromiumClientSessionTest, GoAwayReceived) {
236 Initialize();
179 CompleteCryptoHandshake(); 237 CompleteCryptoHandshake();
180 238
181 // After receiving a GoAway, I should no longer be able to create outgoing 239 // After receiving a GoAway, I should no longer be able to create outgoing
182 // streams. 240 // streams.
183 session_.connection()->OnGoAwayFrame( 241 session_->connection()->OnGoAwayFrame(
184 QuicGoAwayFrame(QUIC_PEER_GOING_AWAY, 1u, "Going away.")); 242 QuicGoAwayFrame(QUIC_PEER_GOING_AWAY, 1u, "Going away."));
185 EXPECT_EQ(nullptr, session_.CreateOutgoingDynamicStream(kDefaultPriority)); 243 EXPECT_EQ(nullptr, session_->CreateOutgoingDynamicStream(kDefaultPriority));
186 } 244 }
187 245
188 TEST_P(QuicChromiumClientSessionTest, CanPool) { 246 TEST_P(QuicChromiumClientSessionTest, CanPool) {
247 Initialize();
189 // Load a cert that is valid for: 248 // Load a cert that is valid for:
190 // www.example.org 249 // www.example.org
191 // mail.example.org 250 // mail.example.org
192 // www.example.com 251 // www.example.com
193 252
194 ProofVerifyDetailsChromium details; 253 ProofVerifyDetailsChromium details;
195 details.cert_verify_result.verified_cert = 254 details.cert_verify_result.verified_cert =
196 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); 255 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem");
197 ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); 256 ASSERT_TRUE(details.cert_verify_result.verified_cert.get());
198 257
199 CompleteCryptoHandshake(); 258 CompleteCryptoHandshake();
200 session_.OnProofVerifyDetailsAvailable(details); 259 session_->OnProofVerifyDetailsAvailable(details);
201 260
202 EXPECT_TRUE(session_.CanPool("www.example.org", PRIVACY_MODE_DISABLED)); 261 EXPECT_TRUE(session_->CanPool("www.example.org", PRIVACY_MODE_DISABLED));
203 EXPECT_FALSE(session_.CanPool("www.example.org", PRIVACY_MODE_ENABLED)); 262 EXPECT_FALSE(session_->CanPool("www.example.org", PRIVACY_MODE_ENABLED));
204 EXPECT_TRUE(session_.CanPool("mail.example.org", PRIVACY_MODE_DISABLED)); 263 EXPECT_TRUE(session_->CanPool("mail.example.org", PRIVACY_MODE_DISABLED));
205 EXPECT_TRUE(session_.CanPool("mail.example.com", PRIVACY_MODE_DISABLED)); 264 EXPECT_TRUE(session_->CanPool("mail.example.com", PRIVACY_MODE_DISABLED));
206 EXPECT_FALSE(session_.CanPool("mail.google.com", PRIVACY_MODE_DISABLED)); 265 EXPECT_FALSE(session_->CanPool("mail.google.com", PRIVACY_MODE_DISABLED));
207 } 266 }
208 267
209 TEST_P(QuicChromiumClientSessionTest, ConnectionPooledWithTlsChannelId) { 268 TEST_P(QuicChromiumClientSessionTest, ConnectionPooledWithTlsChannelId) {
269 Initialize();
210 // Load a cert that is valid for: 270 // Load a cert that is valid for:
211 // www.example.org 271 // www.example.org
212 // mail.example.org 272 // mail.example.org
213 // www.example.com 273 // www.example.com
214 274
215 ProofVerifyDetailsChromium details; 275 ProofVerifyDetailsChromium details;
216 details.cert_verify_result.verified_cert = 276 details.cert_verify_result.verified_cert =
217 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); 277 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem");
218 ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); 278 ASSERT_TRUE(details.cert_verify_result.verified_cert.get());
219 279
220 CompleteCryptoHandshake(); 280 CompleteCryptoHandshake();
221 session_.OnProofVerifyDetailsAvailable(details); 281 session_->OnProofVerifyDetailsAvailable(details);
222 QuicChromiumClientSessionPeer::SetHostname(&session_, "www.example.org"); 282 QuicChromiumClientSessionPeer::SetHostname(session_.get(), "www.example.org");
223 QuicChromiumClientSessionPeer::SetChannelIDSent(&session_, true); 283 QuicChromiumClientSessionPeer::SetChannelIDSent(session_.get(), true);
224 284
225 EXPECT_TRUE(session_.CanPool("www.example.org", PRIVACY_MODE_DISABLED)); 285 EXPECT_TRUE(session_->CanPool("www.example.org", PRIVACY_MODE_DISABLED));
226 EXPECT_TRUE(session_.CanPool("mail.example.org", PRIVACY_MODE_DISABLED)); 286 EXPECT_TRUE(session_->CanPool("mail.example.org", PRIVACY_MODE_DISABLED));
227 EXPECT_FALSE(session_.CanPool("mail.example.com", PRIVACY_MODE_DISABLED)); 287 EXPECT_FALSE(session_->CanPool("mail.example.com", PRIVACY_MODE_DISABLED));
228 EXPECT_FALSE(session_.CanPool("mail.google.com", PRIVACY_MODE_DISABLED)); 288 EXPECT_FALSE(session_->CanPool("mail.google.com", PRIVACY_MODE_DISABLED));
229 } 289 }
230 290
231 TEST_P(QuicChromiumClientSessionTest, ConnectionNotPooledWithDifferentPin) { 291 TEST_P(QuicChromiumClientSessionTest, ConnectionNotPooledWithDifferentPin) {
292 Initialize();
293
232 uint8_t primary_pin = 1; 294 uint8_t primary_pin = 1;
233 uint8_t backup_pin = 2; 295 uint8_t backup_pin = 2;
234 uint8_t bad_pin = 3; 296 uint8_t bad_pin = 3;
235 AddPin(&transport_security_state_, "mail.example.org", primary_pin, 297 AddPin(&transport_security_state_, "mail.example.org", primary_pin,
236 backup_pin); 298 backup_pin);
237 299
238 ProofVerifyDetailsChromium details; 300 ProofVerifyDetailsChromium details;
239 details.cert_verify_result.verified_cert = 301 details.cert_verify_result.verified_cert =
240 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); 302 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem");
241 details.cert_verify_result.is_issued_by_known_root = true; 303 details.cert_verify_result.is_issued_by_known_root = true;
242 details.cert_verify_result.public_key_hashes.push_back( 304 details.cert_verify_result.public_key_hashes.push_back(
243 GetTestHashValue(bad_pin)); 305 GetTestHashValue(bad_pin));
244 306
245 ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); 307 ASSERT_TRUE(details.cert_verify_result.verified_cert.get());
246 308
247 CompleteCryptoHandshake(); 309 CompleteCryptoHandshake();
248 session_.OnProofVerifyDetailsAvailable(details); 310 session_->OnProofVerifyDetailsAvailable(details);
249 QuicChromiumClientSessionPeer::SetHostname(&session_, "www.example.org"); 311 QuicChromiumClientSessionPeer::SetHostname(session_.get(), "www.example.org");
250 QuicChromiumClientSessionPeer::SetChannelIDSent(&session_, true); 312 QuicChromiumClientSessionPeer::SetChannelIDSent(session_.get(), true);
251 313
252 EXPECT_FALSE(session_.CanPool("mail.example.org", PRIVACY_MODE_DISABLED)); 314 EXPECT_FALSE(session_->CanPool("mail.example.org", PRIVACY_MODE_DISABLED));
253 } 315 }
254 316
255 TEST_P(QuicChromiumClientSessionTest, ConnectionPooledWithMatchingPin) { 317 TEST_P(QuicChromiumClientSessionTest, ConnectionPooledWithMatchingPin) {
318 Initialize();
319
256 uint8_t primary_pin = 1; 320 uint8_t primary_pin = 1;
257 uint8_t backup_pin = 2; 321 uint8_t backup_pin = 2;
258 AddPin(&transport_security_state_, "mail.example.org", primary_pin, 322 AddPin(&transport_security_state_, "mail.example.org", primary_pin,
259 backup_pin); 323 backup_pin);
260 324
261 ProofVerifyDetailsChromium details; 325 ProofVerifyDetailsChromium details;
262 details.cert_verify_result.verified_cert = 326 details.cert_verify_result.verified_cert =
263 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); 327 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem");
264 details.cert_verify_result.is_issued_by_known_root = true; 328 details.cert_verify_result.is_issued_by_known_root = true;
265 details.cert_verify_result.public_key_hashes.push_back( 329 details.cert_verify_result.public_key_hashes.push_back(
266 GetTestHashValue(primary_pin)); 330 GetTestHashValue(primary_pin));
267 331
268 ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); 332 ASSERT_TRUE(details.cert_verify_result.verified_cert.get());
269 333
270 CompleteCryptoHandshake(); 334 CompleteCryptoHandshake();
271 session_.OnProofVerifyDetailsAvailable(details); 335 session_->OnProofVerifyDetailsAvailable(details);
272 QuicChromiumClientSessionPeer::SetHostname(&session_, "www.example.org"); 336 QuicChromiumClientSessionPeer::SetHostname(session_.get(), "www.example.org");
273 QuicChromiumClientSessionPeer::SetChannelIDSent(&session_, true); 337 QuicChromiumClientSessionPeer::SetChannelIDSent(session_.get(), true);
274 338
275 EXPECT_TRUE(session_.CanPool("mail.example.org", PRIVACY_MODE_DISABLED)); 339 EXPECT_TRUE(session_->CanPool("mail.example.org", PRIVACY_MODE_DISABLED));
340 }
341
342 TEST_P(QuicChromiumClientSessionTest, MigrateToSocket) {
343 Initialize();
344 CompleteCryptoHandshake();
345
346 char data[] = "ABCD";
347 scoped_ptr<QuicEncryptedPacket> ping(
348 maker_.MakePingPacket(1, /*include_version=*/false));
349 scoped_ptr<QuicEncryptedPacket> ack_and_data_out(maker_.MakeAckAndDataPacket(
350 2, false, 5, 1, 1, false, 0, StringPiece(data)));
351 MockRead reads[] = {MockRead(SYNCHRONOUS, ping->data(), ping->length(), 0),
352 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 1)};
353 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 2),
354 MockWrite(SYNCHRONOUS, ack_and_data_out->data(),
355 ack_and_data_out->length(), 3)};
356 StaticSocketDataProvider socket_data(reads, arraysize(reads), writes,
357 arraysize(writes));
358 socket_factory_.AddSocketDataProvider(&socket_data);
359
360 // Create connected socket.
361 scoped_ptr<DatagramClientSocket> new_socket =
362 socket_factory_.CreateDatagramClientSocket(DatagramSocket::DEFAULT_BIND,
363 base::Bind(&base::RandInt),
364 &net_log_, NetLog::Source());
365 EXPECT_EQ(OK, new_socket->Connect(kIpEndPoint));
366
367 // Create reader and writer.
368 scoped_ptr<QuicPacketReader> new_reader(new QuicPacketReader(
369 new_socket.get(), &clock_, session_.get(), kQuicYieldAfterPacketsRead,
370 QuicTime::Delta::FromMilliseconds(kQuicYieldAfterDurationMilliseconds),
371 bound_net_log_.bound()));
372 scoped_ptr<QuicPacketWriter> new_writer(
373 CreateQuicPacketWriter(new_socket.get(), session_->connection()));
374
375 // Migrate session.
376 EXPECT_TRUE(session_->MigrateToSocket(
377 std::move(new_socket), std::move(new_reader), std::move(new_writer)));
378
379 // Write data to session.
380 struct iovec iov[1];
381 iov[0].iov_base = data;
382 iov[0].iov_len = 4;
383 session_->WritevData(5, QuicIOVector(iov, arraysize(iov), 4), 0, false,
384 MAY_FEC_PROTECT, nullptr);
385
386 EXPECT_TRUE(socket_data.AllReadDataConsumed());
387 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
388 }
389
390 TEST_P(QuicChromiumClientSessionTest, MigrateToSocketMaxReaders) {
391 Initialize();
392 CompleteCryptoHandshake();
393
394 for (size_t i = 0; i < kMaxReadersPerQuicSession; ++i) {
395 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 1)};
396 scoped_ptr<QuicEncryptedPacket> ping_out(
397 maker_.MakePingPacket(i + 1, /*include_version=*/true));
398 MockWrite writes[] = {
399 MockWrite(SYNCHRONOUS, ping_out->data(), ping_out->length(), i + 2)};
400 StaticSocketDataProvider socket_data(reads, arraysize(reads), writes,
401 arraysize(writes));
402 socket_factory_.AddSocketDataProvider(&socket_data);
403
404 // Create connected socket.
405 scoped_ptr<DatagramClientSocket> new_socket =
406 socket_factory_.CreateDatagramClientSocket(DatagramSocket::DEFAULT_BIND,
407 base::Bind(&base::RandInt),
408 &net_log_, NetLog::Source());
409 EXPECT_EQ(OK, new_socket->Connect(kIpEndPoint));
410
411 // Create reader and writer.
412 scoped_ptr<QuicPacketReader> new_reader(new QuicPacketReader(
413 new_socket.get(), &clock_, session_.get(), kQuicYieldAfterPacketsRead,
414 QuicTime::Delta::FromMilliseconds(kQuicYieldAfterDurationMilliseconds),
415 bound_net_log_.bound()));
416 scoped_ptr<QuicPacketWriter> new_writer(
417 CreateQuicPacketWriter(new_socket.get(), session_->connection()));
418
419 // Migrate session.
420 if (i < kMaxReadersPerQuicSession - 1) {
421 EXPECT_TRUE(session_->MigrateToSocket(
422 std::move(new_socket), std::move(new_reader), std::move(new_writer)));
423 EXPECT_TRUE(socket_data.AllReadDataConsumed());
424 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
425 } else {
426 // Max readers exceeded.
427 EXPECT_FALSE(session_->MigrateToSocket(
428 std::move(new_socket), std::move(new_reader), std::move(new_writer)));
429
430 EXPECT_FALSE(socket_data.AllReadDataConsumed());
431 EXPECT_FALSE(socket_data.AllWriteDataConsumed());
432 }
433 }
434 }
435
436 TEST_P(QuicChromiumClientSessionTest, MigrateToSocketReadError) {
437 scoped_ptr<QuicEncryptedPacket> ping(
438 maker_.MakePingPacket(1, /*include_version=*/true));
439 MockRead old_reads[] = {
440 MockRead(SYNCHRONOUS, ping->data(), ping->length(), 0),
441 MockRead(ASYNC, ERR_IO_PENDING, 1), // causes reading to pause.
442 MockRead(ASYNC, ERR_NETWORK_CHANGED, 2)};
443 socket_data_.reset(
444 new SequencedSocketData(old_reads, arraysize(old_reads), nullptr, 0));
445 Initialize();
446 CompleteCryptoHandshake();
447
448 MockWrite writes[] = {
449 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 1)};
450 MockRead new_reads[] = {
451 MockRead(SYNCHRONOUS, ping->data(), ping->length(), 0),
452 MockRead(ASYNC, ERR_IO_PENDING, 2), // pause reading.
453 MockRead(ASYNC, ping->data(), ping->length(), 3),
454 MockRead(ASYNC, ERR_IO_PENDING, 4), // pause reading
455 MockRead(ASYNC, ERR_NETWORK_CHANGED, 5)};
456 SequencedSocketData new_socket_data(new_reads, arraysize(new_reads), writes,
457 arraysize(writes));
458 socket_factory_.AddSocketDataProvider(&new_socket_data);
459
460 // Create connected socket.
461 scoped_ptr<DatagramClientSocket> new_socket =
462 socket_factory_.CreateDatagramClientSocket(DatagramSocket::DEFAULT_BIND,
463 base::Bind(&base::RandInt),
464 &net_log_, NetLog::Source());
465 EXPECT_EQ(OK, new_socket->Connect(kIpEndPoint));
466
467 // Create reader and writer.
468 scoped_ptr<QuicPacketReader> new_reader(new QuicPacketReader(
469 new_socket.get(), &clock_, session_.get(), kQuicYieldAfterPacketsRead,
470 QuicTime::Delta::FromMilliseconds(kQuicYieldAfterDurationMilliseconds),
471 bound_net_log_.bound()));
472 scoped_ptr<QuicPacketWriter> new_writer(
473 CreateQuicPacketWriter(new_socket.get(), session_->connection()));
474
475 // Store old socket and migrate session.
476 EXPECT_TRUE(session_->MigrateToSocket(
477 std::move(new_socket), std::move(new_reader), std::move(new_writer)));
478
479 // Read error on old socket does not impact session.
480 EXPECT_TRUE(socket_data_->IsPaused());
481 socket_data_->Resume();
482 EXPECT_TRUE(session_->connection()->connected());
483 EXPECT_TRUE(new_socket_data.IsPaused());
484 new_socket_data.Resume();
485
486 // Read error on new socket causes session close.
487 EXPECT_TRUE(new_socket_data.IsPaused());
488 EXPECT_TRUE(session_->connection()->connected());
489 new_socket_data.Resume();
490 EXPECT_FALSE(session_->connection()->connected());
491
492 EXPECT_TRUE(socket_data_->AllReadDataConsumed());
493 EXPECT_TRUE(socket_data_->AllWriteDataConsumed());
494 EXPECT_TRUE(new_socket_data.AllReadDataConsumed());
495 EXPECT_TRUE(new_socket_data.AllWriteDataConsumed());
496 }
497
498 TEST_P(QuicChromiumClientSessionTest, MigrateToSocketWriteError) {
499 Initialize();
500 CompleteCryptoHandshake();
501
502 scoped_ptr<QuicEncryptedPacket> ping(
503 maker_.MakePingPacket(1, /*include_version=*/true));
504 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
505 MockWrite writes[] = {MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 1),
506 MockWrite(SYNCHRONOUS, ERR_FAILED, 2)};
507 SequencedSocketData socket_data(reads, arraysize(reads), writes,
508 arraysize(writes));
509 socket_factory_.AddSocketDataProvider(&socket_data);
510
511 // Create connected socket.
512 scoped_ptr<DatagramClientSocket> new_socket =
513 socket_factory_.CreateDatagramClientSocket(DatagramSocket::DEFAULT_BIND,
514 base::Bind(&base::RandInt),
515 &net_log_, NetLog::Source());
516 EXPECT_EQ(OK, new_socket->Connect(kIpEndPoint));
517
518 // Create reader and writer.
519 scoped_ptr<QuicPacketReader> new_reader(new QuicPacketReader(
520 new_socket.get(), &clock_, session_.get(), kQuicYieldAfterPacketsRead,
521 QuicTime::Delta::FromMilliseconds(kQuicYieldAfterDurationMilliseconds),
522 bound_net_log_.bound()));
523 scoped_ptr<QuicPacketWriter> new_writer(
524 CreateQuicPacketWriter(new_socket.get(), session_->connection()));
525
526 // Migrate session.
527 EXPECT_TRUE(session_->MigrateToSocket(
528 std::move(new_socket), std::move(new_reader), std::move(new_writer)));
529
530 // Write error on new socket causes session close.
531 EXPECT_TRUE(session_->connection()->connected());
532 session_->connection()->SendPing();
533 EXPECT_FALSE(session_->connection()->connected());
534
535 EXPECT_TRUE(socket_data.AllReadDataConsumed());
536 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
276 } 537 }
277 538
278 } // namespace 539 } // namespace
279 } // namespace test 540 } // namespace test
280 } // namespace net 541 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_chromium_client_session.cc ('k') | net/quic/quic_connection.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698