| 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" |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 200 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 201 quic_data.AddRead(ASYNC, ERR_IO_PENDING); | 201 quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
| 202 quic_data.AddRead(ASYNC, OK); // EOF | 202 quic_data.AddRead(ASYNC, OK); // EOF |
| 203 quic_data.AddSocketDataToFactory(&socket_factory_); | 203 quic_data.AddSocketDataToFactory(&socket_factory_); |
| 204 | 204 |
| 205 Initialize(); | 205 Initialize(); |
| 206 CompleteCryptoHandshake(); | 206 CompleteCryptoHandshake(); |
| 207 | 207 |
| 208 // Request a stream and verify that a stream was created. | 208 // Request a stream and verify that a stream was created. |
| 209 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = | 209 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 210 session_->CreateStreamRequest(); | 210 session_->CreateStreamRequest(/*requires_confirmation=*/false); |
| 211 TestCompletionCallback callback; | 211 TestCompletionCallback callback; |
| 212 ASSERT_EQ(OK, stream_request->StartRequest(callback.callback())); | 212 ASSERT_EQ(OK, stream_request->StartRequest(callback.callback())); |
| 213 EXPECT_TRUE(stream_request->ReleaseStream() != nullptr); | 213 EXPECT_TRUE(stream_request->ReleaseStream() != nullptr); |
| 214 | 214 |
| 215 quic_data.Resume(); | 215 quic_data.Resume(); |
| 216 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 216 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 217 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 217 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 218 } | 218 } |
| 219 | 219 |
| 220 TEST_P(QuicChromiumClientSessionTest, ConfirmationRequiredStreamRequest) { |
| 221 MockQuicData quic_data; |
| 222 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 223 quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
| 224 quic_data.AddRead(ASYNC, OK); // EOF |
| 225 quic_data.AddSocketDataToFactory(&socket_factory_); |
| 226 |
| 227 Initialize(); |
| 228 CompleteCryptoHandshake(); |
| 229 |
| 230 // Request a stream and verify that a stream was created. |
| 231 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 232 session_->CreateStreamRequest(/*requires_confirmation=*/true); |
| 233 TestCompletionCallback callback; |
| 234 ASSERT_EQ(OK, stream_request->StartRequest(callback.callback())); |
| 235 EXPECT_TRUE(stream_request->ReleaseStream() != nullptr); |
| 236 |
| 237 quic_data.Resume(); |
| 238 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 239 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 240 } |
| 241 |
| 242 TEST_P(QuicChromiumClientSessionTest, StreamRequestBeforeConfirmation) { |
| 243 MockQuicData quic_data; |
| 244 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 245 quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
| 246 quic_data.AddRead(ASYNC, OK); // EOF |
| 247 quic_data.AddSocketDataToFactory(&socket_factory_); |
| 248 |
| 249 Initialize(); |
| 250 |
| 251 // Request a stream and verify that a stream was created. |
| 252 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 253 session_->CreateStreamRequest(/*requires_confirmation=*/true); |
| 254 TestCompletionCallback callback; |
| 255 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); |
| 256 |
| 257 CompleteCryptoHandshake(); |
| 258 |
| 259 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 260 |
| 261 EXPECT_TRUE(stream_request->ReleaseStream() != nullptr); |
| 262 |
| 263 quic_data.Resume(); |
| 264 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 265 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 266 } |
| 267 |
| 220 TEST_P(QuicChromiumClientSessionTest, CancelStreamRequestBeforeRelease) { | 268 TEST_P(QuicChromiumClientSessionTest, CancelStreamRequestBeforeRelease) { |
| 221 MockQuicData quic_data; | 269 MockQuicData quic_data; |
| 222 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 270 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 223 quic_data.AddWrite(client_maker_.MakeRstPacket(2, true, kClientDataStreamId1, | 271 quic_data.AddWrite(client_maker_.MakeRstPacket(2, true, kClientDataStreamId1, |
| 224 QUIC_STREAM_CANCELLED)); | 272 QUIC_STREAM_CANCELLED)); |
| 225 quic_data.AddRead(ASYNC, ERR_IO_PENDING); | 273 quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
| 226 quic_data.AddRead(ASYNC, OK); // EOF | 274 quic_data.AddRead(ASYNC, OK); // EOF |
| 227 quic_data.AddSocketDataToFactory(&socket_factory_); | 275 quic_data.AddSocketDataToFactory(&socket_factory_); |
| 228 | 276 |
| 229 Initialize(); | 277 Initialize(); |
| 230 CompleteCryptoHandshake(); | 278 CompleteCryptoHandshake(); |
| 231 | 279 |
| 232 // Request a stream and cancel it without releasing the stream. | 280 // Request a stream and cancel it without releasing the stream. |
| 233 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = | 281 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 234 session_->CreateStreamRequest(); | 282 session_->CreateStreamRequest(/*requires_confirmation=*/false); |
| 235 TestCompletionCallback callback; | 283 TestCompletionCallback callback; |
| 236 ASSERT_EQ(OK, stream_request->StartRequest(callback.callback())); | 284 ASSERT_EQ(OK, stream_request->StartRequest(callback.callback())); |
| 237 stream_request.reset(); | 285 stream_request.reset(); |
| 238 | 286 |
| 239 quic_data.Resume(); | 287 quic_data.Resume(); |
| 240 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 288 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 241 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 289 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 242 } | 290 } |
| 243 | 291 |
| 244 TEST_P(QuicChromiumClientSessionTest, AsyncStreamRequest) { | 292 TEST_P(QuicChromiumClientSessionTest, AsyncStreamRequest) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 256 // Open the maximum number of streams so that a subsequent request | 304 // Open the maximum number of streams so that a subsequent request |
| 257 // can not proceed immediately. | 305 // can not proceed immediately. |
| 258 const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); | 306 const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); |
| 259 for (size_t i = 0; i < kMaxOpenStreams; i++) { | 307 for (size_t i = 0; i < kMaxOpenStreams; i++) { |
| 260 session_->CreateOutgoingDynamicStream(kDefaultPriority); | 308 session_->CreateOutgoingDynamicStream(kDefaultPriority); |
| 261 } | 309 } |
| 262 EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams()); | 310 EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams()); |
| 263 | 311 |
| 264 // Request a stream and verify that it's pending. | 312 // Request a stream and verify that it's pending. |
| 265 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = | 313 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 266 session_->CreateStreamRequest(); | 314 session_->CreateStreamRequest(/*requires_confirmation=*/false); |
| 267 TestCompletionCallback callback; | 315 TestCompletionCallback callback; |
| 268 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); | 316 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); |
| 269 | 317 |
| 270 // Close a stream and ensure the stream request completes. | 318 // Close a stream and ensure the stream request completes. |
| 271 QuicRstStreamFrame rst(kClientDataStreamId1, QUIC_STREAM_CANCELLED, 0); | 319 QuicRstStreamFrame rst(kClientDataStreamId1, QUIC_STREAM_CANCELLED, 0); |
| 272 session_->OnRstStream(rst); | 320 session_->OnRstStream(rst); |
| 273 ASSERT_TRUE(callback.have_result()); | 321 ASSERT_TRUE(callback.have_result()); |
| 274 EXPECT_THAT(callback.WaitForResult(), IsOk()); | 322 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 275 EXPECT_TRUE(stream_request->ReleaseStream() != nullptr); | 323 EXPECT_TRUE(stream_request->ReleaseStream() != nullptr); |
| 276 | 324 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 294 // Open the maximum number of streams so that a subsequent request | 342 // Open the maximum number of streams so that a subsequent request |
| 295 // can not proceed immediately. | 343 // can not proceed immediately. |
| 296 const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); | 344 const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); |
| 297 for (size_t i = 0; i < kMaxOpenStreams; i++) { | 345 for (size_t i = 0; i < kMaxOpenStreams; i++) { |
| 298 session_->CreateOutgoingDynamicStream(kDefaultPriority); | 346 session_->CreateOutgoingDynamicStream(kDefaultPriority); |
| 299 } | 347 } |
| 300 EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams()); | 348 EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams()); |
| 301 | 349 |
| 302 // Request a stream and verify that it's pending. | 350 // Request a stream and verify that it's pending. |
| 303 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = | 351 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 304 session_->CreateStreamRequest(); | 352 session_->CreateStreamRequest(/*requires_confirmation=*/false); |
| 305 TestCompletionCallback callback; | 353 TestCompletionCallback callback; |
| 306 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); | 354 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); |
| 307 | 355 |
| 308 // Cancel the pending stream request. | 356 // Cancel the pending stream request. |
| 309 stream_request.reset(); | 357 stream_request.reset(); |
| 310 | 358 |
| 311 // Close a stream and ensure that no new stream is created. | 359 // Close a stream and ensure that no new stream is created. |
| 312 QuicRstStreamFrame rst(kClientDataStreamId1, QUIC_STREAM_CANCELLED, 0); | 360 QuicRstStreamFrame rst(kClientDataStreamId1, QUIC_STREAM_CANCELLED, 0); |
| 313 session_->OnRstStream(rst); | 361 session_->OnRstStream(rst); |
| 314 EXPECT_EQ(kMaxOpenStreams - 1, session_->GetNumOpenOutgoingStreams()); | 362 EXPECT_EQ(kMaxOpenStreams - 1, session_->GetNumOpenOutgoingStreams()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 325 quic_data.AddSocketDataToFactory(&socket_factory_); | 373 quic_data.AddSocketDataToFactory(&socket_factory_); |
| 326 | 374 |
| 327 Initialize(); | 375 Initialize(); |
| 328 CompleteCryptoHandshake(); | 376 CompleteCryptoHandshake(); |
| 329 | 377 |
| 330 // Pump the message loop to read the connection close packet. | 378 // Pump the message loop to read the connection close packet. |
| 331 base::RunLoop().RunUntilIdle(); | 379 base::RunLoop().RunUntilIdle(); |
| 332 | 380 |
| 333 // Request a stream and verify that it failed. | 381 // Request a stream and verify that it failed. |
| 334 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = | 382 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 335 session_->CreateStreamRequest(); | 383 session_->CreateStreamRequest(/*requires_confirmation=*/false); |
| 336 TestCompletionCallback callback; | 384 TestCompletionCallback callback; |
| 337 ASSERT_EQ(ERR_CONNECTION_CLOSED, | 385 ASSERT_EQ(ERR_CONNECTION_CLOSED, |
| 338 stream_request->StartRequest(callback.callback())); | 386 stream_request->StartRequest(callback.callback())); |
| 339 | 387 |
| 340 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 388 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 341 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 389 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 342 } | 390 } |
| 343 | 391 |
| 392 TEST_P(QuicChromiumClientSessionTest, ConnectionCloseBeforeHandshakeConfirmed) { |
| 393 MockQuicData quic_data; |
| 394 quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
| 395 quic_data.AddRead(server_maker_.MakeConnectionClosePacket(1)); |
| 396 quic_data.AddSocketDataToFactory(&socket_factory_); |
| 397 |
| 398 Initialize(); |
| 399 |
| 400 // Request a stream and verify that it's pending. |
| 401 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 402 session_->CreateStreamRequest(/*requires_confirmation=*/true); |
| 403 TestCompletionCallback callback; |
| 404 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); |
| 405 |
| 406 // Close the connection and verify that the StreamRequest completes with |
| 407 // an error. |
| 408 quic_data.Resume(); |
| 409 base::RunLoop().RunUntilIdle(); |
| 410 |
| 411 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_CLOSED)); |
| 412 |
| 413 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 414 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 415 } |
| 416 |
| 344 TEST_P(QuicChromiumClientSessionTest, ConnectionCloseWithPendingStreamRequest) { | 417 TEST_P(QuicChromiumClientSessionTest, ConnectionCloseWithPendingStreamRequest) { |
| 345 MockQuicData quic_data; | 418 MockQuicData quic_data; |
| 346 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 419 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 347 quic_data.AddRead(ASYNC, ERR_IO_PENDING); | 420 quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
| 348 quic_data.AddRead(server_maker_.MakeConnectionClosePacket(1)); | 421 quic_data.AddRead(server_maker_.MakeConnectionClosePacket(1)); |
| 349 quic_data.AddSocketDataToFactory(&socket_factory_); | 422 quic_data.AddSocketDataToFactory(&socket_factory_); |
| 350 | 423 |
| 351 Initialize(); | 424 Initialize(); |
| 352 CompleteCryptoHandshake(); | 425 CompleteCryptoHandshake(); |
| 353 | 426 |
| 354 // Open the maximum number of streams so that a subsequent request | 427 // Open the maximum number of streams so that a subsequent request |
| 355 // can not proceed immediately. | 428 // can not proceed immediately. |
| 356 const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); | 429 const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); |
| 357 for (size_t i = 0; i < kMaxOpenStreams; i++) { | 430 for (size_t i = 0; i < kMaxOpenStreams; i++) { |
| 358 session_->CreateOutgoingDynamicStream(kDefaultPriority); | 431 session_->CreateOutgoingDynamicStream(kDefaultPriority); |
| 359 } | 432 } |
| 360 EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams()); | 433 EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams()); |
| 361 | 434 |
| 362 // Request a stream and verify that it's pending. | 435 // Request a stream and verify that it's pending. |
| 363 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = | 436 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 364 session_->CreateStreamRequest(); | 437 session_->CreateStreamRequest(/*requires_confirmation=*/false); |
| 365 TestCompletionCallback callback; | 438 TestCompletionCallback callback; |
| 366 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); | 439 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); |
| 367 | 440 |
| 368 // Close the connection and verify that the StreamRequest completes with | 441 // Close the connection and verify that the StreamRequest completes with |
| 369 // an error. | 442 // an error. |
| 370 quic_data.Resume(); | 443 quic_data.Resume(); |
| 371 base::RunLoop().RunUntilIdle(); | 444 base::RunLoop().RunUntilIdle(); |
| 372 | 445 |
| 373 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_CLOSED)); | 446 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_CLOSED)); |
| 374 | 447 |
| (...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 721 | 794 |
| 722 std::vector<QuicChromiumClientStream*> streams; | 795 std::vector<QuicChromiumClientStream*> streams; |
| 723 for (size_t i = 0; i < kMaxOpenStreams; i++) { | 796 for (size_t i = 0; i < kMaxOpenStreams; i++) { |
| 724 QuicChromiumClientStream* stream = | 797 QuicChromiumClientStream* stream = |
| 725 session_->CreateOutgoingDynamicStream(kDefaultPriority); | 798 session_->CreateOutgoingDynamicStream(kDefaultPriority); |
| 726 EXPECT_TRUE(stream); | 799 EXPECT_TRUE(stream); |
| 727 streams.push_back(stream); | 800 streams.push_back(stream); |
| 728 } | 801 } |
| 729 | 802 |
| 730 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = | 803 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 731 session_->CreateStreamRequest(); | 804 session_->CreateStreamRequest(/*requires_confirmation=*/false); |
| 732 TestCompletionCallback callback; | 805 TestCompletionCallback callback; |
| 733 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); | 806 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); |
| 734 | 807 |
| 735 // Close a stream and ensure I can now open a new one. | 808 // Close a stream and ensure I can now open a new one. |
| 736 QuicStreamId stream_id = streams[0]->id(); | 809 QuicStreamId stream_id = streams[0]->id(); |
| 737 session_->CloseStream(stream_id); | 810 session_->CloseStream(stream_id); |
| 738 QuicRstStreamFrame rst1(stream_id, QUIC_STREAM_NO_ERROR, 0); | 811 QuicRstStreamFrame rst1(stream_id, QUIC_STREAM_NO_ERROR, 0); |
| 739 session_->OnRstStream(rst1); | 812 session_->OnRstStream(rst1); |
| 740 ASSERT_TRUE(callback.have_result()); | 813 ASSERT_TRUE(callback.have_result()); |
| 741 EXPECT_THAT(callback.WaitForResult(), IsOk()); | 814 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1072 | 1145 |
| 1073 EXPECT_TRUE(socket_data_->AllReadDataConsumed()); | 1146 EXPECT_TRUE(socket_data_->AllReadDataConsumed()); |
| 1074 EXPECT_TRUE(socket_data_->AllWriteDataConsumed()); | 1147 EXPECT_TRUE(socket_data_->AllWriteDataConsumed()); |
| 1075 EXPECT_TRUE(new_socket_data.AllReadDataConsumed()); | 1148 EXPECT_TRUE(new_socket_data.AllReadDataConsumed()); |
| 1076 EXPECT_TRUE(new_socket_data.AllWriteDataConsumed()); | 1149 EXPECT_TRUE(new_socket_data.AllWriteDataConsumed()); |
| 1077 } | 1150 } |
| 1078 | 1151 |
| 1079 } // namespace | 1152 } // namespace |
| 1080 } // namespace test | 1153 } // namespace test |
| 1081 } // namespace net | 1154 } // namespace net |
| OLD | NEW |