blob: 0de7b28ff6a1826202fff58febcff6e9bbb74683 [file] [log] [blame]
QUICHE team637502f2021-03-23 08:03:48 -07001#include "http2/adapter/test_utils.h"
2
QUICHE teamcff6df52021-03-29 11:54:24 -07003#include "common/platform/api/quiche_test.h"
QUICHE team637502f2021-03-23 08:03:48 -07004#include "spdy/core/spdy_framer.h"
5
6namespace http2 {
7namespace adapter {
8namespace test {
9namespace {
10
11using spdy::SpdyFramer;
12
QUICHE teamdc70c8f2021-04-20 12:24:03 -070013TEST(EqualsFrames, Empty) {
14 EXPECT_THAT("", EqualsFrames(std::vector<spdy::SpdyFrameType>{}));
QUICHE team637502f2021-03-23 08:03:48 -070015}
16
QUICHE teamdc70c8f2021-04-20 12:24:03 -070017TEST(EqualsFrames, SingleFrameWithLength) {
QUICHE team637502f2021-03-23 08:03:48 -070018 SpdyFramer framer{SpdyFramer::ENABLE_COMPRESSION};
19
20 spdy::SpdyPingIR ping{511};
21 EXPECT_THAT(framer.SerializeFrame(ping),
QUICHE teamdc70c8f2021-04-20 12:24:03 -070022 EqualsFrames({{spdy::SpdyFrameType::PING, 8}}));
QUICHE team637502f2021-03-23 08:03:48 -070023
24 spdy::SpdyWindowUpdateIR window_update{1, 101};
25 EXPECT_THAT(framer.SerializeFrame(window_update),
QUICHE teamdc70c8f2021-04-20 12:24:03 -070026 EqualsFrames({{spdy::SpdyFrameType::WINDOW_UPDATE, 4}}));
QUICHE team637502f2021-03-23 08:03:48 -070027
28 spdy::SpdyDataIR data{3, "Some example data, ha ha!"};
29 EXPECT_THAT(framer.SerializeFrame(data),
QUICHE teamdc70c8f2021-04-20 12:24:03 -070030 EqualsFrames({{spdy::SpdyFrameType::DATA, 25}}));
QUICHE team637502f2021-03-23 08:03:48 -070031}
32
QUICHE teamdc70c8f2021-04-20 12:24:03 -070033TEST(EqualsFrames, SingleFrameWithoutLength) {
QUICHE team637502f2021-03-23 08:03:48 -070034 SpdyFramer framer{SpdyFramer::ENABLE_COMPRESSION};
35
36 spdy::SpdyRstStreamIR rst_stream{7, spdy::ERROR_CODE_REFUSED_STREAM};
QUICHE teamdc70c8f2021-04-20 12:24:03 -070037 EXPECT_THAT(framer.SerializeFrame(rst_stream),
38 EqualsFrames({{spdy::SpdyFrameType::RST_STREAM, absl::nullopt}}));
QUICHE team637502f2021-03-23 08:03:48 -070039
40 spdy::SpdyGoAwayIR goaway{13, spdy::ERROR_CODE_ENHANCE_YOUR_CALM,
41 "Consider taking some deep breaths."};
42 EXPECT_THAT(framer.SerializeFrame(goaway),
QUICHE teamdc70c8f2021-04-20 12:24:03 -070043 EqualsFrames({{spdy::SpdyFrameType::GOAWAY, absl::nullopt}}));
QUICHE team637502f2021-03-23 08:03:48 -070044
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 teamdc70c8f2021-04-20 12:24:03 -070051 EqualsFrames({{spdy::SpdyFrameType::HEADERS, absl::nullopt}}));
QUICHE team637502f2021-03-23 08:03:48 -070052}
53
QUICHE teamdc70c8f2021-04-20 12:24:03 -070054TEST(EqualsFrames, MultipleFrames) {
QUICHE team637502f2021-03-23 08:03:48 -070055 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 team38139f22021-03-24 07:49:45 -070069 const std::string frame_sequence =
QUICHE team637502f2021-03-23 08:03:48 -070070 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 team38139f22021-03-24 07:49:45 -070075 absl::string_view(framer.SerializeFrame(headers)));
QUICHE teamdc70c8f2021-04-20 12:24:03 -070076 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 team38139f22021-03-24 07:49:45 -070091 EXPECT_THAT(
92 frame_sequence,
QUICHE teamdc70c8f2021-04-20 12:24:03 -070093 EqualsFrames(
QUICHE team38139f22021-03-24 07:49:45 -070094 {spdy::SpdyFrameType::PING, spdy::SpdyFrameType::WINDOW_UPDATE,
95 spdy::SpdyFrameType::DATA, spdy::SpdyFrameType::RST_STREAM,
96 spdy::SpdyFrameType::GOAWAY, spdy::SpdyFrameType::HEADERS}));
QUICHE teamdc70c8f2021-04-20 12:24:03 -070097 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 team637502f2021-03-23 08:03:48 -0700118}
119
120} // namespace
121} // namespace test
122} // namespace adapter
123} // namespace http2