| 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 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 const char kServerHostname[] = "test.example.com"; | 57 const char kServerHostname[] = "test.example.com"; |
| 58 const uint16_t kServerPort = 443; | 58 const uint16_t kServerPort = 443; |
| 59 const size_t kMaxReadersPerQuicSession = 5; | 59 const size_t kMaxReadersPerQuicSession = 5; |
| 60 | 60 |
| 61 class MockStreamDelegate : public QuicChromiumClientStream::Delegate { | 61 class MockStreamDelegate : public QuicChromiumClientStream::Delegate { |
| 62 public: | 62 public: |
| 63 MockStreamDelegate() {} | 63 MockStreamDelegate() {} |
| 64 | 64 |
| 65 MOCK_METHOD0(OnSendData, int()); | 65 MOCK_METHOD0(OnSendData, int()); |
| 66 MOCK_METHOD2(OnSendDataComplete, int(int, bool*)); | 66 MOCK_METHOD2(OnSendDataComplete, int(int, bool*)); |
| 67 MOCK_METHOD2(OnHeadersAvailable, | 67 MOCK_METHOD2(OnInitialHeadersAvailable, |
| 68 void(const SpdyHeaderBlock& headers, size_t frame_len)); | 68 void(const SpdyHeaderBlock& headers, size_t frame_len)); |
| 69 MOCK_METHOD2(OnHeadersAvailableMock, | 69 MOCK_METHOD2(OnTrailingHeadersAvailable, |
| 70 void(const SpdyHeaderBlock& headers, size_t frame_len)); | 70 void(const SpdyHeaderBlock& headers, size_t frame_len)); |
| 71 MOCK_METHOD2(OnDataReceived, int(const char*, int)); | 71 MOCK_METHOD2(OnDataReceived, int(const char*, int)); |
| 72 MOCK_METHOD0(OnDataAvailable, void()); | 72 MOCK_METHOD0(OnDataAvailable, void()); |
| 73 MOCK_METHOD0(OnClose, void()); | 73 MOCK_METHOD0(OnClose, void()); |
| 74 MOCK_METHOD1(OnError, void(int)); | 74 MOCK_METHOD1(OnError, void(int)); |
| 75 | 75 |
| 76 private: | 76 private: |
| 77 DISALLOW_COPY_AND_ASSIGN(MockStreamDelegate); | 77 DISALLOW_COPY_AND_ASSIGN(MockStreamDelegate); |
| 78 }; | 78 }; |
| 79 | 79 |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 std::unique_ptr<MockRead> default_read_; | 171 std::unique_ptr<MockRead> default_read_; |
| 172 std::unique_ptr<SequencedSocketData> socket_data_; | 172 std::unique_ptr<SequencedSocketData> socket_data_; |
| 173 MockClock clock_; | 173 MockClock clock_; |
| 174 MockRandom random_; | 174 MockRandom random_; |
| 175 QuicChromiumConnectionHelper helper_; | 175 QuicChromiumConnectionHelper helper_; |
| 176 MockAlarmFactory alarm_factory_; | 176 MockAlarmFactory alarm_factory_; |
| 177 TransportSecurityState transport_security_state_; | 177 TransportSecurityState transport_security_state_; |
| 178 MockCryptoClientStreamFactory crypto_client_stream_factory_; | 178 MockCryptoClientStreamFactory crypto_client_stream_factory_; |
| 179 QuicClientPushPromiseIndex push_promise_index_; | 179 QuicClientPushPromiseIndex push_promise_index_; |
| 180 QuicServerId server_id_; | 180 QuicServerId server_id_; |
| 181 MockStreamDelegate delegate_; |
| 181 std::unique_ptr<QuicChromiumClientSession> session_; | 182 std::unique_ptr<QuicChromiumClientSession> session_; |
| 182 TestServerPushDelegate test_push_delegate_; | 183 TestServerPushDelegate test_push_delegate_; |
| 183 QuicConnectionVisitorInterface* visitor_; | 184 QuicConnectionVisitorInterface* visitor_; |
| 184 TestCompletionCallback callback_; | 185 TestCompletionCallback callback_; |
| 185 QuicTestPacketMaker client_maker_; | 186 QuicTestPacketMaker client_maker_; |
| 186 QuicTestPacketMaker server_maker_; | 187 QuicTestPacketMaker server_maker_; |
| 187 ProofVerifyDetailsChromium verify_details_; | 188 ProofVerifyDetailsChromium verify_details_; |
| 188 }; | 189 }; |
| 189 | 190 |
| 190 INSTANTIATE_TEST_CASE_P(Tests, | 191 INSTANTIATE_TEST_CASE_P(Tests, |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 232 nullptr); | 233 nullptr); |
| 233 | 234 |
| 234 CompleteCryptoHandshake(); | 235 CompleteCryptoHandshake(); |
| 235 | 236 |
| 236 EXPECT_TRUE(handle->IsCryptoHandshakeConfirmed()); | 237 EXPECT_TRUE(handle->IsCryptoHandshakeConfirmed()); |
| 237 | 238 |
| 238 // Request a stream and verify that a stream was created. | 239 // Request a stream and verify that a stream was created. |
| 239 TestCompletionCallback callback; | 240 TestCompletionCallback callback; |
| 240 ASSERT_EQ(OK, handle->RequestStream(/*requires_confirmation=*/false, | 241 ASSERT_EQ(OK, handle->RequestStream(/*requires_confirmation=*/false, |
| 241 callback.callback())); | 242 callback.callback())); |
| 242 EXPECT_TRUE(handle->ReleaseStream() != nullptr); | 243 EXPECT_TRUE(handle->ReleaseStream(&delegate_) != nullptr); |
| 243 | 244 |
| 244 quic_data.Resume(); | 245 quic_data.Resume(); |
| 245 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 246 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 246 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 247 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 247 | 248 |
| 248 // Veirfy that the handle works correctly after the session is closed. | 249 // Veirfy that the handle works correctly after the session is closed. |
| 249 EXPECT_FALSE(handle->IsConnected()); | 250 EXPECT_FALSE(handle->IsConnected()); |
| 250 EXPECT_TRUE(handle->IsCryptoHandshakeConfirmed()); | 251 EXPECT_TRUE(handle->IsCryptoHandshakeConfirmed()); |
| 251 EXPECT_EQ(GetParam(), handle->GetQuicVersion()); | 252 EXPECT_EQ(GetParam(), handle->GetQuicVersion()); |
| 252 EXPECT_EQ(server_id_, handle->server_id()); | 253 EXPECT_EQ(server_id_, handle->server_id()); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 | 295 |
| 295 Initialize(); | 296 Initialize(); |
| 296 CompleteCryptoHandshake(); | 297 CompleteCryptoHandshake(); |
| 297 | 298 |
| 298 // Request a stream and verify that a stream was created. | 299 // Request a stream and verify that a stream was created. |
| 299 std::unique_ptr<QuicChromiumClientSession::Handle> handle = | 300 std::unique_ptr<QuicChromiumClientSession::Handle> handle = |
| 300 session_->CreateHandle(); | 301 session_->CreateHandle(); |
| 301 TestCompletionCallback callback; | 302 TestCompletionCallback callback; |
| 302 ASSERT_EQ(OK, handle->RequestStream(/*requires_confirmation=*/false, | 303 ASSERT_EQ(OK, handle->RequestStream(/*requires_confirmation=*/false, |
| 303 callback.callback())); | 304 callback.callback())); |
| 304 EXPECT_TRUE(handle->ReleaseStream() != nullptr); | 305 EXPECT_TRUE(handle->ReleaseStream(&delegate_) != nullptr); |
| 305 | 306 |
| 306 quic_data.Resume(); | 307 quic_data.Resume(); |
| 307 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 308 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 308 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 309 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 309 } | 310 } |
| 310 | 311 |
| 311 TEST_P(QuicChromiumClientSessionTest, ConfirmationRequiredStreamRequest) { | 312 TEST_P(QuicChromiumClientSessionTest, ConfirmationRequiredStreamRequest) { |
| 312 MockQuicData quic_data; | 313 MockQuicData quic_data; |
| 313 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 314 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 314 quic_data.AddRead(ASYNC, ERR_IO_PENDING); | 315 quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
| 315 quic_data.AddRead(ASYNC, OK); // EOF | 316 quic_data.AddRead(ASYNC, OK); // EOF |
| 316 quic_data.AddSocketDataToFactory(&socket_factory_); | 317 quic_data.AddSocketDataToFactory(&socket_factory_); |
| 317 | 318 |
| 318 Initialize(); | 319 Initialize(); |
| 319 CompleteCryptoHandshake(); | 320 CompleteCryptoHandshake(); |
| 320 | 321 |
| 321 // Request a stream and verify that a stream was created. | 322 // Request a stream and verify that a stream was created. |
| 322 std::unique_ptr<QuicChromiumClientSession::Handle> handle = | 323 std::unique_ptr<QuicChromiumClientSession::Handle> handle = |
| 323 session_->CreateHandle(); | 324 session_->CreateHandle(); |
| 324 TestCompletionCallback callback; | 325 TestCompletionCallback callback; |
| 325 ASSERT_EQ(OK, handle->RequestStream(/*requires_confirmation=*/true, | 326 ASSERT_EQ(OK, handle->RequestStream(/*requires_confirmation=*/true, |
| 326 callback.callback())); | 327 callback.callback())); |
| 327 EXPECT_TRUE(handle->ReleaseStream() != nullptr); | 328 EXPECT_TRUE(handle->ReleaseStream(&delegate_) != nullptr); |
| 328 | 329 |
| 329 quic_data.Resume(); | 330 quic_data.Resume(); |
| 330 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 331 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 331 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 332 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 332 } | 333 } |
| 333 | 334 |
| 334 TEST_P(QuicChromiumClientSessionTest, StreamRequestBeforeConfirmation) { | 335 TEST_P(QuicChromiumClientSessionTest, StreamRequestBeforeConfirmation) { |
| 335 MockQuicData quic_data; | 336 MockQuicData quic_data; |
| 336 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 337 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 337 quic_data.AddRead(ASYNC, ERR_IO_PENDING); | 338 quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
| 338 quic_data.AddRead(ASYNC, OK); // EOF | 339 quic_data.AddRead(ASYNC, OK); // EOF |
| 339 quic_data.AddSocketDataToFactory(&socket_factory_); | 340 quic_data.AddSocketDataToFactory(&socket_factory_); |
| 340 | 341 |
| 341 Initialize(); | 342 Initialize(); |
| 342 | 343 |
| 343 // Request a stream and verify that a stream was created. | 344 // Request a stream and verify that a stream was created. |
| 344 std::unique_ptr<QuicChromiumClientSession::Handle> handle = | 345 std::unique_ptr<QuicChromiumClientSession::Handle> handle = |
| 345 session_->CreateHandle(); | 346 session_->CreateHandle(); |
| 346 TestCompletionCallback callback; | 347 TestCompletionCallback callback; |
| 347 ASSERT_EQ(ERR_IO_PENDING, | 348 ASSERT_EQ(ERR_IO_PENDING, |
| 348 handle->RequestStream(/*requires_confirmation=*/true, | 349 handle->RequestStream(/*requires_confirmation=*/true, |
| 349 callback.callback())); | 350 callback.callback())); |
| 350 | 351 |
| 351 CompleteCryptoHandshake(); | 352 CompleteCryptoHandshake(); |
| 352 | 353 |
| 353 EXPECT_THAT(callback.WaitForResult(), IsOk()); | 354 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 354 | 355 |
| 355 EXPECT_TRUE(handle->ReleaseStream() != nullptr); | 356 EXPECT_TRUE(handle->ReleaseStream(&delegate_) != nullptr); |
| 356 | 357 |
| 357 quic_data.Resume(); | 358 quic_data.Resume(); |
| 358 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 359 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 359 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 360 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 360 } | 361 } |
| 361 | 362 |
| 362 TEST_P(QuicChromiumClientSessionTest, CancelStreamRequestBeforeRelease) { | 363 TEST_P(QuicChromiumClientSessionTest, CancelStreamRequestBeforeRelease) { |
| 363 MockQuicData quic_data; | 364 MockQuicData quic_data; |
| 364 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 365 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 365 quic_data.AddWrite(client_maker_.MakeRstPacket( | 366 quic_data.AddWrite(client_maker_.MakeRstPacket( |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 411 ASSERT_EQ(ERR_IO_PENDING, | 412 ASSERT_EQ(ERR_IO_PENDING, |
| 412 handle->RequestStream(/*requires_confirmation=*/false, | 413 handle->RequestStream(/*requires_confirmation=*/false, |
| 413 callback.callback())); | 414 callback.callback())); |
| 414 | 415 |
| 415 // Close a stream and ensure the stream request completes. | 416 // Close a stream and ensure the stream request completes. |
| 416 QuicRstStreamFrame rst(GetNthClientInitiatedStreamId(0), | 417 QuicRstStreamFrame rst(GetNthClientInitiatedStreamId(0), |
| 417 QUIC_STREAM_CANCELLED, 0); | 418 QUIC_STREAM_CANCELLED, 0); |
| 418 session_->OnRstStream(rst); | 419 session_->OnRstStream(rst); |
| 419 ASSERT_TRUE(callback.have_result()); | 420 ASSERT_TRUE(callback.have_result()); |
| 420 EXPECT_THAT(callback.WaitForResult(), IsOk()); | 421 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 421 EXPECT_TRUE(handle->ReleaseStream() != nullptr); | 422 EXPECT_TRUE(handle->ReleaseStream(&delegate_) != nullptr); |
| 422 | 423 |
| 423 quic_data.Resume(); | 424 quic_data.Resume(); |
| 424 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 425 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 425 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 426 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 426 } | 427 } |
| 427 | 428 |
| 428 TEST_P(QuicChromiumClientSessionTest, CancelPendingStreamRequest) { | 429 TEST_P(QuicChromiumClientSessionTest, CancelPendingStreamRequest) { |
| 429 MockQuicData quic_data; | 430 MockQuicData quic_data; |
| 430 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 431 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 431 quic_data.AddWrite(client_maker_.MakeRstPacket( | 432 quic_data.AddWrite(client_maker_.MakeRstPacket( |
| (...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 916 handle->RequestStream(/*requires_confirmation=*/false, | 917 handle->RequestStream(/*requires_confirmation=*/false, |
| 917 callback.callback())); | 918 callback.callback())); |
| 918 | 919 |
| 919 // Close a stream and ensure I can now open a new one. | 920 // Close a stream and ensure I can now open a new one. |
| 920 QuicStreamId stream_id = streams[0]->id(); | 921 QuicStreamId stream_id = streams[0]->id(); |
| 921 session_->CloseStream(stream_id); | 922 session_->CloseStream(stream_id); |
| 922 QuicRstStreamFrame rst1(stream_id, QUIC_STREAM_NO_ERROR, 0); | 923 QuicRstStreamFrame rst1(stream_id, QUIC_STREAM_NO_ERROR, 0); |
| 923 session_->OnRstStream(rst1); | 924 session_->OnRstStream(rst1); |
| 924 ASSERT_TRUE(callback.have_result()); | 925 ASSERT_TRUE(callback.have_result()); |
| 925 EXPECT_THAT(callback.WaitForResult(), IsOk()); | 926 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 926 EXPECT_TRUE(handle->ReleaseStream() != nullptr); | 927 EXPECT_TRUE(handle->ReleaseStream(&delegate_) != nullptr); |
| 927 } | 928 } |
| 928 | 929 |
| 929 TEST_P(QuicChromiumClientSessionTest, GoAwayReceived) { | 930 TEST_P(QuicChromiumClientSessionTest, GoAwayReceived) { |
| 930 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; | 931 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
| 931 std::unique_ptr<QuicEncryptedPacket> settings_packet( | 932 std::unique_ptr<QuicEncryptedPacket> settings_packet( |
| 932 client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 933 client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 933 MockWrite writes[] = { | 934 MockWrite writes[] = { |
| 934 MockWrite(ASYNC, settings_packet->data(), settings_packet->length(), 1)}; | 935 MockWrite(ASYNC, settings_packet->data(), settings_packet->length(), 1)}; |
| 935 socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes, | 936 socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes, |
| 936 arraysize(writes))); | 937 arraysize(writes))); |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1256 | 1257 |
| 1257 EXPECT_TRUE(socket_data_->AllReadDataConsumed()); | 1258 EXPECT_TRUE(socket_data_->AllReadDataConsumed()); |
| 1258 EXPECT_TRUE(socket_data_->AllWriteDataConsumed()); | 1259 EXPECT_TRUE(socket_data_->AllWriteDataConsumed()); |
| 1259 EXPECT_TRUE(new_socket_data.AllReadDataConsumed()); | 1260 EXPECT_TRUE(new_socket_data.AllReadDataConsumed()); |
| 1260 EXPECT_TRUE(new_socket_data.AllWriteDataConsumed()); | 1261 EXPECT_TRUE(new_socket_data.AllWriteDataConsumed()); |
| 1261 } | 1262 } |
| 1262 | 1263 |
| 1263 } // namespace | 1264 } // namespace |
| 1264 } // namespace test | 1265 } // namespace test |
| 1265 } // namespace net | 1266 } // namespace net |
| OLD | NEW |