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 b9469249f922ff271da969b653ab1d9d7b878d55..aca82cac42b650ca21ba8dcf02384ba33e9872db 100644 |
--- a/net/quic/chromium/quic_chromium_client_session_test.cc |
+++ b/net/quic/chromium/quic_chromium_client_session_test.cc |
@@ -44,6 +44,7 @@ |
#include "net/test/cert_test_util.h" |
#include "net/test/gtest_util.h" |
#include "net/test/test_data_directory.h" |
+#include "net/tools/quic/test_tools/push_promise_delegate.h" |
#include "net/udp/datagram_client_socket.h" |
#include "testing/gmock/include/gmock/gmock.h" |
@@ -165,13 +166,13 @@ class QuicChromiumClientSessionTest |
MockAlarmFactory alarm_factory_; |
TransportSecurityState transport_security_state_; |
MockCryptoClientStreamFactory crypto_client_stream_factory_; |
+ QuicClientPushPromiseIndex push_promise_index_; |
std::unique_ptr<QuicChromiumClientSession> session_; |
QuicConnectionVisitorInterface* visitor_; |
TestCompletionCallback callback_; |
QuicTestPacketMaker client_maker_; |
QuicTestPacketMaker server_maker_; |
ProofVerifyDetailsChromium verify_details_; |
- QuicClientPushPromiseIndex push_promise_index_; |
}; |
INSTANTIATE_TEST_CASE_P(Tests, |
@@ -248,7 +249,8 @@ TEST_P(QuicChromiumClientSessionTest, PushStreamTimedOutNoResponse) { |
promise_headers[":path"] = "/pushed.jpg"; |
// Receive a PUSH PROMISE from the server. |
- session_->HandlePromised(stream->id(), kServerDataStreamId1, promise_headers); |
+ EXPECT_TRUE(session_->HandlePromised(stream->id(), kServerDataStreamId1, |
+ promise_headers)); |
QuicClientPromisedInfo* promised = |
session_->GetPromisedById(kServerDataStreamId1); |
@@ -294,7 +296,8 @@ TEST_P(QuicChromiumClientSessionTest, PushStreamTimedOutWithResponse) { |
session_->GetOrCreateStream(kServerDataStreamId1); |
// Receive a PUSH PROMISE from the server. |
- session_->HandlePromised(stream->id(), kServerDataStreamId1, promise_headers); |
+ EXPECT_TRUE(session_->HandlePromised(stream->id(), kServerDataStreamId1, |
+ promise_headers)); |
session_->OnInitialHeadersComplete(kServerDataStreamId1, SpdyHeaderBlock()); |
// Read data on the pushed stream. |
QuicStreamFrame data(kServerDataStreamId1, false, 0, StringPiece("SP")); |
@@ -311,6 +314,57 @@ TEST_P(QuicChromiumClientSessionTest, PushStreamTimedOutWithResponse) { |
session_.get())); |
} |
+TEST_P(QuicChromiumClientSessionTest, CancelPushWhenPendingValidation) { |
+ MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
+ std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket( |
+ 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT)); |
+ |
+ 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. |
+ EXPECT_TRUE(session_->HandlePromised(stream->id(), kServerDataStreamId1, |
+ promise_headers)); |
+ |
+ QuicClientPromisedInfo* promised = |
+ session_->GetPromisedById(kServerDataStreamId1); |
+ EXPECT_TRUE(promised); |
+ |
+ // Initiate rendezvous. |
+ SpdyHeaderBlock client_request = promise_headers.Clone(); |
+ PushPromiseDelegate delegate(/*match=*/true); |
+ promised->HandleClientRequest(client_request, &delegate); |
+ |
+ // 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_TRUE(session_->GetPromisedByUrl(pushed_url.spec())); |
+ |
+ // Reset the stream now before tear down. |
+ session_->CloseStream(kClientDataStreamId1); |
+} |
+ |
TEST_P(QuicChromiumClientSessionTest, CancelPushBeforeReceivingResponse) { |
base::HistogramTester histogram_tester; |
MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
@@ -341,7 +395,8 @@ TEST_P(QuicChromiumClientSessionTest, CancelPushBeforeReceivingResponse) { |
promise_headers[":path"] = "/pushed.jpg"; |
// Receive a PUSH PROMISE from the server. |
- session_->HandlePromised(stream->id(), kServerDataStreamId1, promise_headers); |
+ EXPECT_TRUE(session_->HandlePromised(stream->id(), kServerDataStreamId1, |
+ promise_headers)); |
QuicClientPromisedInfo* promised = |
session_->GetPromisedById(kServerDataStreamId1); |
@@ -388,7 +443,8 @@ TEST_P(QuicChromiumClientSessionTest, CancelPushAfterReceivingResponse) { |
session_->GetOrCreateStream(kServerDataStreamId1); |
// Receive a PUSH PROMISE from the server. |
- session_->HandlePromised(stream->id(), kServerDataStreamId1, promise_headers); |
+ EXPECT_TRUE(session_->HandlePromised(stream->id(), kServerDataStreamId1, |
+ promise_headers)); |
session_->OnInitialHeadersComplete(kServerDataStreamId1, SpdyHeaderBlock()); |
// Read data on the pushed stream. |
QuicStreamFrame data(kServerDataStreamId1, false, 0, StringPiece("SP")); |