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

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

Issue 2844493002: QuicChromiumClientSession::StreamRequest to be created by the session (Closed)
Patch Set: Rebase Created 3 years, 7 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/chromium/quic_chromium_client_session.cc ('k') | net/quic/chromium/quic_http_stream.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/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
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
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
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
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
OLDNEW
« no previous file with comments | « net/quic/chromium/quic_chromium_client_session.cc ('k') | net/quic/chromium/quic_http_stream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698