Index: net/spdy/spdy_framer_test.cc |
diff --git a/net/spdy/spdy_framer_test.cc b/net/spdy/spdy_framer_test.cc |
index 1ce33951a21fdf27fc0de1af39e80b9d76b2617d..b4429a2da893a1ca2dab72d7b59130e26cc445ab 100644 |
--- a/net/spdy/spdy_framer_test.cc |
+++ b/net/spdy/spdy_framer_test.cc |
@@ -60,21 +60,155 @@ class SpdyFramerTestUtil { |
template <class SpdyFrameType> |
static SpdySerializedFrame DecompressFrame(SpdyFramer* framer, |
const SpdyFrameType& frame) { |
- DecompressionVisitor visitor(framer->protocol_version()); |
+ NewDecompressionVisitor visitor; |
framer->set_visitor(&visitor); |
CHECK_EQ(frame.size(), framer->ProcessInput(frame.data(), frame.size())); |
CHECK_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer->state()); |
- framer->set_visitor(NULL); |
- |
- char* buffer = visitor.ReleaseBuffer(); |
- CHECK(buffer != NULL); |
- SpdySerializedFrame decompressed_frame(buffer, visitor.size(), true); |
- SetFrameLength(&decompressed_frame, |
- visitor.size() - framer->GetControlFrameHeaderSize(), |
- framer->protocol_version()); |
- return decompressed_frame; |
+ framer->set_visitor(nullptr); |
+ SpdyFramer serializer(framer->protocol_version()); |
+ serializer.set_enable_compression(false); |
+ return serializer.SerializeFrame(visitor.GetFrame()); |
} |
+ class NewDecompressionVisitor : public SpdyFramerVisitorInterface { |
+ public: |
+ NewDecompressionVisitor() : finished_(false) {} |
+ |
+ const SpdyFrameIR& GetFrame() const { |
+ CHECK(finished_); |
+ return *frame_; |
+ } |
+ |
+ SpdyHeadersHandlerInterface* OnHeaderFrameStart( |
+ SpdyStreamId stream_id) override { |
+ if (headers_handler_ == nullptr) { |
+ headers_handler_.reset(new TestHeadersHandler); |
+ } |
+ return headers_handler_.get(); |
+ } |
+ |
+ void OnHeaderFrameEnd(SpdyStreamId stream_id, bool end_headers) override { |
+ CHECK(!finished_); |
+ frame_->set_header_block(headers_handler_->decoded_block()); |
+ finished_ = true; |
+ if (end_headers) { |
+ headers_handler_.reset(); |
+ } |
+ } |
+ |
+ void OnSynStream(SpdyStreamId stream_id, |
+ SpdyStreamId associated_stream_id, |
+ SpdyPriority priority, |
+ bool fin, |
+ bool unidirectional) override { |
+ SpdySynStreamIR* syn_stream = new SpdySynStreamIR(stream_id); |
+ syn_stream->set_associated_to_stream_id(associated_stream_id); |
+ syn_stream->set_priority(priority); |
+ syn_stream->set_fin(fin); |
+ syn_stream->set_unidirectional(unidirectional); |
+ frame_.reset(syn_stream); |
+ } |
+ |
+ void OnSynReply(SpdyStreamId stream_id, bool fin) override { |
+ SpdyHeadersIR* headers = new SpdyHeadersIR(stream_id); |
+ headers->set_fin(fin); |
+ frame_.reset(headers); |
+ } |
+ |
+ void OnHeaders(SpdyStreamId stream_id, |
+ bool has_priority, |
+ SpdyPriority priority, |
+ SpdyStreamId parent_stream_id, |
+ bool exclusive, |
+ bool fin, |
+ bool end) override { |
+ SpdyHeadersIR* headers = new SpdyHeadersIR(stream_id); |
+ headers->set_has_priority(has_priority); |
+ headers->set_priority(priority); |
+ headers->set_parent_stream_id(parent_stream_id); |
+ headers->set_exclusive(exclusive); |
+ headers->set_fin(fin); |
+ frame_.reset(headers); |
+ } |
+ |
+ void OnPushPromise(SpdyStreamId stream_id, |
+ SpdyStreamId promised_stream_id, |
+ bool end) override { |
+ SpdyPushPromiseIR* push_promise = |
+ new SpdyPushPromiseIR(stream_id, promised_stream_id); |
+ frame_.reset(push_promise); |
+ } |
+ |
+ // TODO(birenroy): Add support for CONTINUATION. |
+ void OnContinuation(SpdyStreamId stream_id, bool end) override { |
+ LOG(FATAL); |
+ } |
+ |
+ // All other methods just LOG(FATAL). |
+ void OnError(SpdyFramer* framer) override { LOG(FATAL); } |
+ void OnDataFrameHeader(SpdyStreamId stream_id, |
+ size_t length, |
+ bool fin) override { |
+ LOG(FATAL) << "Unexpected data frame header"; |
+ } |
+ void OnStreamFrameData(SpdyStreamId stream_id, |
+ const char* data, |
+ size_t len) override { |
+ LOG(FATAL); |
+ } |
+ |
+ void OnStreamEnd(SpdyStreamId stream_id) override { LOG(FATAL); } |
+ |
+ void OnStreamPadding(SpdyStreamId stream_id, size_t len) override { |
+ LOG(FATAL); |
+ } |
+ |
+ bool OnControlFrameHeaderData(SpdyStreamId stream_id, |
+ const char* header_data, |
+ size_t len) override { |
+ LOG(FATAL); |
+ return true; |
+ } |
+ |
+ void OnRstStream(SpdyStreamId stream_id, |
+ SpdyRstStreamStatus status) override { |
+ LOG(FATAL); |
+ } |
+ void OnSetting(SpdySettingsIds id, uint8_t flags, uint32_t value) override { |
+ LOG(FATAL); |
+ } |
+ void OnPing(SpdyPingId unique_id, bool is_ack) override { LOG(FATAL); } |
+ void OnSettingsEnd() override { LOG(FATAL); } |
+ void OnGoAway(SpdyStreamId last_accepted_stream_id, |
+ SpdyGoAwayStatus status) override { |
+ LOG(FATAL); |
+ } |
+ |
+ void OnWindowUpdate(SpdyStreamId stream_id, |
+ int delta_window_size) override { |
+ LOG(FATAL); |
+ } |
+ |
+ void OnPriority(SpdyStreamId stream_id, |
+ SpdyStreamId parent_stream_id, |
+ uint8_t weight, |
+ bool exclusive) override { |
+ // Do nothing. |
+ } |
+ |
+ bool OnUnknownFrame(SpdyStreamId stream_id, int frame_type) override { |
+ LOG(FATAL); |
+ return false; |
+ } |
+ |
+ private: |
+ std::unique_ptr<TestHeadersHandler> headers_handler_; |
+ std::unique_ptr<SpdyFrameWithHeaderBlockIR> frame_; |
+ bool finished_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(NewDecompressionVisitor); |
+ }; |
+ |
class DecompressionVisitor : public SpdyFramerVisitorInterface { |
public: |
explicit DecompressionVisitor(SpdyMajorVersion version) |
@@ -107,12 +241,12 @@ class SpdyFramerTestUtil { |
SpdyHeadersHandlerInterface* OnHeaderFrameStart( |
SpdyStreamId stream_id) override { |
- LOG(FATAL); |
+ LOG(FATAL) << "Not implemented."; |
return nullptr; |
} |
void OnHeaderFrameEnd(SpdyStreamId stream_id, bool end_headers) override { |
- LOG(FATAL); |
+ LOG(FATAL) << "Not implemented."; |
} |
bool OnControlFrameHeaderData(SpdyStreamId stream_id, |
@@ -240,6 +374,7 @@ class SpdyFramerTestUtil { |
private: |
SpdyMajorVersion version_; |
+ TestHeadersHandler* headers_handler_; |
std::unique_ptr<char[]> buffer_; |
size_t size_; |
bool finished_; |
@@ -251,6 +386,20 @@ class SpdyFramerTestUtil { |
DISALLOW_COPY_AND_ASSIGN(SpdyFramerTestUtil); |
}; |
+class SpdyFramerPeer { |
+ public: |
+ static size_t ControlFrameBufferSize() { |
+ return SpdyFramer::kControlFrameBufferSize; |
+ } |
+ static size_t GetNumberRequiredContinuationFrames(SpdyFramer* framer, |
+ size_t size) { |
+ return framer->GetNumberRequiredContinuationFrames(size); |
+ } |
+ static void SetError(SpdyFramer* framer, SpdyFramer::SpdyError error) { |
+ framer->set_error(error); |
+ } |
+}; |
+ |
class TestSpdyVisitor : public SpdyFramerVisitorInterface, |
public SpdyFramerDebugVisitorInterface { |
public: |
@@ -335,13 +484,19 @@ class TestSpdyVisitor : public SpdyFramerVisitorInterface, |
SpdyHeadersHandlerInterface* OnHeaderFrameStart( |
SpdyStreamId stream_id) override { |
- LOG(FATAL) << "OnHeaderFrameStart(" << stream_id << ")"; |
- return nullptr; |
+ if (headers_handler_ == nullptr) { |
+ headers_handler_.reset(new TestHeadersHandler); |
+ } |
+ return headers_handler_.get(); |
} |
void OnHeaderFrameEnd(SpdyStreamId stream_id, bool end_headers) override { |
- LOG(FATAL) << "OnHeaderFrameEnd(" << stream_id << ", " << end_headers |
- << ")"; |
+ CHECK(headers_handler_ != nullptr); |
+ headers_ = headers_handler_->decoded_block(); |
+ header_bytes_received_ = headers_handler_->header_bytes_parsed(); |
+ if (end_headers) { |
+ headers_handler_.reset(); |
+ } |
} |
bool OnControlFrameHeaderData(SpdyStreamId stream_id, |
@@ -631,26 +786,17 @@ class TestSpdyVisitor : public SpdyFramerVisitorInterface, |
std::unique_ptr<char[]> header_buffer_; |
size_t header_buffer_length_; |
size_t header_buffer_size_; |
+ size_t header_bytes_received_; |
SpdyStreamId header_stream_id_; |
SpdyFrameType header_control_type_; |
bool header_buffer_valid_; |
+ std::unique_ptr<TestHeadersHandler> headers_handler_; |
SpdyHeaderBlock headers_; |
bool header_has_priority_; |
SpdyStreamId header_parent_stream_id_; |
bool header_exclusive_; |
}; |
-class SpdyFramerPeer { |
- public: |
- static size_t ControlFrameBufferSize() { |
- return SpdyFramer::kControlFrameBufferSize; |
- } |
- static size_t GetNumberRequiredContinuationFrames(SpdyFramer* framer, |
- size_t size) { |
- return framer->GetNumberRequiredContinuationFrames(size); |
- } |
-}; |
- |
// Retrieves serialized headers from a HEADERS or SYN_STREAM frame. |
StringPiece GetSerializedHeaders(const SpdySerializedFrame& frame, |
const SpdyFramer& framer) { |
@@ -748,7 +894,7 @@ TEST_P(SpdyFramerTest, HeaderBlockWithEmptyCookie) { |
visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()), |
frame.size()); |
- EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); |
+ EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); |
EXPECT_NE(headers.header_block(), visitor.headers_); |
EXPECT_EQ(1u, visitor.headers_.size()); |
EXPECT_EQ("key=value; foo; bar=; k2=v2 ", visitor.headers_["cookie"]); |
@@ -772,7 +918,7 @@ TEST_P(SpdyFramerTest, HeaderBlockInBuffer) { |
visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()), |
frame.size()); |
- EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); |
+ EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); |
EXPECT_EQ(headers.header_block(), visitor.headers_); |
} |
@@ -935,6 +1081,7 @@ TEST_P(SpdyFramerTest, OversizedHeadersPaddingError) { |
sizeof(kH2FrameData), false); |
EXPECT_CALL(visitor, OnHeaders(1, false, 0, 0, false, false, false)); |
+ EXPECT_CALL(visitor, OnHeaderFrameStart(1)).Times(1); |
EXPECT_CALL(visitor, OnError(testing::Eq(&framer))); |
EXPECT_EQ(frame.size(), framer.ProcessInput(frame.data(), frame.size())); |
EXPECT_TRUE(framer.HasError()); |
@@ -966,7 +1113,7 @@ TEST_P(SpdyFramerTest, CorrectlySizedHeadersPaddingNoError) { |
SpdySerializedFrame frame(kH2FrameData, sizeof(kH2FrameData), false); |
EXPECT_CALL(visitor, OnHeaders(1, false, 0, 0, false, false, false)); |
- |
+ EXPECT_CALL(visitor, OnHeaderFrameStart(1)).Times(1); |
EXPECT_EQ(frame.size(), framer.ProcessInput(frame.data(), frame.size())); |
EXPECT_FALSE(framer.HasError()); |
EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
@@ -3511,12 +3658,8 @@ TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlock) { |
reinterpret_cast<unsigned char*>(control_frame.data()), |
control_frame.size()); |
EXPECT_EQ(1, visitor.headers_frame_count_); |
- // control_frame_header_data_count_ depends on the random sequence |
- // produced by rand(), so adding, removing or running single tests |
- // alters this value. The best we can do is assert that it happens |
- // at least twice. |
- EXPECT_LE(2, visitor.control_frame_header_data_count_); |
- EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); |
+ EXPECT_EQ(0, visitor.control_frame_header_data_count_); |
+ EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); |
EXPECT_EQ(0, visitor.end_of_stream_count_); |
EXPECT_EQ(headers, visitor.headers_); |
} |
@@ -3535,12 +3678,8 @@ TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlockWithHalfClose) { |
reinterpret_cast<unsigned char*>(control_frame.data()), |
control_frame.size()); |
EXPECT_EQ(1, visitor.headers_frame_count_); |
- // control_frame_header_data_count_ depends on the random sequence |
- // produced by rand(), so adding, removing or running single tests |
- // alters this value. The best we can do is assert that it happens |
- // at least twice. |
- EXPECT_LE(2, visitor.control_frame_header_data_count_); |
- EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); |
+ EXPECT_EQ(0, visitor.control_frame_header_data_count_); |
+ EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); |
EXPECT_EQ(1, visitor.end_of_stream_count_); |
EXPECT_EQ(headers, visitor.headers_); |
} |
@@ -3576,9 +3715,8 @@ TEST_P(SpdyFramerTest, ControlFrameAtMaxSizeLimit) { |
EXPECT_TRUE(visitor.header_buffer_valid_); |
EXPECT_EQ(0, visitor.error_count_); |
EXPECT_EQ(1, visitor.syn_frame_count_); |
- EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); |
+ EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); |
EXPECT_EQ(0, visitor.end_of_stream_count_); |
- EXPECT_LT(kBigValueSize, visitor.header_buffer_length_); |
} |
TEST_P(SpdyFramerTest, ControlFrameTooLarge) { |
@@ -3653,7 +3791,7 @@ TEST_P(SpdyFramerTest, TooLargeHeadersFrameUsesContinuation) { |
EXPECT_EQ(0, visitor.error_count_); |
EXPECT_EQ(1, visitor.headers_frame_count_); |
EXPECT_EQ(1, visitor.continuation_count_); |
- EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); |
+ EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); |
} |
TEST_P(SpdyFramerTest, TooLargePushPromiseFrameUsesContinuation) { |
@@ -3683,7 +3821,7 @@ TEST_P(SpdyFramerTest, TooLargePushPromiseFrameUsesContinuation) { |
EXPECT_EQ(0, visitor.error_count_); |
EXPECT_EQ(1, visitor.push_promise_frame_count_); |
EXPECT_EQ(1, visitor.continuation_count_); |
- EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); |
+ EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); |
} |
// Check that the framer stops delivering header data chunks once the visitor |
@@ -3707,25 +3845,10 @@ TEST_P(SpdyFramerTest, ControlFrameMuchTooLarge) { |
visitor.SimulateInFramer( |
reinterpret_cast<unsigned char*>(control_frame.data()), |
control_frame.size()); |
- EXPECT_FALSE(visitor.header_buffer_valid_); |
- EXPECT_EQ(1, visitor.error_count_); |
- EXPECT_EQ(SpdyFramer::SPDY_CONTROL_PAYLOAD_TOO_LARGE, |
- visitor.framer_.error_code()) |
- << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); |
- |
- // The framer should have stoped delivering chunks after the visitor |
- // signaled "stop" by returning false from OnControlFrameHeaderData(). |
- // |
- // control_frame_header_data_count_ depends on the random sequence |
- // produced by rand(), so adding, removing or running single tests |
- // alters this value. The best we can do is assert that it happens |
- // at least kHeaderBufferChunks + 1. |
- EXPECT_LE(kHeaderBufferChunks + 1, |
- static_cast<unsigned>(visitor.control_frame_header_data_count_)); |
- EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); |
- |
- // The framer should not have sent half-close to the visitor. |
- EXPECT_EQ(0, visitor.end_of_stream_count_); |
+ // It's up to the visitor to ignore extraneous header data; the framer |
+ // won't throw an error. |
+ EXPECT_GT(visitor.header_bytes_received_, visitor.header_buffer_size_); |
+ EXPECT_EQ(1, visitor.end_of_stream_count_); |
} |
TEST_P(SpdyFramerTest, DecompressCorruptHeaderBlock) { |
@@ -4179,7 +4302,7 @@ TEST_P(SpdyFramerTest, ReadHeadersWithContinuation) { |
EXPECT_EQ(1, visitor.headers_frame_count_); |
EXPECT_EQ(2, visitor.continuation_count_); |
EXPECT_EQ(1, visitor.fin_flag_count_); |
- EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); |
+ EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); |
EXPECT_EQ(1, visitor.end_of_stream_count_); |
EXPECT_THAT(visitor.headers_, |
@@ -4229,7 +4352,7 @@ TEST_P(SpdyFramerTest, ReadPushPromiseWithContinuation) { |
EXPECT_EQ(1u, visitor.last_push_promise_stream_); |
EXPECT_EQ(42u, visitor.last_push_promise_promised_stream_); |
EXPECT_EQ(2, visitor.continuation_count_); |
- EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); |
+ EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); |
EXPECT_EQ(0, visitor.end_of_stream_count_); |
EXPECT_THAT(visitor.headers_, |
@@ -4836,8 +4959,8 @@ TEST_P(SpdyFramerTest, SynStreamFrameFlags) { |
EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(8, SYN_STREAM, _)); |
EXPECT_CALL(visitor, OnSynStream(8, 3, 1, flags & CONTROL_FLAG_FIN, |
flags & CONTROL_FLAG_UNIDIRECTIONAL)); |
- EXPECT_CALL(visitor, OnControlFrameHeaderData(8, _, _)) |
- .WillRepeatedly(testing::Return(true)); |
+ EXPECT_CALL(visitor, OnHeaderFrameStart(8)).Times(1); |
+ EXPECT_CALL(visitor, OnHeaderFrameEnd(8, _)).Times(1); |
if (flags & DATA_FLAG_FIN) { |
EXPECT_CALL(visitor, OnStreamEnd(_)); |
} else { |
@@ -4883,8 +5006,8 @@ TEST_P(SpdyFramerTest, SynReplyFrameFlags) { |
EXPECT_CALL(visitor, OnError(_)); |
} else { |
EXPECT_CALL(visitor, OnSynReply(37, flags & CONTROL_FLAG_FIN)); |
- EXPECT_CALL(visitor, OnControlFrameHeaderData(37, _, _)) |
- .WillRepeatedly(testing::Return(true)); |
+ EXPECT_CALL(visitor, OnHeaderFrameStart(37)).Times(1); |
+ EXPECT_CALL(visitor, OnHeaderFrameEnd(37, _)).Times(1); |
if (flags & DATA_FLAG_FIN) { |
EXPECT_CALL(visitor, OnStreamEnd(_)); |
} |
@@ -5082,8 +5205,10 @@ TEST_P(SpdyFramerTest, HeadersFrameFlags) { |
} |
EXPECT_CALL(visitor, OnHeaders(stream_id, has_priority, priority, |
parent_stream_id, exclusive, fin, end)); |
- EXPECT_CALL(visitor, OnControlFrameHeaderData(57, _, _)) |
- .WillRepeatedly(testing::Return(true)); |
+ EXPECT_CALL(visitor, OnHeaderFrameStart(57)).Times(1); |
+ if (end) { |
+ EXPECT_CALL(visitor, OnHeaderFrameEnd(57, _)).Times(1); |
+ } |
if (flags & DATA_FLAG_FIN && |
(IsSpdy3() || flags & HEADERS_FLAG_END_HEADERS)) { |
EXPECT_CALL(visitor, OnStreamEnd(_)); |
@@ -5179,9 +5304,13 @@ TEST_P(SpdyFramerTest, PushPromiseFrameFlags) { |
bool end = flags & PUSH_PROMISE_FLAG_END_PUSH_PROMISE; |
EXPECT_CALL(debug_visitor, |
OnReceiveCompressedFrame(client_id, PUSH_PROMISE, _)); |
- EXPECT_CALL(visitor, OnPushPromise(client_id, promised_id, end)); |
- EXPECT_CALL(visitor, OnControlFrameHeaderData(client_id, _, _)) |
- .WillRepeatedly(testing::Return(true)); |
+ EXPECT_CALL(visitor, |
+ OnPushPromise(client_id, promised_id, |
+ flags & PUSH_PROMISE_FLAG_END_PUSH_PROMISE)); |
+ EXPECT_CALL(visitor, OnHeaderFrameStart(client_id)).Times(1); |
+ if (end) { |
+ EXPECT_CALL(visitor, OnHeaderFrameEnd(client_id, _)).Times(1); |
+ } |
framer.ProcessInput(frame.data(), frame.size()); |
EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
@@ -5209,8 +5338,7 @@ TEST_P(SpdyFramerTest, ContinuationFrameFlags) { |
EXPECT_CALL(debug_visitor, OnSendCompressedFrame(42, HEADERS, _, _)); |
EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, HEADERS, _)); |
EXPECT_CALL(visitor, OnHeaders(42, false, 0, 0, false, false, false)); |
- EXPECT_CALL(visitor, OnControlFrameHeaderData(42, _, _)) |
- .WillRepeatedly(testing::Return(true)); |
+ EXPECT_CALL(visitor, OnHeaderFrameStart(42)).Times(1); |
SpdyHeadersIR headers_ir(42); |
headers_ir.SetHeader("foo", "bar"); |
@@ -5224,8 +5352,10 @@ TEST_P(SpdyFramerTest, ContinuationFrameFlags) { |
EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, CONTINUATION, _)); |
EXPECT_CALL(visitor, OnContinuation(42, flags & HEADERS_FLAG_END_HEADERS)); |
- EXPECT_CALL(visitor, OnControlFrameHeaderData(42, _, _)) |
- .WillRepeatedly(testing::Return(true)); |
+ bool end = flags & HEADERS_FLAG_END_HEADERS; |
+ if (end) { |
+ EXPECT_CALL(visitor, OnHeaderFrameEnd(42, _)).Times(1); |
+ } |
framer.ProcessInput(frame0.data(), frame0.size()); |
framer.ProcessInput(frame.data(), frame.size()); |
@@ -5262,7 +5392,8 @@ TEST_P(SpdyFramerTest, EmptySynStream) { |
EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(1, SYN_STREAM, _)); |
EXPECT_CALL(visitor, OnSynStream(1, 0, 1, false, false)); |
- EXPECT_CALL(visitor, OnControlFrameHeaderData(1, NULL, 0)); |
+ EXPECT_CALL(visitor, OnHeaderFrameStart(1)).Times(1); |
+ EXPECT_CALL(visitor, OnHeaderFrameEnd(1, _)).Times(1); |
framer.ProcessInput(frame.data(), framer.GetSynStreamMinimumSize()); |
EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |