| 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;
|
|
|