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 24066535349d4b8755742c03c162f1b6ebdc76c7..1f4d586b4050650ef60187aa7f4e394cf4a0286a 100644 |
--- a/net/quic/quic_headers_stream_test.cc |
+++ b/net/quic/quic_headers_stream_test.cc |
@@ -225,7 +225,7 @@ class QuicHeadersStreamTest : public ::testing::TestWithParam<TestParams> { |
void CloseConnection() { QuicConnectionPeer::CloseConnection(connection_); } |
- QuicStreamId NextPromisedStreamId() { return next_promised_stream_id_++; } |
+ QuicStreamId NextPromisedStreamId() { return next_promised_stream_id_ += 2; } |
static const bool kFrameComplete = true; |
static const bool kHasPriority = true; |
@@ -338,6 +338,83 @@ TEST_P(QuicHeadersStreamTest, ProcessRawData) { |
} |
} |
+TEST_P(QuicHeadersStreamTest, ProcessPushPromise) { |
+ FLAGS_quic_supports_push_promise = true; |
+ for (QuicStreamId stream_id = kClientDataStreamId1; |
+ stream_id < kClientDataStreamId3; stream_id += 2) { |
+ QuicStreamId promised_stream_id = NextPromisedStreamId(); |
+ scoped_ptr<SpdySerializedFrame> frame; |
+ SpdyPushPromiseIR push_promise(stream_id, promised_stream_id); |
+ push_promise.set_header_block(headers_); |
+ frame.reset(framer_.SerializeFrame(push_promise)); |
+ if (perspective() == Perspective::IS_SERVER) { |
+ EXPECT_CALL(*connection_, SendConnectionCloseWithDetails( |
+ QUIC_INVALID_HEADERS_STREAM_DATA, |
+ "PUSH_PROMISE not supported.")) |
+ .WillRepeatedly( |
+ InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
+ } else { |
+ EXPECT_CALL(session_, OnPromiseHeaders(stream_id, _)) |
+ .WillRepeatedly(WithArgs<1>( |
+ Invoke(this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); |
+ EXPECT_CALL(session_, OnPromiseHeadersComplete( |
+ stream_id, promised_stream_id, frame->size())); |
+ } |
+ stream_frame_.frame_buffer = frame->data(); |
+ stream_frame_.frame_length = frame->size(); |
+ headers_stream_->OnStreamFrame(stream_frame_); |
+ if (perspective() == Perspective::IS_CLIENT) { |
+ stream_frame_.offset += frame->size(); |
+ CheckHeaders(); |
+ } |
+ } |
+} |
+ |
+TEST_P(QuicHeadersStreamTest, PushPromiseOutOfOrder) { |
+ FLAGS_quic_supports_push_promise = true; |
+ if (perspective() == Perspective::IS_SERVER) { |
+ return; |
+ } |
+ |
+ QuicStreamId promised_stream_id = NextPromisedStreamId(); |
+ QuicStreamId stream_id = kClientDataStreamId1; |
+ |
+ scoped_ptr<SpdySerializedFrame> frame; |
+ SpdyPushPromiseIR push_promise(stream_id, promised_stream_id); |
+ push_promise.set_header_block(headers_); |
+ frame.reset(framer_.SerializeFrame(push_promise)); |
+ EXPECT_CALL(session_, OnPromiseHeaders(stream_id, _)) |
+ .WillRepeatedly(WithArgs<1>( |
+ Invoke(this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); |
+ EXPECT_CALL(session_, OnPromiseHeadersComplete(stream_id, promised_stream_id, |
+ frame->size())); |
+ stream_frame_.frame_buffer = frame->data(); |
+ stream_frame_.frame_length = frame->size(); |
+ headers_stream_->OnStreamFrame(stream_frame_); |
+ if (perspective() == Perspective::IS_CLIENT) { |
+ stream_frame_.offset += frame->size(); |
+ CheckHeaders(); |
+ } |
+ |
+ stream_id += 2; |
+ push_promise.set_stream_id(stream_id); |
+ frame.reset(framer_.SerializeFrame(push_promise)); |
+ EXPECT_CALL(session_, OnPromiseHeaders(stream_id, _)) |
+ .WillRepeatedly(WithArgs<1>( |
+ Invoke(this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); |
+ EXPECT_CALL(session_, OnPromiseHeadersComplete(stream_id, promised_stream_id, |
+ frame->size())); |
+ EXPECT_CALL(*connection_, SendConnectionCloseWithDetails( |
+ QUIC_INVALID_STREAM_ID, |
+ "Received push stream id lesser or equal to the" |
+ " last accepted before")) |
+ .WillRepeatedly( |
+ InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
+ stream_frame_.frame_buffer = frame->data(); |
+ stream_frame_.frame_length = frame->size(); |
+ headers_stream_->OnStreamFrame(stream_frame_); |
+} |
+ |
TEST_P(QuicHeadersStreamTest, EmptyHeaderHOLBlockedTime) { |
EXPECT_CALL(session_, OnHeadersHeadOfLineBlocking(_)).Times(0); |
testing::InSequence seq; |