QUICHE team | 637502f | 2021-03-23 08:03:48 -0700 | [diff] [blame] | 1 | #include "http2/adapter/test_utils.h" |
| 2 | |
QUICHE team | cff6df5 | 2021-03-29 11:54:24 -0700 | [diff] [blame] | 3 | #include "common/platform/api/quiche_test.h" |
QUICHE team | 637502f | 2021-03-23 08:03:48 -0700 | [diff] [blame] | 4 | #include "spdy/core/spdy_framer.h" |
| 5 | |
| 6 | namespace http2 { |
| 7 | namespace adapter { |
| 8 | namespace test { |
| 9 | namespace { |
| 10 | |
| 11 | using spdy::SpdyFramer; |
| 12 | |
QUICHE team | dc70c8f | 2021-04-20 12:24:03 -0700 | [diff] [blame] | 13 | TEST(EqualsFrames, Empty) { |
| 14 | EXPECT_THAT("", EqualsFrames(std::vector<spdy::SpdyFrameType>{})); |
QUICHE team | 637502f | 2021-03-23 08:03:48 -0700 | [diff] [blame] | 15 | } |
| 16 | |
QUICHE team | dc70c8f | 2021-04-20 12:24:03 -0700 | [diff] [blame] | 17 | TEST(EqualsFrames, SingleFrameWithLength) { |
QUICHE team | 637502f | 2021-03-23 08:03:48 -0700 | [diff] [blame] | 18 | SpdyFramer framer{SpdyFramer::ENABLE_COMPRESSION}; |
| 19 | |
| 20 | spdy::SpdyPingIR ping{511}; |
| 21 | EXPECT_THAT(framer.SerializeFrame(ping), |
QUICHE team | dc70c8f | 2021-04-20 12:24:03 -0700 | [diff] [blame] | 22 | EqualsFrames({{spdy::SpdyFrameType::PING, 8}})); |
QUICHE team | 637502f | 2021-03-23 08:03:48 -0700 | [diff] [blame] | 23 | |
| 24 | spdy::SpdyWindowUpdateIR window_update{1, 101}; |
| 25 | EXPECT_THAT(framer.SerializeFrame(window_update), |
QUICHE team | dc70c8f | 2021-04-20 12:24:03 -0700 | [diff] [blame] | 26 | EqualsFrames({{spdy::SpdyFrameType::WINDOW_UPDATE, 4}})); |
QUICHE team | 637502f | 2021-03-23 08:03:48 -0700 | [diff] [blame] | 27 | |
| 28 | spdy::SpdyDataIR data{3, "Some example data, ha ha!"}; |
| 29 | EXPECT_THAT(framer.SerializeFrame(data), |
QUICHE team | dc70c8f | 2021-04-20 12:24:03 -0700 | [diff] [blame] | 30 | EqualsFrames({{spdy::SpdyFrameType::DATA, 25}})); |
QUICHE team | 637502f | 2021-03-23 08:03:48 -0700 | [diff] [blame] | 31 | } |
| 32 | |
QUICHE team | dc70c8f | 2021-04-20 12:24:03 -0700 | [diff] [blame] | 33 | TEST(EqualsFrames, SingleFrameWithoutLength) { |
QUICHE team | 637502f | 2021-03-23 08:03:48 -0700 | [diff] [blame] | 34 | SpdyFramer framer{SpdyFramer::ENABLE_COMPRESSION}; |
| 35 | |
| 36 | spdy::SpdyRstStreamIR rst_stream{7, spdy::ERROR_CODE_REFUSED_STREAM}; |
QUICHE team | dc70c8f | 2021-04-20 12:24:03 -0700 | [diff] [blame] | 37 | EXPECT_THAT(framer.SerializeFrame(rst_stream), |
| 38 | EqualsFrames({{spdy::SpdyFrameType::RST_STREAM, absl::nullopt}})); |
QUICHE team | 637502f | 2021-03-23 08:03:48 -0700 | [diff] [blame] | 39 | |
| 40 | spdy::SpdyGoAwayIR goaway{13, spdy::ERROR_CODE_ENHANCE_YOUR_CALM, |
| 41 | "Consider taking some deep breaths."}; |
| 42 | EXPECT_THAT(framer.SerializeFrame(goaway), |
QUICHE team | dc70c8f | 2021-04-20 12:24:03 -0700 | [diff] [blame] | 43 | EqualsFrames({{spdy::SpdyFrameType::GOAWAY, absl::nullopt}})); |
QUICHE team | 637502f | 2021-03-23 08:03:48 -0700 | [diff] [blame] | 44 | |
| 45 | spdy::Http2HeaderBlock block; |
| 46 | block[":method"] = "GET"; |
| 47 | block[":path"] = "/example"; |
| 48 | block[":authority"] = "example.com"; |
| 49 | spdy::SpdyHeadersIR headers{17, std::move(block)}; |
| 50 | EXPECT_THAT(framer.SerializeFrame(headers), |
QUICHE team | dc70c8f | 2021-04-20 12:24:03 -0700 | [diff] [blame] | 51 | EqualsFrames({{spdy::SpdyFrameType::HEADERS, absl::nullopt}})); |
QUICHE team | 637502f | 2021-03-23 08:03:48 -0700 | [diff] [blame] | 52 | } |
| 53 | |
QUICHE team | dc70c8f | 2021-04-20 12:24:03 -0700 | [diff] [blame] | 54 | TEST(EqualsFrames, MultipleFrames) { |
QUICHE team | 637502f | 2021-03-23 08:03:48 -0700 | [diff] [blame] | 55 | SpdyFramer framer{SpdyFramer::ENABLE_COMPRESSION}; |
| 56 | |
| 57 | spdy::SpdyPingIR ping{511}; |
| 58 | spdy::SpdyWindowUpdateIR window_update{1, 101}; |
| 59 | spdy::SpdyDataIR data{3, "Some example data, ha ha!"}; |
| 60 | spdy::SpdyRstStreamIR rst_stream{7, spdy::ERROR_CODE_REFUSED_STREAM}; |
| 61 | spdy::SpdyGoAwayIR goaway{13, spdy::ERROR_CODE_ENHANCE_YOUR_CALM, |
| 62 | "Consider taking some deep breaths."}; |
| 63 | spdy::Http2HeaderBlock block; |
| 64 | block[":method"] = "GET"; |
| 65 | block[":path"] = "/example"; |
| 66 | block[":authority"] = "example.com"; |
| 67 | spdy::SpdyHeadersIR headers{17, std::move(block)}; |
| 68 | |
QUICHE team | 38139f2 | 2021-03-24 07:49:45 -0700 | [diff] [blame] | 69 | const std::string frame_sequence = |
QUICHE team | 637502f | 2021-03-23 08:03:48 -0700 | [diff] [blame] | 70 | absl::StrCat(absl::string_view(framer.SerializeFrame(ping)), |
| 71 | absl::string_view(framer.SerializeFrame(window_update)), |
| 72 | absl::string_view(framer.SerializeFrame(data)), |
| 73 | absl::string_view(framer.SerializeFrame(rst_stream)), |
| 74 | absl::string_view(framer.SerializeFrame(goaway)), |
QUICHE team | 38139f2 | 2021-03-24 07:49:45 -0700 | [diff] [blame] | 75 | absl::string_view(framer.SerializeFrame(headers))); |
QUICHE team | dc70c8f | 2021-04-20 12:24:03 -0700 | [diff] [blame] | 76 | absl::string_view frame_sequence_view = frame_sequence; |
| 77 | EXPECT_THAT(frame_sequence, |
| 78 | EqualsFrames({{spdy::SpdyFrameType::PING, absl::nullopt}, |
| 79 | {spdy::SpdyFrameType::WINDOW_UPDATE, absl::nullopt}, |
| 80 | {spdy::SpdyFrameType::DATA, 25}, |
| 81 | {spdy::SpdyFrameType::RST_STREAM, absl::nullopt}, |
| 82 | {spdy::SpdyFrameType::GOAWAY, 42}, |
| 83 | {spdy::SpdyFrameType::HEADERS, 19}})); |
| 84 | EXPECT_THAT(frame_sequence_view, |
| 85 | EqualsFrames({{spdy::SpdyFrameType::PING, absl::nullopt}, |
| 86 | {spdy::SpdyFrameType::WINDOW_UPDATE, absl::nullopt}, |
| 87 | {spdy::SpdyFrameType::DATA, 25}, |
| 88 | {spdy::SpdyFrameType::RST_STREAM, absl::nullopt}, |
| 89 | {spdy::SpdyFrameType::GOAWAY, 42}, |
| 90 | {spdy::SpdyFrameType::HEADERS, 19}})); |
QUICHE team | 38139f2 | 2021-03-24 07:49:45 -0700 | [diff] [blame] | 91 | EXPECT_THAT( |
| 92 | frame_sequence, |
QUICHE team | dc70c8f | 2021-04-20 12:24:03 -0700 | [diff] [blame] | 93 | EqualsFrames( |
QUICHE team | 38139f2 | 2021-03-24 07:49:45 -0700 | [diff] [blame] | 94 | {spdy::SpdyFrameType::PING, spdy::SpdyFrameType::WINDOW_UPDATE, |
| 95 | spdy::SpdyFrameType::DATA, spdy::SpdyFrameType::RST_STREAM, |
| 96 | spdy::SpdyFrameType::GOAWAY, spdy::SpdyFrameType::HEADERS})); |
QUICHE team | dc70c8f | 2021-04-20 12:24:03 -0700 | [diff] [blame] | 97 | EXPECT_THAT( |
| 98 | frame_sequence_view, |
| 99 | EqualsFrames( |
| 100 | {spdy::SpdyFrameType::PING, spdy::SpdyFrameType::WINDOW_UPDATE, |
| 101 | spdy::SpdyFrameType::DATA, spdy::SpdyFrameType::RST_STREAM, |
| 102 | spdy::SpdyFrameType::GOAWAY, spdy::SpdyFrameType::HEADERS})); |
| 103 | |
| 104 | // If the final frame type is removed the expectation fails, as there are |
| 105 | // bytes left to read. |
| 106 | EXPECT_THAT( |
| 107 | frame_sequence, |
| 108 | testing::Not(EqualsFrames( |
| 109 | {spdy::SpdyFrameType::PING, spdy::SpdyFrameType::WINDOW_UPDATE, |
| 110 | spdy::SpdyFrameType::DATA, spdy::SpdyFrameType::RST_STREAM, |
| 111 | spdy::SpdyFrameType::GOAWAY}))); |
| 112 | EXPECT_THAT( |
| 113 | frame_sequence_view, |
| 114 | testing::Not(EqualsFrames( |
| 115 | {spdy::SpdyFrameType::PING, spdy::SpdyFrameType::WINDOW_UPDATE, |
| 116 | spdy::SpdyFrameType::DATA, spdy::SpdyFrameType::RST_STREAM, |
| 117 | spdy::SpdyFrameType::GOAWAY}))); |
QUICHE team | 637502f | 2021-03-23 08:03:48 -0700 | [diff] [blame] | 118 | } |
| 119 | |
| 120 | } // namespace |
| 121 | } // namespace test |
| 122 | } // namespace adapter |
| 123 | } // namespace http2 |