summaryrefslogtreecommitdiff
path: root/chromium/net/tools/quic/quic_spdy_client_session_test.cc
diff options
context:
space:
mode:
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.cc191
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