Index: net/spdy/spdy_framer_test.cc |
diff --git a/net/spdy/spdy_framer_test.cc b/net/spdy/spdy_framer_test.cc |
index d731b3adae94abd2f172485d9e23da95d2c134ba..9ce315fdab7092269ddbb27b6d54b0a95e2a6f3c 100644 |
--- a/net/spdy/spdy_framer_test.cc |
+++ b/net/spdy/spdy_framer_test.cc |
@@ -1012,13 +1012,13 @@ TEST_P(SpdyFramerTest, DuplicateHeader) { |
if (spdy_version_ < 4) { |
frame.WriteControlFrameHeader(framer, SYN_STREAM, CONTROL_FLAG_NONE); |
frame.WriteUInt32(3); // stream_id |
+ frame.WriteUInt32(0); // associated stream id |
+ frame.WriteUInt16(0); // Priority. |
} else { |
- frame.WriteFramePrefix(framer, SYN_STREAM, CONTROL_FLAG_NONE, 3); |
+ frame.WriteFramePrefix(framer, HEADERS, HEADERS_FLAG_PRIORITY, 3); |
+ frame.WriteUInt32(framer.GetHighestPriority()); |
} |
- frame.WriteUInt32(0); // associated stream id |
- frame.WriteUInt16(0); // Priority. |
- |
if (IsSpdy2()) { |
frame.WriteUInt16(2); // Number of headers. |
frame.WriteString("name"); |
@@ -1053,13 +1053,13 @@ TEST_P(SpdyFramerTest, MultiValueHeader) { |
if (spdy_version_ < 4) { |
frame.WriteControlFrameHeader(framer, SYN_STREAM, CONTROL_FLAG_NONE); |
frame.WriteUInt32(3); // stream_id |
+ frame.WriteUInt32(0); // associated stream id |
+ frame.WriteUInt16(0); // Priority. |
} else { |
- frame.WriteFramePrefix(framer, SYN_STREAM, CONTROL_FLAG_NONE, 3); |
+ frame.WriteFramePrefix(framer, HEADERS, HEADERS_FLAG_PRIORITY, 3); |
+ frame.WriteUInt32(framer.GetHighestPriority()); |
} |
- frame.WriteUInt32(0); // associated stream id |
- frame.WriteUInt16(0); // Priority. |
- |
string value("value1\0value2"); |
if (IsSpdy2()) { |
frame.WriteUInt16(1); // Number of headers. |
@@ -1325,14 +1325,13 @@ TEST_P(SpdyFramerTest, Basic) { |
}; |
const unsigned char kV4Input[] = { |
- 0x00, 0x1e, 0x01, 0x00, // SYN_STREAM #1 |
+ 0x00, 0x1c, 0x08, 0x08, // SYN_STREAM #1 |
0x00, 0x00, 0x00, 0x01, |
0x00, 0x00, 0x00, 0x00, |
- 0x00, 0x00, 0x00, 0x00, |
- 0x00, 0x01, 0x00, 0x00, |
- 0x00, 0x02, 'h', 'h', |
+ 0x00, 0x00, 0x00, 0x01, |
0x00, 0x00, 0x00, 0x02, |
- 'v', 'v', |
+ 'h', 'h', 0x00, 0x00, |
+ 0x00, 0x02, 'v', 'v', |
0x00, 0x24, 0x08, 0x00, // HEADERS on Stream #1 |
0x00, 0x00, 0x00, 0x01, |
@@ -1350,11 +1349,10 @@ TEST_P(SpdyFramerTest, Basic) { |
0xde, 0xad, 0xbe, 0xef, |
0xde, 0xad, 0xbe, 0xef, |
- 0x00, 0x12, 0x01, 0x00, // SYN Stream #3 |
+ 0x00, 0x10, 0x08, 0x08, // SYN Stream #3 |
0x00, 0x00, 0x00, 0x03, |
0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, |
- 0x00, 0x00, |
0x00, 0x10, 0x00, 0x00, // DATA on Stream #3 |
0x00, 0x00, 0x00, 0x03, |
@@ -1455,16 +1453,15 @@ TEST_P(SpdyFramerTest, FinOnDataFrame) { |
0xde, 0xad, 0xbe, 0xef, |
}; |
const unsigned char kV4Input[] = { |
- 0x00, 0x1e, 0x01, 0x00, // SYN_STREAM #1 |
+ 0x00, 0x1c, 0x08, 0x08, // SYN_STREAM #1 |
0x00, 0x00, 0x00, 0x01, |
0x00, 0x00, 0x00, 0x00, |
- 0x00, 0x00, 0x00, 0x00, |
- 0x00, 0x01, 0x00, 0x00, |
- 0x00, 0x02, 'h', 'h', |
+ 0x00, 0x00, 0x00, 0x01, |
0x00, 0x00, 0x00, 0x02, |
- 'v', 'v', |
+ 'h', 'h', 0x00, 0x00, |
+ 0x00, 0x02, 'v', 'v', |
- 0x00, 0x18, 0x02, 0x00, // SYN REPLY Stream #1 |
+ 0x00, 0x18, 0x08, 0x00, // SYN REPLY Stream #1 |
0x00, 0x00, 0x00, 0x01, |
0x00, 0x00, 0x00, 0x01, |
0x00, 0x00, 0x00, 0x02, |
@@ -1493,8 +1490,13 @@ TEST_P(SpdyFramerTest, FinOnDataFrame) { |
EXPECT_EQ(0, visitor.error_count_); |
EXPECT_EQ(1, visitor.syn_frame_count_); |
- EXPECT_EQ(1, visitor.syn_reply_frame_count_); |
- EXPECT_EQ(0, visitor.headers_frame_count_); |
+ if (IsSpdy4()) { |
+ EXPECT_EQ(0, visitor.syn_reply_frame_count_); |
+ EXPECT_EQ(1, visitor.headers_frame_count_); |
+ } else { |
+ EXPECT_EQ(1, visitor.syn_reply_frame_count_); |
+ EXPECT_EQ(0, visitor.headers_frame_count_); |
+ } |
EXPECT_EQ(16, visitor.data_bytes_); |
EXPECT_EQ(0, visitor.fin_frame_count_); |
EXPECT_EQ(0, visitor.fin_flag_count_); |
@@ -1540,16 +1542,15 @@ TEST_P(SpdyFramerTest, FinOnSynReplyFrame) { |
0x00, 0x02, 'b', 'b', |
}; |
const unsigned char kV4Input[] = { |
- 0x00, 0x1e, 0x01, 0x00, // SYN_STREAM #1 |
+ 0x00, 0x1c, 0x08, 0x08, // SYN_STREAM #1 |
0x00, 0x00, 0x00, 0x01, |
0x00, 0x00, 0x00, 0x00, |
- 0x00, 0x00, 0x00, 0x00, |
- 0x00, 0x01, 0x00, 0x00, |
- 0x00, 0x02, 'h', 'h', |
+ 0x00, 0x00, 0x00, 0x01, |
0x00, 0x00, 0x00, 0x02, |
- 'v', 'v', |
+ 'h', 'h', 0x00, 0x00, |
+ 0x00, 0x02, 'v', 'v', |
- 0x00, 0x18, 0x02, 0x01, // SYN_REPLY #1, with FIN |
+ 0x00, 0x18, 0x08, 0x01, // SYN_REPLY #1, with FIN |
0x00, 0x00, 0x00, 0x01, |
0x00, 0x00, 0x00, 0x01, |
0x00, 0x00, 0x00, 0x02, |
@@ -1568,8 +1569,13 @@ TEST_P(SpdyFramerTest, FinOnSynReplyFrame) { |
EXPECT_EQ(0, visitor.error_count_); |
EXPECT_EQ(1, visitor.syn_frame_count_); |
- EXPECT_EQ(1, visitor.syn_reply_frame_count_); |
- EXPECT_EQ(0, visitor.headers_frame_count_); |
+ if (IsSpdy4()) { |
+ EXPECT_EQ(0, visitor.syn_reply_frame_count_); |
+ EXPECT_EQ(1, visitor.headers_frame_count_); |
+ } else { |
+ EXPECT_EQ(1, visitor.syn_reply_frame_count_); |
+ EXPECT_EQ(0, visitor.headers_frame_count_); |
+ } |
EXPECT_EQ(0, visitor.data_bytes_); |
EXPECT_EQ(0, visitor.fin_frame_count_); |
EXPECT_EQ(1, visitor.fin_flag_count_); |
@@ -1980,18 +1986,17 @@ TEST_P(SpdyFramerTest, CreateSynStreamUncompressed) { |
'a', 'r' |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x2e, 0x01, 0x00, |
+ 0x00, 0x2c, 0x08, 0x08, |
0x00, 0x00, 0x00, 0x01, |
- 0x00, 0x00, 0x00, 0x00, |
- kPri, kCre, 0x00, 0x00, |
- 0x00, 0x02, 0x00, 0x00, |
- 0x00, 0x03, 'b', 'a', |
- 'r', 0x00, 0x00, 0x00, |
- 0x03, 'f', 'o', 'o', |
+ 0x00, 0x00, 0x00, 0x07, |
+ 0x00, 0x00, 0x00, 0x02, |
0x00, 0x00, 0x00, 0x03, |
- 'f', 'o', 'o', 0x00, |
- 0x00, 0x00, 0x03, 'b', |
- 'a', 'r' |
+ 'b', 'a', 'r', 0x00, |
+ 0x00, 0x00, 0x03, 'f', |
+ 'o', 'o', 0x00, 0x00, |
+ 0x00, 0x03, 'f', 'o', |
+ 'o', 0x00, 0x00, 0x00, |
+ 0x03, 'b', 'a', 'r' |
}; |
scoped_ptr<SpdyFrame> frame( |
framer.CreateSynStream(1, // stream id |
@@ -2046,17 +2051,17 @@ TEST_P(SpdyFramerTest, CreateSynStreamUncompressed) { |
'b', 'a', 'r' |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x2b, 0x01, 0x01, |
- 0x7f, 0xff, 0xff, 0xff, |
+ 0x00, 0x29, 0x08, 0x09, |
0x7f, 0xff, 0xff, 0xff, |
0x00, 0x00, 0x00, 0x00, |
- 0x00, 0x02, 0x00, 0x00, |
+ 0x00, 0x00, 0x00, 0x02, |
0x00, 0x00, 0x00, 0x00, |
- 0x00, 0x03, 'f', 'o', |
- 'o', 0x00, 0x00, 0x00, |
- 0x03, 'f', 'o', 'o', |
0x00, 0x00, 0x00, 0x03, |
- 'b', 'a', 'r' |
+ 'f', 'o', 'o', 0x00, |
+ 0x00, 0x00, 0x03, 'f', |
+ 'o', 'o', 0x00, 0x00, |
+ 0x00, 0x03, 'b', 'a', |
+ 'r' |
}; |
scoped_ptr<SpdyFrame> frame( |
framer.CreateSynStream(0x7fffffff, // stream id |
@@ -2112,17 +2117,17 @@ TEST_P(SpdyFramerTest, CreateSynStreamUncompressed) { |
0x00, 0x00, 0x00 |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x2b, 0x01, 0x01, |
- 0x7f, 0xff, 0xff, 0xff, |
+ 0x00, 0x29, 0x08, 0x09, |
0x7f, 0xff, 0xff, 0xff, |
- kPri, 0x00, 0x00, 0x00, |
- 0x00, 0x02, 0x00, 0x00, |
- 0x00, 0x03, 'b', 'a', |
- 'r', 0x00, 0x00, 0x00, |
- 0x03, 'f', 'o', 'o', |
+ 0x00, 0x00, 0x00, 0x01, |
+ 0x00, 0x00, 0x00, 0x02, |
0x00, 0x00, 0x00, 0x03, |
- 'f', 'o', 'o', 0x00, |
- 0x00, 0x00, 0x00 |
+ 'b', 'a', 'r', 0x00, |
+ 0x00, 0x00, 0x03, 'f', |
+ 'o', 'o', 0x00, 0x00, |
+ 0x00, 0x03, 'f', 'o', |
+ 'o', 0x00, 0x00, 0x00, |
+ 0x00 |
}; |
scoped_ptr<SpdyFrame> frame( |
framer.CreateSynStream(0x7fffffff, // stream id |
@@ -2970,7 +2975,7 @@ TEST_P(SpdyFramerTest, CreateHeadersCompressed) { |
0xff, |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x35, 0x08, 0x00, |
+ 0x00, 0x25, 0x08, 0x00, |
0x00, 0x00, 0x00, 0x01, |
0x38, 0xea, 0xe3, 0xc6, |
0xa7, 0xc2, 0x02, 0xe5, |
@@ -3191,7 +3196,13 @@ TEST_P(SpdyFramerTest, ReadCompressedSynReplyHeaderBlock) { |
visitor.SimulateInFramer( |
reinterpret_cast<unsigned char*>(control_frame->data()), |
control_frame->size()); |
- EXPECT_EQ(1, visitor.syn_reply_frame_count_); |
+ if (IsSpdy4()) { |
+ EXPECT_EQ(0, visitor.syn_reply_frame_count_); |
+ EXPECT_EQ(1, visitor.headers_frame_count_); |
+ } else { |
+ EXPECT_EQ(1, visitor.syn_reply_frame_count_); |
+ EXPECT_EQ(0, visitor.headers_frame_count_); |
+ } |
EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); |
} |
@@ -3846,6 +3857,11 @@ TEST_P(SpdyFramerTest, SizesTest) { |
SpdyFramer framer(spdy_version_); |
EXPECT_EQ(8u, framer.GetDataFrameMinimumSize()); |
if (IsSpdy4()) { |
+ EXPECT_EQ(8u, framer.GetControlFrameHeaderSize()); |
+ EXPECT_EQ(12u, framer.GetSynStreamMinimumSize()); |
+ EXPECT_EQ(8u, framer.GetSynReplyMinimumSize()); |
+ EXPECT_EQ(12u, framer.GetRstStreamSize()); |
+ EXPECT_EQ(12u, framer.GetSettingsMinimumSize()); |
EXPECT_EQ(8u, framer.GetSynReplyMinimumSize()); |
EXPECT_EQ(12u, framer.GetRstStreamSize()); |
EXPECT_EQ(12u, framer.GetSettingsMinimumSize()); |
@@ -4074,14 +4090,27 @@ TEST_P(SpdyFramerTest, SynStreamFrameFlags) { |
headers["foo"] = "bar"; |
scoped_ptr<SpdyFrame> frame( |
framer.CreateSynStream(8, 3, 1, 0, CONTROL_FLAG_NONE, true, &headers)); |
- SetFrameFlags(frame.get(), flags, spdy_version_); |
+ int set_flags = flags; |
+ if(IsSpdy4()) { |
+ set_flags |= HEADERS_FLAG_PRIORITY; // Required for SYN_STREAM simulation. |
+ } |
+ SetFrameFlags(frame.get(), set_flags, spdy_version_); |
- if (flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) { |
+ if (!IsSpdy4() && |
+ flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) { |
+ EXPECT_CALL(visitor, OnError(_)); |
+ } else if (IsSpdy4() && |
+ flags & ~(CONTROL_FLAG_FIN | HEADERS_FLAG_PRIORITY)) { |
EXPECT_CALL(visitor, OnError(_)); |
} else { |
EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(8, SYN_STREAM, _)); |
- EXPECT_CALL(visitor, OnSynStream(8, 3, 1, 0, flags & CONTROL_FLAG_FIN, |
- flags & CONTROL_FLAG_UNIDIRECTIONAL)); |
+ if (IsSpdy4()) { |
+ EXPECT_CALL(visitor, OnSynStream(8, 0, 1, 0, flags & CONTROL_FLAG_FIN, |
+ false)); |
+ } else { |
+ EXPECT_CALL(visitor, OnSynStream(8, 3, 1, 0, flags & CONTROL_FLAG_FIN, |
+ flags & CONTROL_FLAG_UNIDIRECTIONAL)); |
+ } |
EXPECT_CALL(visitor, OnControlFrameHeaderData(8, _, _)) |
.WillRepeatedly(testing::Return(true)); |
if (flags & DATA_FLAG_FIN) { |
@@ -4090,7 +4119,14 @@ TEST_P(SpdyFramerTest, SynStreamFrameFlags) { |
} |
framer.ProcessInput(frame->data(), frame->size()); |
- if (flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) { |
+ if (!IsSpdy4() && |
+ flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) { |
+ EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
+ 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)) { |
EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, |
framer.error_code()) |
@@ -4104,6 +4140,10 @@ TEST_P(SpdyFramerTest, SynStreamFrameFlags) { |
} |
TEST_P(SpdyFramerTest, SynReplyFrameFlags) { |
+ if (IsSpdy4()) { |
+ // Covered by HEADERS case. |
+ return; |
+ } |
for (int flags = 0; flags < 256; ++flags) { |
SCOPED_TRACE(testing::Message() << "Flags " << flags); |
@@ -4243,6 +4283,10 @@ TEST_P(SpdyFramerTest, GoawayFrameFlags) { |
TEST_P(SpdyFramerTest, HeadersFrameFlags) { |
for (int flags = 0; flags < 256; ++flags) { |
+ if (IsSpdy4() && flags & HEADERS_FLAG_PRIORITY) { |
+ // Covered by SYN_STREAM case. |
+ continue; |
+ } |
SCOPED_TRACE(testing::Message() << "Flags " << flags); |
testing::StrictMock<test::MockVisitor> visitor; |