Index: net/spdy/spdy_framer_test.cc |
diff --git a/net/spdy/spdy_framer_test.cc b/net/spdy/spdy_framer_test.cc |
index 89e93cba2debee59ca3638926cb7d8e4397ef4e4..8438692edf9e2ff92cfad6646918cd6f7d24505d 100644 |
--- a/net/spdy/spdy_framer_test.cc |
+++ b/net/spdy/spdy_framer_test.cc |
@@ -198,6 +198,12 @@ class SpdyFramerTestUtil { |
// Do nothing. |
} |
+ virtual bool OnUnknownFrame(SpdyStreamId stream_id, |
+ int frame_type) override { |
+ LOG(FATAL); |
+ return false; |
+ } |
+ |
char* ReleaseBuffer() { |
CHECK(finished_); |
return buffer_.release(); |
@@ -249,6 +255,7 @@ class TestSpdyVisitor : public SpdyFramerVisitorInterface, |
altsvc_count_(0), |
priority_count_(0), |
test_altsvc_ir_(0), |
+ on_unknown_frame_result_(false), |
last_window_update_stream_(0), |
last_window_update_delta_(0), |
last_push_promise_stream_(0), |
@@ -438,6 +445,18 @@ class TestSpdyVisitor : public SpdyFramerVisitorInterface, |
++altsvc_count_; |
} |
+ virtual void OnPriority(SpdyStreamId stream_id, |
+ SpdyStreamId parent_stream_id, |
+ uint8 weight, |
+ bool exclusive) OVERRIDE { |
+ ++priority_count_; |
+ } |
+ |
+ virtual bool OnUnknownFrame(SpdyStreamId stream_id, int frame_type) override { |
+ DLOG(INFO) << "Unknown frame type " << frame_type; |
+ return on_unknown_frame_result_; |
+ } |
+ |
virtual void OnSendCompressedFrame(SpdyStreamId stream_id, |
SpdyFrameType type, |
size_t payload_len, |
@@ -446,13 +465,6 @@ class TestSpdyVisitor : public SpdyFramerVisitorInterface, |
last_frame_len_ = frame_len; |
} |
- virtual void OnPriority(SpdyStreamId stream_id, |
- SpdyStreamId parent_stream_id, |
- uint8 weight, |
- bool exclusive) OVERRIDE { |
- ++priority_count_; |
- } |
- |
virtual void OnReceiveCompressedFrame(SpdyStreamId stream_id, |
SpdyFrameType type, |
size_t frame_len) OVERRIDE { |
@@ -523,6 +535,7 @@ class TestSpdyVisitor : public SpdyFramerVisitorInterface, |
int altsvc_count_; |
int priority_count_; |
SpdyAltSvcIR test_altsvc_ir_; |
+ bool on_unknown_frame_result_; |
SpdyStreamId last_window_update_stream_; |
uint32 last_window_update_delta_; |
SpdyStreamId last_push_promise_stream_; |
@@ -553,7 +566,11 @@ class TestSpdyVisitor : public SpdyFramerVisitorInterface, |
base::StringPiece GetSerializedHeaders(const SpdyFrame* frame, |
const SpdyFramer& framer) { |
SpdyFrameReader reader(frame->data(), frame->size()); |
- reader.Seek(2); // Seek past the frame length. |
+ if (framer.protocol_version() > SPDY3) { |
+ reader.Seek(3); // Seek past the frame length. |
+ } else { |
+ reader.Seek(2); // Seek past the frame length. |
+ } |
SpdyFrameType frame_type; |
if (framer.protocol_version() > SPDY3) { |
uint8 serialized_type; |
@@ -1156,48 +1173,53 @@ TEST_P(SpdyFramerTest, Basic) { |
// SYN_STREAM doesn't exist in SPDY4, so instead we send |
// HEADERS frames with PRIORITY and END_HEADERS set. |
const unsigned char kV4Input[] = { |
- 0x00, 0x05, 0x01, 0x24, // HEADERS: PRIORITY | END_HEADERS |
- 0x00, 0x00, 0x00, 0x01, // Stream 1 |
- 0x00, 0x00, 0x00, 0x00, // Priority 0 |
- 0x82, // :method: GET |
+ 0x00, 0x00, 0x05, 0x01, // HEADERS: PRIORITY | END_HEADERS |
+ 0x24, 0x00, 0x00, 0x00, |
+ 0x01, 0x00, 0x00, 0x00, // Stream 1, Priority 0 |
+ 0x00, 0x82, // :method: GET |
- 0x00, 0x01, 0x01, 0x04, // HEADERS: END_HEADERS |
- 0x00, 0x00, 0x00, 0x01, // Stream 1 |
- 0x8c, // :status: 200 |
+ 0x00, 0x00, 0x01, 0x01, // HEADERS: END_HEADERS |
+ 0x04, 0x00, 0x00, 0x00, // Stream 1 |
+ 0x01, 0x8c, // :status: 200 |
- 0x00, 0x0c, 0x00, 0x00, // DATA on Stream #1 |
- 0x00, 0x00, 0x00, 0x01, |
- 0xde, 0xad, 0xbe, 0xef, |
- 0xde, 0xad, 0xbe, 0xef, |
- 0xde, 0xad, 0xbe, 0xef, |
+ 0x00, 0x00, 0x0c, 0x00, // DATA on Stream #1 |
+ 0x00, 0x00, 0x00, 0x00, |
+ 0x01, 0xde, 0xad, 0xbe, |
+ 0xef, 0xde, 0xad, 0xbe, |
+ 0xef, 0xde, 0xad, 0xbe, |
+ 0xef, |
- 0x00, 0x05, 0x01, 0x24, // HEADERS: PRIORITY | END_HEADERS |
- 0x00, 0x00, 0x00, 0x03, // Stream 3 |
- 0x00, 0x00, 0x00, 0x00, // Priority 0 |
- 0x82, // :method: GET |
+ 0x00, 0x00, 0x05, 0x01, // HEADERS: PRIORITY | END_HEADERS |
+ 0x24, 0x00, 0x00, 0x00, |
+ 0x03, 0x00, 0x00, 0x00, // Stream 3, Priority 0 |
+ 0x00, 0x82, // :method: GET |
- 0x00, 0x08, 0x00, 0x00, // DATA on Stream #3 |
- 0x00, 0x00, 0x00, 0x03, |
- 0xde, 0xad, 0xbe, 0xef, |
- 0xde, 0xad, 0xbe, 0xef, |
+ 0x00, 0x00, 0x08, 0x00, // DATA on Stream #3 |
+ 0x00, 0x00, 0x00, 0x00, |
+ 0x03, 0xde, 0xad, 0xbe, |
+ 0xef, 0xde, 0xad, 0xbe, |
+ 0xef, |
- 0x00, 0x04, 0x00, 0x00, // DATA on Stream #1 |
- 0x00, 0x00, 0x00, 0x01, |
- 0xde, 0xad, 0xbe, 0xef, |
+ 0x00, 0x00, 0x04, 0x00, // DATA on Stream #1 |
+ 0x00, 0x00, 0x00, 0x00, |
+ 0x01, 0xde, 0xad, 0xbe, |
+ 0xef, |
- 0x00, 0x04, 0x03, 0x00, // RST_STREAM on Stream #1 |
- 0x00, 0x00, 0x00, 0x01, |
- 0x00, 0x00, 0x00, 0x08, // RST_STREAM_CANCEL |
+ 0x00, 0x00, 0x04, 0x03, // RST_STREAM on Stream #1 |
+ 0x00, 0x00, 0x00, 0x00, |
+ 0x01, 0x00, 0x00, 0x00, |
+ 0x08, // RST_STREAM_CANCEL |
0x00, 0x00, 0x00, 0x00, // DATA on Stream #3 |
- 0x00, 0x00, 0x00, 0x03, |
+ 0x00, 0x00, 0x00, 0x00, |
+ 0x03, |
- 0x00, 0x0f, 0x03, 0x00, // RST_STREAM on Stream #3 |
- 0x00, 0x00, 0x00, 0x03, |
- 0x00, 0x00, 0x00, 0x08, // RST_STREAM_CANCEL |
- 0x52, 0x45, 0x53, 0x45, // opaque data |
- 0x54, 0x53, 0x54, 0x52, |
- 0x45, 0x41, 0x4d, |
+ 0x00, 0x00, 0x0f, 0x03, // RST_STREAM on Stream #3 |
+ 0x00, 0x00, 0x00, 0x00, |
+ 0x03, 0x00, 0x00, 0x00, // RST_STREAM_CANCEL |
+ 0x08, 0x52, 0x45, 0x53, // opaque data |
+ 0x45, 0x54, 0x53, 0x54, |
+ 0x52, 0x45, 0x41, 0x4d, |
}; |
TestSpdyVisitor visitor(spdy_version_); |
@@ -1291,24 +1313,26 @@ TEST_P(SpdyFramerTest, FinOnDataFrame) { |
// SYN_STREAM and SYN_REPLY don't exist in SPDY4, so instead we send |
// HEADERS frames with PRIORITY(SYN_STREAM only) and END_HEADERS set. |
const unsigned char kV4Input[] = { |
- 0x00, 0x05, 0x01, 0x24, // HEADERS: PRIORITY | END_HEADERS |
- 0x00, 0x00, 0x00, 0x01, // Stream 1 |
- 0x00, 0x00, 0x00, 0x00, // Priority 0 |
- 0x82, // :method: GET |
+ 0x00, 0x00, 0x05, 0x01, // HEADERS: PRIORITY | END_HEADERS |
+ 0x24, 0x00, 0x00, 0x00, // Stream 1 |
+ 0x01, 0x00, 0x00, 0x00, // Priority 0 |
+ 0x00, 0x82, // :method: GET |
- 0x00, 0x01, 0x01, 0x04, // HEADERS: END_HEADERS |
- 0x00, 0x00, 0x00, 0x01, // Stream 1 |
- 0x8c, // :status: 200 |
+ 0x00, 0x00, 0x01, 0x01, // HEADERS: END_HEADERS |
+ 0x04, 0x00, 0x00, 0x00, // Stream 1 |
+ 0x01, 0x8c, // :status: 200 |
- 0x00, 0x0c, 0x00, 0x00, // DATA on Stream #1 |
- 0x00, 0x00, 0x00, 0x01, |
- 0xde, 0xad, 0xbe, 0xef, |
- 0xde, 0xad, 0xbe, 0xef, |
- 0xde, 0xad, 0xbe, 0xef, |
- |
- 0x00, 0x04, 0x00, 0x01, // DATA on Stream #1, with FIN |
- 0x00, 0x00, 0x00, 0x01, |
- 0xde, 0xad, 0xbe, 0xef, |
+ 0x00, 0x00, 0x0c, 0x00, // DATA on Stream #1 |
+ 0x00, 0x00, 0x00, 0x00, |
+ 0x01, 0xde, 0xad, 0xbe, |
+ 0xef, 0xde, 0xad, 0xbe, |
+ 0xef, 0xde, 0xad, 0xbe, |
+ 0xef, |
+ |
+ 0x00, 0x00, 0x04, 0x00, // DATA on Stream #1, with FIN |
+ 0x01, 0x00, 0x00, 0x00, |
+ 0x01, 0xde, 0xad, 0xbe, |
+ 0xef, |
}; |
TestSpdyVisitor visitor(spdy_version_); |
@@ -1339,52 +1363,55 @@ TEST_P(SpdyFramerTest, FinOnDataFrame) { |
// Test that the FIN flag on a SYN reply frame signifies EOF. |
TEST_P(SpdyFramerTest, FinOnSynReplyFrame) { |
const unsigned char kV2Input[] = { |
- 0x80, spdy_version_ch_, 0x00, 0x01, // SYN Stream #1 |
- 0x00, 0x00, 0x00, 0x14, |
- 0x00, 0x00, 0x00, 0x01, |
+ 0x80, spdy_version_ch_, 0x00, // SYN Stream #1 |
+ 0x01, 0x00, 0x00, 0x00, |
+ 0x14, 0x00, 0x00, 0x00, |
+ 0x01, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, |
- 0x00, 0x00, 0x00, 0x01, |
- 0x00, 0x02, 'h', 'h', |
- 0x00, 0x02, 'v', 'v', |
- |
- 0x80, spdy_version_ch_, 0x00, 0x02, // SYN REPLY Stream #1 |
- 0x01, 0x00, 0x00, 0x10, |
- 0x00, 0x00, 0x00, 0x01, |
- 0x00, 0x00, 0x00, 0x01, |
- 0x00, 0x02, 'a', 'a', |
- 0x00, 0x02, 'b', 'b', |
+ 0x01, 0x00, 0x02, 'h', |
+ 'h', 0x00, 0x02, 'v', |
+ 'v', |
+ |
+ 0x80, spdy_version_ch_, 0x00, // SYN REPLY Stream #1 |
+ 0x02, 0x01, 0x00, 0x00, |
+ 0x10, 0x00, 0x00, 0x00, |
+ 0x01, 0x00, 0x00, 0x00, |
+ 0x01, 0x00, 0x02, 'a', |
+ 'a', 0x00, 0x02, 'b', |
+ 'b', |
}; |
const unsigned char kV3Input[] = { |
- 0x80, spdy_version_ch_, 0x00, 0x01, // SYN Stream #1 |
- 0x00, 0x00, 0x00, 0x1a, |
- 0x00, 0x00, 0x00, 0x01, |
+ 0x80, spdy_version_ch_, 0x00, // SYN Stream #1 |
+ 0x01, 0x00, 0x00, 0x00, |
+ 0x1a, 0x00, 0x00, 0x00, |
+ 0x01, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, |
- 0x00, 0x00, 0x00, 0x00, |
- 0x00, 0x01, 0x00, 0x00, |
- 0x00, 0x02, 'h', 'h', |
- 0x00, 0x00, 0x00, 0x02, |
- 'v', 'v', |
- |
- 0x80, spdy_version_ch_, 0x00, 0x02, // SYN REPLY Stream #1 |
- 0x01, 0x00, 0x00, 0x14, |
- 0x00, 0x00, 0x00, 0x01, |
- 0x00, 0x00, 0x00, 0x01, |
- 0x00, 0x00, 0x00, 0x02, |
- 'a', 'a', 0x00, 0x00, |
- 0x00, 0x02, 'b', 'b', |
+ 0x00, 0x00, 0x01, 0x00, |
+ 0x00, 0x00, 0x02, 'h', |
+ 'h', 0x00, 0x00, 0x00, |
+ 0x02, 'v', 'v', |
+ |
+ 0x80, spdy_version_ch_, 0x00, // SYN REPLY Stream #1 |
+ 0x02, 0x01, 0x00, 0x00, |
+ 0x14, 0x00, 0x00, 0x00, |
+ 0x01, 0x00, 0x00, 0x00, |
+ 0x01, 0x00, 0x00, 0x00, |
+ 0x02, 'a', 'a', 0x00, |
+ 0x00, 0x00, 0x02, 'b', |
+ 'b', |
}; |
// SYN_STREAM and SYN_REPLY don't exist in SPDY4, so instead we send |
// HEADERS frames with PRIORITY(SYN_STREAM only) and END_HEADERS set. |
const unsigned char kV4Input[] = { |
- 0x00, 0x05, 0x01, 0x24, // HEADERS: PRIORITY | END_HEADERS |
- 0x00, 0x00, 0x00, 0x01, // Stream 1 |
- 0x00, 0x00, 0x00, 0x00, // Priority 0 |
- 0x82, // :method: GET |
- |
- 0x00, 0x01, 0x01, 0x05, // HEADERS: FIN | END_HEADERS |
- 0x00, 0x00, 0x00, 0x01, // Stream 1 |
- 0x8c, // :status: 200 |
+ 0x00, 0x00, 0x05, 0x01, // HEADERS: PRIORITY | END_HEADERS |
+ 0x24, 0x00, 0x00, 0x00, |
+ 0x01, 0x00, 0x00, 0x00, // Stream 1, Priority 0 |
+ 0x00, 0x82, // :method: GET |
+ |
+ 0x00, 0x00, 0x01, 0x01, // HEADERS: FIN | END_HEADERS |
+ 0x05, 0x00, 0x00, 0x00, |
+ 0x01, 0x8c, // Stream 1, :status: 200 |
}; |
TestSpdyVisitor visitor(spdy_version_); |
@@ -1542,9 +1569,10 @@ TEST_P(SpdyFramerTest, WindowUpdateFrame) { |
0x12, 0x34, 0x56, 0x78 |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x04, 0x08, 0x00, |
- 0x00, 0x00, 0x00, 0x01, |
- 0x12, 0x34, 0x56, 0x78 |
+ 0x00, 0x00, 0x04, 0x08, |
+ 0x00, 0x00, 0x00, 0x00, |
+ 0x01, 0x12, 0x34, 0x56, |
+ 0x78 |
}; |
if (IsSpdy4()) { |
@@ -1566,10 +1594,10 @@ TEST_P(SpdyFramerTest, CreateDataFrame) { |
'o' |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x05, 0x00, 0x00, |
- 0x00, 0x00, 0x00, 0x01, |
- 'h', 'e', 'l', 'l', |
- 'o' |
+ 0x00, 0x00, 0x05, 0x00, |
+ 0x00, 0x00, 0x00, 0x00, |
+ 0x01, 'h', 'e', 'l', |
+ 'l', 'o' |
}; |
const char bytes[] = "hello"; |
@@ -1605,9 +1633,9 @@ TEST_P(SpdyFramerTest, CreateDataFrame) { |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0xfd, 0x00, 0x08, // Length = 253. PADDED set. |
- 0x00, 0x00, 0x00, 0x01, |
- 0xf7, // Pad length field. |
+ 0x00, 0x00, 0xfd, 0x00, // Length = 253. PADDED set. |
+ 0x08, 0x00, 0x00, 0x00, |
+ 0x01, 0xf7, // Pad length field. |
'h', 'e', 'l', 'l', // Data |
'o', |
// Padding of 247 zeros. |
@@ -1665,9 +1693,9 @@ TEST_P(SpdyFramerTest, CreateDataFrame) { |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x0d, 0x00, 0x08, // Length = 13. PADDED set. |
- 0x00, 0x00, 0x00, 0x01, |
- 0x07, // Pad length field. |
+ 0x00, 0x00, 0x0d, 0x00, // Length = 13. PADDED set. |
+ 0x08, 0x00, 0x00, 0x00, |
+ 0x01, 0x07, // Pad length field. |
'h', 'e', 'l', 'l', // Data |
'o', |
'0', '0', '0', '0', // Padding |
@@ -1699,9 +1727,9 @@ TEST_P(SpdyFramerTest, CreateDataFrame) { |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x06, 0x00, 0x08, // Length = 6. PADDED set. |
- 0x00, 0x00, 0x00, 0x01, |
- 0x00, // Pad length field. |
+ 0x00, 0x00, 0x06, 0x00, // Length = 6. PADDED set. |
+ 0x08, 0x00, 0x00, 0x00, |
+ 0x01, 0x00, // Pad length field. |
'h', 'e', 'l', 'l', // Data |
'o', |
}; |
@@ -1737,7 +1765,7 @@ TEST_P(SpdyFramerTest, CreateDataFrame) { |
0xff |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x01, 0x00, 0x00, |
+ 0x00, 0x00, 0x01, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x01, |
0xff |
}; |
@@ -1761,10 +1789,10 @@ TEST_P(SpdyFramerTest, CreateDataFrame) { |
'o' |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x05, 0x00, 0x01, |
- 0x00, 0x00, 0x00, 0x01, |
- 'h', 'e', 'l', 'l', |
- 'o' |
+ 0x00, 0x00, 0x05, 0x00, |
+ 0x01, 0x00, 0x00, 0x00, |
+ 0x01, 'h', 'e', 'l', |
+ 'l', 'o' |
}; |
SpdyDataIR data_ir(1, StringPiece("hello", 5)); |
data_ir.set_fin(true); |
@@ -1786,7 +1814,8 @@ TEST_P(SpdyFramerTest, CreateDataFrame) { |
}; |
const unsigned char kV4FrameData[] = { |
0x00, 0x00, 0x00, 0x00, |
- 0x00, 0x00, 0x00, 0x01, |
+ 0x00, 0x00, 0x00, 0x00, |
+ 0x01, |
}; |
SpdyDataIR data_ir(1, StringPiece()); |
scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); |
@@ -1816,10 +1845,10 @@ TEST_P(SpdyFramerTest, CreateDataFrame) { |
'o' |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x05, 0x00, 0x01, |
- 0x7f, 0xff, 0xff, 0xff, |
- 'h', 'e', 'l', 'l', |
- 'o' |
+ 0x00, 0x00, 0x05, 0x00, |
+ 0x01, 0x7f, 0xff, 0xff, |
+ 0xff, 'h', 'e', 'l', |
+ 'l', 'o' |
}; |
SpdyDataIR data_ir(0x7fffffff, "hello"); |
data_ir.set_fin(true); |
@@ -2282,10 +2311,10 @@ TEST_P(SpdyFramerTest, CreateRstStream) { |
0x00, 0x00, 0x00, 0x01, |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x07, 0x03, 0x00, |
- 0x00, 0x00, 0x00, 0x01, |
- 0x00, 0x00, 0x00, 0x01, |
- 0x52, 0x53, 0x54 |
+ 0x00, 0x00, 0x07, 0x03, |
+ 0x00, 0x00, 0x00, 0x00, |
+ 0x01, 0x00, 0x00, 0x00, |
+ 0x01, 0x52, 0x53, 0x54 |
}; |
SpdyRstStreamIR rst_stream(1, RST_STREAM_PROTOCOL_ERROR, "RST"); |
scoped_ptr<SpdyFrame> frame(framer.SerializeRstStream(rst_stream)); |
@@ -2305,9 +2334,10 @@ TEST_P(SpdyFramerTest, CreateRstStream) { |
0x00, 0x00, 0x00, 0x01, |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x04, 0x03, 0x00, |
- 0x7f, 0xff, 0xff, 0xff, |
- 0x00, 0x00, 0x00, 0x01, |
+ 0x00, 0x00, 0x04, 0x03, |
+ 0x00, 0x7f, 0xff, 0xff, |
+ 0xff, 0x00, 0x00, 0x00, |
+ 0x01, |
}; |
SpdyRstStreamIR rst_stream(0x7FFFFFFF, |
RST_STREAM_PROTOCOL_ERROR, |
@@ -2329,9 +2359,10 @@ TEST_P(SpdyFramerTest, CreateRstStream) { |
0x00, 0x00, 0x00, 0x06, |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x04, 0x03, 0x00, |
- 0x7f, 0xff, 0xff, 0xff, |
- 0x00, 0x00, 0x00, 0x06, |
+ 0x00, 0x00, 0x04, 0x03, |
+ 0x00, 0x7f, 0xff, 0xff, |
+ 0xff, 0x00, 0x00, 0x00, |
+ 0x06, |
}; |
SpdyRstStreamIR rst_stream(0x7FFFFFFF, |
RST_STREAM_INTERNAL_ERROR, |
@@ -2366,10 +2397,10 @@ TEST_P(SpdyFramerTest, CreateSettings) { |
0x0a, 0x0b, 0x0c, 0x0d, |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x06, 0x04, 0x00, |
+ 0x00, 0x00, 0x06, 0x04, |
0x00, 0x00, 0x00, 0x00, |
- 0x00, 0x04, 0x0a, 0x0b, |
- 0x0c, 0x0d, |
+ 0x00, 0x00, 0x04, 0x0a, |
+ 0x0b, 0x0c, 0x0d, |
}; |
uint32 kValue = 0x0a0b0c0d; |
@@ -2429,9 +2460,9 @@ TEST_P(SpdyFramerTest, CreateSettings) { |
// ordering for settings_ir works. HTTP2 has no requirement on ordering on |
// the wire. |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x18, 0x04, 0x00, |
+ 0x00, 0x00, 0x18, 0x04, |
0x00, 0x00, 0x00, 0x00, |
- 0x00, 0x03, // 3rd Setting |
+ 0x00, 0x00, 0x03, // 3rd Setting |
0x00, 0x00, 0x00, 0x07, |
0x00, 0x04, // 4th Setting |
0x00, 0x00, 0x00, 0x08, |
@@ -2478,8 +2509,9 @@ TEST_P(SpdyFramerTest, CreateSettings) { |
0x00, 0x00, 0x00, 0x00, |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x00, 0x04, 0x00, |
+ 0x00, 0x00, 0x00, 0x04, |
0x00, 0x00, 0x00, 0x00, |
+ 0x00, |
}; |
SpdySettingsIR settings_ir; |
scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir)); |
@@ -2502,16 +2534,18 @@ TEST_P(SpdyFramerTest, CreatePingFrame) { |
0x12, 0x34, 0x56, 0x78, |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x08, 0x06, 0x00, |
+ 0x00, 0x00, 0x08, 0x06, |
0x00, 0x00, 0x00, 0x00, |
- 0x12, 0x34, 0x56, 0x78, |
- 0x9a, 0xbc, 0xde, 0xff, |
+ 0x00, 0x12, 0x34, 0x56, |
+ 0x78, 0x9a, 0xbc, 0xde, |
+ 0xff, |
}; |
const unsigned char kV4FrameDataWithAck[] = { |
- 0x00, 0x08, 0x06, 0x01, |
- 0x00, 0x00, 0x00, 0x00, |
- 0x12, 0x34, 0x56, 0x78, |
- 0x9a, 0xbc, 0xde, 0xff, |
+ 0x00, 0x00, 0x08, 0x06, |
+ 0x01, 0x00, 0x00, 0x00, |
+ 0x00, 0x12, 0x34, 0x56, |
+ 0x78, 0x9a, 0xbc, 0xde, |
+ 0xff, |
}; |
scoped_ptr<SpdyFrame> frame; |
if (IsSpdy4()) { |
@@ -2552,11 +2586,11 @@ TEST_P(SpdyFramerTest, CreateGoAway) { |
0x00, 0x00, 0x00, 0x00, // Status |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x0a, 0x07, 0x00, |
+ 0x00, 0x00, 0x0a, 0x07, |
0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, // Stream id |
0x00, 0x00, 0x00, 0x00, // Status |
- 0x47, 0x41, // Opaque Description |
+ 0x00, 0x47, 0x41, // Opaque Description |
}; |
SpdyGoAwayIR goaway_ir(0, GOAWAY_OK, "GA"); |
scoped_ptr<SpdyFrame> frame(framer.SerializeGoAway(goaway_ir)); |
@@ -2583,11 +2617,11 @@ TEST_P(SpdyFramerTest, CreateGoAway) { |
0x00, 0x00, 0x00, 0x01, // Status: PROTOCOL_ERROR. |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x0a, 0x07, 0x00, |
+ 0x00, 0x00, 0x0a, 0x07, |
0x00, 0x00, 0x00, 0x00, |
- 0x7f, 0xff, 0xff, 0xff, // Stream Id |
- 0x00, 0x00, 0x00, 0x02, // Status: INTERNAL_ERROR. |
- 0x47, 0x41, // Opaque Description |
+ 0x00, 0x7f, 0xff, 0xff, // Stream Id |
+ 0xff, 0x00, 0x00, 0x00, // Status: INTERNAL_ERROR. |
+ 0x02, 0x47, 0x41, // Opaque Description |
}; |
SpdyGoAwayIR goaway_ir(0x7FFFFFFF, GOAWAY_INTERNAL_ERROR, "GA"); |
scoped_ptr<SpdyFrame> frame(framer.SerializeGoAway(goaway_ir)); |
@@ -2633,13 +2667,13 @@ TEST_P(SpdyFramerTest, CreateHeadersUncompressed) { |
0x03, 'b', 'a', 'r' |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x12, 0x01, 0x04, // Headers: 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 |
+ 0x00, 0x00, 0x12, 0x01, // Headers: END_HEADERS |
+ 0x04, 0x00, 0x00, 0x00, // Stream 1 |
+ 0x01, 0x00, 0x03, 0x62, // @.ba |
+ 0x61, 0x72, 0x03, 0x66, // r.fo |
+ 0x6f, 0x6f, 0x00, 0x03, // o@.f |
+ 0x66, 0x6f, 0x6f, 0x03, // oo.b |
+ 0x62, 0x61, 0x72, // ar |
}; |
SpdyHeadersIR headers_ir(1); |
headers_ir.SetHeader("bar", "foo"); |
@@ -2683,12 +2717,12 @@ TEST_P(SpdyFramerTest, CreateHeadersUncompressed) { |
'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 |
+ 0x00, 0x00, 0x0f, 0x01, // Headers: FIN | END_HEADERS |
+ 0x05, 0x7f, 0xff, 0xff, // Stream 0x7fffffff |
+ 0xff, 0x00, 0x00, 0x03, // @.. |
+ 0x66, 0x6f, 0x6f, 0x00, // foo@ |
+ 0x03, 0x66, 0x6f, 0x6f, // .foo |
+ 0x03, 0x62, 0x61, 0x72, // .bar |
}; |
SpdyHeadersIR headers_ir(0x7fffffff); |
headers_ir.set_fin(true); |
@@ -2733,12 +2767,12 @@ TEST_P(SpdyFramerTest, CreateHeadersUncompressed) { |
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. |
+ 0x00, 0x00, 0x0f, 0x01, // Headers: FIN | END_HEADERS |
+ 0x05, 0x7f, 0xff, 0xff, // Stream 0x7fffffff |
+ 0xff, 0x00, 0x03, 0x62, // @.b |
+ 0x61, 0x72, 0x03, 0x66, // ar.f |
+ 0x6f, 0x6f, 0x00, 0x03, // oo@. |
+ 0x66, 0x6f, 0x6f, 0x00, // foo. |
}; |
SpdyHeadersIR headers_ir(0x7fffffff); |
headers_ir.set_fin(true); |
@@ -2759,10 +2793,10 @@ TEST_P(SpdyFramerTest, CreateHeadersUncompressed) { |
"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, 0x00, 0x14, 0x01, // Headers: FIN | END_HEADERS | PRIORITY |
+ 0x25, 0x7f, 0xff, 0xff, // Stream 0x7fffffff |
+ 0xff, 0x00, 0x00, 0x00, // parent stream |
+ 0x00, 0xdb, // weight |
0x00, 0x03, 0x62, 0x61, // @.ba |
0x72, 0x03, 0x66, 0x6f, // r.fo |
0x6f, 0x00, 0x03, 0x66, // o@.f |
@@ -2854,9 +2888,10 @@ TEST_P(SpdyFramerTest, CreateWindowUpdate) { |
0x00, 0x00, 0x00, 0x01, |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x04, 0x08, 0x00, |
- 0x00, 0x00, 0x00, 0x01, |
- 0x00, 0x00, 0x00, 0x01, |
+ 0x00, 0x00, 0x04, 0x08, |
+ 0x00, 0x00, 0x00, 0x00, |
+ 0x01, 0x00, 0x00, 0x00, |
+ 0x01, |
}; |
scoped_ptr<SpdyFrame> frame( |
framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 1))); |
@@ -2876,9 +2911,10 @@ TEST_P(SpdyFramerTest, CreateWindowUpdate) { |
0x00, 0x00, 0x00, 0x01, |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x04, 0x08, 0x00, |
- 0x7f, 0xff, 0xff, 0xff, |
- 0x00, 0x00, 0x00, 0x01, |
+ 0x00, 0x00, 0x04, 0x08, |
+ 0x00, 0x7f, 0xff, 0xff, |
+ 0xff, 0x00, 0x00, 0x00, |
+ 0x01, |
}; |
scoped_ptr<SpdyFrame> frame(framer.SerializeWindowUpdate( |
SpdyWindowUpdateIR(0x7FFFFFFF, 1))); |
@@ -2898,9 +2934,10 @@ TEST_P(SpdyFramerTest, CreateWindowUpdate) { |
0x7f, 0xff, 0xff, 0xff, |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x04, 0x08, 0x00, |
- 0x00, 0x00, 0x00, 0x01, |
- 0x7f, 0xff, 0xff, 0xff, |
+ 0x00, 0x00, 0x04, 0x08, |
+ 0x00, 0x00, 0x00, 0x00, |
+ 0x01, 0x7f, 0xff, 0xff, |
+ 0xff, |
}; |
scoped_ptr<SpdyFrame> frame(framer.SerializeWindowUpdate( |
SpdyWindowUpdateIR(1, 0x7FFFFFFF))); |
@@ -2923,7 +2960,7 @@ TEST_P(SpdyFramerTest, SerializeBlocked) { |
const unsigned char kType = static_cast<unsigned char>( |
SpdyConstants::SerializeFrameType(spdy_version_, BLOCKED)); |
const unsigned char kFrameData[] = { |
- 0x00, 0x00, kType, 0x00, |
+ 0x00, 0x00, 0x00, kType, 0x00, |
0x00, 0x00, 0x00, 0x00, |
}; |
SpdyBlockedIR blocked_ir(0); |
@@ -2960,7 +2997,7 @@ TEST_P(SpdyFramerTest, CreatePushPromiseUncompressed) { |
const char kDescription[] = "PUSH_PROMISE frame"; |
const unsigned char kFrameData[] = { |
- 0x00, 0x16, 0x05, 0x04, // PUSH_PROMISE: END_HEADERS |
+ 0x00, 0x00, 0x16, 0x05, 0x04, // PUSH_PROMISE: END_HEADERS |
0x00, 0x00, 0x00, 0x2a, // Stream 42 |
0x00, 0x00, 0x00, 0x39, // Promised stream 57 |
0x00, 0x03, 0x62, 0x61, // @.ba |
@@ -2978,6 +3015,33 @@ TEST_P(SpdyFramerTest, CreatePushPromiseUncompressed) { |
CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); |
} |
+TEST_P(SpdyFramerTest, CreateContinuationUncompressed) { |
+ if (spdy_version_ <= SPDY3) { |
+ return; |
+ } |
+ |
+ SpdyFramer framer(spdy_version_); |
+ framer.set_enable_compression(false); |
+ const char kDescription[] = "CONTINUATION frame"; |
+ |
+ const unsigned char kFrameData[] = { |
+ 0x00, 0x00, 0x12, 0x09, 0x00, // CONTINUATION |
+ 0x00, 0x00, 0x00, 0x2a, // Stream 42 |
+ 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 |
+ }; |
+ |
+ SpdyContinuationIR continuation(42); |
+ continuation.SetHeader("bar", "foo"); |
+ continuation.SetHeader("foo", "bar"); |
+ scoped_ptr<SpdySerializedFrame> frame( |
+ framer.SerializeContinuation(continuation)); |
+ CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); |
+} |
+ |
TEST_P(SpdyFramerTest, CreateAltSvc) { |
if (spdy_version_ <= SPDY3) { |
return; |
@@ -2989,7 +3053,7 @@ TEST_P(SpdyFramerTest, CreateAltSvc) { |
const unsigned char kType = static_cast<unsigned char>( |
SpdyConstants::SerializeFrameType(spdy_version_, ALTSVC)); |
const unsigned char kFrameData[] = { |
- 0x00, 0x17, kType, 0x00, |
+ 0x00, 0x00, 0x17, kType, 0x00, |
0x00, 0x00, 0x00, 0x03, |
0x00, 0x00, 0x00, 0x05, |
0x01, 0xbb, 0x00, 0x04, // Port = 443 |
@@ -3019,7 +3083,7 @@ TEST_P(SpdyFramerTest, CreatePriority) { |
const unsigned char kType = static_cast<unsigned char>( |
SpdyConstants::SerializeFrameType(spdy_version_, PRIORITY)); |
const unsigned char kFrameData[] = { |
- 0x00, 0x05, kType, 0x00, |
+ 0x00, 0x00, 0x05, kType, 0x00, |
0x00, 0x00, 0x00, 0x02, // Stream ID = 2 |
0x80, 0x00, 0x00, 0x01, // Exclusive dependency, parent stream ID = 1 |
0x10, // Weight = 16 |
@@ -3345,10 +3409,11 @@ TEST_P(SpdyFramerTest, ControlFrameSizesAreValidated) { |
const unsigned char less_than_min_length = |
framer.GetGoAwayMinimumSize() - framer.GetControlFrameHeaderSize() - 1; |
const unsigned char kV4FrameData[] = { |
- 0x00, static_cast<uint8>(less_than_min_length), 0x07, 0x00, |
+ 0x00, 0x00, static_cast<uint8>(less_than_min_length), 0x07, |
0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, // Stream Id |
0x00, 0x00, 0x00, 0x00, // Status |
+ 0x00, |
}; |
const size_t pad_length = |
length + framer.GetControlFrameHeaderSize() - |
@@ -3494,9 +3559,9 @@ TEST_P(SpdyFramerTest, ReadDuplicateSettings) { |
0x00, 0x00, 0x00, 0x03, |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x12, 0x04, 0x00, |
+ 0x00, 0x00, 0x12, 0x04, |
0x00, 0x00, 0x00, 0x00, |
- 0x00, 0x01, // 1st Setting |
+ 0x00, 0x00, 0x01, // 1st Setting |
0x00, 0x00, 0x00, 0x02, |
0x00, 0x01, // 2nd (duplicate) Setting |
0x00, 0x00, 0x00, 0x03, |
@@ -3526,6 +3591,51 @@ TEST_P(SpdyFramerTest, ReadDuplicateSettings) { |
} |
} |
+// Tests handling of SETTINGS frame with a setting we don't recognize. |
+TEST_P(SpdyFramerTest, ReadUnknownSettingsId) { |
+ SpdyFramer framer(spdy_version_); |
+ |
+ const unsigned char kV2FrameData[] = { |
+ 0x80, spdy_version_ch_, 0x00, 0x04, |
+ 0x00, 0x00, 0x00, 0x1C, |
+ 0x00, 0x00, 0x00, 0x01, |
+ 0x10, 0x00, 0x00, 0x00, // 1st Setting |
+ 0x00, 0x00, 0x00, 0x02, |
+ }; |
+ const unsigned char kV3FrameData[] = { |
+ 0x80, spdy_version_ch_, 0x00, 0x04, |
+ 0x00, 0x00, 0x00, 0x1C, |
+ 0x00, 0x00, 0x00, 0x01, |
+ 0x00, 0x00, 0x00, 0x10, // 1st Setting |
+ 0x00, 0x00, 0x00, 0x02, |
+ }; |
+ const unsigned char kV4FrameData[] = { |
+ 0x00, 0x00, 0x06, 0x04, |
+ 0x00, 0x00, 0x00, 0x00, |
+ 0x00, 0x00, 0x10, // 1st Setting |
+ 0x00, 0x00, 0x00, 0x02, |
+ }; |
+ |
+ TestSpdyVisitor visitor(spdy_version_); |
+ visitor.use_compression_ = false; |
+ if (IsSpdy2()) { |
+ visitor.SimulateInFramer(kV2FrameData, sizeof(kV2FrameData)); |
+ } else if (IsSpdy3()) { |
+ visitor.SimulateInFramer(kV3FrameData, sizeof(kV3FrameData)); |
+ } else { |
+ visitor.SimulateInFramer(kV4FrameData, sizeof(kV4FrameData)); |
+ } |
+ |
+ if (!IsSpdy4()) { |
+ EXPECT_EQ(0, visitor.setting_count_); |
+ EXPECT_EQ(1, visitor.error_count_); |
+ } else { |
+ // In SPDY 4+, we ignore unknown settings because of extensions. |
+ EXPECT_EQ(0, visitor.setting_count_); |
+ EXPECT_EQ(0, visitor.error_count_); |
+ } |
+} |
+ |
// Tests handling of SETTINGS frame with entries out of order. |
TEST_P(SpdyFramerTest, ReadOutOfOrderSettings) { |
SpdyFramer framer(spdy_version_); |
@@ -3553,9 +3663,9 @@ TEST_P(SpdyFramerTest, ReadOutOfOrderSettings) { |
0x00, 0x00, 0x00, 0x03, |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x12, 0x04, 0x00, |
+ 0x00, 0x00, 0x12, 0x04, |
0x00, 0x00, 0x00, 0x00, |
- 0x00, 0x02, // 1st Setting |
+ 0x00, 0x00, 0x02, // 1st Setting |
0x00, 0x00, 0x00, 0x02, |
0x00, 0x01, // 2nd (out of order) Setting |
0x00, 0x00, 0x00, 0x03, |
@@ -3580,7 +3690,6 @@ TEST_P(SpdyFramerTest, ReadOutOfOrderSettings) { |
// In SPDY 4+, settings are allowed in any order. |
EXPECT_EQ(3, visitor.setting_count_); |
EXPECT_EQ(0, visitor.error_count_); |
- // EXPECT_EQ(1, visitor.settings_ack_count_); |
} |
} |
@@ -3591,7 +3700,7 @@ TEST_P(SpdyFramerTest, ProcessSettingsAckFrame) { |
SpdyFramer framer(spdy_version_); |
const unsigned char kFrameData[] = { |
- 0x00, 0x00, 0x04, 0x01, |
+ 0x00, 0x00, 0x00, 0x04, 0x01, |
0x00, 0x00, 0x00, 0x00, |
}; |
@@ -3627,10 +3736,12 @@ TEST_P(SpdyFramerTest, ProcessDataFrameWithPadding) { |
EXPECT_CALL(visitor, OnDataFrameHeader(1, |
kPaddingLen + strlen(data_payload), |
false)); |
- CHECK_EQ(8u, framer.ProcessInput(frame->data(), 8)); |
+ CHECK_EQ(framer.GetDataFrameMinimumSize(), |
+ framer.ProcessInput(frame->data(), |
+ framer.GetDataFrameMinimumSize())); |
CHECK_EQ(framer.state(), SpdyFramer::SPDY_READ_PADDING_LENGTH); |
CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); |
- bytes_consumed += 8; |
+ bytes_consumed += framer.GetDataFrameMinimumSize(); |
// Send the padding length field. |
CHECK_EQ(1u, framer.ProcessInput(frame->data() + bytes_consumed, 1)); |
@@ -3744,33 +3855,6 @@ TEST_P(SpdyFramerTest, ReadCredentialFrameFollowedByAnotherFrame) { |
EXPECT_EQ(2u, visitor.last_window_update_delta_); |
} |
-TEST_P(SpdyFramerTest, CreateContinuationUncompressed) { |
- if (spdy_version_ <= SPDY3) { |
- return; |
- } |
- |
- SpdyFramer framer(spdy_version_); |
- framer.set_enable_compression(false); |
- const char kDescription[] = "CONTINUATION frame"; |
- |
- const unsigned char kFrameData[] = { |
- 0x00, 0x12, 0x09, 0x00, // CONTINUATION |
- 0x00, 0x00, 0x00, 0x2a, // Stream 42 |
- 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 |
- }; |
- |
- SpdyContinuationIR continuation(42); |
- continuation.SetHeader("bar", "foo"); |
- continuation.SetHeader("foo", "bar"); |
- scoped_ptr<SpdySerializedFrame> frame( |
- framer.SerializeContinuation(continuation)); |
- CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); |
-} |
- |
TEST_P(SpdyFramerTest, ReadCompressedPushPromise) { |
if (spdy_version_ <= SPDY3) { |
return; |
@@ -3800,7 +3884,7 @@ TEST_P(SpdyFramerTest, ReadHeadersWithContinuation) { |
} |
const unsigned char kInput[] = { |
- 0x00, 0x14, 0x01, 0x08, // HEADERS: PADDED |
+ 0x00, 0x00, 0x14, 0x01, 0x08, // HEADERS: PADDED |
0x00, 0x00, 0x00, 0x01, // Stream 1 |
0x03, // Padding of 3. |
0x00, 0x06, 0x63, 0x6f, |
@@ -3809,7 +3893,7 @@ TEST_P(SpdyFramerTest, ReadHeadersWithContinuation) { |
0x3d, 0x62, 0x61, 0x72, |
0x00, 0x00, 0x00, |
- 0x00, 0x14, 0x09, 0x00, // CONTINUATION |
+ 0x00, 0x00, 0x14, 0x09, 0x00, // CONTINUATION |
0x00, 0x00, 0x00, 0x01, // Stream 1 |
0x00, 0x06, 0x63, 0x6f, |
0x6f, 0x6b, 0x69, 0x65, |
@@ -3817,7 +3901,7 @@ TEST_P(SpdyFramerTest, ReadHeadersWithContinuation) { |
0x3d, 0x62, 0x69, 0x6e, |
0x67, 0x00, 0x06, 0x63, |
- 0x00, 0x12, 0x09, 0x04, // CONTINUATION: END_HEADERS |
+ 0x00, 0x00, 0x12, 0x09, 0x04, // CONTINUATION: END_HEADERS |
0x00, 0x00, 0x00, 0x01, // Stream 1 |
0x6f, 0x6f, 0x6b, 0x69, |
0x65, 0x00, 0x00, 0x04, |
@@ -3846,14 +3930,14 @@ TEST_P(SpdyFramerTest, ReadHeadersWithContinuationAndFin) { |
} |
const unsigned char kInput[] = { |
- 0x00, 0x10, 0x01, 0x01, // HEADERS: FIN |
+ 0x00, 0x00, 0x10, 0x01, 0x01, // HEADERS: FIN |
0x00, 0x00, 0x00, 0x01, // Stream 1 |
0x00, 0x06, 0x63, 0x6f, |
0x6f, 0x6b, 0x69, 0x65, |
0x07, 0x66, 0x6f, 0x6f, |
0x3d, 0x62, 0x61, 0x72, |
- 0x00, 0x14, 0x09, 0x00, // CONTINUATION |
+ 0x00, 0x00, 0x14, 0x09, 0x00, // CONTINUATION |
0x00, 0x00, 0x00, 0x01, // Stream 1 |
0x00, 0x06, 0x63, 0x6f, |
0x6f, 0x6b, 0x69, 0x65, |
@@ -3861,7 +3945,7 @@ TEST_P(SpdyFramerTest, ReadHeadersWithContinuationAndFin) { |
0x3d, 0x62, 0x69, 0x6e, |
0x67, 0x00, 0x06, 0x63, |
- 0x00, 0x12, 0x09, 0x04, // CONTINUATION: END_HEADERS |
+ 0x00, 0x00, 0x12, 0x09, 0x04, // CONTINUATION: END_HEADERS |
0x00, 0x00, 0x00, 0x01, // Stream 1 |
0x6f, 0x6f, 0x6b, 0x69, |
0x65, 0x00, 0x00, 0x04, |
@@ -3892,7 +3976,7 @@ TEST_P(SpdyFramerTest, ReadPushPromiseWithContinuation) { |
} |
const unsigned char kInput[] = { |
- 0x00, 0x17, 0x05, 0x08, // PUSH_PROMISE: PADDED |
+ 0x00, 0x00, 0x17, 0x05, 0x08, // PUSH_PROMISE: PADDED |
0x00, 0x00, 0x00, 0x01, // Stream 1 |
0x00, 0x00, 0x00, 0x2A, // Promised stream 42 |
0x02, // Padding of 2. |
@@ -3902,7 +3986,7 @@ TEST_P(SpdyFramerTest, ReadPushPromiseWithContinuation) { |
0x3d, 0x62, 0x61, 0x72, |
0x00, 0x00, |
- 0x00, 0x14, 0x09, 0x00, // CONTINUATION |
+ 0x00, 0x00, 0x14, 0x09, 0x00, // CONTINUATION |
0x00, 0x00, 0x00, 0x01, // Stream 1 |
0x00, 0x06, 0x63, 0x6f, |
0x6f, 0x6b, 0x69, 0x65, |
@@ -3910,7 +3994,7 @@ TEST_P(SpdyFramerTest, ReadPushPromiseWithContinuation) { |
0x3d, 0x62, 0x69, 0x6e, |
0x67, 0x00, 0x06, 0x63, |
- 0x00, 0x12, 0x09, 0x04, // CONTINUATION: END_HEADERS |
+ 0x00, 0x00, 0x12, 0x09, 0x04, // CONTINUATION: END_HEADERS |
0x00, 0x00, 0x00, 0x01, // Stream 1 |
0x6f, 0x6f, 0x6b, 0x69, |
0x65, 0x00, 0x00, 0x04, |
@@ -3941,14 +4025,14 @@ TEST_P(SpdyFramerTest, ReadContinuationWithWrongStreamId) { |
} |
const unsigned char kInput[] = { |
- 0x00, 0x10, 0x01, 0x00, // HEADERS |
+ 0x00, 0x00, 0x10, 0x01, 0x00, // HEADERS |
0x00, 0x00, 0x00, 0x01, // Stream 1 |
0x00, 0x06, 0x63, 0x6f, |
0x6f, 0x6b, 0x69, 0x65, |
0x07, 0x66, 0x6f, 0x6f, |
0x3d, 0x62, 0x61, 0x72, |
- 0x00, 0x14, 0x09, 0x00, // CONTINUATION |
+ 0x00, 0x00, 0x14, 0x09, 0x00, // CONTINUATION |
0x00, 0x00, 0x00, 0x02, // Stream 2 |
0x00, 0x06, 0x63, 0x6f, |
0x6f, 0x6b, 0x69, 0x65, |
@@ -3977,7 +4061,7 @@ TEST_P(SpdyFramerTest, ReadContinuationOutOfOrder) { |
} |
const unsigned char kInput[] = { |
- 0x00, 0x10, 0x09, 0x00, // CONTINUATION |
+ 0x00, 0x00, 0x18, 0x09, 0x00, // CONTINUATION |
0x00, 0x00, 0x00, 0x01, // Stream 1 |
0x00, 0x06, 0x63, 0x6f, |
0x6f, 0x6b, 0x69, 0x65, |
@@ -4004,14 +4088,14 @@ TEST_P(SpdyFramerTest, ExpectContinuationReceiveData) { |
} |
const unsigned char kInput[] = { |
- 0x00, 0x10, 0x01, 0x00, // HEADERS |
+ 0x00, 0x00, 0x10, 0x01, 0x00, // HEADERS |
0x00, 0x00, 0x00, 0x01, // Stream 1 |
0x00, 0x06, 0x63, 0x6f, |
0x6f, 0x6b, 0x69, 0x65, |
0x07, 0x66, 0x6f, 0x6f, |
0x3d, 0x62, 0x61, 0x72, |
- 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1 |
+ 0x00, 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1 |
0x00, 0x00, 0x00, 0x04, |
0xde, 0xad, 0xbe, 0xef, |
}; |
@@ -4037,14 +4121,14 @@ TEST_P(SpdyFramerTest, ExpectContinuationReceiveControlFrame) { |
} |
const unsigned char kInput[] = { |
- 0x00, 0x10, 0x01, 0x00, // HEADERS |
+ 0x00, 0x00, 0x18, 0x01, 0x00, // HEADERS |
0x00, 0x00, 0x00, 0x01, // Stream 1 |
0x00, 0x06, 0x63, 0x6f, |
0x6f, 0x6b, 0x69, 0x65, |
0x07, 0x66, 0x6f, 0x6f, |
0x3d, 0x62, 0x61, 0x72, |
- 0x00, 0x14, 0x08, 0x00, // HEADERS |
+ 0x00, 0x00, 0x1c, 0x08, 0x00, // HEADERS |
0x00, 0x00, 0x00, 0x01, // Stream 1 |
0x00, 0x06, 0x63, 0x6f, // (Note this is a valid continued encoding). |
0x6f, 0x6b, 0x69, 0x65, |
@@ -4073,7 +4157,7 @@ TEST_P(SpdyFramerTest, EndSegmentOnDataFrame) { |
return; |
} |
const unsigned char kInput[] = { |
- 0x00, 0x0c, 0x00, 0x02, // DATA: END_SEGMENT |
+ 0x00, 0x00, 0x0c, 0x00, 0x02, // DATA: END_SEGMENT |
0x00, 0x00, 0x00, 0x01, // Stream 1 |
0xde, 0xad, 0xbe, 0xef, |
0xde, 0xad, 0xbe, 0xef, |
@@ -4095,7 +4179,7 @@ TEST_P(SpdyFramerTest, EndSegmentOnHeadersFrame) { |
return; |
} |
const unsigned char kInput[] = { |
- 0x00, 0x10, 0x01, 0x06, // HEADERS: END_SEGMENT | END_HEADERS |
+ 0x00, 0x00, 0x10, 0x01, 0x06, // HEADERS: END_SEGMENT | END_HEADERS |
0x00, 0x00, 0x00, 0x01, // Stream 1 |
0x00, 0x06, 0x63, 0x6f, |
0x6f, 0x6b, 0x69, 0x65, |
@@ -4125,13 +4209,50 @@ TEST_P(SpdyFramerTest, ReadGarbage) { |
EXPECT_EQ(1, visitor.error_count_); |
} |
+TEST_P(SpdyFramerTest, ReadUnknownExtensionFrame) { |
+ if (spdy_version_ <= SPDY3) { |
+ return; |
+ } |
+ SpdyFramer framer(spdy_version_); |
+ |
+ // The unrecognized frame type should still have a valid length. |
+ const unsigned char unknown_frame[] = { |
+ 0x00, 0x00, 0x08, 0xff, 0xff, |
+ 0xff, 0xff, 0xff, 0xff, |
+ 0xff, 0xff, 0xff, 0xff, |
+ 0xff, 0xff, 0xff, 0xff, |
+ }; |
+ TestSpdyVisitor visitor(spdy_version_); |
+ |
+ // Simulate the case where the stream id validation checks out. |
+ visitor.on_unknown_frame_result_ = true; |
+ visitor.use_compression_ = false; |
+ visitor.SimulateInFramer(unknown_frame, arraysize(unknown_frame)); |
+ EXPECT_EQ(0, visitor.error_count_); |
+ |
+ // Follow it up with a valid control frame to make sure we handle |
+ // subsequent frames correctly. |
+ SpdySettingsIR settings_ir; |
+ settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 1), |
+ false, // persist |
+ false, // persisted |
+ 10); |
+ scoped_ptr<SpdyFrame> control_frame(framer.SerializeSettings(settings_ir)); |
+ visitor.SimulateInFramer( |
+ reinterpret_cast<unsigned char*>(control_frame->data()), |
+ control_frame->size()); |
+ EXPECT_EQ(0, visitor.error_count_); |
+ EXPECT_EQ(1u, static_cast<unsigned>(visitor.setting_count_)); |
+ EXPECT_EQ(1u, static_cast<unsigned>(visitor.settings_ack_sent_)); |
+} |
+ |
TEST_P(SpdyFramerTest, ReadGarbageWithValidLength) { |
if (!IsSpdy4()) { |
return; |
} |
SpdyFramer framer(spdy_version_); |
const unsigned char kFrameData[] = { |
- 0x00, 0x10, 0xff, 0xff, |
+ 0x00, 0x00, 0x08, 0xff, 0xff, |
0xff, 0xff, 0xff, 0xff, |
0xff, 0xff, 0xff, 0xff, |
0xff, 0xff, 0xff, 0xff, |
@@ -4179,22 +4300,25 @@ TEST_P(SpdyFramerTest, ReadGarbageHPACKEncoding) { |
TEST_P(SpdyFramerTest, SizesTest) { |
SpdyFramer framer(spdy_version_); |
- EXPECT_EQ(8u, framer.GetDataFrameMinimumSize()); |
if (IsSpdy4() || IsSpdy5()) { |
- EXPECT_EQ(8u, framer.GetSynReplyMinimumSize()); |
- EXPECT_EQ(12u, framer.GetRstStreamMinimumSize()); |
- EXPECT_EQ(8u, framer.GetSettingsMinimumSize()); |
- EXPECT_EQ(16u, framer.GetPingSize()); |
- EXPECT_EQ(16u, framer.GetGoAwayMinimumSize()); |
- EXPECT_EQ(8u, framer.GetHeadersMinimumSize()); |
- EXPECT_EQ(12u, framer.GetWindowUpdateSize()); |
- EXPECT_EQ(8u, framer.GetBlockedSize()); |
- EXPECT_EQ(12u, framer.GetPushPromiseMinimumSize()); |
- EXPECT_EQ(17u, framer.GetAltSvcMinimumSize()); |
- EXPECT_EQ(8u, framer.GetFrameMinimumSize()); |
- EXPECT_EQ(16383u, framer.GetFrameMaximumSize()); |
- EXPECT_EQ(16375u, framer.GetDataFrameMaximumPayload()); |
+ EXPECT_EQ(9u, framer.GetDataFrameMinimumSize()); |
+ EXPECT_EQ(9u, framer.GetControlFrameHeaderSize()); |
+ EXPECT_EQ(14u, framer.GetSynStreamMinimumSize()); |
+ EXPECT_EQ(9u, framer.GetSynReplyMinimumSize()); |
+ EXPECT_EQ(13u, framer.GetRstStreamMinimumSize()); |
+ EXPECT_EQ(9u, framer.GetSettingsMinimumSize()); |
+ EXPECT_EQ(17u, framer.GetPingSize()); |
+ EXPECT_EQ(17u, framer.GetGoAwayMinimumSize()); |
+ EXPECT_EQ(9u, framer.GetHeadersMinimumSize()); |
+ EXPECT_EQ(13u, framer.GetWindowUpdateSize()); |
+ EXPECT_EQ(9u, framer.GetBlockedSize()); |
+ EXPECT_EQ(13u, framer.GetPushPromiseMinimumSize()); |
+ EXPECT_EQ(18u, framer.GetAltSvcMinimumSize()); |
+ EXPECT_EQ(9u, framer.GetFrameMinimumSize()); |
+ EXPECT_EQ(16393u, framer.GetFrameMaximumSize()); |
+ EXPECT_EQ(16384u, framer.GetDataFrameMaximumPayload()); |
} else { |
+ EXPECT_EQ(8u, framer.GetDataFrameMinimumSize()); |
EXPECT_EQ(8u, framer.GetControlFrameHeaderSize()); |
EXPECT_EQ(18u, framer.GetSynStreamMinimumSize()); |
EXPECT_EQ(IsSpdy2() ? 14u : 12u, framer.GetSynReplyMinimumSize()); |
@@ -5000,9 +5124,10 @@ TEST_P(SpdyFramerTest, RstStreamStatusBounds) { |
0x00, 0x00, 0x00, kRstStreamStatusTooLow |
}; |
const unsigned char kV4RstStreamInvalid[] = { |
- 0x00, 0x04, 0x03, 0x00, |
- 0x00, 0x00, 0x00, 0x01, |
- 0x00, 0x00, 0x00, kRstStreamStatusTooLow |
+ 0x00, 0x00, 0x04, 0x03, |
+ 0x00, 0x00, 0x00, 0x00, |
+ 0x01, 0x00, 0x00, 0x00, |
+ kRstStreamStatusTooLow |
}; |
const unsigned char kV3RstStreamNumStatusCodes[] = { |
@@ -5012,9 +5137,10 @@ TEST_P(SpdyFramerTest, RstStreamStatusBounds) { |
0x00, 0x00, 0x00, kRstStreamStatusTooHigh |
}; |
const unsigned char kV4RstStreamNumStatusCodes[] = { |
- 0x00, 0x04, 0x03, 0x00, |
- 0x00, 0x00, 0x00, 0x01, |
- 0x00, 0x00, 0x00, kRstStreamStatusTooHigh |
+ 0x00, 0x00, 0x04, 0x03, |
+ 0x00, 0x00, 0x00, 0x00, |
+ 0x01, 0x00, 0x00, 0x00, |
+ kRstStreamStatusTooHigh |
}; |
testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
@@ -5022,41 +5148,72 @@ TEST_P(SpdyFramerTest, RstStreamStatusBounds) { |
framer.set_visitor(&visitor); |
if (IsSpdy4()) { |
- EXPECT_CALL(visitor, OnError(_)); |
+ EXPECT_CALL(visitor, OnRstStream(1, RST_STREAM_INTERNAL_ERROR)); |
framer.ProcessInput(reinterpret_cast<const char*>(kV4RstStreamInvalid), |
arraysize(kV4RstStreamInvalid)); |
- EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
- EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.error_code()) |
- << SpdyFramer::ErrorCodeToString(framer.error_code()); |
} else { |
EXPECT_CALL(visitor, OnRstStream(1, RST_STREAM_INVALID)); |
framer.ProcessInput(reinterpret_cast<const char*>(kV3RstStreamInvalid), |
arraysize(kV3RstStreamInvalid)); |
- EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
- EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
- << SpdyFramer::ErrorCodeToString(framer.error_code()); |
} |
+ EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
+ EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
+ << SpdyFramer::ErrorCodeToString(framer.error_code()); |
framer.Reset(); |
if (IsSpdy4()) { |
- EXPECT_CALL(visitor, OnError(_)); |
+ EXPECT_CALL(visitor, OnRstStream(1, RST_STREAM_INTERNAL_ERROR)); |
framer.ProcessInput( |
reinterpret_cast<const char*>(kV4RstStreamNumStatusCodes), |
arraysize(kV4RstStreamNumStatusCodes)); |
- EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
- EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.error_code()) |
- << SpdyFramer::ErrorCodeToString(framer.error_code()); |
} else { |
EXPECT_CALL(visitor, OnRstStream(1, RST_STREAM_INVALID)); |
framer.ProcessInput( |
reinterpret_cast<const char*>(kV3RstStreamNumStatusCodes), |
arraysize(kV3RstStreamNumStatusCodes)); |
- EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
- EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
+ } |
+ EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
+ EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
<< SpdyFramer::ErrorCodeToString(framer.error_code()); |
+} |
+ |
+// Test handling of GOAWAY frames with out-of-bounds status code. |
+TEST_P(SpdyFramerTest, GoAwayStatusBounds) { |
+ if (spdy_version_ <= SPDY2) { |
+ return; |
+ } |
+ SpdyFramer framer(spdy_version_); |
+ |
+ const unsigned char kV3FrameData[] = { |
+ 0x80, spdy_version_ch_, 0x00, 0x07, |
+ 0x00, 0x00, 0x00, 0x08, |
+ 0x00, 0x00, 0x00, 0x01, // Stream Id |
+ 0xff, 0xff, 0xff, 0xff, // Status |
+ }; |
+ const unsigned char kV4FrameData[] = { |
+ 0x00, 0x00, 0x0a, 0x07, |
+ 0x00, 0x00, 0x00, 0x00, |
+ 0x00, 0x00, 0x00, 0x00, // Stream id |
+ 0x01, 0xff, 0xff, 0xff, // Status |
+ 0xff, 0x47, 0x41, // Opaque Description |
+ }; |
+ testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
+ framer.set_visitor(&visitor); |
+ |
+ if (IsSpdy3()) { |
+ EXPECT_CALL(visitor, OnGoAway(1, GOAWAY_OK)); |
+ framer.ProcessInput(reinterpret_cast<const char*>(kV3FrameData), |
+ arraysize(kV3FrameData)); |
+ } else { |
+ EXPECT_CALL(visitor, OnGoAway(1, GOAWAY_INTERNAL_ERROR)); |
+ framer.ProcessInput(reinterpret_cast<const char*>(kV4FrameData), |
+ arraysize(kV4FrameData)); |
} |
+ EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
+ EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
+ << SpdyFramer::ErrorCodeToString(framer.error_code()); |
} |
// Tests handling of a GOAWAY frame with out-of-bounds stream ID. |
@@ -5073,10 +5230,11 @@ TEST_P(SpdyFramerTest, GoAwayStreamIdBounds) { |
0x00, 0x00, 0x00, 0x00, |
}; |
const unsigned char kV4FrameData[] = { |
- 0x00, 0x08, 0x07, 0x00, |
- 0x00, 0x00, 0x00, 0x00, |
- 0xff, 0xff, 0xff, 0xff, |
+ 0x00, 0x00, 0x08, 0x07, |
0x00, 0x00, 0x00, 0x00, |
+ 0x00, 0xff, 0xff, 0xff, |
+ 0xff, 0x00, 0x00, 0x00, |
+ 0x00, |
}; |
testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
@@ -5202,7 +5360,7 @@ TEST_P(SpdyFramerTest, OnAltSvcBadLengths) { |
framer.set_visitor(&visitor); |
const unsigned char kFrameDataLargePIDLen[] = { |
- 0x00, 0x17, kType, 0x00, |
+ 0x00, 0x00, 0x17, kType, 0x00, |
0x00, 0x00, 0x00, 0x03, |
0x00, 0x00, 0x00, 0x05, |
0x01, 0xbb, 0x00, 0x05, // Port = 443 |
@@ -5224,7 +5382,7 @@ TEST_P(SpdyFramerTest, OnAltSvcBadLengths) { |
SpdyFramer framer(spdy_version_); |
framer.set_visitor(&visitor); |
const unsigned char kFrameDataPIDLenLargerThanFrame[] = { |
- 0x00, 0x17, kType, 0x00, |
+ 0x00, 0x00, 0x17, kType, 0x00, |
0x00, 0x00, 0x00, 0x03, |
0x00, 0x00, 0x00, 0x05, |
0x01, 0xbb, 0x00, 0x99, // Port = 443 |
@@ -5247,7 +5405,7 @@ TEST_P(SpdyFramerTest, OnAltSvcBadLengths) { |
framer.set_visitor(&visitor); |
const unsigned char kFrameDataLargeHostLen[] = { |
- 0x00, 0x17, kType, 0x00, |
+ 0x00, 0x00, 0x17, kType, 0x00, |
0x00, 0x00, 0x00, 0x03, |
0x00, 0x00, 0x00, 0x05, |
0x01, 0xbb, 0x00, 0x04, // Port = 443 |
@@ -5269,7 +5427,7 @@ TEST_P(SpdyFramerTest, OnAltSvcBadLengths) { |
SpdyFramer framer(spdy_version_); |
framer.set_visitor(&visitor); |
const unsigned char kFrameDataSmallPIDLen[] = { |
- 0x00, 0x17, kType, 0x00, |
+ 0x00, 0x00, 0x17, kType, 0x00, |
0x00, 0x00, 0x00, 0x03, |
0x00, 0x00, 0x00, 0x05, |
0x01, 0xbb, 0x00, 0x01, // Port = 443 |
@@ -5343,28 +5501,6 @@ TEST_P(SpdyFramerTest, ReadPriority) { |
// check that state is adjusted correctly. |
} |
-// Tests handling of PRIORITY frame with incorrect size. |
-TEST_P(SpdyFramerTest, ReadIncorrectlySizedPriority) { |
- if (spdy_version_ <= SPDY3) { |
- return; |
- } |
- |
- // PRIORITY frame of size 4, which isn't correct. |
- const unsigned char kFrameData[] = { |
- 0x00, 0x04, 0x02, 0x00, |
- 0x00, 0x00, 0x00, 0x03, |
- 0x00, 0x00, 0x00, 0x01, |
- }; |
- |
- TestSpdyVisitor visitor(spdy_version_); |
- visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); |
- |
- EXPECT_EQ(SpdyFramer::SPDY_ERROR, visitor.framer_.state()); |
- EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, |
- visitor.framer_.error_code()) |
- << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); |
-} |
- |
TEST_P(SpdyFramerTest, PriorityWeightMapping) { |
if (spdy_version_ <= SPDY3) { |
return; |
@@ -5397,4 +5533,26 @@ TEST_P(SpdyFramerTest, PriorityWeightMapping) { |
EXPECT_EQ(7u, framer.MapWeightToPriority(0)); |
} |
+// Tests handling of PRIORITY frame with incorrect size. |
+TEST_P(SpdyFramerTest, ReadIncorrectlySizedPriority) { |
+ if (spdy_version_ <= SPDY3) { |
+ return; |
+ } |
+ |
+ // PRIORITY frame of size 4, which isn't correct. |
+ const unsigned char kFrameData[] = { |
+ 0x00, 0x00, 0x04, 0x02, 0x00, |
+ 0x00, 0x00, 0x00, 0x03, |
+ 0x00, 0x00, 0x00, 0x01, |
+ }; |
+ |
+ TestSpdyVisitor visitor(spdy_version_); |
+ visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); |
+ |
+ EXPECT_EQ(SpdyFramer::SPDY_ERROR, visitor.framer_.state()); |
+ EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, |
+ visitor.framer_.error_code()) |
+ << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); |
+} |
+ |
} // namespace net |