| Index: net/spdy/spdy_framer_test.cc
|
| diff --git a/net/spdy/spdy_framer_test.cc b/net/spdy/spdy_framer_test.cc
|
| index 888fcd7c8124242674cb597b96e2158924492460..a131f62037feee8a1a9dea3ef5324bc7cf71b888 100644
|
| --- a/net/spdy/spdy_framer_test.cc
|
| +++ b/net/spdy/spdy_framer_test.cc
|
| @@ -673,13 +673,13 @@ TEST_P(SpdyFramerTest, HeaderBlockInBuffer) {
|
| SpdyFramer framer(spdy_version_);
|
| framer.set_enable_compression(false);
|
|
|
| - // Encode the header block into a SynStream frame.
|
| - SpdySynStreamIR syn_stream(1);
|
| - syn_stream.set_priority(1);
|
| - syn_stream.SetHeader("alpha", "beta");
|
| - syn_stream.SetHeader("gamma", "charlie");
|
| - syn_stream.SetHeader("cookie", "key1=value1; key2=value2");
|
| - scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream));
|
| + // Encode the header block into a Headers frame.
|
| + SpdyHeadersIR headers(1);
|
| + headers.set_priority(1);
|
| + headers.SetHeader("alpha", "beta");
|
| + headers.SetHeader("gamma", "charlie");
|
| + headers.SetHeader("cookie", "key1=value1; key2=value2");
|
| + scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers));
|
| EXPECT_TRUE(frame.get() != NULL);
|
|
|
| TestSpdyVisitor visitor(spdy_version_);
|
| @@ -689,7 +689,7 @@ TEST_P(SpdyFramerTest, HeaderBlockInBuffer) {
|
| frame->size());
|
|
|
| EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_);
|
| - EXPECT_TRUE(CompareHeaderBlocks(&syn_stream.name_value_block(),
|
| + EXPECT_TRUE(CompareHeaderBlocks(&headers.name_value_block(),
|
| &visitor.headers_));
|
| }
|
|
|
| @@ -698,12 +698,12 @@ TEST_P(SpdyFramerTest, UndersizedHeaderBlockInBuffer) {
|
| SpdyFramer framer(spdy_version_);
|
| framer.set_enable_compression(false);
|
|
|
| - // Encode the header block into a SynStream frame.
|
| - SpdySynStreamIR syn_stream(1);
|
| - syn_stream.set_priority(1);
|
| - syn_stream.SetHeader("alpha", "beta");
|
| - syn_stream.SetHeader("gamma", "charlie");
|
| - scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream));
|
| + // Encode the header block into a Headers frame.
|
| + SpdyHeadersIR headers(1);
|
| + headers.set_priority(1);
|
| + headers.SetHeader("alpha", "beta");
|
| + headers.SetHeader("gamma", "charlie");
|
| + scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers));
|
| EXPECT_TRUE(frame.get() != NULL);
|
|
|
| TestSpdyVisitor visitor(spdy_version_);
|
| @@ -997,18 +997,18 @@ TEST_P(SpdyFramerTest, BasicCompression) {
|
|
|
| TEST_P(SpdyFramerTest, CompressEmptyHeaders) {
|
| // See crbug.com/172383
|
| - SpdySynStreamIR syn_stream(1);
|
| - syn_stream.SetHeader("server", "SpdyServer 1.0");
|
| - syn_stream.SetHeader("date", "Mon 12 Jan 2009 12:12:12 PST");
|
| - syn_stream.SetHeader("status", "200");
|
| - syn_stream.SetHeader("version", "HTTP/1.1");
|
| - syn_stream.SetHeader("content-type", "text/html");
|
| - syn_stream.SetHeader("content-length", "12");
|
| - syn_stream.SetHeader("x-empty-header", "");
|
| + SpdyHeadersIR headers(1);
|
| + headers.SetHeader("server", "SpdyServer 1.0");
|
| + headers.SetHeader("date", "Mon 12 Jan 2009 12:12:12 PST");
|
| + headers.SetHeader("status", "200");
|
| + headers.SetHeader("version", "HTTP/1.1");
|
| + headers.SetHeader("content-type", "text/html");
|
| + headers.SetHeader("content-length", "12");
|
| + headers.SetHeader("x-empty-header", "");
|
|
|
| SpdyFramer framer(spdy_version_);
|
| framer.set_enable_compression(true);
|
| - scoped_ptr<SpdyFrame> frame1(framer.SerializeSynStream(syn_stream));
|
| + scoped_ptr<SpdyFrame> frame1(framer.SerializeHeaders(headers));
|
| }
|
|
|
| TEST_P(SpdyFramerTest, Basic) {
|
| @@ -1450,49 +1450,6 @@ TEST_P(SpdyFramerTest, HeaderCompression) {
|
| EXPECT_EQ(kValue3, decompressed_headers[kHeader3]);
|
| }
|
|
|
| -// Verify we don't leak when we leave streams unclosed
|
| -TEST_P(SpdyFramerTest, UnclosedStreamDataCompressors) {
|
| - SpdyFramer send_framer(spdy_version_);
|
| -
|
| - send_framer.set_enable_compression(true);
|
| -
|
| - const char kHeader1[] = "header1";
|
| - const char kHeader2[] = "header2";
|
| - const char kValue1[] = "value1";
|
| - const char kValue2[] = "value2";
|
| -
|
| - SpdySynStreamIR syn_stream(1);
|
| - syn_stream.SetHeader(kHeader1, kValue1);
|
| - syn_stream.SetHeader(kHeader2, kValue2);
|
| - scoped_ptr<SpdyFrame> syn_frame(send_framer.SerializeSynStream(syn_stream));
|
| - EXPECT_TRUE(syn_frame.get() != NULL);
|
| -
|
| - StringPiece bytes = "this is a test test test test test!";
|
| - SpdyDataIR data_ir(1, bytes);
|
| - data_ir.set_fin(true);
|
| - scoped_ptr<SpdyFrame> send_frame(send_framer.SerializeData(data_ir));
|
| - EXPECT_TRUE(send_frame.get() != NULL);
|
| -
|
| - // Run the inputs through the framer.
|
| - TestSpdyVisitor visitor(spdy_version_);
|
| - visitor.use_compression_ = true;
|
| - const unsigned char* data;
|
| - data = reinterpret_cast<const unsigned char*>(syn_frame->data());
|
| - visitor.SimulateInFramer(data, syn_frame->size());
|
| - data = reinterpret_cast<const unsigned char*>(send_frame->data());
|
| - visitor.SimulateInFramer(data, send_frame->size());
|
| -
|
| - EXPECT_EQ(0, visitor.error_count_);
|
| - EXPECT_EQ(1, visitor.syn_frame_count_);
|
| - EXPECT_EQ(0, visitor.syn_reply_frame_count_);
|
| - EXPECT_EQ(0, visitor.headers_frame_count_);
|
| - EXPECT_EQ(bytes.size(), static_cast<unsigned>(visitor.data_bytes_));
|
| - EXPECT_EQ(0, visitor.fin_frame_count_);
|
| - EXPECT_EQ(0, visitor.fin_flag_count_);
|
| - EXPECT_EQ(1, visitor.zero_length_data_frame_count_);
|
| - EXPECT_EQ(1, visitor.data_frame_count_);
|
| -}
|
| -
|
| // Verify we can decompress the stream even if handed over to the
|
| // framer 1 byte at a time.
|
| TEST_P(SpdyFramerTest, UnclosedStreamDataCompressorsOneByteAtATime) {
|
| @@ -1505,11 +1462,11 @@ TEST_P(SpdyFramerTest, UnclosedStreamDataCompressorsOneByteAtATime) {
|
| const char kValue1[] = "value1";
|
| const char kValue2[] = "value2";
|
|
|
| - SpdySynStreamIR syn_stream(1);
|
| - syn_stream.SetHeader(kHeader1, kValue1);
|
| - syn_stream.SetHeader(kHeader2, kValue2);
|
| - scoped_ptr<SpdyFrame> syn_frame(send_framer.SerializeSynStream(syn_stream));
|
| - EXPECT_TRUE(syn_frame.get() != NULL);
|
| + SpdyHeadersIR headers(1);
|
| + headers.SetHeader(kHeader1, kValue1);
|
| + headers.SetHeader(kHeader2, kValue2);
|
| + scoped_ptr<SpdyFrame> headers_frame(send_framer.SerializeHeaders(headers));
|
| + EXPECT_TRUE(headers_frame.get() != NULL);
|
|
|
| const char bytes[] = "this is a test test test test test!";
|
| SpdyDataIR data_ir(1, StringPiece(bytes, arraysize(bytes)));
|
| @@ -1521,8 +1478,8 @@ TEST_P(SpdyFramerTest, UnclosedStreamDataCompressorsOneByteAtATime) {
|
| TestSpdyVisitor visitor(spdy_version_);
|
| visitor.use_compression_ = true;
|
| const unsigned char* data;
|
| - data = reinterpret_cast<const unsigned char*>(syn_frame->data());
|
| - for (size_t idx = 0; idx < syn_frame->size(); ++idx) {
|
| + data = reinterpret_cast<const unsigned char*>(headers_frame->data());
|
| + for (size_t idx = 0; idx < headers_frame->size(); ++idx) {
|
| visitor.SimulateInFramer(data + idx, 1);
|
| ASSERT_EQ(0, visitor.error_count_);
|
| }
|
| @@ -1533,9 +1490,9 @@ TEST_P(SpdyFramerTest, UnclosedStreamDataCompressorsOneByteAtATime) {
|
| }
|
|
|
| EXPECT_EQ(0, visitor.error_count_);
|
| - EXPECT_EQ(1, visitor.syn_frame_count_);
|
| + EXPECT_EQ(0, visitor.syn_frame_count_);
|
| EXPECT_EQ(0, visitor.syn_reply_frame_count_);
|
| - EXPECT_EQ(0, visitor.headers_frame_count_);
|
| + EXPECT_EQ(1, visitor.headers_frame_count_);
|
| EXPECT_EQ(arraysize(bytes), static_cast<unsigned>(visitor.data_bytes_));
|
| EXPECT_EQ(0, visitor.fin_frame_count_);
|
| EXPECT_EQ(0, visitor.fin_flag_count_);
|
| @@ -1873,6 +1830,10 @@ TEST_P(SpdyFramerTest, CreateDataFrame) {
|
| }
|
|
|
| TEST_P(SpdyFramerTest, CreateSynStreamUncompressed) {
|
| + if (!IsSpdy2() && !IsSpdy3()) {
|
| + // SYN_STREAM unsupported in SPDY>3
|
| + return;
|
| + }
|
| SpdyFramer framer(spdy_version_);
|
| framer.set_enable_compression(false);
|
|
|
| @@ -1907,16 +1868,6 @@ TEST_P(SpdyFramerTest, CreateSynStreamUncompressed) {
|
| 0x00, 0x00, 0x03, 'b',
|
| 'a', 'r'
|
| };
|
| - const unsigned char kV4FrameData[] = {
|
| - 0x00, 0x17, 0x01, 0x24, // HEADERS: PRIORITY | END_HEADERS
|
| - 0x00, 0x00, 0x00, 0x01, // Stream 1
|
| - 0x00, 0x00, 0x00, 0x00, // Non-exclusive dependency 0. Weight 0.
|
| - 0x00, 0x00, 0x03, 0x62,
|
| - 0x61, 0x72, 0x03, 0x66,
|
| - 0x6f, 0x6f, 0x00, 0x03,
|
| - 0x66, 0x6f, 0x6f, 0x03,
|
| - 0x62, 0x61, 0x72,
|
| - };
|
| SpdySynStreamIR syn_stream(1);
|
| syn_stream.set_priority(framer.GetLowestPriority());
|
| syn_stream.SetHeader("bar", "foo");
|
| @@ -1927,7 +1878,7 @@ TEST_P(SpdyFramerTest, CreateSynStreamUncompressed) {
|
| } else if (IsSpdy3()) {
|
| CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
|
| } else {
|
| - CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
|
| + LOG(FATAL) << "Unsupported version in test.";
|
| }
|
| }
|
|
|
| @@ -1962,15 +1913,6 @@ TEST_P(SpdyFramerTest, CreateSynStreamUncompressed) {
|
| 0x00, 0x00, 0x00, 0x03,
|
| 'b', 'a', 'r'
|
| };
|
| - const unsigned char kV4FrameData[] = {
|
| - 0x00, 0x14, 0x01, 0x25, // HEADERS: PRIORITY | FIN | END_HEADERS
|
| - 0x7f, 0xff, 0xff, 0xff, // Stream 0x7fffffff
|
| - 0x00, 0x00, 0x00, 0x00, // Non-exclusive dependency 0. Weight 255.
|
| - 0xff, 0x00, 0x00, 0x03,
|
| - 0x66, 0x6f, 0x6f, 0x00,
|
| - 0x03, 0x66, 0x6f, 0x6f,
|
| - 0x03, 0x62, 0x61, 0x72,
|
| - };
|
| SpdySynStreamIR syn_stream(0x7fffffff);
|
| syn_stream.set_associated_to_stream_id(0x7fffffff);
|
| syn_stream.set_priority(framer.GetHighestPriority());
|
| @@ -1983,7 +1925,7 @@ TEST_P(SpdyFramerTest, CreateSynStreamUncompressed) {
|
| } else if (IsSpdy3()) {
|
| CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
|
| } else {
|
| - CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
|
| + LOG(FATAL) << "Unsupported version in test.";
|
| }
|
| }
|
|
|
| @@ -2019,15 +1961,6 @@ TEST_P(SpdyFramerTest, CreateSynStreamUncompressed) {
|
| 'f', 'o', 'o', 0x00,
|
| 0x00, 0x00, 0x00
|
| };
|
| - const unsigned char kV4FrameData[] = {
|
| - 0x00, 0x14, 0x01, 0x25, // HEADERS: PRIORITY | FIN | END_HEADERS
|
| - 0x7f, 0xff, 0xff, 0xff, // Stream 0x7fffffff
|
| - 0x00, 0x00, 0x00, 0x00, // Non-exclusive dependency 0. Weight 219.
|
| - 0xdb, 0x00, 0x03, 0x62,
|
| - 0x61, 0x72, 0x03, 0x66,
|
| - 0x6f, 0x6f, 0x00, 0x03,
|
| - 0x66, 0x6f, 0x6f, 0x00,
|
| - };
|
| SpdySynStreamIR syn_stream(0x7fffffff);
|
| syn_stream.set_associated_to_stream_id(0x7fffffff);
|
| syn_stream.set_priority(1);
|
| @@ -2040,7 +1973,7 @@ TEST_P(SpdyFramerTest, CreateSynStreamUncompressed) {
|
| } else if (IsSpdy3()) {
|
| CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
|
| } else {
|
| - CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
|
| + LOG(FATAL) << "Unsupported version in test.";
|
| }
|
| }
|
| }
|
| @@ -2049,6 +1982,10 @@ TEST_P(SpdyFramerTest, CreateSynStreamUncompressed) {
|
| // to workaround http://crbug.com/139744.
|
| #if !defined(USE_SYSTEM_ZLIB)
|
| TEST_P(SpdyFramerTest, CreateSynStreamCompressed) {
|
| + if (!IsSpdy2() && !IsSpdy3()) {
|
| + // SYN_STREAM not supported for SPDY>3
|
| + return;
|
| + }
|
| SpdyFramer framer(spdy_version_);
|
| framer.set_enable_compression(true);
|
|
|
| @@ -2103,7 +2040,7 @@ TEST_P(SpdyFramerTest, CreateSynStreamCompressed) {
|
| } else if (IsSpdy3()) {
|
| CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
|
| } else {
|
| - // Deflate compression doesn't apply to HPACK.
|
| + LOG(FATAL) << "Unsupported version in test.";
|
| }
|
| }
|
| }
|
| @@ -2111,6 +2048,7 @@ TEST_P(SpdyFramerTest, CreateSynStreamCompressed) {
|
|
|
| TEST_P(SpdyFramerTest, CreateSynReplyUncompressed) {
|
| if (spdy_version_ > SPDY3) {
|
| + // SYN_REPLY unsupported in SPDY>3
|
| return;
|
| }
|
| SpdyFramer framer(spdy_version_);
|
| @@ -2143,15 +2081,6 @@ TEST_P(SpdyFramerTest, CreateSynReplyUncompressed) {
|
| 'o', 0x00, 0x00, 0x00,
|
| 0x03, 'b', 'a', 'r'
|
| };
|
| - const unsigned char kV4FrameData[] = {
|
| - 0x00, 0x12, 0x01, 0x04, // HEADER: END_HEADERS
|
| - 0x00, 0x00, 0x00, 0x01, // Stream 1
|
| - 0x00, 0x03, 0x62, 0x61, // @.ba
|
| - 0x72, 0x03, 0x66, 0x6f, // r.fo
|
| - 0x6f, 0x00, 0x03, 0x66, // o@.f
|
| - 0x6f, 0x6f, 0x03, 0x62, // oo.b
|
| - 0x61, 0x72, // ar
|
| - };
|
| SpdySynReplyIR syn_reply(1);
|
| syn_reply.SetHeader("bar", "foo");
|
| syn_reply.SetHeader("foo", "bar");
|
| @@ -2161,7 +2090,7 @@ TEST_P(SpdyFramerTest, CreateSynReplyUncompressed) {
|
| } else if (IsSpdy3()) {
|
| CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
|
| } else {
|
| - CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
|
| + LOG(FATAL) << "Unsupported version in test.";
|
| }
|
| }
|
|
|
| @@ -2193,14 +2122,6 @@ TEST_P(SpdyFramerTest, CreateSynReplyUncompressed) {
|
| 0x00, 0x03, 'b', 'a',
|
| 'r'
|
| };
|
| - const unsigned char kV4FrameData[] = {
|
| - 0x00, 0x0f, 0x01, 0x05, // HEADER: FIN | END_HEADERS
|
| - 0x7f, 0xff, 0xff, 0xff, // Stream 0x7fffffff
|
| - 0x00, 0x00, 0x03, 0x66, // @..f
|
| - 0x6f, 0x6f, 0x00, 0x03, // oo@.
|
| - 0x66, 0x6f, 0x6f, 0x03, // foo.
|
| - 0x62, 0x61, 0x72, // bar
|
| - };
|
| SpdySynReplyIR syn_reply(0x7fffffff);
|
| syn_reply.set_fin(true);
|
| syn_reply.SetHeader("", "foo");
|
| @@ -2211,7 +2132,7 @@ TEST_P(SpdyFramerTest, CreateSynReplyUncompressed) {
|
| } else if (IsSpdy3()) {
|
| CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
|
| } else {
|
| - CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
|
| + LOG(FATAL) << "Unsupported version in test.";
|
| }
|
| }
|
|
|
| @@ -2243,14 +2164,6 @@ TEST_P(SpdyFramerTest, CreateSynReplyUncompressed) {
|
| 'o', 0x00, 0x00, 0x00,
|
| 0x00
|
| };
|
| - const unsigned char kV4FrameData[] = {
|
| - 0x00, 0x0f, 0x01, 0x05, // HEADER: FIN | END_HEADERS
|
| - 0x7f, 0xff, 0xff, 0xff, // Stream 0x7fffffff
|
| - 0x00, 0x03, 0x62, 0x61, // @.ba
|
| - 0x72, 0x03, 0x66, 0x6f, // r.fo
|
| - 0x6f, 0x00, 0x03, 0x66, // o@.f
|
| - 0x6f, 0x6f, 0x00, // oo.
|
| - };
|
| SpdySynReplyIR syn_reply(0x7fffffff);
|
| syn_reply.set_fin(true);
|
| syn_reply.SetHeader("bar", "foo");
|
| @@ -2261,7 +2174,7 @@ TEST_P(SpdyFramerTest, CreateSynReplyUncompressed) {
|
| } else if (IsSpdy3()) {
|
| CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
|
| } else {
|
| - CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
|
| + LOG(FATAL) << "Unsupported version in test.";
|
| }
|
| }
|
| }
|
| @@ -2271,6 +2184,7 @@ TEST_P(SpdyFramerTest, CreateSynReplyUncompressed) {
|
| #if !defined(USE_SYSTEM_ZLIB)
|
| TEST_P(SpdyFramerTest, CreateSynReplyCompressed) {
|
| if (spdy_version_ > SPDY3) {
|
| + // SYN_REPLY unsupported in SPDY>3
|
| return;
|
| }
|
| SpdyFramer framer(spdy_version_);
|
| @@ -2322,7 +2236,7 @@ TEST_P(SpdyFramerTest, CreateSynReplyCompressed) {
|
| } else if (IsSpdy3()) {
|
| CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
|
| } else {
|
| - // Deflate compression doesn't apply to HPACK.
|
| + LOG(FATAL) << "Unsupported version in test.";
|
| }
|
| }
|
| }
|
| @@ -2811,6 +2725,34 @@ TEST_P(SpdyFramerTest, CreateHeadersUncompressed) {
|
| CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
|
| }
|
| }
|
| +
|
| + {
|
| + const char kDescription[] =
|
| + "HEADERS frame with a 0-length header val, FIN, max stream ID, pri";
|
| +
|
| + const unsigned char kV4FrameData[] = {
|
| + 0x00, 0x14, 0x01, 0x25, // Headers: FIN | END_HEADERS | PRIORITY
|
| + 0x7f, 0xff, 0xff, 0xff, // Stream 0x7fffffff
|
| + 0x00, 0x00, 0x00, 0x00, // parent stream
|
| + 0xdb, // weight
|
| + 0x00, 0x03, 0x62, 0x61, // @.ba
|
| + 0x72, 0x03, 0x66, 0x6f, // r.fo
|
| + 0x6f, 0x00, 0x03, 0x66, // o@.f
|
| + 0x6f, 0x6f, 0x00, // oo.
|
| + };
|
| + SpdyHeadersIR headers_ir(0x7fffffff);
|
| + headers_ir.set_fin(true);
|
| + headers_ir.set_priority(1);
|
| + headers_ir.set_has_priority(true);
|
| + headers_ir.SetHeader("bar", "foo");
|
| + headers_ir.SetHeader("foo", "");
|
| + scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir));
|
| + if (IsSpdy2() || IsSpdy3()) {
|
| + // HEADERS with priority not supported.
|
| + } else {
|
| + CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
|
| + }
|
| + }
|
| }
|
|
|
| // TODO(phajdan.jr): Clean up after we no longer need
|
| @@ -3060,6 +3002,10 @@ TEST_P(SpdyFramerTest, CreatePriority) {
|
| }
|
|
|
| TEST_P(SpdyFramerTest, ReadCompressedSynStreamHeaderBlock) {
|
| + if (spdy_version_ > SPDY3) {
|
| + // SYN_STREAM not supported in SPDY>3
|
| + return;
|
| + }
|
| SpdyFramer framer(spdy_version_);
|
| SpdySynStreamIR syn_stream(1);
|
| syn_stream.set_priority(1);
|
| @@ -3295,11 +3241,11 @@ TEST_P(SpdyFramerTest, ControlFrameMuchTooLarge) {
|
| const size_t kBigValueSize = kHeaderBufferSize * 2;
|
| string big_value(kBigValueSize, 'x');
|
| SpdyFramer framer(spdy_version_);
|
| - SpdySynStreamIR syn_stream(1);
|
| - syn_stream.set_priority(1);
|
| - syn_stream.set_fin(true);
|
| - syn_stream.SetHeader("aa", big_value);
|
| - scoped_ptr<SpdyFrame> control_frame(framer.SerializeSynStream(syn_stream));
|
| + SpdyHeadersIR headers(1);
|
| + headers.set_priority(1);
|
| + headers.set_fin(true);
|
| + headers.SetHeader("aa", big_value);
|
| + scoped_ptr<SpdyFrame> control_frame(framer.SerializeHeaders(headers));
|
| EXPECT_TRUE(control_frame.get() != NULL);
|
| TestSpdyVisitor visitor(spdy_version_);
|
| visitor.set_header_buffer_size(kHeaderBufferSize);
|
| @@ -4503,6 +4449,10 @@ TEST_P(SpdyFramerTest, DataFrameFlagsV4) {
|
| }
|
|
|
| TEST_P(SpdyFramerTest, SynStreamFrameFlags) {
|
| + if (!IsSpdy2() && !IsSpdy3()) {
|
| + // SYN_STREAM not supported in SPDY>3
|
| + return;
|
| + }
|
| for (int flags = 0; flags < 256; ++flags) {
|
| SCOPED_TRACE(testing::Message() << "Flags " << flags);
|
|
|
| @@ -4520,40 +4470,17 @@ TEST_P(SpdyFramerTest, SynStreamFrameFlags) {
|
| syn_stream.SetHeader("foo", "bar");
|
| scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream));
|
| int set_flags = flags;
|
| - 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_);
|
|
|
| - if (!IsSpdy4() &&
|
| - flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) {
|
| - EXPECT_CALL(visitor, OnError(_));
|
| - } else if (IsSpdy4() &&
|
| - flags & ~(CONTROL_FLAG_FIN |
|
| - HEADERS_FLAG_PRIORITY |
|
| - HEADERS_FLAG_END_HEADERS |
|
| - HEADERS_FLAG_END_SEGMENT |
|
| - HEADERS_FLAG_PAD_LOW |
|
| - HEADERS_FLAG_PAD_HIGH)) {
|
| + if (flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) {
|
| EXPECT_CALL(visitor, OnError(_));
|
| } else {
|
| EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(8, SYN_STREAM, _));
|
| - if (IsSpdy4()) {
|
| - EXPECT_CALL(visitor, OnSynStream(8, 0, 1, flags & CONTROL_FLAG_FIN,
|
| - false));
|
| - } else {
|
| - EXPECT_CALL(visitor, OnSynStream(8, 3, 1, flags & CONTROL_FLAG_FIN,
|
| - flags & CONTROL_FLAG_UNIDIRECTIONAL));
|
| - }
|
| + EXPECT_CALL(visitor, OnSynStream(8, 3, 1, flags & CONTROL_FLAG_FIN,
|
| + flags & CONTROL_FLAG_UNIDIRECTIONAL));
|
| EXPECT_CALL(visitor, OnControlFrameHeaderData(8, _, _))
|
| .WillRepeatedly(testing::Return(true));
|
| - if (flags & DATA_FLAG_FIN && (!IsSpdy4() ||
|
| - flags & HEADERS_FLAG_END_HEADERS)) {
|
| + if (flags & DATA_FLAG_FIN) {
|
| EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true));
|
| } else {
|
| // Do not close the stream if we are expecting a CONTINUATION frame.
|
| @@ -4562,19 +4489,7 @@ TEST_P(SpdyFramerTest, SynStreamFrameFlags) {
|
| }
|
|
|
| framer.ProcessInput(frame->data(), frame->size());
|
| - 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 |
|
| - HEADERS_FLAG_END_HEADERS |
|
| - HEADERS_FLAG_END_SEGMENT |
|
| - HEADERS_FLAG_PAD_LOW |
|
| - HEADERS_FLAG_PAD_HIGH)) {
|
| + if (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())
|
| @@ -4588,8 +4503,8 @@ TEST_P(SpdyFramerTest, SynStreamFrameFlags) {
|
| }
|
|
|
| TEST_P(SpdyFramerTest, SynReplyFrameFlags) {
|
| - if (IsSpdy4()) {
|
| - // Covered by HEADERS case.
|
| + if (!IsSpdy2() && !IsSpdy3()) {
|
| + // SYN_REPLY not supported in SPDY>3
|
| return;
|
| }
|
| for (int flags = 0; flags < 256; ++flags) {
|
| @@ -4778,10 +4693,6 @@ 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::MockSpdyFramerVisitor> visitor;
|
| @@ -4789,6 +4700,10 @@ TEST_P(SpdyFramerTest, HeadersFrameFlags) {
|
| framer.set_visitor(&visitor);
|
|
|
| SpdyHeadersIR headers_ir(57);
|
| + if (IsSpdy4() && (flags & HEADERS_FLAG_PRIORITY)) {
|
| + headers_ir.set_priority(3);
|
| + headers_ir.set_has_priority(true);
|
| + }
|
| headers_ir.SetHeader("foo", "bar");
|
| scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir));
|
| int set_flags = flags;
|
| @@ -4806,13 +4721,22 @@ TEST_P(SpdyFramerTest, HeadersFrameFlags) {
|
| HEADERS_FLAG_END_HEADERS |
|
| HEADERS_FLAG_END_SEGMENT |
|
| HEADERS_FLAG_PAD_LOW |
|
| - HEADERS_FLAG_PAD_HIGH)) {
|
| + HEADERS_FLAG_PAD_HIGH |
|
| + HEADERS_FLAG_PRIORITY)) {
|
| EXPECT_CALL(visitor, OnError(_));
|
| } else {
|
| - EXPECT_CALL(visitor, OnHeaders(57,
|
| - flags & CONTROL_FLAG_FIN,
|
| - (flags & HEADERS_FLAG_END_HEADERS) ||
|
| - !IsSpdy4()));
|
| + if (spdy_version_ > SPDY3 && flags & HEADERS_FLAG_PRIORITY) {
|
| + EXPECT_CALL(visitor, OnSynStream(57, // stream id
|
| + 0, // associated stream id
|
| + 3, // priority
|
| + flags & CONTROL_FLAG_FIN,
|
| + false)); // unidirectional
|
| + } else {
|
| + EXPECT_CALL(visitor, OnHeaders(57,
|
| + flags & CONTROL_FLAG_FIN,
|
| + (flags & HEADERS_FLAG_END_HEADERS) ||
|
| + !IsSpdy4()));
|
| + }
|
| EXPECT_CALL(visitor, OnControlFrameHeaderData(57, _, _))
|
| .WillRepeatedly(testing::Return(true));
|
| if (flags & DATA_FLAG_FIN && (!IsSpdy4() ||
|
| @@ -4834,7 +4758,8 @@ TEST_P(SpdyFramerTest, HeadersFrameFlags) {
|
| HEADERS_FLAG_END_HEADERS |
|
| HEADERS_FLAG_END_SEGMENT |
|
| HEADERS_FLAG_PAD_LOW |
|
| - HEADERS_FLAG_PAD_HIGH)) {
|
| + HEADERS_FLAG_PAD_HIGH |
|
| + HEADERS_FLAG_PRIORITY)) {
|
| EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
|
| EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
|
| framer.error_code())
|
| @@ -5040,6 +4965,10 @@ TEST_P(SpdyFramerTest, ContinuationFrameFlags) {
|
| // TODO(hkhalil): Add TEST_P(SpdyFramerTest, BlockedFrameFlags)
|
|
|
| TEST_P(SpdyFramerTest, EmptySynStream) {
|
| + if (!IsSpdy2() && !IsSpdy3()) {
|
| + // SYN_STREAM not supported in SPDY>3.
|
| + return;
|
| + }
|
| testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
|
| testing::StrictMock<test::MockDebugVisitor> debug_visitor;
|
| SpdyFramer framer(spdy_version_);
|
|
|