| 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 26 matching lines...) Expand all Loading... |
| 37 #include "net/quic/test_tools/quic_client_promised_info_peer.h" | 37 #include "net/quic/test_tools/quic_client_promised_info_peer.h" |
| 38 #include "net/quic/test_tools/quic_spdy_session_peer.h" | 38 #include "net/quic/test_tools/quic_spdy_session_peer.h" |
| 39 #include "net/quic/test_tools/quic_test_packet_maker.h" | 39 #include "net/quic/test_tools/quic_test_packet_maker.h" |
| 40 #include "net/quic/test_tools/quic_test_utils.h" | 40 #include "net/quic/test_tools/quic_test_utils.h" |
| 41 #include "net/quic/test_tools/simple_quic_framer.h" | 41 #include "net/quic/test_tools/simple_quic_framer.h" |
| 42 #include "net/socket/socket_test_util.h" | 42 #include "net/socket/socket_test_util.h" |
| 43 #include "net/spdy/spdy_test_utils.h" | 43 #include "net/spdy/spdy_test_utils.h" |
| 44 #include "net/test/cert_test_util.h" | 44 #include "net/test/cert_test_util.h" |
| 45 #include "net/test/gtest_util.h" | 45 #include "net/test/gtest_util.h" |
| 46 #include "net/test/test_data_directory.h" | 46 #include "net/test/test_data_directory.h" |
| 47 #include "net/tools/quic/test_tools/push_promise_delegate.h" |
| 47 #include "net/udp/datagram_client_socket.h" | 48 #include "net/udp/datagram_client_socket.h" |
| 48 #include "testing/gmock/include/gmock/gmock.h" | 49 #include "testing/gmock/include/gmock/gmock.h" |
| 49 | 50 |
| 50 using testing::_; | 51 using testing::_; |
| 51 | 52 |
| 52 namespace net { | 53 namespace net { |
| 53 namespace test { | 54 namespace test { |
| 54 namespace { | 55 namespace { |
| 55 | 56 |
| 56 const IPEndPoint kIpEndPoint = IPEndPoint(IPAddress::IPv4AllZeros(), 0); | 57 const IPEndPoint kIpEndPoint = IPEndPoint(IPAddress::IPv4AllZeros(), 0); |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 BoundTestNetLog bound_test_net_log_; | 159 BoundTestNetLog bound_test_net_log_; |
| 159 MockClientSocketFactory socket_factory_; | 160 MockClientSocketFactory socket_factory_; |
| 160 std::unique_ptr<MockRead> default_read_; | 161 std::unique_ptr<MockRead> default_read_; |
| 161 std::unique_ptr<SequencedSocketData> socket_data_; | 162 std::unique_ptr<SequencedSocketData> socket_data_; |
| 162 MockClock clock_; | 163 MockClock clock_; |
| 163 MockRandom random_; | 164 MockRandom random_; |
| 164 QuicChromiumConnectionHelper helper_; | 165 QuicChromiumConnectionHelper helper_; |
| 165 MockAlarmFactory alarm_factory_; | 166 MockAlarmFactory alarm_factory_; |
| 166 TransportSecurityState transport_security_state_; | 167 TransportSecurityState transport_security_state_; |
| 167 MockCryptoClientStreamFactory crypto_client_stream_factory_; | 168 MockCryptoClientStreamFactory crypto_client_stream_factory_; |
| 169 QuicClientPushPromiseIndex push_promise_index_; |
| 168 std::unique_ptr<QuicChromiumClientSession> session_; | 170 std::unique_ptr<QuicChromiumClientSession> session_; |
| 169 QuicConnectionVisitorInterface* visitor_; | 171 QuicConnectionVisitorInterface* visitor_; |
| 170 TestCompletionCallback callback_; | 172 TestCompletionCallback callback_; |
| 171 QuicTestPacketMaker client_maker_; | 173 QuicTestPacketMaker client_maker_; |
| 172 QuicTestPacketMaker server_maker_; | 174 QuicTestPacketMaker server_maker_; |
| 173 ProofVerifyDetailsChromium verify_details_; | 175 ProofVerifyDetailsChromium verify_details_; |
| 174 QuicClientPushPromiseIndex push_promise_index_; | |
| 175 }; | 176 }; |
| 176 | 177 |
| 177 INSTANTIATE_TEST_CASE_P(Tests, | 178 INSTANTIATE_TEST_CASE_P(Tests, |
| 178 QuicChromiumClientSessionTest, | 179 QuicChromiumClientSessionTest, |
| 179 ::testing::ValuesIn(AllSupportedVersions())); | 180 ::testing::ValuesIn(AllSupportedVersions())); |
| 180 | 181 |
| 181 TEST_P(QuicChromiumClientSessionTest, CryptoConnect) { | 182 TEST_P(QuicChromiumClientSessionTest, CryptoConnect) { |
| 182 Initialize(); | 183 Initialize(); |
| 183 CompleteCryptoHandshake(); | 184 CompleteCryptoHandshake(); |
| 184 } | 185 } |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 241 session_->CreateOutgoingDynamicStream(kDefaultPriority); | 242 session_->CreateOutgoingDynamicStream(kDefaultPriority); |
| 242 EXPECT_TRUE(stream); | 243 EXPECT_TRUE(stream); |
| 243 | 244 |
| 244 SpdyHeaderBlock promise_headers; | 245 SpdyHeaderBlock promise_headers; |
| 245 promise_headers[":method"] = "GET"; | 246 promise_headers[":method"] = "GET"; |
| 246 promise_headers[":authority"] = "www.example.org"; | 247 promise_headers[":authority"] = "www.example.org"; |
| 247 promise_headers[":scheme"] = "https"; | 248 promise_headers[":scheme"] = "https"; |
| 248 promise_headers[":path"] = "/pushed.jpg"; | 249 promise_headers[":path"] = "/pushed.jpg"; |
| 249 | 250 |
| 250 // Receive a PUSH PROMISE from the server. | 251 // Receive a PUSH PROMISE from the server. |
| 251 session_->HandlePromised(stream->id(), kServerDataStreamId1, promise_headers); | 252 EXPECT_TRUE(session_->HandlePromised(stream->id(), kServerDataStreamId1, |
| 253 promise_headers)); |
| 252 | 254 |
| 253 QuicClientPromisedInfo* promised = | 255 QuicClientPromisedInfo* promised = |
| 254 session_->GetPromisedById(kServerDataStreamId1); | 256 session_->GetPromisedById(kServerDataStreamId1); |
| 255 EXPECT_TRUE(promised); | 257 EXPECT_TRUE(promised); |
| 256 // Fire alarm to time out the push stream. | 258 // Fire alarm to time out the push stream. |
| 257 alarm_factory_.FireAlarm(QuicClientPromisedInfoPeer::GetAlarm(promised)); | 259 alarm_factory_.FireAlarm(QuicClientPromisedInfoPeer::GetAlarm(promised)); |
| 258 EXPECT_FALSE( | 260 EXPECT_FALSE( |
| 259 session_->GetPromisedByUrl("https://www.example.org/pushed.jpg")); | 261 session_->GetPromisedByUrl("https://www.example.org/pushed.jpg")); |
| 260 EXPECT_EQ(0u, | 262 EXPECT_EQ(0u, |
| 261 QuicChromiumClientSessionPeer::GetPushedBytesCount(session_.get())); | 263 QuicChromiumClientSessionPeer::GetPushedBytesCount(session_.get())); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 287 EXPECT_TRUE(stream); | 289 EXPECT_TRUE(stream); |
| 288 | 290 |
| 289 SpdyHeaderBlock promise_headers; | 291 SpdyHeaderBlock promise_headers; |
| 290 promise_headers[":method"] = "GET"; | 292 promise_headers[":method"] = "GET"; |
| 291 promise_headers[":authority"] = "www.example.org"; | 293 promise_headers[":authority"] = "www.example.org"; |
| 292 promise_headers[":scheme"] = "https"; | 294 promise_headers[":scheme"] = "https"; |
| 293 promise_headers[":path"] = "/pushed.jpg"; | 295 promise_headers[":path"] = "/pushed.jpg"; |
| 294 | 296 |
| 295 session_->GetOrCreateStream(kServerDataStreamId1); | 297 session_->GetOrCreateStream(kServerDataStreamId1); |
| 296 // Receive a PUSH PROMISE from the server. | 298 // Receive a PUSH PROMISE from the server. |
| 297 session_->HandlePromised(stream->id(), kServerDataStreamId1, promise_headers); | 299 EXPECT_TRUE(session_->HandlePromised(stream->id(), kServerDataStreamId1, |
| 300 promise_headers)); |
| 298 session_->OnInitialHeadersComplete(kServerDataStreamId1, SpdyHeaderBlock()); | 301 session_->OnInitialHeadersComplete(kServerDataStreamId1, SpdyHeaderBlock()); |
| 299 // Read data on the pushed stream. | 302 // Read data on the pushed stream. |
| 300 QuicStreamFrame data(kServerDataStreamId1, false, 0, StringPiece("SP")); | 303 QuicStreamFrame data(kServerDataStreamId1, false, 0, StringPiece("SP")); |
| 301 session_->OnStreamFrame(data); | 304 session_->OnStreamFrame(data); |
| 302 | 305 |
| 303 QuicClientPromisedInfo* promised = | 306 QuicClientPromisedInfo* promised = |
| 304 session_->GetPromisedById(kServerDataStreamId1); | 307 session_->GetPromisedById(kServerDataStreamId1); |
| 305 EXPECT_TRUE(promised); | 308 EXPECT_TRUE(promised); |
| 306 // Fire alarm to time out the push stream. | 309 // Fire alarm to time out the push stream. |
| 307 alarm_factory_.FireAlarm(QuicClientPromisedInfoPeer::GetAlarm(promised)); | 310 alarm_factory_.FireAlarm(QuicClientPromisedInfoPeer::GetAlarm(promised)); |
| 308 EXPECT_EQ(2u, | 311 EXPECT_EQ(2u, |
| 309 QuicChromiumClientSessionPeer::GetPushedBytesCount(session_.get())); | 312 QuicChromiumClientSessionPeer::GetPushedBytesCount(session_.get())); |
| 310 EXPECT_EQ(2u, QuicChromiumClientSessionPeer::GetPushedAndUnclaimedBytesCount( | 313 EXPECT_EQ(2u, QuicChromiumClientSessionPeer::GetPushedAndUnclaimedBytesCount( |
| 311 session_.get())); | 314 session_.get())); |
| 312 } | 315 } |
| 313 | 316 |
| 317 TEST_P(QuicChromiumClientSessionTest, CancelPushWhenPendingValidation) { |
| 318 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
| 319 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket( |
| 320 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT)); |
| 321 |
| 322 MockWrite writes[] = { |
| 323 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1)}; |
| 324 socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes, |
| 325 arraysize(writes))); |
| 326 Initialize(); |
| 327 |
| 328 ProofVerifyDetailsChromium details; |
| 329 details.cert_verify_result.verified_cert = |
| 330 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); |
| 331 ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); |
| 332 |
| 333 CompleteCryptoHandshake(); |
| 334 session_->OnProofVerifyDetailsAvailable(details); |
| 335 |
| 336 QuicChromiumClientStream* stream = |
| 337 session_->CreateOutgoingDynamicStream(kDefaultPriority); |
| 338 EXPECT_TRUE(stream); |
| 339 |
| 340 SpdyHeaderBlock promise_headers; |
| 341 promise_headers[":method"] = "GET"; |
| 342 promise_headers[":authority"] = "www.example.org"; |
| 343 promise_headers[":scheme"] = "https"; |
| 344 promise_headers[":path"] = "/pushed.jpg"; |
| 345 |
| 346 // Receive a PUSH PROMISE from the server. |
| 347 EXPECT_TRUE(session_->HandlePromised(stream->id(), kServerDataStreamId1, |
| 348 promise_headers)); |
| 349 |
| 350 QuicClientPromisedInfo* promised = |
| 351 session_->GetPromisedById(kServerDataStreamId1); |
| 352 EXPECT_TRUE(promised); |
| 353 |
| 354 // Initiate rendezvous. |
| 355 SpdyHeaderBlock client_request = promise_headers.Clone(); |
| 356 PushPromiseDelegate delegate(/*match=*/true); |
| 357 promised->HandleClientRequest(client_request, &delegate); |
| 358 |
| 359 // Cancel the push before receiving the response to the pushed request. |
| 360 GURL pushed_url("https://www.example.org/pushed.jpg"); |
| 361 session_->CancelPush(pushed_url); |
| 362 EXPECT_TRUE(session_->GetPromisedByUrl(pushed_url.spec())); |
| 363 |
| 364 // Reset the stream now before tear down. |
| 365 session_->CloseStream(kClientDataStreamId1); |
| 366 } |
| 367 |
| 314 TEST_P(QuicChromiumClientSessionTest, CancelPushBeforeReceivingResponse) { | 368 TEST_P(QuicChromiumClientSessionTest, CancelPushBeforeReceivingResponse) { |
| 315 base::HistogramTester histogram_tester; | 369 base::HistogramTester histogram_tester; |
| 316 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; | 370 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
| 317 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket( | 371 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket( |
| 318 1, true, kServerDataStreamId1, QUIC_STREAM_CANCELLED)); | 372 1, true, kServerDataStreamId1, QUIC_STREAM_CANCELLED)); |
| 319 MockWrite writes[] = { | 373 MockWrite writes[] = { |
| 320 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1)}; | 374 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1)}; |
| 321 socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes, | 375 socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes, |
| 322 arraysize(writes))); | 376 arraysize(writes))); |
| 323 Initialize(); | 377 Initialize(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 334 session_->CreateOutgoingDynamicStream(kDefaultPriority); | 388 session_->CreateOutgoingDynamicStream(kDefaultPriority); |
| 335 EXPECT_TRUE(stream); | 389 EXPECT_TRUE(stream); |
| 336 | 390 |
| 337 SpdyHeaderBlock promise_headers; | 391 SpdyHeaderBlock promise_headers; |
| 338 promise_headers[":method"] = "GET"; | 392 promise_headers[":method"] = "GET"; |
| 339 promise_headers[":authority"] = "www.example.org"; | 393 promise_headers[":authority"] = "www.example.org"; |
| 340 promise_headers[":scheme"] = "https"; | 394 promise_headers[":scheme"] = "https"; |
| 341 promise_headers[":path"] = "/pushed.jpg"; | 395 promise_headers[":path"] = "/pushed.jpg"; |
| 342 | 396 |
| 343 // Receive a PUSH PROMISE from the server. | 397 // Receive a PUSH PROMISE from the server. |
| 344 session_->HandlePromised(stream->id(), kServerDataStreamId1, promise_headers); | 398 EXPECT_TRUE(session_->HandlePromised(stream->id(), kServerDataStreamId1, |
| 399 promise_headers)); |
| 345 | 400 |
| 346 QuicClientPromisedInfo* promised = | 401 QuicClientPromisedInfo* promised = |
| 347 session_->GetPromisedById(kServerDataStreamId1); | 402 session_->GetPromisedById(kServerDataStreamId1); |
| 348 EXPECT_TRUE(promised); | 403 EXPECT_TRUE(promised); |
| 349 // Cancel the push before receiving the response to the pushed request. | 404 // Cancel the push before receiving the response to the pushed request. |
| 350 GURL pushed_url("https://www.example.org/pushed.jpg"); | 405 GURL pushed_url("https://www.example.org/pushed.jpg"); |
| 351 session_->CancelPush(pushed_url); | 406 session_->CancelPush(pushed_url); |
| 352 | 407 |
| 353 EXPECT_FALSE(session_->GetPromisedByUrl(pushed_url.spec())); | 408 EXPECT_FALSE(session_->GetPromisedByUrl(pushed_url.spec())); |
| 354 EXPECT_EQ(0u, | 409 EXPECT_EQ(0u, |
| (...skipping 26 matching lines...) Expand all Loading... |
| 381 EXPECT_TRUE(stream); | 436 EXPECT_TRUE(stream); |
| 382 | 437 |
| 383 SpdyHeaderBlock promise_headers; | 438 SpdyHeaderBlock promise_headers; |
| 384 promise_headers[":method"] = "GET"; | 439 promise_headers[":method"] = "GET"; |
| 385 promise_headers[":authority"] = "www.example.org"; | 440 promise_headers[":authority"] = "www.example.org"; |
| 386 promise_headers[":scheme"] = "https"; | 441 promise_headers[":scheme"] = "https"; |
| 387 promise_headers[":path"] = "/pushed.jpg"; | 442 promise_headers[":path"] = "/pushed.jpg"; |
| 388 | 443 |
| 389 session_->GetOrCreateStream(kServerDataStreamId1); | 444 session_->GetOrCreateStream(kServerDataStreamId1); |
| 390 // Receive a PUSH PROMISE from the server. | 445 // Receive a PUSH PROMISE from the server. |
| 391 session_->HandlePromised(stream->id(), kServerDataStreamId1, promise_headers); | 446 EXPECT_TRUE(session_->HandlePromised(stream->id(), kServerDataStreamId1, |
| 447 promise_headers)); |
| 392 session_->OnInitialHeadersComplete(kServerDataStreamId1, SpdyHeaderBlock()); | 448 session_->OnInitialHeadersComplete(kServerDataStreamId1, SpdyHeaderBlock()); |
| 393 // Read data on the pushed stream. | 449 // Read data on the pushed stream. |
| 394 QuicStreamFrame data(kServerDataStreamId1, false, 0, StringPiece("SP")); | 450 QuicStreamFrame data(kServerDataStreamId1, false, 0, StringPiece("SP")); |
| 395 session_->OnStreamFrame(data); | 451 session_->OnStreamFrame(data); |
| 396 | 452 |
| 397 QuicClientPromisedInfo* promised = | 453 QuicClientPromisedInfo* promised = |
| 398 session_->GetPromisedById(kServerDataStreamId1); | 454 session_->GetPromisedById(kServerDataStreamId1); |
| 399 EXPECT_TRUE(promised); | 455 EXPECT_TRUE(promised); |
| 400 // Cancel the push after receiving data on the push stream. | 456 // Cancel the push after receiving data on the push stream. |
| 401 GURL pushed_url("https://www.example.org/pushed.jpg"); | 457 GURL pushed_url("https://www.example.org/pushed.jpg"); |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 751 | 807 |
| 752 EXPECT_TRUE(socket_data_->AllReadDataConsumed()); | 808 EXPECT_TRUE(socket_data_->AllReadDataConsumed()); |
| 753 EXPECT_TRUE(socket_data_->AllWriteDataConsumed()); | 809 EXPECT_TRUE(socket_data_->AllWriteDataConsumed()); |
| 754 EXPECT_TRUE(new_socket_data.AllReadDataConsumed()); | 810 EXPECT_TRUE(new_socket_data.AllReadDataConsumed()); |
| 755 EXPECT_TRUE(new_socket_data.AllWriteDataConsumed()); | 811 EXPECT_TRUE(new_socket_data.AllWriteDataConsumed()); |
| 756 } | 812 } |
| 757 | 813 |
| 758 } // namespace | 814 } // namespace |
| 759 } // namespace test | 815 } // namespace test |
| 760 } // namespace net | 816 } // namespace net |
| OLD | NEW |