Chromium Code Reviews| Index: net/quic/chromium/quic_chromium_client_session_test.cc |
| diff --git a/net/quic/chromium/quic_chromium_client_session_test.cc b/net/quic/chromium/quic_chromium_client_session_test.cc |
| index c6fcf6543c98466f110e5c6d50155124e160115d..3aaf05f531f63e5d4be2a71a872ed21cfa7595c2 100644 |
| --- a/net/quic/chromium/quic_chromium_client_session_test.cc |
| +++ b/net/quic/chromium/quic_chromium_client_session_test.cc |
| @@ -311,6 +311,103 @@ TEST_P(QuicChromiumClientSessionTest, PushStreamTimedOutWithResponse) { |
| session_.get())); |
| } |
| +TEST_P(QuicChromiumClientSessionTest, CancelPushBeforeReceiveResponse) { |
|
Ryan Hamilton
2016/10/27 17:00:25
nit: s/Receive/Receiving/
Zhongyi Shi
2016/10/27 17:57:29
Done.
|
| + base::HistogramTester histogram_tester; |
| + MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
| + std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket( |
| + 1, true, kServerDataStreamId1, QUIC_STREAM_CANCELLED)); |
| + MockWrite writes[] = { |
| + MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1)}; |
| + socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes, |
| + arraysize(writes))); |
| + Initialize(); |
| + |
| + ProofVerifyDetailsChromium details; |
| + details.cert_verify_result.verified_cert = |
| + ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); |
| + ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); |
| + |
| + CompleteCryptoHandshake(); |
| + session_->OnProofVerifyDetailsAvailable(details); |
| + |
| + QuicChromiumClientStream* stream = |
| + session_->CreateOutgoingDynamicStream(kDefaultPriority); |
| + EXPECT_TRUE(stream); |
| + |
| + SpdyHeaderBlock promise_headers; |
| + promise_headers[":method"] = "GET"; |
| + promise_headers[":authority"] = "www.example.org"; |
| + promise_headers[":scheme"] = "https"; |
| + promise_headers[":path"] = "/pushed.jpg"; |
| + |
| + // Receive a PUSH PROMISE from the server. |
| + session_->HandlePromised(stream->id(), kServerDataStreamId1, promise_headers); |
| + |
| + QuicClientPromisedInfo* promised = |
| + session_->GetPromisedById(kServerDataStreamId1); |
| + EXPECT_TRUE(promised); |
| + // Cancel the push before receiving the response to the pushed request. |
| + GURL pushed_url("https://www.example.org/pushed.jpg"); |
| + session_->CancelPush(pushed_url); |
| + |
| + EXPECT_FALSE(session_->GetPromisedByUrl(pushed_url.spec())); |
| + EXPECT_EQ(0u, |
| + QuicChromiumClientSessionPeer::GetPushedBytesCount(session_.get())); |
| + EXPECT_EQ(0u, QuicChromiumClientSessionPeer::GetPushedAndUnclaimedBytesCount( |
| + session_.get())); |
| +} |
| + |
| +TEST_P(QuicChromiumClientSessionTest, CancelPushAfterReceivingResponse) { |
| + base::HistogramTester histogram_tester; |
| + MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
| + std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket( |
| + 1, true, kServerDataStreamId1, QUIC_STREAM_CANCELLED)); |
| + MockWrite writes[] = { |
| + MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1)}; |
| + socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes, |
| + arraysize(writes))); |
| + Initialize(); |
| + |
| + ProofVerifyDetailsChromium details; |
| + details.cert_verify_result.verified_cert = |
| + ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); |
| + ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); |
| + |
| + CompleteCryptoHandshake(); |
| + session_->OnProofVerifyDetailsAvailable(details); |
| + |
| + QuicChromiumClientStream* stream = |
| + session_->CreateOutgoingDynamicStream(kDefaultPriority); |
| + EXPECT_TRUE(stream); |
| + |
| + SpdyHeaderBlock promise_headers; |
| + promise_headers[":method"] = "GET"; |
| + promise_headers[":authority"] = "www.example.org"; |
| + promise_headers[":scheme"] = "https"; |
| + promise_headers[":path"] = "/pushed.jpg"; |
| + |
| + session_->GetOrCreateStream(kServerDataStreamId1); |
| + // Receive a PUSH PROMISE from the server. |
| + session_->HandlePromised(stream->id(), kServerDataStreamId1, promise_headers); |
| + session_->OnInitialHeadersComplete(kServerDataStreamId1, SpdyHeaderBlock()); |
| + // Read data on the pushed stream. |
| + QuicStreamFrame data(kServerDataStreamId1, false, 0, StringPiece("SP")); |
| + session_->OnStreamFrame(data); |
| + |
| + QuicClientPromisedInfo* promised = |
| + session_->GetPromisedById(kServerDataStreamId1); |
| + EXPECT_TRUE(promised); |
| + // Cancel the push after receiving data on the push stream. |
| + GURL pushed_url("https://www.example.org/pushed.jpg"); |
| + session_->CancelPush(pushed_url); |
| + |
| + EXPECT_FALSE(session_->GetPromisedByUrl(pushed_url.spec())); |
| + EXPECT_EQ(2u, |
| + QuicChromiumClientSessionPeer::GetPushedBytesCount(session_.get())); |
| + EXPECT_EQ(2u, QuicChromiumClientSessionPeer::GetPushedAndUnclaimedBytesCount( |
| + session_.get())); |
| +} |
| + |
| TEST_P(QuicChromiumClientSessionTest, Priority) { |
| MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
| std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket( |