diff options
Diffstat (limited to 'chromium/net/tools/quic/quic_spdy_client_session_test.cc')
-rw-r--r-- | chromium/net/tools/quic/quic_spdy_client_session_test.cc | 191 |
1 files changed, 150 insertions, 41 deletions
diff --git a/chromium/net/tools/quic/quic_spdy_client_session_test.cc b/chromium/net/tools/quic/quic_spdy_client_session_test.cc index a41ebe13778..afc3fec1038 100644 --- a/chromium/net/tools/quic/quic_spdy_client_session_test.cc +++ b/chromium/net/tools/quic/quic_spdy_client_session_test.cc @@ -13,6 +13,7 @@ #include "net/quic/platform/api/quic_ptr_util.h" #include "net/quic/platform/api/quic_socket_address.h" #include "net/quic/platform/api/quic_str_cat.h" +#include "net/quic/platform/api/quic_string.h" #include "net/quic/platform/api/quic_test.h" #include "net/quic/test_tools/crypto_test_utils.h" #include "net/quic/test_tools/mock_quic_spdy_client_stream.h" @@ -24,11 +25,10 @@ #include "net/tools/quic/quic_spdy_client_stream.h" using google::protobuf::implicit_cast; -using std::string; +using testing::_; using testing::AnyNumber; using testing::Invoke; using testing::Truly; -using testing::_; namespace net { namespace test { @@ -86,17 +86,17 @@ class QuicSpdyClientSessionTest : public QuicTestWithParam<ParsedQuicVersion> { connection_ = new PacketSavingConnection(&helper_, &alarm_factory_, Perspective::IS_CLIENT, SupportedVersions(GetParam())); - session_.reset(new TestQuicSpdyClientSession( + session_ = QuicMakeUnique<TestQuicSpdyClientSession>( DefaultQuicConfig(), connection_, QuicServerId(kServerHostname, kPort, PRIVACY_MODE_DISABLED), - &crypto_config_, &push_promise_index_)); + &crypto_config_, &push_promise_index_); session_->Initialize(); push_promise_[":path"] = "/bar"; push_promise_[":authority"] = "www.google.com"; push_promise_[":version"] = "HTTP/1.1"; push_promise_[":method"] = "GET"; push_promise_[":scheme"] = "https"; - promise_url_ = SpdyUtils::GetUrlFromHeaderBlock(push_promise_); + promise_url_ = SpdyUtils::GetPromisedUrlFromHeaders(push_promise_); promised_stream_id_ = QuicSpdySessionPeer::GetNthServerInitiatedStreamId(*session_, 0); associated_stream_id_ = @@ -125,7 +125,7 @@ class QuicSpdyClientSessionTest : public QuicTestWithParam<ParsedQuicVersion> { std::unique_ptr<TestQuicSpdyClientSession> session_; QuicClientPushPromiseIndex push_promise_index_; SpdyHeaderBlock push_promise_; - string promise_url_; + QuicString promise_url_; QuicStreamId promised_stream_id_; QuicStreamId associated_stream_id_; }; @@ -177,7 +177,12 @@ TEST_P(QuicSpdyClientSessionTest, NoEncryptionAfterInitialEncryption) { } TEST_P(QuicSpdyClientSessionTest, MaxNumStreamsWithNoFinOrRst) { - EXPECT_CALL(*connection_, SendRstStream(_, _, _)).Times(AnyNumber()); + if (session_->use_control_frame_manager()) { + EXPECT_CALL(*connection_, SendControlFrame(_)).Times(AnyNumber()); + EXPECT_CALL(*connection_, OnStreamReset(_, _)).Times(AnyNumber()); + } else { + EXPECT_CALL(*connection_, SendRstStream(_, _, _)).Times(AnyNumber()); + } const uint32_t kServerMaxIncomingStreams = 1; CompleteCryptoHandshake(kServerMaxIncomingStreams); @@ -196,7 +201,12 @@ TEST_P(QuicSpdyClientSessionTest, MaxNumStreamsWithNoFinOrRst) { } TEST_P(QuicSpdyClientSessionTest, MaxNumStreamsWithRst) { - EXPECT_CALL(*connection_, SendRstStream(_, _, _)).Times(AnyNumber()); + if (session_->use_control_frame_manager()) { + EXPECT_CALL(*connection_, SendControlFrame(_)).Times(AnyNumber()); + EXPECT_CALL(*connection_, OnStreamReset(_, _)).Times(AnyNumber()); + } else { + EXPECT_CALL(*connection_, SendRstStream(_, _, _)).Times(AnyNumber()); + } const uint32_t kServerMaxIncomingStreams = 1; CompleteCryptoHandshake(kServerMaxIncomingStreams); @@ -228,7 +238,12 @@ TEST_P(QuicSpdyClientSessionTest, ResetAndTrailers) { EXPECT_FALSE(session_->CreateOutgoingDynamicStream()); QuicStreamId stream_id = stream->id(); - EXPECT_CALL(*connection_, SendRstStream(_, _, _)).Times(1); + if (session_->use_control_frame_manager()) { + EXPECT_CALL(*connection_, SendControlFrame(_)).Times(1); + EXPECT_CALL(*connection_, OnStreamReset(_, _)).Times(1); + } else { + EXPECT_CALL(*connection_, SendRstStream(_, _, _)).Times(1); + } session_->SendRstStream(stream_id, QUIC_STREAM_PEER_GOING_AWAY, 0); // A new stream cannot be created as the reset stream still counts as an open @@ -264,7 +279,12 @@ TEST_P(QuicSpdyClientSessionTest, ReceivedMalformedTrailersAfterSendingRst) { // Send the RST, which results in the stream being closed locally (but some // state remains while the client waits for a response from the server). QuicStreamId stream_id = stream->id(); - EXPECT_CALL(*connection_, SendRstStream(_, _, _)).Times(1); + if (session_->use_control_frame_manager()) { + EXPECT_CALL(*connection_, SendControlFrame(_)).Times(1); + EXPECT_CALL(*connection_, OnStreamReset(_, _)).Times(1); + } else { + EXPECT_CALL(*connection_, SendRstStream(_, _, _)).Times(1); + } session_->SendRstStream(stream_id, QUIC_STREAM_PEER_GOING_AWAY, 0); // The stream receives trailers with final byte offset, but the header value @@ -371,8 +391,14 @@ TEST_P(QuicSpdyClientSessionTest, PushPromiseOnPromiseHeadersAlreadyClosed) { session_->CreateOutgoingDynamicStream(); - EXPECT_CALL(*connection_, - SendRstStream(associated_stream_id_, QUIC_REFUSED_STREAM, 0)); + if (session_->use_control_frame_manager()) { + EXPECT_CALL(*connection_, SendControlFrame(_)); + EXPECT_CALL(*connection_, + OnStreamReset(associated_stream_id_, QUIC_REFUSED_STREAM)); + } else { + EXPECT_CALL(*connection_, + SendRstStream(associated_stream_id_, QUIC_REFUSED_STREAM, 0)); + } session_->ResetPromised(associated_stream_id_, QUIC_REFUSED_STREAM); session_->OnPromiseHeaderList(associated_stream_id_, promised_stream_id_, 0, @@ -405,8 +431,8 @@ TEST_P(QuicSpdyClientSessionTest, PushPromiseHandlePromise) { session_->CreateOutgoingDynamicStream(); - session_->HandlePromised(associated_stream_id_, promised_stream_id_, - push_promise_); + EXPECT_TRUE(session_->HandlePromised(associated_stream_id_, + promised_stream_id_, push_promise_)); EXPECT_NE(session_->GetPromisedById(promised_stream_id_), nullptr); EXPECT_NE(session_->GetPromisedByUrl(promise_url_), nullptr); @@ -419,13 +445,19 @@ TEST_P(QuicSpdyClientSessionTest, PushPromiseAlreadyClosed) { session_->CreateOutgoingDynamicStream(); session_->GetOrCreateStream(promised_stream_id_); - EXPECT_CALL(*connection_, - SendRstStream(promised_stream_id_, QUIC_REFUSED_STREAM, 0)); + if (session_->use_control_frame_manager()) { + EXPECT_CALL(*connection_, SendControlFrame(_)); + EXPECT_CALL(*connection_, + OnStreamReset(promised_stream_id_, QUIC_REFUSED_STREAM)); + } else { + EXPECT_CALL(*connection_, + SendRstStream(promised_stream_id_, QUIC_REFUSED_STREAM, 0)); + } session_->ResetPromised(promised_stream_id_, QUIC_REFUSED_STREAM); SpdyHeaderBlock promise_headers; - session_->HandlePromised(associated_stream_id_, promised_stream_id_, - promise_headers); + EXPECT_FALSE(session_->HandlePromised(associated_stream_id_, + promised_stream_id_, promise_headers)); // Verify that the promise was not created. EXPECT_EQ(session_->GetPromisedById(promised_stream_id_), nullptr); @@ -438,18 +470,24 @@ TEST_P(QuicSpdyClientSessionTest, PushPromiseDuplicateUrl) { session_->CreateOutgoingDynamicStream(); - session_->HandlePromised(associated_stream_id_, promised_stream_id_, - push_promise_); + EXPECT_TRUE(session_->HandlePromised(associated_stream_id_, + promised_stream_id_, push_promise_)); EXPECT_NE(session_->GetPromisedById(promised_stream_id_), nullptr); EXPECT_NE(session_->GetPromisedByUrl(promise_url_), nullptr); promised_stream_id_ += 2; - EXPECT_CALL(*connection_, SendRstStream(promised_stream_id_, - QUIC_DUPLICATE_PROMISE_URL, 0)); + if (session_->use_control_frame_manager()) { + EXPECT_CALL(*connection_, SendControlFrame(_)); + EXPECT_CALL(*connection_, + OnStreamReset(promised_stream_id_, QUIC_DUPLICATE_PROMISE_URL)); + } else { + EXPECT_CALL(*connection_, SendRstStream(promised_stream_id_, + QUIC_DUPLICATE_PROMISE_URL, 0)); + } - session_->HandlePromised(associated_stream_id_, promised_stream_id_, - push_promise_); + EXPECT_FALSE(session_->HandlePromised(associated_stream_id_, + promised_stream_id_, push_promise_)); // Verify that the promise was not created. EXPECT_EQ(session_->GetPromisedById(promised_stream_id_), nullptr); @@ -461,10 +499,11 @@ TEST_P(QuicSpdyClientSessionTest, ReceivingPromiseEnhanceYourCalm) { QuicStreamId id = promised_stream_id_ + i * 2; - session_->HandlePromised(associated_stream_id_, id, push_promise_); + EXPECT_TRUE( + session_->HandlePromised(associated_stream_id_, id, push_promise_)); // Verify that the promise is in the unclaimed streams map. - string promise_url(SpdyUtils::GetUrlFromHeaderBlock(push_promise_)); + QuicString promise_url(SpdyUtils::GetPromisedUrlFromHeaders(push_promise_)); EXPECT_NE(session_->GetPromisedByUrl(promise_url), nullptr); EXPECT_NE(session_->GetPromisedById(id), nullptr); } @@ -474,11 +513,17 @@ TEST_P(QuicSpdyClientSessionTest, ReceivingPromiseEnhanceYourCalm) { push_promise_[":path"] = QuicStringPrintf("/bar%d", i); QuicStreamId id = promised_stream_id_ + i * 2; - EXPECT_CALL(*connection_, SendRstStream(id, QUIC_REFUSED_STREAM, 0)); - session_->HandlePromised(associated_stream_id_, id, push_promise_); + if (session_->use_control_frame_manager()) { + EXPECT_CALL(*connection_, SendControlFrame(_)); + EXPECT_CALL(*connection_, OnStreamReset(id, QUIC_REFUSED_STREAM)); + } else { + EXPECT_CALL(*connection_, SendRstStream(id, QUIC_REFUSED_STREAM, 0)); + } + EXPECT_FALSE( + session_->HandlePromised(associated_stream_id_, id, push_promise_)); // Verify that the promise was not created. - string promise_url(SpdyUtils::GetUrlFromHeaderBlock(push_promise_)); + QuicString promise_url(SpdyUtils::GetPromisedUrlFromHeaders(push_promise_)); EXPECT_EQ(session_->GetPromisedById(id), nullptr); EXPECT_EQ(session_->GetPromisedByUrl(promise_url), nullptr); } @@ -488,8 +533,14 @@ TEST_P(QuicSpdyClientSessionTest, IsClosedTrueAfterResetPromisedAlreadyOpen) { CompleteCryptoHandshake(); session_->GetOrCreateStream(promised_stream_id_); - EXPECT_CALL(*connection_, - SendRstStream(promised_stream_id_, QUIC_REFUSED_STREAM, 0)); + if (session_->use_control_frame_manager()) { + EXPECT_CALL(*connection_, SendControlFrame(_)); + EXPECT_CALL(*connection_, + OnStreamReset(promised_stream_id_, QUIC_REFUSED_STREAM)); + } else { + EXPECT_CALL(*connection_, + SendRstStream(promised_stream_id_, QUIC_REFUSED_STREAM, 0)); + } session_->ResetPromised(promised_stream_id_, QUIC_REFUSED_STREAM); EXPECT_TRUE(session_->IsClosedStream(promised_stream_id_)); } @@ -498,8 +549,14 @@ TEST_P(QuicSpdyClientSessionTest, IsClosedTrueAfterResetPromisedNonexistant) { // Initialize crypto before the client session will create a stream. CompleteCryptoHandshake(); - EXPECT_CALL(*connection_, - SendRstStream(promised_stream_id_, QUIC_REFUSED_STREAM, 0)); + if (session_->use_control_frame_manager()) { + EXPECT_CALL(*connection_, SendControlFrame(_)); + EXPECT_CALL(*connection_, + OnStreamReset(promised_stream_id_, QUIC_REFUSED_STREAM)); + } else { + EXPECT_CALL(*connection_, + SendRstStream(promised_stream_id_, QUIC_REFUSED_STREAM, 0)); + } session_->ResetPromised(promised_stream_id_, QUIC_REFUSED_STREAM); EXPECT_TRUE(session_->IsClosedStream(promised_stream_id_)); } @@ -508,8 +565,8 @@ TEST_P(QuicSpdyClientSessionTest, OnInitialHeadersCompleteIsPush) { // Initialize crypto before the client session will create a stream. CompleteCryptoHandshake(); session_->GetOrCreateStream(promised_stream_id_); - session_->HandlePromised(associated_stream_id_, promised_stream_id_, - push_promise_); + EXPECT_TRUE(session_->HandlePromised(associated_stream_id_, + promised_stream_id_, push_promise_)); EXPECT_NE(session_->GetPromisedById(promised_stream_id_), nullptr); EXPECT_NE(session_->GetPromisedStream(promised_stream_id_), nullptr); EXPECT_NE(session_->GetPromisedByUrl(promise_url_), nullptr); @@ -528,8 +585,8 @@ TEST_P(QuicSpdyClientSessionTest, DeletePromised) { // Initialize crypto before the client session will create a stream. CompleteCryptoHandshake(); session_->GetOrCreateStream(promised_stream_id_); - session_->HandlePromised(associated_stream_id_, promised_stream_id_, - push_promise_); + EXPECT_TRUE(session_->HandlePromised(associated_stream_id_, + promised_stream_id_, push_promise_)); QuicClientPromisedInfo* promised = session_->GetPromisedById(promised_stream_id_); EXPECT_NE(promised, nullptr); @@ -545,10 +602,16 @@ TEST_P(QuicSpdyClientSessionTest, ResetPromised) { // Initialize crypto before the client session will create a stream. CompleteCryptoHandshake(); session_->GetOrCreateStream(promised_stream_id_); - session_->HandlePromised(associated_stream_id_, promised_stream_id_, - push_promise_); - EXPECT_CALL(*connection_, SendRstStream(promised_stream_id_, - QUIC_STREAM_PEER_GOING_AWAY, 0)); + EXPECT_TRUE(session_->HandlePromised(associated_stream_id_, + promised_stream_id_, push_promise_)); + if (session_->use_control_frame_manager()) { + EXPECT_CALL(*connection_, SendControlFrame(_)); + EXPECT_CALL(*connection_, OnStreamReset(promised_stream_id_, + QUIC_STREAM_PEER_GOING_AWAY)); + } else { + EXPECT_CALL(*connection_, SendRstStream(promised_stream_id_, + QUIC_STREAM_PEER_GOING_AWAY, 0)); + } session_->SendRstStream(promised_stream_id_, QUIC_STREAM_PEER_GOING_AWAY, 0); QuicClientPromisedInfo* promised = session_->GetPromisedById(promised_stream_id_); @@ -557,6 +620,52 @@ TEST_P(QuicSpdyClientSessionTest, ResetPromised) { EXPECT_EQ(session_->GetPromisedStream(promised_stream_id_), nullptr); } +TEST_P(QuicSpdyClientSessionTest, PushPromiseInvalidMethod) { + // Initialize crypto before the client session will create a stream. + CompleteCryptoHandshake(); + + session_->CreateOutgoingDynamicStream(); + + if (session_->use_control_frame_manager()) { + EXPECT_CALL(*connection_, SendControlFrame(_)); + EXPECT_CALL(*connection_, OnStreamReset(promised_stream_id_, + QUIC_INVALID_PROMISE_METHOD)); + } else { + EXPECT_CALL(*connection_, SendRstStream(promised_stream_id_, + QUIC_INVALID_PROMISE_METHOD, 0)); + } + + push_promise_[":method"] = "POST"; + EXPECT_FALSE(session_->HandlePromised(associated_stream_id_, + promised_stream_id_, push_promise_)); + + EXPECT_EQ(session_->GetPromisedById(promised_stream_id_), nullptr); + EXPECT_EQ(session_->GetPromisedByUrl(promise_url_), nullptr); +} + +TEST_P(QuicSpdyClientSessionTest, PushPromiseInvalidHost) { + // Initialize crypto before the client session will create a stream. + CompleteCryptoHandshake(); + + session_->CreateOutgoingDynamicStream(); + + if (session_->use_control_frame_manager()) { + EXPECT_CALL(*connection_, SendControlFrame(_)); + EXPECT_CALL(*connection_, + OnStreamReset(promised_stream_id_, QUIC_INVALID_PROMISE_URL)); + } else { + EXPECT_CALL(*connection_, SendRstStream(promised_stream_id_, + QUIC_INVALID_PROMISE_URL, 0)); + } + + push_promise_[":authority"] = ""; + EXPECT_FALSE(session_->HandlePromised(associated_stream_id_, + promised_stream_id_, push_promise_)); + + EXPECT_EQ(session_->GetPromisedById(promised_stream_id_), nullptr); + EXPECT_EQ(session_->GetPromisedByUrl(promise_url_), nullptr); +} + } // namespace } // namespace test } // namespace net |