| 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..b9469249f922ff271da969b653ab1d9d7b878d55 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, CancelPushBeforeReceivingResponse) { | 
| +  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( | 
|  |