| 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 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 | 51 |
| 52 namespace net { | 52 namespace net { |
| 53 namespace test { | 53 namespace test { |
| 54 namespace { | 54 namespace { |
| 55 | 55 |
| 56 const IPEndPoint kIpEndPoint = IPEndPoint(IPAddress::IPv4AllZeros(), 0); | 56 const IPEndPoint kIpEndPoint = IPEndPoint(IPAddress::IPv4AllZeros(), 0); |
| 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 { | |
| 62 public: | |
| 63 MockStreamDelegate() {} | |
| 64 | |
| 65 MOCK_METHOD0(OnSendData, int()); | |
| 66 MOCK_METHOD2(OnSendDataComplete, int(int, bool*)); | |
| 67 MOCK_METHOD2(OnInitialHeadersAvailable, | |
| 68 void(const SpdyHeaderBlock& headers, size_t frame_len)); | |
| 69 MOCK_METHOD2(OnTrailingHeadersAvailable, | |
| 70 void(const SpdyHeaderBlock& headers, size_t frame_len)); | |
| 71 MOCK_METHOD2(OnDataReceived, int(const char*, int)); | |
| 72 MOCK_METHOD0(OnDataAvailable, void()); | |
| 73 MOCK_METHOD0(OnClose, void()); | |
| 74 MOCK_METHOD1(OnError, void(int)); | |
| 75 | |
| 76 private: | |
| 77 DISALLOW_COPY_AND_ASSIGN(MockStreamDelegate); | |
| 78 }; | |
| 79 | |
| 80 class QuicChromiumClientSessionTest | 61 class QuicChromiumClientSessionTest |
| 81 : public ::testing::TestWithParam<QuicVersion> { | 62 : public ::testing::TestWithParam<QuicVersion> { |
| 82 protected: | 63 protected: |
| 83 QuicChromiumClientSessionTest() | 64 QuicChromiumClientSessionTest() |
| 84 : crypto_config_(crypto_test_utils::ProofVerifierForTesting()), | 65 : crypto_config_(crypto_test_utils::ProofVerifierForTesting()), |
| 85 default_read_(new MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)), | 66 default_read_(new MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)), |
| 86 socket_data_( | 67 socket_data_( |
| 87 new SequencedSocketData(default_read_.get(), 1, nullptr, 0)), | 68 new SequencedSocketData(default_read_.get(), 1, nullptr, 0)), |
| 88 random_(0), | 69 random_(0), |
| 89 helper_(&clock_, &random_), | 70 helper_(&clock_, &random_), |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 std::unique_ptr<MockRead> default_read_; | 152 std::unique_ptr<MockRead> default_read_; |
| 172 std::unique_ptr<SequencedSocketData> socket_data_; | 153 std::unique_ptr<SequencedSocketData> socket_data_; |
| 173 MockClock clock_; | 154 MockClock clock_; |
| 174 MockRandom random_; | 155 MockRandom random_; |
| 175 QuicChromiumConnectionHelper helper_; | 156 QuicChromiumConnectionHelper helper_; |
| 176 MockAlarmFactory alarm_factory_; | 157 MockAlarmFactory alarm_factory_; |
| 177 TransportSecurityState transport_security_state_; | 158 TransportSecurityState transport_security_state_; |
| 178 MockCryptoClientStreamFactory crypto_client_stream_factory_; | 159 MockCryptoClientStreamFactory crypto_client_stream_factory_; |
| 179 QuicClientPushPromiseIndex push_promise_index_; | 160 QuicClientPushPromiseIndex push_promise_index_; |
| 180 QuicServerId server_id_; | 161 QuicServerId server_id_; |
| 181 MockStreamDelegate delegate_; | |
| 182 std::unique_ptr<QuicChromiumClientSession> session_; | 162 std::unique_ptr<QuicChromiumClientSession> session_; |
| 183 TestServerPushDelegate test_push_delegate_; | 163 TestServerPushDelegate test_push_delegate_; |
| 184 QuicConnectionVisitorInterface* visitor_; | 164 QuicConnectionVisitorInterface* visitor_; |
| 185 TestCompletionCallback callback_; | 165 TestCompletionCallback callback_; |
| 186 QuicTestPacketMaker client_maker_; | 166 QuicTestPacketMaker client_maker_; |
| 187 QuicTestPacketMaker server_maker_; | 167 QuicTestPacketMaker server_maker_; |
| 188 ProofVerifyDetailsChromium verify_details_; | 168 ProofVerifyDetailsChromium verify_details_; |
| 189 }; | 169 }; |
| 190 | 170 |
| 191 INSTANTIATE_TEST_CASE_P(Tests, | 171 INSTANTIATE_TEST_CASE_P(Tests, |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 nullptr); | 213 nullptr); |
| 234 | 214 |
| 235 CompleteCryptoHandshake(); | 215 CompleteCryptoHandshake(); |
| 236 | 216 |
| 237 EXPECT_TRUE(handle->IsCryptoHandshakeConfirmed()); | 217 EXPECT_TRUE(handle->IsCryptoHandshakeConfirmed()); |
| 238 | 218 |
| 239 // Request a stream and verify that a stream was created. | 219 // Request a stream and verify that a stream was created. |
| 240 TestCompletionCallback callback; | 220 TestCompletionCallback callback; |
| 241 ASSERT_EQ(OK, handle->RequestStream(/*requires_confirmation=*/false, | 221 ASSERT_EQ(OK, handle->RequestStream(/*requires_confirmation=*/false, |
| 242 callback.callback())); | 222 callback.callback())); |
| 243 EXPECT_TRUE(handle->ReleaseStream(&delegate_) != nullptr); | 223 EXPECT_TRUE(handle->ReleaseStream() != nullptr); |
| 244 | 224 |
| 245 quic_data.Resume(); | 225 quic_data.Resume(); |
| 246 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 226 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 247 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 227 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 248 | 228 |
| 249 // Veirfy that the handle works correctly after the session is closed. | 229 // Veirfy that the handle works correctly after the session is closed. |
| 250 EXPECT_FALSE(handle->IsConnected()); | 230 EXPECT_FALSE(handle->IsConnected()); |
| 251 EXPECT_TRUE(handle->IsCryptoHandshakeConfirmed()); | 231 EXPECT_TRUE(handle->IsCryptoHandshakeConfirmed()); |
| 252 EXPECT_EQ(GetParam(), handle->GetQuicVersion()); | 232 EXPECT_EQ(GetParam(), handle->GetQuicVersion()); |
| 253 EXPECT_EQ(server_id_, handle->server_id()); | 233 EXPECT_EQ(server_id_, handle->server_id()); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 | 275 |
| 296 Initialize(); | 276 Initialize(); |
| 297 CompleteCryptoHandshake(); | 277 CompleteCryptoHandshake(); |
| 298 | 278 |
| 299 // Request a stream and verify that a stream was created. | 279 // Request a stream and verify that a stream was created. |
| 300 std::unique_ptr<QuicChromiumClientSession::Handle> handle = | 280 std::unique_ptr<QuicChromiumClientSession::Handle> handle = |
| 301 session_->CreateHandle(); | 281 session_->CreateHandle(); |
| 302 TestCompletionCallback callback; | 282 TestCompletionCallback callback; |
| 303 ASSERT_EQ(OK, handle->RequestStream(/*requires_confirmation=*/false, | 283 ASSERT_EQ(OK, handle->RequestStream(/*requires_confirmation=*/false, |
| 304 callback.callback())); | 284 callback.callback())); |
| 305 EXPECT_TRUE(handle->ReleaseStream(&delegate_) != nullptr); | 285 EXPECT_TRUE(handle->ReleaseStream() != nullptr); |
| 306 | 286 |
| 307 quic_data.Resume(); | 287 quic_data.Resume(); |
| 308 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 288 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 309 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 289 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 310 } | 290 } |
| 311 | 291 |
| 312 TEST_P(QuicChromiumClientSessionTest, ConfirmationRequiredStreamRequest) { | 292 TEST_P(QuicChromiumClientSessionTest, ConfirmationRequiredStreamRequest) { |
| 313 MockQuicData quic_data; | 293 MockQuicData quic_data; |
| 314 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 294 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 315 quic_data.AddRead(ASYNC, ERR_IO_PENDING); | 295 quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
| 316 quic_data.AddRead(ASYNC, OK); // EOF | 296 quic_data.AddRead(ASYNC, OK); // EOF |
| 317 quic_data.AddSocketDataToFactory(&socket_factory_); | 297 quic_data.AddSocketDataToFactory(&socket_factory_); |
| 318 | 298 |
| 319 Initialize(); | 299 Initialize(); |
| 320 CompleteCryptoHandshake(); | 300 CompleteCryptoHandshake(); |
| 321 | 301 |
| 322 // Request a stream and verify that a stream was created. | 302 // Request a stream and verify that a stream was created. |
| 323 std::unique_ptr<QuicChromiumClientSession::Handle> handle = | 303 std::unique_ptr<QuicChromiumClientSession::Handle> handle = |
| 324 session_->CreateHandle(); | 304 session_->CreateHandle(); |
| 325 TestCompletionCallback callback; | 305 TestCompletionCallback callback; |
| 326 ASSERT_EQ(OK, handle->RequestStream(/*requires_confirmation=*/true, | 306 ASSERT_EQ(OK, handle->RequestStream(/*requires_confirmation=*/true, |
| 327 callback.callback())); | 307 callback.callback())); |
| 328 EXPECT_TRUE(handle->ReleaseStream(&delegate_) != nullptr); | 308 EXPECT_TRUE(handle->ReleaseStream() != nullptr); |
| 329 | 309 |
| 330 quic_data.Resume(); | 310 quic_data.Resume(); |
| 331 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 311 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 332 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 312 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 333 } | 313 } |
| 334 | 314 |
| 335 TEST_P(QuicChromiumClientSessionTest, StreamRequestBeforeConfirmation) { | 315 TEST_P(QuicChromiumClientSessionTest, StreamRequestBeforeConfirmation) { |
| 336 MockQuicData quic_data; | 316 MockQuicData quic_data; |
| 337 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 317 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 338 quic_data.AddRead(ASYNC, ERR_IO_PENDING); | 318 quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
| 339 quic_data.AddRead(ASYNC, OK); // EOF | 319 quic_data.AddRead(ASYNC, OK); // EOF |
| 340 quic_data.AddSocketDataToFactory(&socket_factory_); | 320 quic_data.AddSocketDataToFactory(&socket_factory_); |
| 341 | 321 |
| 342 Initialize(); | 322 Initialize(); |
| 343 | 323 |
| 344 // Request a stream and verify that a stream was created. | 324 // Request a stream and verify that a stream was created. |
| 345 std::unique_ptr<QuicChromiumClientSession::Handle> handle = | 325 std::unique_ptr<QuicChromiumClientSession::Handle> handle = |
| 346 session_->CreateHandle(); | 326 session_->CreateHandle(); |
| 347 TestCompletionCallback callback; | 327 TestCompletionCallback callback; |
| 348 ASSERT_EQ(ERR_IO_PENDING, | 328 ASSERT_EQ(ERR_IO_PENDING, |
| 349 handle->RequestStream(/*requires_confirmation=*/true, | 329 handle->RequestStream(/*requires_confirmation=*/true, |
| 350 callback.callback())); | 330 callback.callback())); |
| 351 | 331 |
| 352 CompleteCryptoHandshake(); | 332 CompleteCryptoHandshake(); |
| 353 | 333 |
| 354 EXPECT_THAT(callback.WaitForResult(), IsOk()); | 334 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 355 | 335 |
| 356 EXPECT_TRUE(handle->ReleaseStream(&delegate_) != nullptr); | 336 EXPECT_TRUE(handle->ReleaseStream() != nullptr); |
| 357 | 337 |
| 358 quic_data.Resume(); | 338 quic_data.Resume(); |
| 359 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 339 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 360 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 340 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 361 } | 341 } |
| 362 | 342 |
| 363 TEST_P(QuicChromiumClientSessionTest, CancelStreamRequestBeforeRelease) { | 343 TEST_P(QuicChromiumClientSessionTest, CancelStreamRequestBeforeRelease) { |
| 364 MockQuicData quic_data; | 344 MockQuicData quic_data; |
| 365 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 345 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 366 quic_data.AddWrite(client_maker_.MakeRstPacket( | 346 quic_data.AddWrite(client_maker_.MakeRstPacket( |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 412 ASSERT_EQ(ERR_IO_PENDING, | 392 ASSERT_EQ(ERR_IO_PENDING, |
| 413 handle->RequestStream(/*requires_confirmation=*/false, | 393 handle->RequestStream(/*requires_confirmation=*/false, |
| 414 callback.callback())); | 394 callback.callback())); |
| 415 | 395 |
| 416 // Close a stream and ensure the stream request completes. | 396 // Close a stream and ensure the stream request completes. |
| 417 QuicRstStreamFrame rst(GetNthClientInitiatedStreamId(0), | 397 QuicRstStreamFrame rst(GetNthClientInitiatedStreamId(0), |
| 418 QUIC_STREAM_CANCELLED, 0); | 398 QUIC_STREAM_CANCELLED, 0); |
| 419 session_->OnRstStream(rst); | 399 session_->OnRstStream(rst); |
| 420 ASSERT_TRUE(callback.have_result()); | 400 ASSERT_TRUE(callback.have_result()); |
| 421 EXPECT_THAT(callback.WaitForResult(), IsOk()); | 401 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 422 EXPECT_TRUE(handle->ReleaseStream(&delegate_) != nullptr); | 402 EXPECT_TRUE(handle->ReleaseStream() != nullptr); |
| 423 | 403 |
| 424 quic_data.Resume(); | 404 quic_data.Resume(); |
| 425 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 405 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 426 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 406 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 427 } | 407 } |
| 428 | 408 |
| 429 TEST_P(QuicChromiumClientSessionTest, CancelPendingStreamRequest) { | 409 TEST_P(QuicChromiumClientSessionTest, CancelPendingStreamRequest) { |
| 430 MockQuicData quic_data; | 410 MockQuicData quic_data; |
| 431 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 411 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 432 quic_data.AddWrite(client_maker_.MakeRstPacket( | 412 quic_data.AddWrite(client_maker_.MakeRstPacket( |
| (...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 917 handle->RequestStream(/*requires_confirmation=*/false, | 897 handle->RequestStream(/*requires_confirmation=*/false, |
| 918 callback.callback())); | 898 callback.callback())); |
| 919 | 899 |
| 920 // Close a stream and ensure I can now open a new one. | 900 // Close a stream and ensure I can now open a new one. |
| 921 QuicStreamId stream_id = streams[0]->id(); | 901 QuicStreamId stream_id = streams[0]->id(); |
| 922 session_->CloseStream(stream_id); | 902 session_->CloseStream(stream_id); |
| 923 QuicRstStreamFrame rst1(stream_id, QUIC_STREAM_NO_ERROR, 0); | 903 QuicRstStreamFrame rst1(stream_id, QUIC_STREAM_NO_ERROR, 0); |
| 924 session_->OnRstStream(rst1); | 904 session_->OnRstStream(rst1); |
| 925 ASSERT_TRUE(callback.have_result()); | 905 ASSERT_TRUE(callback.have_result()); |
| 926 EXPECT_THAT(callback.WaitForResult(), IsOk()); | 906 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 927 EXPECT_TRUE(handle->ReleaseStream(&delegate_) != nullptr); | 907 EXPECT_TRUE(handle->ReleaseStream() != nullptr); |
| 928 } | 908 } |
| 929 | 909 |
| 930 TEST_P(QuicChromiumClientSessionTest, GoAwayReceived) { | 910 TEST_P(QuicChromiumClientSessionTest, GoAwayReceived) { |
| 931 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; | 911 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
| 932 std::unique_ptr<QuicEncryptedPacket> settings_packet( | 912 std::unique_ptr<QuicEncryptedPacket> settings_packet( |
| 933 client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 913 client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 934 MockWrite writes[] = { | 914 MockWrite writes[] = { |
| 935 MockWrite(ASYNC, settings_packet->data(), settings_packet->length(), 1)}; | 915 MockWrite(ASYNC, settings_packet->data(), settings_packet->length(), 1)}; |
| 936 socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes, | 916 socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes, |
| 937 arraysize(writes))); | 917 arraysize(writes))); |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1257 | 1237 |
| 1258 EXPECT_TRUE(socket_data_->AllReadDataConsumed()); | 1238 EXPECT_TRUE(socket_data_->AllReadDataConsumed()); |
| 1259 EXPECT_TRUE(socket_data_->AllWriteDataConsumed()); | 1239 EXPECT_TRUE(socket_data_->AllWriteDataConsumed()); |
| 1260 EXPECT_TRUE(new_socket_data.AllReadDataConsumed()); | 1240 EXPECT_TRUE(new_socket_data.AllReadDataConsumed()); |
| 1261 EXPECT_TRUE(new_socket_data.AllWriteDataConsumed()); | 1241 EXPECT_TRUE(new_socket_data.AllWriteDataConsumed()); |
| 1262 } | 1242 } |
| 1263 | 1243 |
| 1264 } // namespace | 1244 } // namespace |
| 1265 } // namespace test | 1245 } // namespace test |
| 1266 } // namespace net | 1246 } // namespace net |
| OLD | NEW |