Index: net/quic/quic_headers_stream_test.cc |
diff --git a/net/quic/quic_headers_stream_test.cc b/net/quic/quic_headers_stream_test.cc |
index 95c923df5df2ff3b4d71bcdab91f9ed8d8021d33..9cad397c44dcf3bf6a96bdd1579fbb28f8dbd80e 100644 |
--- a/net/quic/quic_headers_stream_test.cc |
+++ b/net/quic/quic_headers_stream_test.cc |
@@ -13,6 +13,7 @@ |
#include "net/spdy/spdy_alt_svc_wire_format.h" |
#include "net/spdy/spdy_protocol.h" |
#include "net/spdy/spdy_test_utils.h" |
+#include "net/test/gtest_util.h" |
#include "testing/gtest/include/gtest/gtest.h" |
using base::StringPiece; |
@@ -126,7 +127,8 @@ class QuicHeadersStreamTest : public ::testing::TestWithParam<TestParams> { |
headers_stream_(QuicSpdySessionPeer::GetHeadersStream(&session_)), |
body_("hello world"), |
framer_(HTTP2), |
- stream_frame_(kHeadersStreamId, /*fin=*/false, /*offset=*/0, "") { |
+ stream_frame_(kHeadersStreamId, /*fin=*/false, /*offset=*/0, ""), |
+ next_promised_stream_id_(2) { |
headers_[":version"] = "HTTP/1.1"; |
headers_[":status"] = "200 Ok"; |
headers_["content-length"] = "11"; |
@@ -157,7 +159,7 @@ class QuicHeadersStreamTest : public ::testing::TestWithParam<TestParams> { |
void WriteHeadersAndExpectSynStream(QuicStreamId stream_id, |
bool fin, |
- QuicPriority priority) { |
+ SpdyPriority priority) { |
WriteHeadersAndCheckData(stream_id, fin, priority, SYN_STREAM); |
} |
@@ -168,7 +170,7 @@ class QuicHeadersStreamTest : public ::testing::TestWithParam<TestParams> { |
void WriteHeadersAndCheckData(QuicStreamId stream_id, |
bool fin, |
- QuicPriority priority, |
+ SpdyPriority priority, |
SpdyFrameType type) { |
// Write the headers and capture the outgoing data |
EXPECT_CALL(session_, WritevData(kHeadersStreamId, _, _, false, _, nullptr)) |
@@ -224,6 +226,8 @@ class QuicHeadersStreamTest : public ::testing::TestWithParam<TestParams> { |
QuicConnectionPeer::CloseConnection(connection_); |
} |
+ QuicStreamId NextPromisedStreamId() { return next_promised_stream_id_++; } |
+ |
static const bool kFrameComplete = true; |
static const bool kHasPriority = true; |
@@ -238,6 +242,7 @@ class QuicHeadersStreamTest : public ::testing::TestWithParam<TestParams> { |
SpdyFramer framer_; |
StrictMock<MockVisitor> visitor_; |
QuicStreamFrame stream_frame_; |
+ QuicStreamId next_promised_stream_id_; |
}; |
INSTANTIATE_TEST_CASE_P(Tests, |
@@ -248,8 +253,8 @@ TEST_P(QuicHeadersStreamTest, StreamId) { |
EXPECT_EQ(3u, headers_stream_->id()); |
} |
-TEST_P(QuicHeadersStreamTest, EffectivePriority) { |
- EXPECT_EQ(0u, headers_stream_->EffectivePriority()); |
+TEST_P(QuicHeadersStreamTest, Priority) { |
+ EXPECT_EQ(0u, headers_stream_->Priority()); |
} |
TEST_P(QuicHeadersStreamTest, WriteHeaders) { |
@@ -259,7 +264,7 @@ TEST_P(QuicHeadersStreamTest, WriteHeaders) { |
if (perspective() == Perspective::IS_SERVER) { |
WriteHeadersAndExpectSynReply(stream_id, fin); |
} else { |
- for (QuicPriority priority = 0; priority < 7; ++priority) { |
+ for (SpdyPriority priority = 0; priority < 7; ++priority) { |
// TODO(rch): implement priorities correctly. |
WriteHeadersAndExpectSynStream(stream_id, fin, 0); |
} |
@@ -268,11 +273,42 @@ TEST_P(QuicHeadersStreamTest, WriteHeaders) { |
} |
} |
+TEST_P(QuicHeadersStreamTest, WritePushPromises) { |
+ for (QuicStreamId stream_id = kClientDataStreamId1; |
+ stream_id < kClientDataStreamId3; stream_id += 2) { |
+ QuicStreamId promised_stream_id = NextPromisedStreamId(); |
+ if (perspective() == Perspective::IS_SERVER) { |
+ // Write the headers and capture the outgoing data |
+ EXPECT_CALL(session_, |
+ WritevData(kHeadersStreamId, _, _, false, _, nullptr)) |
+ .WillOnce(WithArgs<1>(Invoke(this, &QuicHeadersStreamTest::SaveIov))); |
+ headers_stream_->WritePushPromise(stream_id, promised_stream_id, headers_, |
+ nullptr); |
+ |
+ // Parse the outgoing data and check that it matches was was written. |
+ EXPECT_CALL(visitor_, |
+ OnPushPromise(stream_id, promised_stream_id, kFrameComplete)); |
+ EXPECT_CALL(visitor_, OnControlFrameHeaderData(stream_id, _, _)) |
+ .WillRepeatedly(WithArgs<1, 2>( |
+ Invoke(this, &QuicHeadersStreamTest::SaveHeaderData))); |
+ framer_.ProcessInput(saved_data_.data(), saved_data_.length()); |
+ EXPECT_FALSE(framer_.HasError()) |
+ << SpdyFramer::ErrorCodeToString(framer_.error_code()); |
+ CheckHeaders(); |
+ saved_data_.clear(); |
+ } else { |
+ EXPECT_DFATAL(headers_stream_->WritePushPromise( |
+ stream_id, promised_stream_id, headers_, nullptr), |
+ "Client shouldn't send PUSH_PROMISE"); |
+ } |
+ } |
+} |
+ |
TEST_P(QuicHeadersStreamTest, ProcessRawData) { |
for (QuicStreamId stream_id = kClientDataStreamId1; |
stream_id < kClientDataStreamId3; stream_id += 2) { |
- for (bool fin : kFins) { |
- for (QuicPriority priority = 0; priority < 7; ++priority) { |
+ for (bool fin : {false, true}) { |
+ for (SpdyPriority priority = 0; priority < 7; ++priority) { |
// Replace with "WriteHeadersAndSaveData" |
scoped_ptr<SpdySerializedFrame> frame; |
if (perspective() == Perspective::IS_SERVER) { |
@@ -389,8 +425,8 @@ TEST_P(QuicHeadersStreamTest, ProcessLargeRawData) { |
headers_["key2"] = string(1 << 13, '.'); |
for (QuicStreamId stream_id = kClientDataStreamId1; |
stream_id < kClientDataStreamId3; stream_id += 2) { |
- for (bool fin : kFins) { |
- for (QuicPriority priority = 0; priority < 7; ++priority) { |
+ for (bool fin : {false, true}) { |
+ for (SpdyPriority priority = 0; priority < 7; ++priority) { |
// Replace with "WriteHeadersAndSaveData" |
scoped_ptr<SpdySerializedFrame> frame; |
if (perspective() == Perspective::IS_SERVER) { |