Index: net/spdy/spdy_framer_test.cc |
diff --git a/net/spdy/spdy_framer_test.cc b/net/spdy/spdy_framer_test.cc |
index 5dd60fb6fae684624fa943b6f730f438d1a32ed3..dfb1f9fa89c91857d25433a1d196d1135098cddf 100644 |
--- a/net/spdy/spdy_framer_test.cc |
+++ b/net/spdy/spdy_framer_test.cc |
@@ -3784,29 +3784,34 @@ TEST_P(SpdyFramerTest, ReadCompressedPushPromise) { |
EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); |
} |
-TEST_P(SpdyFramerTest, ReadHeadersWithContinuation) { |
+TEST_P(SpdyFramerTest, ReadHeadersWithContinuationAndPadding) { |
if (spdy_version_ <= SPDY3) { |
return; |
} |
const unsigned char kInput[] = { |
- 0x00, 0x10, 0x01, 0x00, // HEADERS |
+ 0x00, 0x14, 0x01, 0x08, // HEADERS: PAD_LOW |
0x00, 0x00, 0x00, 0x01, // Stream 1 |
+ 0x03, // Padding of 3. |
0x00, 0x06, 0x63, 0x6f, |
0x6f, 0x6b, 0x69, 0x65, |
0x07, 0x66, 0x6f, 0x6f, |
0x3d, 0x62, 0x61, 0x72, |
+ 0x00, 0x00, 0x00, |
- 0x00, 0x14, 0x09, 0x00, // CONTINUATION |
+ 0x00, 0x1a, 0x09, 0x18, // CONTINUATION: PAD_LOW & PAD_HIGH |
0x00, 0x00, 0x00, 0x01, // Stream 1 |
+ 0x00, 0x04, // Padding of 4. |
0x00, 0x06, 0x63, 0x6f, |
0x6f, 0x6b, 0x69, 0x65, |
0x08, 0x62, 0x61, 0x7a, |
0x3d, 0x62, 0x69, 0x6e, |
0x67, 0x00, 0x06, 0x63, |
+ 0x00, 0x00, 0x00, 0x00, |
- 0x00, 0x12, 0x09, 0x04, // CONTINUATION: END_HEADERS |
+ 0x00, 0x13, 0x09, 0x0c, // CONTINUATION: PAD_LOW & END_HEADERS |
0x00, 0x00, 0x00, 0x01, // Stream 1 |
+ 0x00, // Padding of 0. |
0x6f, 0x6f, 0x6b, 0x69, |
0x65, 0x00, 0x00, 0x04, |
0x6e, 0x61, 0x6d, 0x65, |
@@ -3814,7 +3819,6 @@ TEST_P(SpdyFramerTest, ReadHeadersWithContinuation) { |
0x75, 0x65, |
}; |
- SpdyFramer framer(spdy_version_); |
TestSpdyVisitor visitor(spdy_version_); |
visitor.SimulateInFramer(kInput, sizeof(kInput)); |
@@ -3875,21 +3879,23 @@ TEST_P(SpdyFramerTest, ReadHeadersWithContinuationAndFin) { |
Pair("name", "value"))); |
} |
-TEST_P(SpdyFramerTest, ReadPushPromiseWithContinuation) { |
+TEST_P(SpdyFramerTest, ReadPushPromiseWithContinuationAndPadding) { |
if (spdy_version_ <= SPDY3) { |
return; |
} |
const unsigned char kInput[] = { |
- 0x00, 0x14, 0x05, 0x00, // PUSH_PROMISE |
+ 0x00, 0x18, 0x05, 0x18, // PUSH_PROMISE: PAD_LOW & PAD_HIGH |
0x00, 0x00, 0x00, 0x01, // Stream 1 |
0x00, 0x00, 0x00, 0x2A, // Promised stream 42 |
+ 0x00, 0x02, // Padding of 2. |
0x00, 0x06, 0x63, 0x6f, |
0x6f, 0x6b, 0x69, 0x65, |
0x07, 0x66, 0x6f, 0x6f, |
0x3d, 0x62, 0x61, 0x72, |
+ 0x00, 0x00, |
- 0x00, 0x14, 0x09, 0x00, // CONTINUATION |
+ 0x00, 0x14, 0x09, 0x00, // CONTINUATION: |
0x00, 0x00, 0x00, 0x01, // Stream 1 |
0x00, 0x06, 0x63, 0x6f, |
0x6f, 0x6b, 0x69, 0x65, |
@@ -3897,13 +3903,15 @@ TEST_P(SpdyFramerTest, ReadPushPromiseWithContinuation) { |
0x3d, 0x62, 0x69, 0x6e, |
0x67, 0x00, 0x06, 0x63, |
- 0x00, 0x12, 0x09, 0x04, // CONTINUATION: END_HEADERS |
+ 0x00, 0x17, 0x09, 0x0c, // CONTINUATION: PAD_LOW & END_HEADERS |
0x00, 0x00, 0x00, 0x01, // Stream 1 |
+ 0x04, // Padding of 4. |
0x6f, 0x6f, 0x6b, 0x69, |
0x65, 0x00, 0x00, 0x04, |
0x6e, 0x61, 0x6d, 0x65, |
0x05, 0x76, 0x61, 0x6c, |
- 0x75, 0x65, |
+ 0x75, 0x65, 0x00, 0x00, |
+ 0x00, 0x00, |
}; |
SpdyFramer framer(spdy_version_); |
@@ -4055,6 +4063,53 @@ TEST_P(SpdyFramerTest, ExpectContinuationReceiveControlFrame) { |
EXPECT_EQ(0, visitor.data_frame_count_); |
} |
+TEST_P(SpdyFramerTest, EndSegmentOnDataFrame) { |
+ if (spdy_version_ <= SPDY3) { |
+ return; |
+ } |
+ const unsigned char kInput[] = { |
+ 0x00, 0x0c, 0x00, 0x02, // DATA: END_SEGMENT |
+ 0x00, 0x00, 0x00, 0x01, // Stream 1 |
+ 0xde, 0xad, 0xbe, 0xef, |
+ 0xde, 0xad, 0xbe, 0xef, |
+ 0xde, 0xad, 0xbe, 0xef, |
+ }; |
+ |
+ TestSpdyVisitor visitor(spdy_version_); |
+ visitor.SimulateInFramer(kInput, sizeof(kInput)); |
+ |
+ // TODO(jgraettinger): Verify END_SEGMENT when support is added. |
+ EXPECT_EQ(0, visitor.error_count_); |
+ EXPECT_EQ(12, visitor.data_bytes_); |
+ EXPECT_EQ(0, visitor.fin_frame_count_); |
+ EXPECT_EQ(0, visitor.fin_flag_count_); |
+} |
+ |
+TEST_P(SpdyFramerTest, EndSegmentOnHeadersFrame) { |
+ if (spdy_version_ <= SPDY3) { |
+ return; |
+ } |
+ const unsigned char kInput[] = { |
+ 0x00, 0x10, 0x01, 0x06, // HEADERS: END_SEGMENT | END_HEADERS |
+ 0x00, 0x00, 0x00, 0x01, // Stream 1 |
+ 0x00, 0x06, 0x63, 0x6f, |
+ 0x6f, 0x6b, 0x69, 0x65, |
+ 0x07, 0x66, 0x6f, 0x6f, |
+ 0x3d, 0x62, 0x61, 0x72, |
+ }; |
+ |
+ TestSpdyVisitor visitor(spdy_version_); |
+ visitor.SimulateInFramer(kInput, sizeof(kInput)); |
+ |
+ // TODO(jgraettinger): Verify END_SEGMENT when support is added. |
+ EXPECT_EQ(0, visitor.error_count_); |
+ EXPECT_EQ(1, visitor.headers_frame_count_); |
+ EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); |
+ |
+ EXPECT_THAT(visitor.headers_, ElementsAre( |
+ Pair("cookie", "foo=bar"))); |
+} |
+ |
TEST_P(SpdyFramerTest, ReadGarbage) { |
SpdyFramer framer(spdy_version_); |
unsigned char garbage_frame[256]; |
@@ -4098,6 +4153,25 @@ TEST_P(SpdyFramerTest, ReadGarbageWithValidVersion) { |
EXPECT_EQ(1, visitor.error_count_); |
} |
+TEST_P(SpdyFramerTest, ReadGarbageHPACKEncoding) { |
+ if (spdy_version_ <= SPDY3) { |
+ return; |
+ } |
+ const unsigned char kInput[] = { |
+ 0x00, 0x12, 0x01, 0x04, // HEADER: END_HEADERS |
+ 0x00, 0x00, 0x00, 0x01, // Stream 1 |
+ 0xef, 0xef, 0xff, 0xff, |
+ 0xff, 0xff, 0xff, 0xff, |
+ 0xff, 0xff, 0xff, 0xff, |
+ 0xff, 0xff, 0xff, 0xff, |
+ 0xff, 0xff, |
+ }; |
+ |
+ TestSpdyVisitor visitor(spdy_version_); |
+ visitor.SimulateInFramer(kInput, arraysize(kInput)); |
+ EXPECT_EQ(1, visitor.error_count_); |
+} |
+ |
TEST_P(SpdyFramerTest, SizesTest) { |
SpdyFramer framer(spdy_version_); |
EXPECT_EQ(8u, framer.GetDataFrameMinimumSize()); |
@@ -4389,6 +4463,10 @@ TEST_P(SpdyFramerTest, SynStreamFrameFlags) { |
if (IsSpdy4()) { |
// PRIORITY required for SYN_STREAM simulation. |
set_flags |= HEADERS_FLAG_PRIORITY; |
+ |
+ // TODO(jgraettinger): Add padding to SynStreamIR, and implement framing. |
+ set_flags &= ~HEADERS_FLAG_PAD_LOW; |
+ set_flags &= ~HEADERS_FLAG_PAD_HIGH; |
} |
SetFrameFlags(frame.get(), set_flags, spdy_version_); |
@@ -4398,7 +4476,10 @@ TEST_P(SpdyFramerTest, SynStreamFrameFlags) { |
} else if (IsSpdy4() && |
flags & ~(CONTROL_FLAG_FIN | |
HEADERS_FLAG_PRIORITY | |
- HEADERS_FLAG_END_HEADERS)) { |
+ HEADERS_FLAG_END_HEADERS | |
+ HEADERS_FLAG_END_SEGMENT | |
+ HEADERS_FLAG_PAD_LOW | |
+ HEADERS_FLAG_PAD_HIGH)) { |
EXPECT_CALL(visitor, OnError(_)); |
} else { |
EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(8, SYN_STREAM, _)); |
@@ -4430,7 +4511,10 @@ TEST_P(SpdyFramerTest, SynStreamFrameFlags) { |
} else if (IsSpdy4() && |
flags & ~(CONTROL_FLAG_FIN | |
HEADERS_FLAG_PRIORITY | |
- HEADERS_FLAG_END_HEADERS)) { |
+ HEADERS_FLAG_END_HEADERS | |
+ HEADERS_FLAG_END_SEGMENT | |
+ HEADERS_FLAG_PAD_LOW | |
+ HEADERS_FLAG_PAD_HIGH)) { |
EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, |
framer.error_code()) |
@@ -4647,12 +4731,22 @@ TEST_P(SpdyFramerTest, HeadersFrameFlags) { |
SpdyHeadersIR headers_ir(57); |
headers_ir.SetHeader("foo", "bar"); |
scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); |
- SetFrameFlags(frame.get(), flags, spdy_version_); |
+ int set_flags = flags; |
+ if (IsSpdy4()) { |
+ // TODO(jgraettinger): Add padding to SpdyHeadersIR, |
+ // and implement framing. |
+ set_flags &= ~HEADERS_FLAG_PAD_LOW; |
+ set_flags &= ~HEADERS_FLAG_PAD_HIGH; |
+ } |
+ SetFrameFlags(frame.get(), set_flags, spdy_version_); |
if (!IsSpdy4() && flags & ~CONTROL_FLAG_FIN) { |
EXPECT_CALL(visitor, OnError(_)); |
} else if (IsSpdy4() && flags & ~(CONTROL_FLAG_FIN | |
- HEADERS_FLAG_END_HEADERS)) { |
+ HEADERS_FLAG_END_HEADERS | |
+ HEADERS_FLAG_END_SEGMENT | |
+ HEADERS_FLAG_PAD_LOW | |
+ HEADERS_FLAG_PAD_HIGH)) { |
EXPECT_CALL(visitor, OnError(_)); |
} else { |
EXPECT_CALL(visitor, OnHeaders(57, |
@@ -4676,8 +4770,11 @@ TEST_P(SpdyFramerTest, HeadersFrameFlags) { |
EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, |
framer.error_code()) |
<< SpdyFramer::ErrorCodeToString(framer.error_code()); |
- } else if (IsSpdy4() && flags & ~(CONTROL_FLAG_FIN | HEADERS_FLAG_PRIORITY | |
- HEADERS_FLAG_END_HEADERS)) { |
+ } else if (IsSpdy4() && flags & ~(CONTROL_FLAG_FIN | |
+ HEADERS_FLAG_END_HEADERS | |
+ HEADERS_FLAG_END_SEGMENT | |
+ HEADERS_FLAG_PAD_LOW | |
+ HEADERS_FLAG_PAD_HIGH)) { |
EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, |
framer.error_code()) |
@@ -4781,9 +4878,14 @@ TEST_P(SpdyFramerTest, PushPromiseFrameFlags) { |
push_promise.SetHeader("foo", "bar"); |
scoped_ptr<SpdySerializedFrame> frame( |
framer.SerializePushPromise(push_promise)); |
- SetFrameFlags(frame.get(), flags, spdy_version_); |
+ // TODO(jgraettinger): Add padding to SpdyPushPromiseIR, |
+ // and implement framing. |
+ int set_flags = flags & ~HEADERS_FLAG_PAD_LOW & ~HEADERS_FLAG_PAD_HIGH; |
+ SetFrameFlags(frame.get(), set_flags, spdy_version_); |
- if (flags & ~(PUSH_PROMISE_FLAG_END_PUSH_PROMISE)) { |
+ if (flags & ~(PUSH_PROMISE_FLAG_END_PUSH_PROMISE | |
+ HEADERS_FLAG_PAD_LOW | |
+ HEADERS_FLAG_PAD_HIGH)) { |
EXPECT_CALL(visitor, OnError(_)); |
} else { |
EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, PUSH_PROMISE, _)); |
@@ -4794,7 +4896,9 @@ TEST_P(SpdyFramerTest, PushPromiseFrameFlags) { |
} |
framer.ProcessInput(frame->data(), frame->size()); |
- if (flags & ~(PUSH_PROMISE_FLAG_END_PUSH_PROMISE)) { |
+ if (flags & ~(PUSH_PROMISE_FLAG_END_PUSH_PROMISE | |
+ HEADERS_FLAG_PAD_LOW | |
+ HEADERS_FLAG_PAD_HIGH)) { |
EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, |
framer.error_code()) |
@@ -4837,9 +4941,14 @@ TEST_P(SpdyFramerTest, ContinuationFrameFlags) { |
continuation.SetHeader("foo", "bar"); |
scoped_ptr<SpdySerializedFrame> frame( |
framer.SerializeContinuation(continuation)); |
- SetFrameFlags(frame.get(), flags, spdy_version_); |
+ // TODO(jgraettinger): Add padding to the eventual continuation |
+ // serialization implementation. |
+ int set_flags = flags & ~HEADERS_FLAG_PAD_LOW & ~HEADERS_FLAG_PAD_HIGH; |
+ SetFrameFlags(frame.get(), set_flags, spdy_version_); |
- if (flags & ~(HEADERS_FLAG_END_HEADERS)) { |
+ if (flags & ~(HEADERS_FLAG_END_HEADERS | |
+ HEADERS_FLAG_PAD_LOW | |
+ HEADERS_FLAG_PAD_HIGH)) { |
EXPECT_CALL(visitor, OnError(_)); |
} else { |
EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, CONTINUATION, _)); |
@@ -4851,7 +4960,9 @@ TEST_P(SpdyFramerTest, ContinuationFrameFlags) { |
framer.ProcessInput(frame0->data(), frame0->size()); |
framer.ProcessInput(frame->data(), frame->size()); |
- if (flags & ~(HEADERS_FLAG_END_HEADERS)) { |
+ if (flags & ~(HEADERS_FLAG_END_HEADERS | |
+ HEADERS_FLAG_PAD_LOW | |
+ HEADERS_FLAG_PAD_HIGH)) { |
EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, |
framer.error_code()) |