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