blob: 92c8e9bc5b94a49e2b7c5b8ce2803ad031ca4a29 [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
5#include "net/third_party/quiche/src/spdy/core/spdy_frame_reader.h"
6
7#include <cstdint>
8
QUICHE team82dee2f2019-01-18 12:35:12 -05009#include "net/third_party/quiche/src/spdy/platform/api/spdy_arraysize.h"
10#include "net/third_party/quiche/src/spdy/platform/api/spdy_endianness_util.h"
danzh8f3a5762019-06-25 13:43:51 -070011#include "net/third_party/quiche/src/spdy/platform/api/spdy_test.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[] = {
18 SpdyHostToNet16(1),
19 SpdyHostToNet16(1 << 15),
20 };
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[] = {
39 SpdyHostToNet32(1),
40 SpdyHostToNet32(0x80000000),
41 };
42
43 SpdyFrameReader frame_reader(reinterpret_cast<const char*>(kFrameData),
44 SPDY_ARRAYSIZE(kFrameData) * sizeof(uint32_t));
45 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
67 SpdyFrameReader frame_reader(kFrameData, SPDY_ARRAYSIZE(kFrameData));
68 EXPECT_FALSE(frame_reader.IsDoneReading());
69
70 SpdyStringPiece stringpiece_val;
71 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
90 SpdyFrameReader frame_reader(kFrameData, SPDY_ARRAYSIZE(kFrameData));
91 EXPECT_FALSE(frame_reader.IsDoneReading());
92
93 SpdyStringPiece stringpiece_val;
94 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
109 SpdyFrameReader frame_reader(kFrameData, SPDY_ARRAYSIZE(kFrameData));
110 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
122 SpdyFrameReader frame_reader(kFrameData, SPDY_ARRAYSIZE(kFrameData));
123 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
142 SpdyFrameReader frame_reader(kFrameData, SPDY_ARRAYSIZE(kFrameData));
143 EXPECT_FALSE(frame_reader.IsDoneReading());
144
145 SpdyStringPiece stringpiece_val;
146 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
161 SpdyFrameReader frame_reader(kFrameData, SPDY_ARRAYSIZE(kFrameData));
162 EXPECT_FALSE(frame_reader.IsDoneReading());
163
164 SpdyStringPiece stringpiece_val;
165 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
181 SpdyFrameReader frame_reader(kFrameData, SPDY_ARRAYSIZE(kFrameData));
182 EXPECT_FALSE(frame_reader.IsDoneReading());
183
184 SpdyStringPiece stringpiece_val;
185 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
200 SpdyFrameReader frame_reader(kFrameData, SPDY_ARRAYSIZE(kFrameData));
201 EXPECT_FALSE(frame_reader.IsDoneReading());
202
203 SpdyStringPiece stringpiece_val;
204 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
219 SpdyFrameReader frame_reader(kFrameData, SPDY_ARRAYSIZE(kFrameData));
220 EXPECT_FALSE(frame_reader.IsDoneReading());
221
222 char dest1[3] = {};
223 EXPECT_TRUE(frame_reader.ReadBytes(&dest1, SPDY_ARRAYSIZE(dest1)));
224 EXPECT_FALSE(frame_reader.IsDoneReading());
225 EXPECT_EQ("foo", SpdyStringPiece(dest1, SPDY_ARRAYSIZE(dest1)));
226
227 char dest2[2] = {};
228 EXPECT_TRUE(frame_reader.ReadBytes(&dest2, SPDY_ARRAYSIZE(dest2)));
229 EXPECT_TRUE(frame_reader.IsDoneReading());
230 EXPECT_EQ("Hi", SpdyStringPiece(dest2, SPDY_ARRAYSIZE(dest2)));
231}
232
233TEST(SpdyFrameReaderTest, ReadBytesWithBufferTooSmall) {
234 // Frame data in network byte order.
235 const char kFrameData[] = {
236 0x01,
237 };
238
239 SpdyFrameReader frame_reader(kFrameData, SPDY_ARRAYSIZE(kFrameData));
240 EXPECT_FALSE(frame_reader.IsDoneReading());
241
242 char dest[SPDY_ARRAYSIZE(kFrameData) + 2] = {};
243 EXPECT_FALSE(frame_reader.ReadBytes(&dest, SPDY_ARRAYSIZE(kFrameData) + 1));
244 EXPECT_STREQ("", dest);
245}
246
247} // namespace spdy