| 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"));
|
|
|