| Index: net/spdy/spdy_framer_test.cc
|
| diff --git a/net/spdy/spdy_framer_test.cc b/net/spdy/spdy_framer_test.cc
|
| index 3f0926cf8d451285fe419b8a7a3f529df0766b94..892a52b99a98cdde8cc573419eb984ed9378088e 100644
|
| --- a/net/spdy/spdy_framer_test.cc
|
| +++ b/net/spdy/spdy_framer_test.cc
|
| @@ -968,13 +968,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");
|
| @@ -1009,13 +1009,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.
|
| @@ -1277,14 +1277,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,
|
| @@ -1302,11 +1301,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,
|
| @@ -1407,16 +1405,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,
|
| @@ -1445,8 +1442,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_);
|
| @@ -1492,16 +1494,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,
|
| @@ -1520,8 +1521,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_);
|
| @@ -1929,18 +1935,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
|
| @@ -1994,17 +1999,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
|
| @@ -2059,17 +2064,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
|
| @@ -2141,21 +2146,21 @@ TEST_P(SpdyFramerTest, CreateSynStreamCompressed) {
|
| 0x00, 0xFF, 0xFF,
|
| };
|
| const unsigned char kV4FrameData[] = {
|
| - 0x00, 0x3b, 0x01, 0x00,
|
| + 0x00, 0x39, 0x08, 0x08,
|
| 0x00, 0x00, 0x00, 0x01,
|
| - 0x00, 0x00, 0x00, 0x00,
|
| - 0x80, 0x00, 0x38, 0xea,
|
| - 0xe3, 0xc6, 0xa7, 0xc2,
|
| - 0x02, 0xe5, 0x0e, 0x50,
|
| - 0xc2, 0x4b, 0x4a, 0x04,
|
| - 0xe5, 0x0b, 0x66, 0x80,
|
| - 0x00, 0x4a, 0xcb, 0xcf,
|
| - 0x07, 0x08, 0x20, 0x10,
|
| - 0x95, 0x96, 0x9f, 0x0f,
|
| - 0xa2, 0x00, 0x02, 0x28,
|
| - 0x29, 0xb1, 0x08, 0x20,
|
| - 0x80, 0x00, 0x00, 0x00,
|
| - 0x00, 0xff, 0xff,
|
| + 0x00, 0x00, 0x00, 0x04,
|
| + 0x38, 0xea, 0xe3, 0xc6,
|
| + 0xa7, 0xc2, 0x02, 0xe5,
|
| + 0x0e, 0x50, 0xc2, 0x4b,
|
| + 0x4a, 0x04, 0xe5, 0x0b,
|
| + 0x66, 0x80, 0x00, 0x4a,
|
| + 0xcb, 0xcf, 0x07, 0x08,
|
| + 0x20, 0x10, 0x95, 0x96,
|
| + 0x9f, 0x0f, 0xa2, 0x00,
|
| + 0x02, 0x28, 0x29, 0xb1,
|
| + 0x08, 0x20, 0x80, 0x00,
|
| + 0x00, 0x00, 0x00, 0xff,
|
| + 0xff,
|
| };
|
| scoped_ptr<SpdyFrame> frame(
|
| framer.CreateSynStream(1, // stream id
|
| @@ -2211,7 +2216,7 @@ TEST_P(SpdyFramerTest, CreateSynReplyUncompressed) {
|
| 0x03, 'b', 'a', 'r'
|
| };
|
| const unsigned char kV4FrameData[] = {
|
| - 0x00, 0x28, 0x02, 0x00,
|
| + 0x00, 0x28, 0x08, 0x00,
|
| 0x00, 0x00, 0x00, 0x01,
|
| 0x00, 0x00, 0x00, 0x02,
|
| 0x00, 0x00, 0x00, 0x03,
|
| @@ -2266,7 +2271,7 @@ TEST_P(SpdyFramerTest, CreateSynReplyUncompressed) {
|
| 'r'
|
| };
|
| const unsigned char kV4FrameData[] = {
|
| - 0x00, 0x25, 0x02, 0x01,
|
| + 0x00, 0x25, 0x08, 0x01,
|
| 0x7f, 0xff, 0xff, 0xff,
|
| 0x00, 0x00, 0x00, 0x02,
|
| 0x00, 0x00, 0x00, 0x00,
|
| @@ -2321,7 +2326,7 @@ TEST_P(SpdyFramerTest, CreateSynReplyUncompressed) {
|
| 0x00
|
| };
|
| const unsigned char kV4FrameData[] = {
|
| - 0x00, 0x25, 0x02, 0x01,
|
| + 0x00, 0x25, 0x08, 0x01,
|
| 0x7f, 0xff, 0xff, 0xff,
|
| 0x00, 0x00, 0x00, 0x02,
|
| 0x00, 0x00, 0x00, 0x03,
|
| @@ -2393,7 +2398,7 @@ TEST_P(SpdyFramerTest, CreateSynReplyCompressed) {
|
| 0xff,
|
| };
|
| const unsigned char kV4FrameData[] = {
|
| - 0x00, 0x35, 0x02, 0x00,
|
| + 0x00, 0x35, 0x08, 0x00,
|
| 0x00, 0x00, 0x00, 0x01,
|
| 0x38, 0xea, 0xe3, 0xc6,
|
| 0xa7, 0xc2, 0x02, 0xe5,
|
| @@ -3134,7 +3139,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_));
|
| }
|
|
|
| @@ -4039,14 +4050,28 @@ TEST_P(SpdyFramerTest, SynStreamFrameFlags) {
|
| headers["foo"] = "bar";
|
| scoped_ptr<SpdyFrame> frame(
|
| framer.CreateSynStream(8, 3, 1, 0, CONTROL_FLAG_NONE, &headers));
|
| - SetFrameFlags(frame.get(), flags, spdy_version_);
|
| + int set_flags = flags;
|
| + if (IsSpdy4()) {
|
| + // PRIORITY required for SYN_STREAM simulation.
|
| + set_flags |= HEADERS_FLAG_PRIORITY;
|
| + }
|
| + 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) {
|
| @@ -4055,7 +4080,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())
|
| @@ -4069,6 +4101,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);
|
|
|
| @@ -4208,6 +4244,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;
|
|
|