|  | #include "http2/adapter/test_utils.h" | 
|  |  | 
|  | #include "common/platform/api/quiche_test.h" | 
|  | #include "spdy/core/spdy_framer.h" | 
|  |  | 
|  | namespace http2 { | 
|  | namespace adapter { | 
|  | namespace test { | 
|  | namespace { | 
|  |  | 
|  | using spdy::SpdyFramer; | 
|  |  | 
|  | TEST(EqualsFrames, Empty) { | 
|  | EXPECT_THAT("", EqualsFrames(std::vector<spdy::SpdyFrameType>{})); | 
|  | } | 
|  |  | 
|  | TEST(EqualsFrames, SingleFrameWithLength) { | 
|  | SpdyFramer framer{SpdyFramer::ENABLE_COMPRESSION}; | 
|  |  | 
|  | spdy::SpdyPingIR ping{511}; | 
|  | EXPECT_THAT(framer.SerializeFrame(ping), | 
|  | EqualsFrames({{spdy::SpdyFrameType::PING, 8}})); | 
|  |  | 
|  | spdy::SpdyWindowUpdateIR window_update{1, 101}; | 
|  | EXPECT_THAT(framer.SerializeFrame(window_update), | 
|  | EqualsFrames({{spdy::SpdyFrameType::WINDOW_UPDATE, 4}})); | 
|  |  | 
|  | spdy::SpdyDataIR data{3, "Some example data, ha ha!"}; | 
|  | EXPECT_THAT(framer.SerializeFrame(data), | 
|  | EqualsFrames({{spdy::SpdyFrameType::DATA, 25}})); | 
|  | } | 
|  |  | 
|  | TEST(EqualsFrames, SingleFrameWithoutLength) { | 
|  | SpdyFramer framer{SpdyFramer::ENABLE_COMPRESSION}; | 
|  |  | 
|  | spdy::SpdyRstStreamIR rst_stream{7, spdy::ERROR_CODE_REFUSED_STREAM}; | 
|  | EXPECT_THAT(framer.SerializeFrame(rst_stream), | 
|  | EqualsFrames({{spdy::SpdyFrameType::RST_STREAM, absl::nullopt}})); | 
|  |  | 
|  | spdy::SpdyGoAwayIR goaway{13, spdy::ERROR_CODE_ENHANCE_YOUR_CALM, | 
|  | "Consider taking some deep breaths."}; | 
|  | EXPECT_THAT(framer.SerializeFrame(goaway), | 
|  | EqualsFrames({{spdy::SpdyFrameType::GOAWAY, absl::nullopt}})); | 
|  |  | 
|  | spdy::Http2HeaderBlock block; | 
|  | block[":method"] = "GET"; | 
|  | block[":path"] = "/example"; | 
|  | block[":authority"] = "example.com"; | 
|  | spdy::SpdyHeadersIR headers{17, std::move(block)}; | 
|  | EXPECT_THAT(framer.SerializeFrame(headers), | 
|  | EqualsFrames({{spdy::SpdyFrameType::HEADERS, absl::nullopt}})); | 
|  | } | 
|  |  | 
|  | TEST(EqualsFrames, MultipleFrames) { | 
|  | SpdyFramer framer{SpdyFramer::ENABLE_COMPRESSION}; | 
|  |  | 
|  | spdy::SpdyPingIR ping{511}; | 
|  | spdy::SpdyWindowUpdateIR window_update{1, 101}; | 
|  | spdy::SpdyDataIR data{3, "Some example data, ha ha!"}; | 
|  | spdy::SpdyRstStreamIR rst_stream{7, spdy::ERROR_CODE_REFUSED_STREAM}; | 
|  | spdy::SpdyGoAwayIR goaway{13, spdy::ERROR_CODE_ENHANCE_YOUR_CALM, | 
|  | "Consider taking some deep breaths."}; | 
|  | spdy::Http2HeaderBlock block; | 
|  | block[":method"] = "GET"; | 
|  | block[":path"] = "/example"; | 
|  | block[":authority"] = "example.com"; | 
|  | spdy::SpdyHeadersIR headers{17, std::move(block)}; | 
|  |  | 
|  | const std::string frame_sequence = | 
|  | absl::StrCat(absl::string_view(framer.SerializeFrame(ping)), | 
|  | absl::string_view(framer.SerializeFrame(window_update)), | 
|  | absl::string_view(framer.SerializeFrame(data)), | 
|  | absl::string_view(framer.SerializeFrame(rst_stream)), | 
|  | absl::string_view(framer.SerializeFrame(goaway)), | 
|  | absl::string_view(framer.SerializeFrame(headers))); | 
|  | absl::string_view frame_sequence_view = frame_sequence; | 
|  | EXPECT_THAT(frame_sequence, | 
|  | EqualsFrames({{spdy::SpdyFrameType::PING, absl::nullopt}, | 
|  | {spdy::SpdyFrameType::WINDOW_UPDATE, absl::nullopt}, | 
|  | {spdy::SpdyFrameType::DATA, 25}, | 
|  | {spdy::SpdyFrameType::RST_STREAM, absl::nullopt}, | 
|  | {spdy::SpdyFrameType::GOAWAY, 42}, | 
|  | {spdy::SpdyFrameType::HEADERS, 19}})); | 
|  | EXPECT_THAT(frame_sequence_view, | 
|  | EqualsFrames({{spdy::SpdyFrameType::PING, absl::nullopt}, | 
|  | {spdy::SpdyFrameType::WINDOW_UPDATE, absl::nullopt}, | 
|  | {spdy::SpdyFrameType::DATA, 25}, | 
|  | {spdy::SpdyFrameType::RST_STREAM, absl::nullopt}, | 
|  | {spdy::SpdyFrameType::GOAWAY, 42}, | 
|  | {spdy::SpdyFrameType::HEADERS, 19}})); | 
|  | EXPECT_THAT( | 
|  | frame_sequence, | 
|  | EqualsFrames( | 
|  | {spdy::SpdyFrameType::PING, spdy::SpdyFrameType::WINDOW_UPDATE, | 
|  | spdy::SpdyFrameType::DATA, spdy::SpdyFrameType::RST_STREAM, | 
|  | spdy::SpdyFrameType::GOAWAY, spdy::SpdyFrameType::HEADERS})); | 
|  | EXPECT_THAT( | 
|  | frame_sequence_view, | 
|  | EqualsFrames( | 
|  | {spdy::SpdyFrameType::PING, spdy::SpdyFrameType::WINDOW_UPDATE, | 
|  | spdy::SpdyFrameType::DATA, spdy::SpdyFrameType::RST_STREAM, | 
|  | spdy::SpdyFrameType::GOAWAY, spdy::SpdyFrameType::HEADERS})); | 
|  |  | 
|  | // If the final frame type is removed the expectation fails, as there are | 
|  | // bytes left to read. | 
|  | EXPECT_THAT( | 
|  | frame_sequence, | 
|  | testing::Not(EqualsFrames( | 
|  | {spdy::SpdyFrameType::PING, spdy::SpdyFrameType::WINDOW_UPDATE, | 
|  | spdy::SpdyFrameType::DATA, spdy::SpdyFrameType::RST_STREAM, | 
|  | spdy::SpdyFrameType::GOAWAY}))); | 
|  | EXPECT_THAT( | 
|  | frame_sequence_view, | 
|  | testing::Not(EqualsFrames( | 
|  | {spdy::SpdyFrameType::PING, spdy::SpdyFrameType::WINDOW_UPDATE, | 
|  | spdy::SpdyFrameType::DATA, spdy::SpdyFrameType::RST_STREAM, | 
|  | spdy::SpdyFrameType::GOAWAY}))); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  | }  // namespace test | 
|  | }  // namespace adapter | 
|  | }  // namespace http2 |