Remove Http2DecoderAdapter::Reset() and ResetInternal(). These methods were only called in tests and the Http2DecoderAdapter constructor. This CL removes the test calls, instead replacing them with std::unique_ptr re-creation where needed, and inlines the body of ResetInternal() into the Http2DecoderAdapter constructor. PiperOrigin-RevId: 434591645
diff --git a/spdy/core/http2_frame_decoder_adapter.cc b/spdy/core/http2_frame_decoder_adapter.cc index 320befa..e79234f 100644 --- a/spdy/core/http2_frame_decoder_adapter.cc +++ b/spdy/core/http2_frame_decoder_adapter.cc
@@ -244,7 +244,22 @@ Http2DecoderAdapter::Http2DecoderAdapter() { QUICHE_DVLOG(1) << "Http2DecoderAdapter ctor"; - ResetInternal(); + + set_spdy_state(SpdyState::SPDY_READY_FOR_FRAME); + spdy_framer_error_ = SpdyFramerError::SPDY_NO_ERROR; + + decoded_frame_header_ = false; + has_frame_header_ = false; + on_headers_called_ = false; + on_hpack_fragment_called_ = false; + latched_probable_http_response_ = false; + has_expected_frame_type_ = false; + + CorruptFrameHeader(&frame_header_); + CorruptFrameHeader(&hpack_first_frame_header_); + + frame_decoder_ = std::make_unique<Http2FrameDecoder>(this); + hpack_decoder_ = nullptr; } Http2DecoderAdapter::~Http2DecoderAdapter() = default; @@ -287,10 +302,6 @@ return total_processed; } -void Http2DecoderAdapter::Reset() { - ResetInternal(); -} - Http2DecoderAdapter::SpdyState Http2DecoderAdapter::state() const { return spdy_state_; } @@ -889,26 +900,6 @@ set_spdy_state(SpdyState::SPDY_READY_FOR_FRAME); } -// ResetInternal is called from the constructor, and during tests, but not -// otherwise (i.e. not between every frame). -void Http2DecoderAdapter::ResetInternal() { - set_spdy_state(SpdyState::SPDY_READY_FOR_FRAME); - spdy_framer_error_ = SpdyFramerError::SPDY_NO_ERROR; - - decoded_frame_header_ = false; - has_frame_header_ = false; - on_headers_called_ = false; - on_hpack_fragment_called_ = false; - latched_probable_http_response_ = false; - has_expected_frame_type_ = false; - - CorruptFrameHeader(&frame_header_); - CorruptFrameHeader(&hpack_first_frame_header_); - - frame_decoder_ = std::make_unique<Http2FrameDecoder>(this); - hpack_decoder_ = nullptr; -} - void Http2DecoderAdapter::set_spdy_state(SpdyState v) { QUICHE_DVLOG(2) << "set_spdy_state(" << StateToString(v) << ")"; spdy_state_ = v;
diff --git a/spdy/core/http2_frame_decoder_adapter.h b/spdy/core/http2_frame_decoder_adapter.h index 259924c..3ed18f2 100644 --- a/spdy/core/http2_frame_decoder_adapter.h +++ b/spdy/core/http2_frame_decoder_adapter.h
@@ -103,6 +103,9 @@ Http2DecoderAdapter(); ~Http2DecoderAdapter() override; + Http2DecoderAdapter(const Http2DecoderAdapter&) = delete; + Http2DecoderAdapter& operator=(const Http2DecoderAdapter&) = delete; + // Set callbacks to be called from the framer. A visitor must be set, or // else the framer will likely crash. It is acceptable for the visitor // to do nothing. If this is called multiple times, only the last visitor @@ -137,9 +140,6 @@ // is guaranteed to be called exactly once, with the entire payload or field. size_t ProcessInput(const char* data, size_t len); - // Reset the decoder (used just for tests at this time). - void Reset(); - // Current state of the decoder. SpdyState state() const; @@ -224,10 +224,6 @@ void DetermineSpdyState(DecodeStatus status); void ResetBetweenFrames(); - // ResetInternal is called from the constructor, and during tests, but not - // otherwise (i.e. not between every frame). - void ResetInternal(); - void set_spdy_state(SpdyState v); void SetSpdyErrorAndNotify(SpdyFramerError error, std::string detailed_error); @@ -296,8 +292,7 @@ // clearing if the adapter is to be used for another connection. std::unique_ptr<spdy::HpackDecoderAdapter> hpack_decoder_ = nullptr; - // The HTTP/2 frame decoder. Accessed via a unique_ptr to allow replacement - // (e.g. in tests) when Reset() is called. + // The HTTP/2 frame decoder. std::unique_ptr<Http2FrameDecoder> frame_decoder_; // Next frame type expected. Currently only used for CONTINUATION frames,
diff --git a/spdy/core/spdy_framer_test.cc b/spdy/core/spdy_framer_test.cc index 1b20d9b..80e6256 100644 --- a/spdy/core/spdy_framer_test.cc +++ b/spdy/core/spdy_framer_test.cc
@@ -18,6 +18,7 @@ #include "common/platform/api/quiche_test.h" #include "common/quiche_text_utils.h" #include "spdy/core/array_output_buffer.h" +#include "spdy/core/http2_frame_decoder_adapter.h" #include "spdy/core/mock_spdy_framer_visitor.h" #include "spdy/core/recording_headers_handler.h" #include "spdy/core/spdy_bitmasks.h" @@ -591,7 +592,8 @@ public: SpdyFramerTest() : output_(output_buffer, kSize), - framer_(SpdyFramer::ENABLE_COMPRESSION) {} + framer_(SpdyFramer::ENABLE_COMPRESSION), + deframer_(absl::make_unique<Http2DecoderAdapter>()) {} protected: void SetUp() override { @@ -620,7 +622,7 @@ bool use_output_ = false; ArrayOutputBuffer output_; SpdyFramer framer_; - Http2DecoderAdapter deframer_; + std::unique_ptr<Http2DecoderAdapter> deframer_; }; INSTANTIATE_TEST_SUITE_P(SpdyFramerTests, @@ -697,7 +699,7 @@ // max size, we do not set an error in ProcessInput. TEST_P(SpdyFramerTest, AcceptMaxFrameSizeSetting) { testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); // DATA frame with maximum allowed payload length. unsigned char kH2FrameData[] = { @@ -714,15 +716,15 @@ EXPECT_CALL(visitor, OnCommonHeader(1, 16384, 0x0, 0x0)); EXPECT_CALL(visitor, OnDataFrameHeader(1, 1 << 14, false)); EXPECT_CALL(visitor, OnStreamFrameData(1, _, 4)); - deframer_.ProcessInput(frame.data(), frame.size()); - EXPECT_FALSE(deframer_.HasError()); + deframer_->ProcessInput(frame.data(), frame.size()); + EXPECT_FALSE(deframer_->HasError()); } // Test that if we receive a frame with a payload length larger than the default // max size, we set an error of SPDY_INVALID_CONTROL_FRAME_SIZE. TEST_P(SpdyFramerTest, ExceedMaxFrameSizeSetting) { testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); // DATA frame with too large payload length. unsigned char kH2FrameData[] = { @@ -738,22 +740,22 @@ EXPECT_CALL(visitor, OnCommonHeader(1, 16385, 0x0, 0x0)); EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_OVERSIZED_PAYLOAD, _)); - deframer_.ProcessInput(frame.data(), frame.size()); - EXPECT_TRUE(deframer_.HasError()); + deframer_->ProcessInput(frame.data(), frame.size()); + EXPECT_TRUE(deframer_->HasError()); EXPECT_EQ(Http2DecoderAdapter::SPDY_OVERSIZED_PAYLOAD, - deframer_.spdy_framer_error()) + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } // Test that if we set a larger max frame size and then receive a frame with a // payload length at that larger size, we do not set an error in ProcessInput. TEST_P(SpdyFramerTest, AcceptLargerMaxFrameSizeSetting) { testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); const size_t big_frame_size = (1 << 14) + 1; - deframer_.SetMaxFrameSize(big_frame_size); + deframer_->SetMaxFrameSize(big_frame_size); // DATA frame with larger-than-default but acceptable payload length. unsigned char kH2FrameData[] = { @@ -770,15 +772,15 @@ EXPECT_CALL(visitor, OnCommonHeader(1, big_frame_size, 0x0, 0x0)); EXPECT_CALL(visitor, OnDataFrameHeader(1, big_frame_size, false)); EXPECT_CALL(visitor, OnStreamFrameData(1, _, 4)); - deframer_.ProcessInput(frame.data(), frame.size()); - EXPECT_FALSE(deframer_.HasError()); + deframer_->ProcessInput(frame.data(), frame.size()); + EXPECT_FALSE(deframer_->HasError()); } // Test that if we receive a DATA frame with padding length larger than the // payload length, we set an error of SPDY_INVALID_PADDING TEST_P(SpdyFramerTest, OversizedDataPaddingError) { testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); // DATA frame with invalid padding length. // |kH2FrameData| has to be |unsigned char|, because Chromium on Windows uses @@ -803,12 +805,12 @@ EXPECT_CALL(visitor, OnStreamPadding(1, 1)); EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_PADDING, _)); } - EXPECT_GT(frame.size(), deframer_.ProcessInput(frame.data(), frame.size())); - EXPECT_TRUE(deframer_.HasError()); + EXPECT_GT(frame.size(), deframer_->ProcessInput(frame.data(), frame.size())); + EXPECT_TRUE(deframer_->HasError()); EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_PADDING, - deframer_.spdy_framer_error()) + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } // Test that if we receive a DATA frame with padding length not larger than the @@ -816,7 +818,7 @@ TEST_P(SpdyFramerTest, CorrectlySizedDataPaddingNoError) { testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); // DATA frame with valid Padding length char kH2FrameData[] = { @@ -841,11 +843,11 @@ EXPECT_CALL(visitor, OnStreamPadding(1, 4)); } - EXPECT_EQ(frame.size(), deframer_.ProcessInput(frame.data(), frame.size())); - EXPECT_FALSE(deframer_.HasError()); - EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error()) + EXPECT_EQ(frame.size(), deframer_->ProcessInput(frame.data(), frame.size())); + EXPECT_FALSE(deframer_->HasError()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } // Test that if we receive a HEADERS frame with padding length larger than the @@ -853,7 +855,7 @@ TEST_P(SpdyFramerTest, OversizedHeadersPaddingError) { testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); // HEADERS frame with invalid padding length. // |kH2FrameData| has to be |unsigned char|, because Chromium on Windows uses @@ -875,12 +877,12 @@ EXPECT_CALL(visitor, OnHeaders(1, false, 0, 0, false, false, false)); EXPECT_CALL(visitor, OnHeaderFrameStart(1)).Times(1); EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_PADDING, _)); - EXPECT_EQ(frame.size(), deframer_.ProcessInput(frame.data(), frame.size())); - EXPECT_TRUE(deframer_.HasError()); + EXPECT_EQ(frame.size(), deframer_->ProcessInput(frame.data(), frame.size())); + EXPECT_TRUE(deframer_->HasError()); EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_PADDING, - deframer_.spdy_framer_error()) + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } // Test that if we receive a HEADERS frame with padding length not larger @@ -888,7 +890,7 @@ TEST_P(SpdyFramerTest, CorrectlySizedHeadersPaddingNoError) { testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); // HEADERS frame with invalid Padding length char kH2FrameData[] = { @@ -906,11 +908,11 @@ EXPECT_CALL(visitor, OnHeaders(1, false, 0, 0, false, false, false)); EXPECT_CALL(visitor, OnHeaderFrameStart(1)).Times(1); - EXPECT_EQ(frame.size(), deframer_.ProcessInput(frame.data(), frame.size())); - EXPECT_FALSE(deframer_.HasError()); - EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error()) + EXPECT_EQ(frame.size(), deframer_->ProcessInput(frame.data(), frame.size())); + EXPECT_FALSE(deframer_->HasError()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } // Test that if we receive a DATA with stream ID zero, we signal an error @@ -918,7 +920,7 @@ TEST_P(SpdyFramerTest, DataWithStreamIdZero) { testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); const char bytes[] = "hello"; SpdyDataIR data_ir(/* stream_id = */ 0, bytes); @@ -927,12 +929,12 @@ // We shouldn't have to read the whole frame before we signal an error. EXPECT_CALL(visitor, OnCommonHeader(0, _, 0x0, _)); EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _)); - EXPECT_GT(frame.size(), deframer_.ProcessInput(frame.data(), frame.size())); - EXPECT_TRUE(deframer_.HasError()); + EXPECT_GT(frame.size(), deframer_->ProcessInput(frame.data(), frame.size())); + EXPECT_TRUE(deframer_->HasError()); EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, - deframer_.spdy_framer_error()) + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } // Test that if we receive a HEADERS with stream ID zero, we signal an error @@ -940,7 +942,7 @@ TEST_P(SpdyFramerTest, HeadersWithStreamIdZero) { testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); SpdyHeadersIR headers(/* stream_id = */ 0); headers.SetHeader("alpha", "beta"); @@ -950,12 +952,12 @@ // We shouldn't have to read the whole frame before we signal an error. EXPECT_CALL(visitor, OnCommonHeader(0, _, 0x1, _)); EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _)); - EXPECT_GT(frame.size(), deframer_.ProcessInput(frame.data(), frame.size())); - EXPECT_TRUE(deframer_.HasError()); + EXPECT_GT(frame.size(), deframer_->ProcessInput(frame.data(), frame.size())); + EXPECT_TRUE(deframer_->HasError()); EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, - deframer_.spdy_framer_error()) + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } // Test that if we receive a PRIORITY with stream ID zero, we signal an error @@ -963,7 +965,7 @@ TEST_P(SpdyFramerTest, PriorityWithStreamIdZero) { testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); SpdyPriorityIR priority_ir(/* stream_id = */ 0, /* parent_stream_id = */ 1, @@ -978,12 +980,12 @@ // We shouldn't have to read the whole frame before we signal an error. EXPECT_CALL(visitor, OnCommonHeader(0, _, 0x2, _)); EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _)); - EXPECT_GT(frame.size(), deframer_.ProcessInput(frame.data(), frame.size())); - EXPECT_TRUE(deframer_.HasError()); + EXPECT_GT(frame.size(), deframer_->ProcessInput(frame.data(), frame.size())); + EXPECT_TRUE(deframer_->HasError()); EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, - deframer_.spdy_framer_error()) + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } // Test that if we receive a RST_STREAM with stream ID zero, we signal an error @@ -991,7 +993,7 @@ TEST_P(SpdyFramerTest, RstStreamWithStreamIdZero) { testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); SpdyRstStreamIR rst_stream_ir(/* stream_id = */ 0, ERROR_CODE_PROTOCOL_ERROR); SpdySerializedFrame frame(framer_.SerializeRstStream(rst_stream_ir)); @@ -1003,12 +1005,12 @@ // We shouldn't have to read the whole frame before we signal an error. EXPECT_CALL(visitor, OnCommonHeader(0, _, 0x3, _)); EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _)); - EXPECT_GT(frame.size(), deframer_.ProcessInput(frame.data(), frame.size())); - EXPECT_TRUE(deframer_.HasError()); + EXPECT_GT(frame.size(), deframer_->ProcessInput(frame.data(), frame.size())); + EXPECT_TRUE(deframer_->HasError()); EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, - deframer_.spdy_framer_error()) + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } // Test that if we receive a SETTINGS with stream ID other than zero, @@ -1016,7 +1018,7 @@ TEST_P(SpdyFramerTest, SettingsWithStreamIdNotZero) { testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); // Settings frame with invalid StreamID of 0x01 char kH2FrameData[] = { @@ -1033,12 +1035,12 @@ // We shouldn't have to read the whole frame before we signal an error. EXPECT_CALL(visitor, OnCommonHeader(1, 6, 0x4, 0x0)); EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _)); - EXPECT_GT(frame.size(), deframer_.ProcessInput(frame.data(), frame.size())); - EXPECT_TRUE(deframer_.HasError()); + EXPECT_GT(frame.size(), deframer_->ProcessInput(frame.data(), frame.size())); + EXPECT_TRUE(deframer_->HasError()); EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, - deframer_.spdy_framer_error()) + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } // Test that if we receive a GOAWAY with stream ID other than zero, @@ -1046,7 +1048,7 @@ TEST_P(SpdyFramerTest, GoawayWithStreamIdNotZero) { testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); // GOAWAY frame with invalid StreamID of 0x01 char kH2FrameData[] = { @@ -1064,12 +1066,12 @@ // We shouldn't have to read the whole frame before we signal an error. EXPECT_CALL(visitor, OnCommonHeader(1, 10, 0x7, 0x0)); EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _)); - EXPECT_GT(frame.size(), deframer_.ProcessInput(frame.data(), frame.size())); - EXPECT_TRUE(deframer_.HasError()); + EXPECT_GT(frame.size(), deframer_->ProcessInput(frame.data(), frame.size())); + EXPECT_TRUE(deframer_->HasError()); EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, - deframer_.spdy_framer_error()) + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } // Test that if we receive a CONTINUATION with stream ID zero, we signal @@ -1077,7 +1079,7 @@ TEST_P(SpdyFramerTest, ContinuationWithStreamIdZero) { testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); SpdyContinuationIR continuation(/* stream_id = */ 0); std::string some_nonsense_encoding = "some nonsense encoding"; @@ -1092,12 +1094,12 @@ // We shouldn't have to read the whole frame before we signal an error. EXPECT_CALL(visitor, OnCommonHeader(0, _, 0x9, _)); EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _)); - EXPECT_GT(frame.size(), deframer_.ProcessInput(frame.data(), frame.size())); - EXPECT_TRUE(deframer_.HasError()); + EXPECT_GT(frame.size(), deframer_->ProcessInput(frame.data(), frame.size())); + EXPECT_TRUE(deframer_->HasError()); EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, - deframer_.spdy_framer_error()) + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } // Test that if we receive a PUSH_PROMISE with stream ID zero, we signal @@ -1105,7 +1107,7 @@ TEST_P(SpdyFramerTest, PushPromiseWithStreamIdZero) { testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); SpdyPushPromiseIR push_promise(/* stream_id = */ 0, /* promised_stream_id = */ 4); @@ -1116,12 +1118,12 @@ // We shouldn't have to read the whole frame before we signal an error. EXPECT_CALL(visitor, OnCommonHeader(0, _, 0x5, _)); EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _)); - EXPECT_GT(frame.size(), deframer_.ProcessInput(frame.data(), frame.size())); - EXPECT_TRUE(deframer_.HasError()); + EXPECT_GT(frame.size(), deframer_->ProcessInput(frame.data(), frame.size())); + EXPECT_TRUE(deframer_->HasError()); EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, - deframer_.spdy_framer_error()) + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } // Test that if we receive a PUSH_PROMISE with promised stream ID zero, we @@ -1129,7 +1131,7 @@ TEST_P(SpdyFramerTest, PushPromiseWithPromisedStreamIdZero) { testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); SpdyPushPromiseIR push_promise(/* stream_id = */ 3, /* promised_stream_id = */ 0); @@ -1140,12 +1142,12 @@ EXPECT_CALL(visitor, OnCommonHeader(3, _, 0x5, _)); EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_CONTROL_FRAME, _)); - deframer_.ProcessInput(frame.data(), frame.size()); - EXPECT_TRUE(deframer_.HasError()); + deframer_->ProcessInput(frame.data(), frame.size()); + EXPECT_TRUE(deframer_->HasError()); EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_CONTROL_FRAME, - deframer_.spdy_framer_error()) + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } TEST_P(SpdyFramerTest, MultiValueHeader) { @@ -1332,7 +1334,7 @@ testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); testing::InSequence s; EXPECT_CALL(visitor, OnCommonHeader(1, 1, 0x1, 0x4)); @@ -1348,15 +1350,15 @@ EXPECT_CALL(visitor, OnHeaderFrameEnd(3)); EXPECT_CALL(visitor, OnCommonHeader(3, 8, 0x0, 0x0)); EXPECT_CALL(visitor, OnDataFrameHeader(3, 8, false)) - .WillOnce( - testing::InvokeWithoutArgs([this]() { deframer_.StopProcessing(); })); + .WillOnce(testing::InvokeWithoutArgs( + [this]() { deframer_->StopProcessing(); })); // Remaining frames are not processed due to the error. EXPECT_CALL( visitor, OnError(http2::Http2DecoderAdapter::SpdyFramerError::SPDY_STOP_PROCESSING, "Ignoring further events on this connection.")); - size_t processed = deframer_.ProcessInput( + size_t processed = deframer_->ProcessInput( reinterpret_cast<const char*>(kH2Input), sizeof(kH2Input)); EXPECT_LT(processed, sizeof(kH2Input)); } @@ -2467,7 +2469,7 @@ TEST_P(SpdyFramerTest, SendUnexpectedContinuation) { testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); // frame-format off char kH2FrameData[] = { @@ -2495,12 +2497,12 @@ // We shouldn't have to read the whole frame before we signal an error. EXPECT_CALL(visitor, OnCommonHeader(42, 18, 0x9, 0x4)); EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_UNEXPECTED_FRAME, _)); - EXPECT_GT(frame.size(), deframer_.ProcessInput(frame.data(), frame.size())); - EXPECT_TRUE(deframer_.HasError()); + EXPECT_GT(frame.size(), deframer_->ProcessInput(frame.data(), frame.size())); + EXPECT_TRUE(deframer_->HasError()); EXPECT_EQ(Http2DecoderAdapter::SPDY_UNEXPECTED_FRAME, - deframer_.spdy_framer_error()) + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } TEST_P(SpdyFramerTest, CreatePushPromiseThenContinuationUncompressed) { @@ -3309,7 +3311,7 @@ const char data_payload[] = "hello"; testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); SpdyDataIR data_ir(/* stream_id = */ 1, data_payload); data_ir.set_padding_len(kPaddingLen); @@ -3323,54 +3325,60 @@ EXPECT_CALL(visitor, OnDataFrameHeader(1, kPaddingLen + strlen(data_payload), false)); QUICHE_CHECK_EQ(kDataFrameMinimumSize, - deframer_.ProcessInput(frame.data(), kDataFrameMinimumSize)); - QUICHE_CHECK_EQ(deframer_.state(), + deframer_->ProcessInput(frame.data(), kDataFrameMinimumSize)); + QUICHE_CHECK_EQ(deframer_->state(), Http2DecoderAdapter::SPDY_READ_DATA_FRAME_PADDING_LENGTH); - QUICHE_CHECK_EQ(deframer_.spdy_framer_error(), + QUICHE_CHECK_EQ(deframer_->spdy_framer_error(), Http2DecoderAdapter::SPDY_NO_ERROR); bytes_consumed += kDataFrameMinimumSize; // Send the padding length field. EXPECT_CALL(visitor, OnStreamPadLength(1, kPaddingLen - 1)); - QUICHE_CHECK_EQ(1u, deframer_.ProcessInput(frame.data() + bytes_consumed, 1)); - QUICHE_CHECK_EQ(deframer_.state(), + QUICHE_CHECK_EQ(1u, + deframer_->ProcessInput(frame.data() + bytes_consumed, 1)); + QUICHE_CHECK_EQ(deframer_->state(), Http2DecoderAdapter::SPDY_FORWARD_STREAM_FRAME); - QUICHE_CHECK_EQ(deframer_.spdy_framer_error(), + QUICHE_CHECK_EQ(deframer_->spdy_framer_error(), Http2DecoderAdapter::SPDY_NO_ERROR); bytes_consumed += 1; // Send the first two bytes of the data payload, i.e., "he". EXPECT_CALL(visitor, OnStreamFrameData(1, _, 2)); - QUICHE_CHECK_EQ(2u, deframer_.ProcessInput(frame.data() + bytes_consumed, 2)); - QUICHE_CHECK_EQ(deframer_.state(), + QUICHE_CHECK_EQ(2u, + deframer_->ProcessInput(frame.data() + bytes_consumed, 2)); + QUICHE_CHECK_EQ(deframer_->state(), Http2DecoderAdapter::SPDY_FORWARD_STREAM_FRAME); - QUICHE_CHECK_EQ(deframer_.spdy_framer_error(), + QUICHE_CHECK_EQ(deframer_->spdy_framer_error(), Http2DecoderAdapter::SPDY_NO_ERROR); bytes_consumed += 2; // Send the rest three bytes of the data payload, i.e., "llo". EXPECT_CALL(visitor, OnStreamFrameData(1, _, 3)); - QUICHE_CHECK_EQ(3u, deframer_.ProcessInput(frame.data() + bytes_consumed, 3)); - QUICHE_CHECK_EQ(deframer_.state(), Http2DecoderAdapter::SPDY_CONSUME_PADDING); - QUICHE_CHECK_EQ(deframer_.spdy_framer_error(), + QUICHE_CHECK_EQ(3u, + deframer_->ProcessInput(frame.data() + bytes_consumed, 3)); + QUICHE_CHECK_EQ(deframer_->state(), + Http2DecoderAdapter::SPDY_CONSUME_PADDING); + QUICHE_CHECK_EQ(deframer_->spdy_framer_error(), Http2DecoderAdapter::SPDY_NO_ERROR); bytes_consumed += 3; // Send the first 100 bytes of the padding payload. EXPECT_CALL(visitor, OnStreamPadding(1, 100)); QUICHE_CHECK_EQ(100u, - deframer_.ProcessInput(frame.data() + bytes_consumed, 100)); - QUICHE_CHECK_EQ(deframer_.state(), Http2DecoderAdapter::SPDY_CONSUME_PADDING); - QUICHE_CHECK_EQ(deframer_.spdy_framer_error(), + deframer_->ProcessInput(frame.data() + bytes_consumed, 100)); + QUICHE_CHECK_EQ(deframer_->state(), + Http2DecoderAdapter::SPDY_CONSUME_PADDING); + QUICHE_CHECK_EQ(deframer_->spdy_framer_error(), Http2DecoderAdapter::SPDY_NO_ERROR); bytes_consumed += 100; // Send rest of the padding payload. EXPECT_CALL(visitor, OnStreamPadding(1, 18)); QUICHE_CHECK_EQ(18u, - deframer_.ProcessInput(frame.data() + bytes_consumed, 18)); - QUICHE_CHECK_EQ(deframer_.state(), Http2DecoderAdapter::SPDY_READY_FOR_FRAME); - QUICHE_CHECK_EQ(deframer_.spdy_framer_error(), + deframer_->ProcessInput(frame.data() + bytes_consumed, 18)); + QUICHE_CHECK_EQ(deframer_->state(), + Http2DecoderAdapter::SPDY_READY_FOR_FRAME); + QUICHE_CHECK_EQ(deframer_->spdy_framer_error(), Http2DecoderAdapter::SPDY_NO_ERROR); } @@ -3604,7 +3612,7 @@ TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); // Assume the unknown frame is allowed visitor.on_unknown_frame_result_ = true; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); visitor.SimulateInFramer(kInput, sizeof(kInput)); EXPECT_EQ(1, visitor.error_count_); @@ -3644,7 +3652,7 @@ TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); TestExtension extension; visitor.set_extension_visitor(&extension); - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); visitor.SimulateInFramer(kInput, sizeof(kInput)); EXPECT_EQ(1, visitor.error_count_); @@ -3680,7 +3688,7 @@ }; TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); visitor.SimulateInFramer(kInput, sizeof(kInput)); EXPECT_EQ(1, visitor.error_count_); @@ -3706,7 +3714,7 @@ }; TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); visitor.SimulateInFramer(kInput, sizeof(kInput)); EXPECT_EQ(1, visitor.error_count_); @@ -3738,7 +3746,7 @@ }; TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); visitor.SimulateInFramer(kInput, sizeof(kInput)); EXPECT_EQ(1, visitor.error_count_); @@ -3774,7 +3782,7 @@ }; TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); visitor.SimulateInFramer(kInput, sizeof(kInput)); EXPECT_EQ(1, visitor.error_count_); @@ -4008,7 +4016,7 @@ testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); SpdyDataIR data_ir(/* stream_id = */ 1, "hello"); SpdySerializedFrame frame(framer_.SerializeData(data_ir)); @@ -4033,27 +4041,27 @@ } } - deframer_.ProcessInput(frame.data(), frame.size()); + deframer_->ProcessInput(frame.data(), frame.size()); if (flags & ~valid_data_flags) { - EXPECT_EQ(Http2DecoderAdapter::SPDY_ERROR, deframer_.state()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_ERROR, deframer_->state()); EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_DATA_FRAME_FLAGS, - deframer_.spdy_framer_error()) + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } else if (flags & DATA_FLAG_PADDED) { - EXPECT_EQ(Http2DecoderAdapter::SPDY_ERROR, deframer_.state()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_ERROR, deframer_->state()); EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_PADDING, - deframer_.spdy_framer_error()) + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } else { - EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state()); EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, - deframer_.spdy_framer_error()) + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } - deframer_.Reset(); + deframer_ = absl::make_unique<Http2DecoderAdapter>(); } while (++flags != 0); } @@ -4064,7 +4072,7 @@ << "Flags " << std::hex << static_cast<int>(flags)); testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); SpdyRstStreamIR rst_stream(/* stream_id = */ 13, ERROR_CODE_CANCEL); SpdySerializedFrame frame(framer_.SerializeRstStream(rst_stream)); @@ -4078,12 +4086,13 @@ EXPECT_CALL(visitor, OnCommonHeader(13, 4, 0x3, flags)); EXPECT_CALL(visitor, OnRstStream(13, ERROR_CODE_CANCEL)); - deframer_.ProcessInput(frame.data(), frame.size()); - EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state()); - EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error()) + deframer_->ProcessInput(frame.data(), frame.size()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); - deframer_.Reset(); + deframer_->spdy_framer_error()); + deframer_ = absl::make_unique<Http2DecoderAdapter>(); } while (++flags != 0); } @@ -4094,7 +4103,7 @@ << "Flags " << std::hex << static_cast<int>(flags)); testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); SpdySettingsIR settings_ir; settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 16); @@ -4115,22 +4124,22 @@ EXPECT_CALL(visitor, OnSettingsEnd()); } - deframer_.ProcessInput(frame.data(), frame.size()); + deframer_->ProcessInput(frame.data(), frame.size()); if (flags & SETTINGS_FLAG_ACK) { // The frame is invalid because ACK frames should have no payload. - EXPECT_EQ(Http2DecoderAdapter::SPDY_ERROR, deframer_.state()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_ERROR, deframer_->state()); EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_CONTROL_FRAME_SIZE, - deframer_.spdy_framer_error()) + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } else { - EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state()); EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, - deframer_.spdy_framer_error()) + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } - deframer_.Reset(); + deframer_ = absl::make_unique<Http2DecoderAdapter>(); } while (++flags != 0); } @@ -4142,7 +4151,7 @@ testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); SpdyGoAwayIR goaway_ir(/* last_good_stream_id = */ 97, ERROR_CODE_NO_ERROR, "test"); @@ -4159,12 +4168,13 @@ EXPECT_CALL(visitor, OnGoAwayFrameData) .WillRepeatedly(testing::Return(true)); - deframer_.ProcessInput(frame.data(), frame.size()); - EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state()); - EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error()) + deframer_->ProcessInput(frame.data(), frame.size()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); - deframer_.Reset(); + deframer_->spdy_framer_error()); + deframer_ = absl::make_unique<Http2DecoderAdapter>(); } while (++flags != 0); } @@ -4225,7 +4235,6 @@ EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer.spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( deframer.spdy_framer_error()); - deframer.Reset(); } while (++flags != 0); } @@ -4236,7 +4245,7 @@ << "Flags " << std::hex << static_cast<int>(flags)); testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); SpdySerializedFrame frame(framer_.SerializePing(SpdyPingIR(42))); SetFrameFlags(&frame, flags); @@ -4244,12 +4253,13 @@ EXPECT_CALL(visitor, OnCommonHeader(0, 8, 0x6, flags)); EXPECT_CALL(visitor, OnPing(42, flags & PING_FLAG_ACK)); - deframer_.ProcessInput(frame.data(), frame.size()); - EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state()); - EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error()) + deframer_->ProcessInput(frame.data(), frame.size()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); - deframer_.Reset(); + deframer_->spdy_framer_error()); + deframer_ = absl::make_unique<Http2DecoderAdapter>(); } while (++flags != 0); } @@ -4261,7 +4271,7 @@ testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); SpdySerializedFrame frame(framer_.SerializeWindowUpdate( SpdyWindowUpdateIR(/* stream_id = */ 4, /* delta = */ 1024))); @@ -4270,12 +4280,13 @@ EXPECT_CALL(visitor, OnCommonHeader(4, 4, 0x8, flags)); EXPECT_CALL(visitor, OnWindowUpdate(4, 1024)); - deframer_.ProcessInput(frame.data(), frame.size()); - EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state()); - EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error()) + deframer_->ProcessInput(frame.data(), frame.size()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); - deframer_.Reset(); + deframer_->spdy_framer_error()); + deframer_ = absl::make_unique<Http2DecoderAdapter>(); } while (++flags != 0); } @@ -4412,27 +4423,28 @@ }; testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); EXPECT_CALL(visitor, OnCommonHeader(1, 4, 0x3, 0x0)); EXPECT_CALL(visitor, OnRstStream(1, ERROR_CODE_NO_ERROR)); - deframer_.ProcessInput(reinterpret_cast<const char*>(kH2RstStreamInvalid), - ABSL_ARRAYSIZE(kH2RstStreamInvalid)); - EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state()); - EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error()) + deframer_->ProcessInput(reinterpret_cast<const char*>(kH2RstStreamInvalid), + ABSL_ARRAYSIZE(kH2RstStreamInvalid)); + EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); - deframer_.Reset(); + deframer_->spdy_framer_error()); + deframer_ = absl::make_unique<Http2DecoderAdapter>(); + deframer_->set_visitor(&visitor); EXPECT_CALL(visitor, OnCommonHeader(1, 4, 0x3, 0x0)); EXPECT_CALL(visitor, OnRstStream(1, ERROR_CODE_INTERNAL_ERROR)); - deframer_.ProcessInput( + deframer_->ProcessInput( reinterpret_cast<const char*>(kH2RstStreamNumStatusCodes), ABSL_ARRAYSIZE(kH2RstStreamNumStatusCodes)); - EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state()); - EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error()) + EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } // Test handling of GOAWAY frames with out-of-bounds status code. @@ -4447,17 +4459,17 @@ 0x47, 0x41, // Description }; testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); EXPECT_CALL(visitor, OnCommonHeader(0, 10, 0x7, 0x0)); EXPECT_CALL(visitor, OnGoAway(1, ERROR_CODE_INTERNAL_ERROR)); EXPECT_CALL(visitor, OnGoAwayFrameData).WillRepeatedly(testing::Return(true)); - deframer_.ProcessInput(reinterpret_cast<const char*>(kH2FrameData), - ABSL_ARRAYSIZE(kH2FrameData)); - EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state()); - EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error()) + deframer_->ProcessInput(reinterpret_cast<const char*>(kH2FrameData), + ABSL_ARRAYSIZE(kH2FrameData)); + EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } // Tests handling of a GOAWAY frame with out-of-bounds stream ID. @@ -4473,17 +4485,17 @@ testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); EXPECT_CALL(visitor, OnCommonHeader(0, 8, 0x7, 0x0)); EXPECT_CALL(visitor, OnGoAway(0x7fffffff, ERROR_CODE_NO_ERROR)); EXPECT_CALL(visitor, OnGoAwayFrameData).WillRepeatedly(testing::Return(true)); - deframer_.ProcessInput(reinterpret_cast<const char*>(kH2FrameData), - ABSL_ARRAYSIZE(kH2FrameData)); - EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state()); - EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error()) + deframer_->ProcessInput(reinterpret_cast<const char*>(kH2FrameData), + ABSL_ARRAYSIZE(kH2FrameData)); + EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } TEST_P(SpdyFramerTest, OnAltSvcWithOrigin) { @@ -4491,7 +4503,7 @@ testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); SpdyAltSvcWireFormat::AlternativeService altsvc1( "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector()); @@ -4514,12 +4526,12 @@ EXPECT_EQ(framer_.SerializeFrame(altsvc_ir, &output_), frame.size()); frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); } - deframer_.ProcessInput(frame.data(), frame.size()); + deframer_->ProcessInput(frame.data(), frame.size()); - EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state()); - EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error()) + EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } TEST_P(SpdyFramerTest, OnAltSvcNoOrigin) { @@ -4527,7 +4539,7 @@ testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); SpdyAltSvcWireFormat::AlternativeService altsvc1( "pid1", "host", 443, 5, SpdyAltSvcWireFormat::VersionVector()); @@ -4544,12 +4556,12 @@ altsvc_ir.add_altsvc(altsvc1); altsvc_ir.add_altsvc(altsvc2); SpdySerializedFrame frame(framer_.SerializeFrame(altsvc_ir)); - deframer_.ProcessInput(frame.data(), frame.size()); + deframer_->ProcessInput(frame.data(), frame.size()); - EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state()); - EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error()) + EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } TEST_P(SpdyFramerTest, OnAltSvcEmptyProtocolId) { @@ -4557,7 +4569,7 @@ testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); EXPECT_CALL(visitor, OnCommonHeader(kStreamId, _, 0x0A, 0x0)); EXPECT_CALL(visitor, @@ -4575,13 +4587,13 @@ EXPECT_EQ(framer_.SerializeFrame(altsvc_ir, &output_), frame.size()); frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); } - deframer_.ProcessInput(frame.data(), frame.size()); + deframer_->ProcessInput(frame.data(), frame.size()); - EXPECT_EQ(Http2DecoderAdapter::SPDY_ERROR, deframer_.state()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_ERROR, deframer_->state()); EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_CONTROL_FRAME, - deframer_.spdy_framer_error()) + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } TEST_P(SpdyFramerTest, OnAltSvcBadLengths) { @@ -4593,7 +4605,7 @@ TestSpdyVisitor visitor(SpdyFramer::DISABLE_COMPRESSION); - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); visitor.SimulateInFramer(kFrameDataOriginLenLargerThanFrame, sizeof(kFrameDataOriginLenLargerThanFrame)); @@ -4655,15 +4667,16 @@ SpdySerializedFrame frame(framer_.SerializeAltSvc(altsvc_ir)); TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION); - deframer_.set_visitor(&visitor); - deframer_.ProcessInput(frame.data(), frame.size()); + deframer_->set_visitor(&visitor); + deframer_->ProcessInput(frame.data(), frame.size()); EXPECT_EQ(0, visitor.error_count_); EXPECT_EQ(1, visitor.altsvc_count_); - EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state()); - EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error()) + EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } } @@ -4683,16 +4696,16 @@ }; TestSpdyVisitor visitor(SpdyFramer::ENABLE_COMPRESSION); - deframer_.set_visitor(&visitor); - deframer_.ProcessInput(kFrameData, sizeof(kFrameData)); + deframer_->set_visitor(&visitor); + deframer_->ProcessInput(kFrameData, sizeof(kFrameData)); EXPECT_EQ(1, visitor.error_count_); EXPECT_EQ(0, visitor.altsvc_count_); - EXPECT_EQ(Http2DecoderAdapter::SPDY_ERROR, deframer_.state()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_ERROR, deframer_->state()); EXPECT_EQ(Http2DecoderAdapter::SPDY_INVALID_CONTROL_FRAME, - deframer_.spdy_framer_error()) + deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } TEST_P(SpdyFramerTest, ReadPriorityUpdateFrame) { @@ -4706,12 +4719,12 @@ }; testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); EXPECT_CALL(visitor, OnCommonHeader(0, 7, 0x10, 0x0)); EXPECT_CALL(visitor, OnPriorityUpdate(3, "foo")); - deframer_.ProcessInput(kFrameData, sizeof(kFrameData)); - EXPECT_FALSE(deframer_.HasError()); + deframer_->ProcessInput(kFrameData, sizeof(kFrameData)); + EXPECT_FALSE(deframer_->HasError()); } TEST_P(SpdyFramerTest, ReadPriorityUpdateFrameWithEmptyPriorityFieldValue) { @@ -4724,12 +4737,12 @@ }; testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); EXPECT_CALL(visitor, OnCommonHeader(0, 4, 0x10, 0x0)); EXPECT_CALL(visitor, OnPriorityUpdate(3, "")); - deframer_.ProcessInput(kFrameData, sizeof(kFrameData)); - EXPECT_FALSE(deframer_.HasError()); + deframer_->ProcessInput(kFrameData, sizeof(kFrameData)); + EXPECT_FALSE(deframer_->HasError()); } TEST_P(SpdyFramerTest, PriorityUpdateFrameWithEmptyPayload) { @@ -4741,13 +4754,13 @@ }; testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); EXPECT_CALL(visitor, OnCommonHeader(0, 0, 0x10, 0x0)); EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_CONTROL_FRAME_SIZE, _)); - deframer_.ProcessInput(kFrameData, sizeof(kFrameData)); - EXPECT_TRUE(deframer_.HasError()); + deframer_->ProcessInput(kFrameData, sizeof(kFrameData)); + EXPECT_TRUE(deframer_->HasError()); } TEST_P(SpdyFramerTest, PriorityUpdateFrameWithShortPayload) { @@ -4761,13 +4774,13 @@ }; testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); EXPECT_CALL(visitor, OnCommonHeader(0, 2, 0x10, 0x0)); EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_CONTROL_FRAME_SIZE, _)); - deframer_.ProcessInput(kFrameData, sizeof(kFrameData)); - EXPECT_TRUE(deframer_.HasError()); + deframer_->ProcessInput(kFrameData, sizeof(kFrameData)); + EXPECT_TRUE(deframer_->HasError()); } TEST_P(SpdyFramerTest, PriorityUpdateFrameOnIncorrectStream) { @@ -4780,12 +4793,12 @@ }; testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); EXPECT_CALL(visitor, OnCommonHeader(1, 4, 0x10, 0x0)); EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _)); - deframer_.ProcessInput(kFrameData, sizeof(kFrameData)); - EXPECT_TRUE(deframer_.HasError()); + deframer_->ProcessInput(kFrameData, sizeof(kFrameData)); + EXPECT_TRUE(deframer_->HasError()); } TEST_P(SpdyFramerTest, PriorityUpdateFramePrioritizingIncorrectStream) { @@ -4798,12 +4811,12 @@ }; testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); EXPECT_CALL(visitor, OnCommonHeader(0, 4, 0x10, 0x0)); EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _)); - deframer_.ProcessInput(kFrameData, sizeof(kFrameData)); - EXPECT_TRUE(deframer_.HasError()); + deframer_->ProcessInput(kFrameData, sizeof(kFrameData)); + EXPECT_TRUE(deframer_->HasError()); } // Tests handling of PRIORITY frames. @@ -4819,15 +4832,15 @@ frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); } testing::StrictMock<test::MockSpdyFramerVisitor> visitor; - deframer_.set_visitor(&visitor); + deframer_->set_visitor(&visitor); EXPECT_CALL(visitor, OnCommonHeader(3, 5, 0x2, 0x0)); EXPECT_CALL(visitor, OnPriority(3, 1, 256, false)); - deframer_.ProcessInput(frame.data(), frame.size()); + deframer_->ProcessInput(frame.data(), frame.size()); - EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state()); - EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_.spdy_framer_error()) + EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_NO_ERROR, deframer_->spdy_framer_error()) << Http2DecoderAdapter::SpdyFramerErrorToString( - deframer_.spdy_framer_error()); + deframer_->spdy_framer_error()); } // Tests handling of PRIORITY frame with incorrect size. @@ -4940,7 +4953,7 @@ TEST_P(SpdyFramerTest, ProcessAllInput) { auto visitor = std::make_unique<TestSpdyVisitor>(SpdyFramer::DISABLE_COMPRESSION); - deframer_.set_visitor(visitor.get()); + deframer_->set_visitor(visitor.get()); // Create two input frames. SpdyHeadersIR headers(/* stream_id = */ 1); @@ -4974,9 +4987,9 @@ QUICHE_VLOG(1) << "buf_size = " << buf_size; - size_t processed = deframer_.ProcessInput(buf, buf_size); + size_t processed = deframer_->ProcessInput(buf, buf_size); EXPECT_EQ(buf_size, processed); - EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_.state()); + EXPECT_EQ(Http2DecoderAdapter::SPDY_READY_FOR_FRAME, deframer_->state()); EXPECT_EQ(1, visitor->headers_frame_count_); EXPECT_EQ(1, visitor->data_frame_count_); EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_));