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