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/chromium/quic_chromium_client_session.h" | 5 #include "net/quic/chromium/quic_chromium_client_session.h" |
6 | 6 |
7 #include "base/base64.h" | 7 #include "base/base64.h" |
8 #include "base/files/file_path.h" | 8 #include "base/files/file_path.h" |
9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
10 #include "base/rand_util.h" | 10 #include "base/rand_util.h" |
11 #include "base/run_loop.h" | 11 #include "base/run_loop.h" |
12 #include "base/test/histogram_tester.h" | 12 #include "base/test/histogram_tester.h" |
13 #include "base/threading/thread_task_runner_handle.h" | 13 #include "base/threading/thread_task_runner_handle.h" |
14 #include "net/base/test_completion_callback.h" | 14 #include "net/base/test_completion_callback.h" |
15 #include "net/cert/cert_verify_result.h" | 15 #include "net/cert/cert_verify_result.h" |
16 #include "net/http/transport_security_state.h" | 16 #include "net/http/transport_security_state.h" |
17 #include "net/log/net_log_source.h" | 17 #include "net/log/net_log_source.h" |
18 #include "net/log/test_net_log.h" | 18 #include "net/log/test_net_log.h" |
19 #include "net/quic/chromium/crypto/proof_verifier_chromium.h" | 19 #include "net/quic/chromium/crypto/proof_verifier_chromium.h" |
20 #include "net/quic/chromium/mock_crypto_client_stream_factory.h" | 20 #include "net/quic/chromium/mock_crypto_client_stream_factory.h" |
| 21 #include "net/quic/chromium/mock_quic_data.h" |
21 #include "net/quic/chromium/quic_chromium_alarm_factory.h" | 22 #include "net/quic/chromium/quic_chromium_alarm_factory.h" |
22 #include "net/quic/chromium/quic_chromium_client_session_peer.h" | 23 #include "net/quic/chromium/quic_chromium_client_session_peer.h" |
23 #include "net/quic/chromium/quic_chromium_connection_helper.h" | 24 #include "net/quic/chromium/quic_chromium_connection_helper.h" |
24 #include "net/quic/chromium/quic_chromium_packet_reader.h" | 25 #include "net/quic/chromium/quic_chromium_packet_reader.h" |
25 #include "net/quic/chromium/quic_chromium_packet_writer.h" | 26 #include "net/quic/chromium/quic_chromium_packet_writer.h" |
26 #include "net/quic/chromium/quic_crypto_client_stream_factory.h" | 27 #include "net/quic/chromium/quic_crypto_client_stream_factory.h" |
27 #include "net/quic/chromium/quic_http_utils.h" | 28 #include "net/quic/chromium/quic_http_utils.h" |
28 #include "net/quic/chromium/quic_server_info.h" | 29 #include "net/quic/chromium/quic_server_info.h" |
29 #include "net/quic/chromium/quic_test_packet_maker.h" | 30 #include "net/quic/chromium/quic_test_packet_maker.h" |
30 #include "net/quic/core/crypto/aes_128_gcm_12_encrypter.h" | 31 #include "net/quic/core/crypto/aes_128_gcm_12_encrypter.h" |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 server_maker_(GetParam(), | 97 server_maker_(GetParam(), |
97 0, | 98 0, |
98 &clock_, | 99 &clock_, |
99 kServerHostname, | 100 kServerHostname, |
100 Perspective::IS_SERVER) { | 101 Perspective::IS_SERVER) { |
101 // Advance the time, because timers do not like uninitialized times. | 102 // Advance the time, because timers do not like uninitialized times. |
102 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 103 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
103 } | 104 } |
104 | 105 |
105 void Initialize() { | 106 void Initialize() { |
106 socket_factory_.AddSocketDataProvider(socket_data_.get()); | 107 if (socket_data_) |
| 108 socket_factory_.AddSocketDataProvider(socket_data_.get()); |
107 std::unique_ptr<DatagramClientSocket> socket = | 109 std::unique_ptr<DatagramClientSocket> socket = |
108 socket_factory_.CreateDatagramClientSocket(DatagramSocket::DEFAULT_BIND, | 110 socket_factory_.CreateDatagramClientSocket(DatagramSocket::DEFAULT_BIND, |
109 base::Bind(&base::RandInt), | 111 base::Bind(&base::RandInt), |
110 &net_log_, NetLogSource()); | 112 &net_log_, NetLogSource()); |
111 socket->Connect(kIpEndPoint); | 113 socket->Connect(kIpEndPoint); |
112 QuicChromiumPacketWriter* writer = | 114 QuicChromiumPacketWriter* writer = |
113 new net::QuicChromiumPacketWriter(socket.get()); | 115 new net::QuicChromiumPacketWriter(socket.get()); |
114 QuicConnection* connection = new QuicConnection( | 116 QuicConnection* connection = new QuicConnection( |
115 0, QuicSocketAddress(QuicSocketAddressImpl(kIpEndPoint)), &helper_, | 117 0, QuicSocketAddress(QuicSocketAddressImpl(kIpEndPoint)), &helper_, |
116 &alarm_factory_, writer, true, Perspective::IS_CLIENT, | 118 &alarm_factory_, writer, true, Perspective::IS_CLIENT, |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 std::unique_ptr<QuicEncryptedPacket> settings_packet( | 188 std::unique_ptr<QuicEncryptedPacket> settings_packet( |
187 client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 189 client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
188 MockWrite writes[] = { | 190 MockWrite writes[] = { |
189 MockWrite(ASYNC, settings_packet->data(), settings_packet->length(), 1)}; | 191 MockWrite(ASYNC, settings_packet->data(), settings_packet->length(), 1)}; |
190 socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes, | 192 socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes, |
191 arraysize(writes))); | 193 arraysize(writes))); |
192 Initialize(); | 194 Initialize(); |
193 CompleteCryptoHandshake(); | 195 CompleteCryptoHandshake(); |
194 } | 196 } |
195 | 197 |
| 198 TEST_P(QuicChromiumClientSessionTest, StreamRequest) { |
| 199 MockQuicData quic_data; |
| 200 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 201 quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
| 202 quic_data.AddRead(ASYNC, OK); // EOF |
| 203 quic_data.AddSocketDataToFactory(&socket_factory_); |
| 204 |
| 205 Initialize(); |
| 206 CompleteCryptoHandshake(); |
| 207 |
| 208 // Request a stream and verify that a stream was created. |
| 209 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 210 session_->CreateStreamRequest(); |
| 211 TestCompletionCallback callback; |
| 212 ASSERT_EQ(OK, stream_request->StartRequest(callback.callback())); |
| 213 EXPECT_TRUE(stream_request->ReleaseStream() != nullptr); |
| 214 |
| 215 quic_data.Resume(); |
| 216 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 217 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 218 } |
| 219 |
| 220 TEST_P(QuicChromiumClientSessionTest, CancelStreamRequestBeforeRelease) { |
| 221 MockQuicData quic_data; |
| 222 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 223 quic_data.AddWrite(client_maker_.MakeRstPacket(2, true, kClientDataStreamId1, |
| 224 QUIC_STREAM_CANCELLED)); |
| 225 quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
| 226 quic_data.AddRead(ASYNC, OK); // EOF |
| 227 quic_data.AddSocketDataToFactory(&socket_factory_); |
| 228 |
| 229 Initialize(); |
| 230 CompleteCryptoHandshake(); |
| 231 |
| 232 // Request a stream and cancel it without releasing the stream. |
| 233 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 234 session_->CreateStreamRequest(); |
| 235 TestCompletionCallback callback; |
| 236 ASSERT_EQ(OK, stream_request->StartRequest(callback.callback())); |
| 237 stream_request.reset(); |
| 238 |
| 239 quic_data.Resume(); |
| 240 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 241 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 242 } |
| 243 |
| 244 TEST_P(QuicChromiumClientSessionTest, AsyncStreamRequest) { |
| 245 MockQuicData quic_data; |
| 246 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 247 quic_data.AddWrite(client_maker_.MakeRstPacket(2, true, kClientDataStreamId1, |
| 248 QUIC_RST_ACKNOWLEDGEMENT)); |
| 249 quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
| 250 quic_data.AddRead(ASYNC, OK); // EOF |
| 251 quic_data.AddSocketDataToFactory(&socket_factory_); |
| 252 |
| 253 Initialize(); |
| 254 CompleteCryptoHandshake(); |
| 255 |
| 256 // Open the maximum number of streams so that a subsequent request |
| 257 // can not proceed immediately. |
| 258 const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); |
| 259 for (size_t i = 0; i < kMaxOpenStreams; i++) { |
| 260 session_->CreateOutgoingDynamicStream(kDefaultPriority); |
| 261 } |
| 262 EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams()); |
| 263 |
| 264 // Request a stream and verify that it's pending. |
| 265 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 266 session_->CreateStreamRequest(); |
| 267 TestCompletionCallback callback; |
| 268 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); |
| 269 |
| 270 // Close a stream and ensure the stream request completes. |
| 271 QuicRstStreamFrame rst(kClientDataStreamId1, QUIC_STREAM_CANCELLED, 0); |
| 272 session_->OnRstStream(rst); |
| 273 ASSERT_TRUE(callback.have_result()); |
| 274 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 275 EXPECT_TRUE(stream_request->ReleaseStream() != nullptr); |
| 276 |
| 277 quic_data.Resume(); |
| 278 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 279 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 280 } |
| 281 |
| 282 TEST_P(QuicChromiumClientSessionTest, CancelPendingStreamRequest) { |
| 283 MockQuicData quic_data; |
| 284 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 285 quic_data.AddWrite(client_maker_.MakeRstPacket(2, true, kClientDataStreamId1, |
| 286 QUIC_RST_ACKNOWLEDGEMENT)); |
| 287 quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
| 288 quic_data.AddRead(ASYNC, OK); // EOF |
| 289 quic_data.AddSocketDataToFactory(&socket_factory_); |
| 290 |
| 291 Initialize(); |
| 292 CompleteCryptoHandshake(); |
| 293 |
| 294 // Open the maximum number of streams so that a subsequent request |
| 295 // can not proceed immediately. |
| 296 const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); |
| 297 for (size_t i = 0; i < kMaxOpenStreams; i++) { |
| 298 session_->CreateOutgoingDynamicStream(kDefaultPriority); |
| 299 } |
| 300 EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams()); |
| 301 |
| 302 // Request a stream and verify that it's pending. |
| 303 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 304 session_->CreateStreamRequest(); |
| 305 TestCompletionCallback callback; |
| 306 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); |
| 307 |
| 308 // Cancel the pending stream request. |
| 309 stream_request.reset(); |
| 310 |
| 311 // Close a stream and ensure that no new stream is created. |
| 312 QuicRstStreamFrame rst(kClientDataStreamId1, QUIC_STREAM_CANCELLED, 0); |
| 313 session_->OnRstStream(rst); |
| 314 EXPECT_EQ(kMaxOpenStreams - 1, session_->GetNumOpenOutgoingStreams()); |
| 315 |
| 316 quic_data.Resume(); |
| 317 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 318 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 319 } |
| 320 |
196 TEST_P(QuicChromiumClientSessionTest, MaxNumStreams) { | 321 TEST_P(QuicChromiumClientSessionTest, MaxNumStreams) { |
197 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; | 322 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
198 std::unique_ptr<QuicEncryptedPacket> settings_packet( | 323 std::unique_ptr<QuicEncryptedPacket> settings_packet( |
199 client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 324 client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
200 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket( | 325 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket( |
201 2, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT)); | 326 2, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT)); |
202 MockWrite writes[] = { | 327 MockWrite writes[] = { |
203 MockWrite(ASYNC, settings_packet->data(), settings_packet->length(), 1), | 328 MockWrite(ASYNC, settings_packet->data(), settings_packet->length(), 1), |
204 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 2)}; | 329 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 2)}; |
205 socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes, | 330 socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes, |
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
537 const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); | 662 const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); |
538 | 663 |
539 std::vector<QuicChromiumClientStream*> streams; | 664 std::vector<QuicChromiumClientStream*> streams; |
540 for (size_t i = 0; i < kMaxOpenStreams; i++) { | 665 for (size_t i = 0; i < kMaxOpenStreams; i++) { |
541 QuicChromiumClientStream* stream = | 666 QuicChromiumClientStream* stream = |
542 session_->CreateOutgoingDynamicStream(kDefaultPriority); | 667 session_->CreateOutgoingDynamicStream(kDefaultPriority); |
543 EXPECT_TRUE(stream); | 668 EXPECT_TRUE(stream); |
544 streams.push_back(stream); | 669 streams.push_back(stream); |
545 } | 670 } |
546 | 671 |
547 QuicChromiumClientStream* stream; | 672 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
548 QuicChromiumClientSession::StreamRequest stream_request; | 673 session_->CreateStreamRequest(); |
549 TestCompletionCallback callback; | 674 TestCompletionCallback callback; |
550 ASSERT_EQ(ERR_IO_PENDING, | 675 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); |
551 stream_request.StartRequest(session_->GetWeakPtr(), &stream, | |
552 callback.callback())); | |
553 | 676 |
554 // Close a stream and ensure I can now open a new one. | 677 // Close a stream and ensure I can now open a new one. |
555 QuicStreamId stream_id = streams[0]->id(); | 678 QuicStreamId stream_id = streams[0]->id(); |
556 session_->CloseStream(stream_id); | 679 session_->CloseStream(stream_id); |
557 QuicRstStreamFrame rst1(stream_id, QUIC_STREAM_NO_ERROR, 0); | 680 QuicRstStreamFrame rst1(stream_id, QUIC_STREAM_NO_ERROR, 0); |
558 session_->OnRstStream(rst1); | 681 session_->OnRstStream(rst1); |
559 ASSERT_TRUE(callback.have_result()); | 682 ASSERT_TRUE(callback.have_result()); |
560 EXPECT_THAT(callback.WaitForResult(), IsOk()); | 683 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
561 EXPECT_TRUE(stream != nullptr); | 684 EXPECT_TRUE(stream_request->ReleaseStream() != nullptr); |
562 } | 685 } |
563 | 686 |
564 TEST_P(QuicChromiumClientSessionTest, GoAwayReceived) { | 687 TEST_P(QuicChromiumClientSessionTest, GoAwayReceived) { |
565 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; | 688 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
566 std::unique_ptr<QuicEncryptedPacket> settings_packet( | 689 std::unique_ptr<QuicEncryptedPacket> settings_packet( |
567 client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 690 client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
568 MockWrite writes[] = { | 691 MockWrite writes[] = { |
569 MockWrite(ASYNC, settings_packet->data(), settings_packet->length(), 1)}; | 692 MockWrite(ASYNC, settings_packet->data(), settings_packet->length(), 1)}; |
570 socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes, | 693 socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes, |
571 arraysize(writes))); | 694 arraysize(writes))); |
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
891 | 1014 |
892 EXPECT_TRUE(socket_data_->AllReadDataConsumed()); | 1015 EXPECT_TRUE(socket_data_->AllReadDataConsumed()); |
893 EXPECT_TRUE(socket_data_->AllWriteDataConsumed()); | 1016 EXPECT_TRUE(socket_data_->AllWriteDataConsumed()); |
894 EXPECT_TRUE(new_socket_data.AllReadDataConsumed()); | 1017 EXPECT_TRUE(new_socket_data.AllReadDataConsumed()); |
895 EXPECT_TRUE(new_socket_data.AllWriteDataConsumed()); | 1018 EXPECT_TRUE(new_socket_data.AllWriteDataConsumed()); |
896 } | 1019 } |
897 | 1020 |
898 } // namespace | 1021 } // namespace |
899 } // namespace test | 1022 } // namespace test |
900 } // namespace net | 1023 } // namespace net |
OLD | NEW |