blob: 035cac9eceb051d534e10c867f6371eeaf44f9e3 [file] [log] [blame]
QUICHE team82dee2f2019-01-18 12:35:12 -05001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
QUICHE team5be974e2020-12-29 18:35:24 -05005#include "spdy/core/spdy_frame_reader.h"
QUICHE team82dee2f2019-01-18 12:35:12 -05006
7#include <cstdint>
8
vasilvv5504d2f2020-10-20 07:04:17 -07009#include "absl/base/macros.h"
QUICHE team5be974e2020-12-29 18:35:24 -050010#include "common/platform/api/quiche_test.h"
11#include "common/quiche_endian.h"
QUICHE team82dee2f2019-01-18 12:35:12 -050012
13namespace spdy {
14
15TEST(SpdyFrameReaderTest, ReadUInt16) {
16 // Frame data in network byte order.
17 const uint16_t kFrameData[] = {
bnc975c94c2020-10-17 05:08:58 -070018 quiche::QuicheEndian::HostToNet16(1),
19 quiche::QuicheEndian::HostToNet16(1 << 15),
QUICHE team82dee2f2019-01-18 12:35:12 -050020 };
21
22 SpdyFrameReader frame_reader(reinterpret_cast<const char*>(kFrameData),
23 sizeof(kFrameData));
24 EXPECT_FALSE(frame_reader.IsDoneReading());
25
26 uint16_t uint16_val;
27 EXPECT_TRUE(frame_reader.ReadUInt16(&uint16_val));
28 EXPECT_FALSE(frame_reader.IsDoneReading());
29 EXPECT_EQ(1, uint16_val);
30
31 EXPECT_TRUE(frame_reader.ReadUInt16(&uint16_val));
32 EXPECT_TRUE(frame_reader.IsDoneReading());
33 EXPECT_EQ(1 << 15, uint16_val);
34}
35
36TEST(SpdyFrameReaderTest, ReadUInt32) {
37 // Frame data in network byte order.
38 const uint32_t kFrameData[] = {
bnc975c94c2020-10-17 05:08:58 -070039 quiche::QuicheEndian::HostToNet32(1),
40 quiche::QuicheEndian::HostToNet32(0x80000000),
QUICHE team82dee2f2019-01-18 12:35:12 -050041 };
42
43 SpdyFrameReader frame_reader(reinterpret_cast<const char*>(kFrameData),
vasilvv5504d2f2020-10-20 07:04:17 -070044 ABSL_ARRAYSIZE(kFrameData) * sizeof(uint32_t));
QUICHE team82dee2f2019-01-18 12:35:12 -050045 EXPECT_FALSE(frame_reader.IsDoneReading());
46
47 uint32_t uint32_val;
48 EXPECT_TRUE(frame_reader.ReadUInt32(&uint32_val));
49 EXPECT_FALSE(frame_reader.IsDoneReading());
50 EXPECT_EQ(1u, uint32_val);
51
52 EXPECT_TRUE(frame_reader.ReadUInt32(&uint32_val));
53 EXPECT_TRUE(frame_reader.IsDoneReading());
54 EXPECT_EQ(1u << 31, uint32_val);
55}
56
57TEST(SpdyFrameReaderTest, ReadStringPiece16) {
58 // Frame data in network byte order.
59 const char kFrameData[] = {
60 0x00, 0x02, // uint16_t(2)
61 0x48, 0x69, // "Hi"
62 0x00, 0x10, // uint16_t(16)
63 0x54, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2c,
64 0x20, 0x31, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x33, // "Testing, 1, 2, 3"
65 };
66
vasilvv5504d2f2020-10-20 07:04:17 -070067 SpdyFrameReader frame_reader(kFrameData, ABSL_ARRAYSIZE(kFrameData));
QUICHE team82dee2f2019-01-18 12:35:12 -050068 EXPECT_FALSE(frame_reader.IsDoneReading());
69
vasilvvc8ccdb22020-10-12 16:42:34 -070070 absl::string_view stringpiece_val;
QUICHE team82dee2f2019-01-18 12:35:12 -050071 EXPECT_TRUE(frame_reader.ReadStringPiece16(&stringpiece_val));
72 EXPECT_FALSE(frame_reader.IsDoneReading());
73 EXPECT_EQ(0, stringpiece_val.compare("Hi"));
74
75 EXPECT_TRUE(frame_reader.ReadStringPiece16(&stringpiece_val));
76 EXPECT_TRUE(frame_reader.IsDoneReading());
77 EXPECT_EQ(0, stringpiece_val.compare("Testing, 1, 2, 3"));
78}
79
80TEST(SpdyFrameReaderTest, ReadStringPiece32) {
81 // Frame data in network byte order.
82 const char kFrameData[] = {
83 0x00, 0x00, 0x00, 0x03, // uint32_t(3)
84 0x66, 0x6f, 0x6f, // "foo"
85 0x00, 0x00, 0x00, 0x10, // uint32_t(16)
86 0x54, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2c,
87 0x20, 0x34, 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x36, // "Testing, 4, 5, 6"
88 };
89
vasilvv5504d2f2020-10-20 07:04:17 -070090 SpdyFrameReader frame_reader(kFrameData, ABSL_ARRAYSIZE(kFrameData));
QUICHE team82dee2f2019-01-18 12:35:12 -050091 EXPECT_FALSE(frame_reader.IsDoneReading());
92
vasilvvc8ccdb22020-10-12 16:42:34 -070093 absl::string_view stringpiece_val;
QUICHE team82dee2f2019-01-18 12:35:12 -050094 EXPECT_TRUE(frame_reader.ReadStringPiece32(&stringpiece_val));
95 EXPECT_FALSE(frame_reader.IsDoneReading());
96 EXPECT_EQ(0, stringpiece_val.compare("foo"));
97
98 EXPECT_TRUE(frame_reader.ReadStringPiece32(&stringpiece_val));
99 EXPECT_TRUE(frame_reader.IsDoneReading());
100 EXPECT_EQ(0, stringpiece_val.compare("Testing, 4, 5, 6"));
101}
102
103TEST(SpdyFrameReaderTest, ReadUInt16WithBufferTooSmall) {
104 // Frame data in network byte order.
105 const char kFrameData[] = {
106 0x00, // part of a uint16_t
107 };
108
vasilvv5504d2f2020-10-20 07:04:17 -0700109 SpdyFrameReader frame_reader(kFrameData, ABSL_ARRAYSIZE(kFrameData));
QUICHE team82dee2f2019-01-18 12:35:12 -0500110 EXPECT_FALSE(frame_reader.IsDoneReading());
111
112 uint16_t uint16_val;
113 EXPECT_FALSE(frame_reader.ReadUInt16(&uint16_val));
114}
115
116TEST(SpdyFrameReaderTest, ReadUInt32WithBufferTooSmall) {
117 // Frame data in network byte order.
118 const char kFrameData[] = {
119 0x00, 0x00, 0x00, // part of a uint32_t
120 };
121
vasilvv5504d2f2020-10-20 07:04:17 -0700122 SpdyFrameReader frame_reader(kFrameData, ABSL_ARRAYSIZE(kFrameData));
QUICHE team82dee2f2019-01-18 12:35:12 -0500123 EXPECT_FALSE(frame_reader.IsDoneReading());
124
125 uint32_t uint32_val;
126 EXPECT_FALSE(frame_reader.ReadUInt32(&uint32_val));
127
128 // Also make sure that trying to read a uint16_t, which technically could
129 // work, fails immediately due to previously encountered failed read.
130 uint16_t uint16_val;
131 EXPECT_FALSE(frame_reader.ReadUInt16(&uint16_val));
132}
133
134// Tests ReadStringPiece16() with a buffer too small to fit the entire string.
135TEST(SpdyFrameReaderTest, ReadStringPiece16WithBufferTooSmall) {
136 // Frame data in network byte order.
137 const char kFrameData[] = {
138 0x00, 0x03, // uint16_t(3)
139 0x48, 0x69, // "Hi"
140 };
141
vasilvv5504d2f2020-10-20 07:04:17 -0700142 SpdyFrameReader frame_reader(kFrameData, ABSL_ARRAYSIZE(kFrameData));
QUICHE team82dee2f2019-01-18 12:35:12 -0500143 EXPECT_FALSE(frame_reader.IsDoneReading());
144
vasilvvc8ccdb22020-10-12 16:42:34 -0700145 absl::string_view stringpiece_val;
QUICHE team82dee2f2019-01-18 12:35:12 -0500146 EXPECT_FALSE(frame_reader.ReadStringPiece16(&stringpiece_val));
147
148 // Also make sure that trying to read a uint16_t, which technically could
149 // work, fails immediately due to previously encountered failed read.
150 uint16_t uint16_val;
151 EXPECT_FALSE(frame_reader.ReadUInt16(&uint16_val));
152}
153
154// Tests ReadStringPiece16() with a buffer too small even to fit the length.
155TEST(SpdyFrameReaderTest, ReadStringPiece16WithBufferWayTooSmall) {
156 // Frame data in network byte order.
157 const char kFrameData[] = {
158 0x00, // part of a uint16_t
159 };
160
vasilvv5504d2f2020-10-20 07:04:17 -0700161 SpdyFrameReader frame_reader(kFrameData, ABSL_ARRAYSIZE(kFrameData));
QUICHE team82dee2f2019-01-18 12:35:12 -0500162 EXPECT_FALSE(frame_reader.IsDoneReading());
163
vasilvvc8ccdb22020-10-12 16:42:34 -0700164 absl::string_view stringpiece_val;
QUICHE team82dee2f2019-01-18 12:35:12 -0500165 EXPECT_FALSE(frame_reader.ReadStringPiece16(&stringpiece_val));
166
167 // Also make sure that trying to read a uint16_t, which technically could
168 // work, fails immediately due to previously encountered failed read.
169 uint16_t uint16_val;
170 EXPECT_FALSE(frame_reader.ReadUInt16(&uint16_val));
171}
172
173// Tests ReadStringPiece32() with a buffer too small to fit the entire string.
174TEST(SpdyFrameReaderTest, ReadStringPiece32WithBufferTooSmall) {
175 // Frame data in network byte order.
176 const char kFrameData[] = {
177 0x00, 0x00, 0x00, 0x03, // uint32_t(3)
178 0x48, 0x69, // "Hi"
179 };
180
vasilvv5504d2f2020-10-20 07:04:17 -0700181 SpdyFrameReader frame_reader(kFrameData, ABSL_ARRAYSIZE(kFrameData));
QUICHE team82dee2f2019-01-18 12:35:12 -0500182 EXPECT_FALSE(frame_reader.IsDoneReading());
183
vasilvvc8ccdb22020-10-12 16:42:34 -0700184 absl::string_view stringpiece_val;
QUICHE team82dee2f2019-01-18 12:35:12 -0500185 EXPECT_FALSE(frame_reader.ReadStringPiece32(&stringpiece_val));
186
187 // Also make sure that trying to read a uint16_t, which technically could
188 // work, fails immediately due to previously encountered failed read.
189 uint16_t uint16_val;
190 EXPECT_FALSE(frame_reader.ReadUInt16(&uint16_val));
191}
192
193// Tests ReadStringPiece32() with a buffer too small even to fit the length.
194TEST(SpdyFrameReaderTest, ReadStringPiece32WithBufferWayTooSmall) {
195 // Frame data in network byte order.
196 const char kFrameData[] = {
197 0x00, 0x00, 0x00, // part of a uint32_t
198 };
199
vasilvv5504d2f2020-10-20 07:04:17 -0700200 SpdyFrameReader frame_reader(kFrameData, ABSL_ARRAYSIZE(kFrameData));
QUICHE team82dee2f2019-01-18 12:35:12 -0500201 EXPECT_FALSE(frame_reader.IsDoneReading());
202
vasilvvc8ccdb22020-10-12 16:42:34 -0700203 absl::string_view stringpiece_val;
QUICHE team82dee2f2019-01-18 12:35:12 -0500204 EXPECT_FALSE(frame_reader.ReadStringPiece32(&stringpiece_val));
205
206 // Also make sure that trying to read a uint16_t, which technically could
207 // work, fails immediately due to previously encountered failed read.
208 uint16_t uint16_val;
209 EXPECT_FALSE(frame_reader.ReadUInt16(&uint16_val));
210}
211
212TEST(SpdyFrameReaderTest, ReadBytes) {
213 // Frame data in network byte order.
214 const char kFrameData[] = {
215 0x66, 0x6f, 0x6f, // "foo"
216 0x48, 0x69, // "Hi"
217 };
218
vasilvv5504d2f2020-10-20 07:04:17 -0700219 SpdyFrameReader frame_reader(kFrameData, ABSL_ARRAYSIZE(kFrameData));
QUICHE team82dee2f2019-01-18 12:35:12 -0500220 EXPECT_FALSE(frame_reader.IsDoneReading());
221
222 char dest1[3] = {};
vasilvv5504d2f2020-10-20 07:04:17 -0700223 EXPECT_TRUE(frame_reader.ReadBytes(&dest1, ABSL_ARRAYSIZE(dest1)));
QUICHE team82dee2f2019-01-18 12:35:12 -0500224 EXPECT_FALSE(frame_reader.IsDoneReading());
vasilvv5504d2f2020-10-20 07:04:17 -0700225 EXPECT_EQ("foo", absl::string_view(dest1, ABSL_ARRAYSIZE(dest1)));
QUICHE team82dee2f2019-01-18 12:35:12 -0500226
227 char dest2[2] = {};
vasilvv5504d2f2020-10-20 07:04:17 -0700228 EXPECT_TRUE(frame_reader.ReadBytes(&dest2, ABSL_ARRAYSIZE(dest2)));
QUICHE team82dee2f2019-01-18 12:35:12 -0500229 EXPECT_TRUE(frame_reader.IsDoneReading());
vasilvv5504d2f2020-10-20 07:04:17 -0700230 EXPECT_EQ("Hi", absl::string_view(dest2, ABSL_ARRAYSIZE(dest2)));
QUICHE team82dee2f2019-01-18 12:35:12 -0500231}
232
233TEST(SpdyFrameReaderTest, ReadBytesWithBufferTooSmall) {
234 // Frame data in network byte order.
235 const char kFrameData[] = {
236 0x01,
237 };
238
vasilvv5504d2f2020-10-20 07:04:17 -0700239 SpdyFrameReader frame_reader(kFrameData, ABSL_ARRAYSIZE(kFrameData));
QUICHE team82dee2f2019-01-18 12:35:12 -0500240 EXPECT_FALSE(frame_reader.IsDoneReading());
241
vasilvv5504d2f2020-10-20 07:04:17 -0700242 char dest[ABSL_ARRAYSIZE(kFrameData) + 2] = {};
243 EXPECT_FALSE(frame_reader.ReadBytes(&dest, ABSL_ARRAYSIZE(kFrameData) + 1));
QUICHE team82dee2f2019-01-18 12:35:12 -0500244 EXPECT_STREQ("", dest);
245}
246
247} // namespace spdy