Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(129)

Side by Side Diff: net/spdy/buffered_spdy_framer_unittest.cc

Issue 2686613002: Cleanup control_frame_fields_ if coalescer rejected the headers. (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/spdy/buffered_spdy_framer.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/spdy/buffered_spdy_framer.h" 5 #include "net/spdy/buffered_spdy_framer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 altsvc_stream_id_ = stream_id; 120 altsvc_stream_id_ = stream_id;
121 origin.CopyToString(&altsvc_origin_); 121 origin.CopyToString(&altsvc_origin_);
122 altsvc_vector_ = altsvc_vector; 122 altsvc_vector_ = altsvc_vector;
123 } 123 }
124 124
125 bool OnUnknownFrame(SpdyStreamId stream_id, uint8_t frame_type) override { 125 bool OnUnknownFrame(SpdyStreamId stream_id, uint8_t frame_type) override {
126 return true; 126 return true;
127 } 127 }
128 128
129 // Convenience function which runs a framer simulation with particular input. 129 // Convenience function which runs a framer simulation with particular input.
130 void SimulateInFramer(const unsigned char* input, size_t size) { 130 void SimulateInFramer(const SpdySerializedFrame& frame) {
Maks Orlovich 2017/02/07 18:59:48 This could/should arguably be a separate cleanup C
Bence 2017/02/07 20:01:17 I really do not mind doing multiple things in the
131 const char* input_ptr = frame.data();
132 size_t size = frame.size();
Bence 2017/02/07 20:01:17 No need for named variable |size| which is only us
Maks Orlovich 2017/02/07 20:40:38 Done.
131 buffered_spdy_framer_.set_visitor(this); 133 buffered_spdy_framer_.set_visitor(this);
132 size_t input_remaining = size; 134 size_t input_remaining = size;
133 const char* input_ptr = reinterpret_cast<const char*>(input);
134 while (input_remaining > 0 && 135 while (input_remaining > 0 &&
135 buffered_spdy_framer_.spdy_framer_error() == 136 buffered_spdy_framer_.spdy_framer_error() ==
136 SpdyFramer::SPDY_NO_ERROR) { 137 SpdyFramer::SPDY_NO_ERROR) {
137 // To make the tests more interesting, we feed random (amd small) chunks 138 // To make the tests more interesting, we feed random (amd small) chunks
138 // into the framer. This simulates getting strange-sized reads from 139 // into the framer. This simulates getting strange-sized reads from
139 // the socket. 140 // the socket.
140 const size_t kMaxReadSize = 32; 141 const size_t kMaxReadSize = 32;
141 size_t bytes_read = 142 size_t bytes_read =
142 (rand() % std::min(input_remaining, kMaxReadSize)) + 1; 143 (rand() % std::min(input_remaining, kMaxReadSize)) + 1;
143 size_t bytes_processed = 144 size_t bytes_processed =
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 class BufferedSpdyFramerTest : public PlatformTest {}; 181 class BufferedSpdyFramerTest : public PlatformTest {};
181 182
182 TEST_F(BufferedSpdyFramerTest, OnSetting) { 183 TEST_F(BufferedSpdyFramerTest, OnSetting) {
183 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); 184 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
184 SpdySettingsIR settings_ir; 185 SpdySettingsIR settings_ir;
185 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 2); 186 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 2);
186 settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, 3); 187 settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, 3);
187 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir)); 188 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir));
188 TestBufferedSpdyVisitor visitor; 189 TestBufferedSpdyVisitor visitor;
189 190
190 visitor.SimulateInFramer( 191 visitor.SimulateInFramer(control_frame);
191 reinterpret_cast<unsigned char*>(control_frame.data()),
192 control_frame.size());
193 EXPECT_EQ(0, visitor.error_count_); 192 EXPECT_EQ(0, visitor.error_count_);
194 EXPECT_EQ(2, visitor.setting_count_); 193 EXPECT_EQ(2, visitor.setting_count_);
195 } 194 }
196 195
197 TEST_F(BufferedSpdyFramerTest, HeaderListTooLarge) { 196 TEST_F(BufferedSpdyFramerTest, HeaderListTooLarge) {
198 SpdyHeaderBlock headers; 197 SpdyHeaderBlock headers;
199 std::string long_header_value(256 * 1024, 'x'); 198 std::string long_header_value(256 * 1024, 'x');
200 headers["foo"] = long_header_value; 199 headers["foo"] = long_header_value;
201 BufferedSpdyFramer framer; 200 BufferedSpdyFramer framer;
202 std::unique_ptr<SpdySerializedFrame> control_frame( 201 std::unique_ptr<SpdySerializedFrame> control_frame(
203 framer.CreateHeaders(1, // stream_id 202 framer.CreateHeaders(1, // stream_id
204 CONTROL_FLAG_NONE, 203 CONTROL_FLAG_NONE,
205 255, // weight 204 255, // weight
206 std::move(headers))); 205 std::move(headers)));
207 EXPECT_TRUE(control_frame); 206 EXPECT_TRUE(control_frame);
208 207
209 TestBufferedSpdyVisitor visitor; 208 TestBufferedSpdyVisitor visitor;
210 visitor.SimulateInFramer( 209 visitor.SimulateInFramer(*control_frame);
211 reinterpret_cast<unsigned char*>(control_frame.get()->data()),
212 control_frame.get()->size());
213 210
214 EXPECT_EQ(1, visitor.error_count_); 211 EXPECT_EQ(1, visitor.error_count_);
215 EXPECT_EQ(0, visitor.headers_frame_count_); 212 EXPECT_EQ(0, visitor.headers_frame_count_);
216 EXPECT_EQ(0, visitor.push_promise_frame_count_); 213 EXPECT_EQ(0, visitor.push_promise_frame_count_);
217 EXPECT_EQ(SpdyHeaderBlock(), visitor.headers_); 214 EXPECT_EQ(SpdyHeaderBlock(), visitor.headers_);
218 } 215 }
219 216
217 TEST_F(BufferedSpdyFramerTest, ValidHeadersAfterInvalidHeaders) {
218 SpdyHeaderBlock headers;
219 headers["invalid"] = "\r\n\r\n";
220
221 SpdyHeaderBlock headers2;
222 headers["alpha"] = "beta";
223
224 SpdyTestUtil spdy_test_util;
225 SpdySerializedFrame headers_frame(
226 spdy_test_util.ConstructSpdyReply(1, std::move(headers)));
227 SpdySerializedFrame headers_frame2(
228 spdy_test_util.ConstructSpdyReply(2, std::move(headers2)));
229
230 TestBufferedSpdyVisitor visitor;
231 visitor.SimulateInFramer(headers_frame);
232 EXPECT_EQ(1, visitor.error_count_);
233 EXPECT_EQ(0, visitor.headers_frame_count_);
234
235 visitor.SimulateInFramer(headers_frame2);
236 EXPECT_EQ(1, visitor.error_count_);
237 EXPECT_EQ(1, visitor.headers_frame_count_);
238 }
239
220 TEST_F(BufferedSpdyFramerTest, ReadHeadersHeaderBlock) { 240 TEST_F(BufferedSpdyFramerTest, ReadHeadersHeaderBlock) {
221 SpdyHeaderBlock headers; 241 SpdyHeaderBlock headers;
222 headers["alpha"] = "beta"; 242 headers["alpha"] = "beta";
223 headers["gamma"] = "delta"; 243 headers["gamma"] = "delta";
224 BufferedSpdyFramer framer; 244 BufferedSpdyFramer framer;
225 std::unique_ptr<SpdySerializedFrame> control_frame( 245 std::unique_ptr<SpdySerializedFrame> control_frame(
226 framer.CreateHeaders(1, // stream_id 246 framer.CreateHeaders(1, // stream_id
227 CONTROL_FLAG_NONE, 247 CONTROL_FLAG_NONE,
228 255, // weight 248 255, // weight
229 headers.Clone())); 249 headers.Clone()));
230 EXPECT_TRUE(control_frame.get() != NULL); 250 EXPECT_TRUE(control_frame.get() != NULL);
231 251
232 TestBufferedSpdyVisitor visitor; 252 TestBufferedSpdyVisitor visitor;
233 visitor.SimulateInFramer( 253 visitor.SimulateInFramer(*control_frame);
234 reinterpret_cast<unsigned char*>(control_frame.get()->data()),
235 control_frame.get()->size());
236 EXPECT_EQ(0, visitor.error_count_); 254 EXPECT_EQ(0, visitor.error_count_);
237 EXPECT_EQ(1, visitor.headers_frame_count_); 255 EXPECT_EQ(1, visitor.headers_frame_count_);
238 EXPECT_EQ(0, visitor.push_promise_frame_count_); 256 EXPECT_EQ(0, visitor.push_promise_frame_count_);
239 EXPECT_EQ(headers, visitor.headers_); 257 EXPECT_EQ(headers, visitor.headers_);
240 } 258 }
241 259
242 TEST_F(BufferedSpdyFramerTest, ReadPushPromiseHeaderBlock) { 260 TEST_F(BufferedSpdyFramerTest, ReadPushPromiseHeaderBlock) {
243 SpdyHeaderBlock headers; 261 SpdyHeaderBlock headers;
244 headers["alpha"] = "beta"; 262 headers["alpha"] = "beta";
245 headers["gamma"] = "delta"; 263 headers["gamma"] = "delta";
246 BufferedSpdyFramer framer; 264 BufferedSpdyFramer framer;
247 std::unique_ptr<SpdySerializedFrame> control_frame( 265 std::unique_ptr<SpdySerializedFrame> control_frame(
248 framer.CreatePushPromise(1, 2, headers.Clone())); 266 framer.CreatePushPromise(1, 2, headers.Clone()));
249 EXPECT_TRUE(control_frame.get() != NULL); 267 EXPECT_TRUE(control_frame.get() != NULL);
250 268
251 TestBufferedSpdyVisitor visitor; 269 TestBufferedSpdyVisitor visitor;
252 visitor.SimulateInFramer( 270 visitor.SimulateInFramer(*control_frame);
253 reinterpret_cast<unsigned char*>(control_frame.get()->data()),
254 control_frame.get()->size());
255 EXPECT_EQ(0, visitor.error_count_); 271 EXPECT_EQ(0, visitor.error_count_);
256 EXPECT_EQ(0, visitor.headers_frame_count_); 272 EXPECT_EQ(0, visitor.headers_frame_count_);
257 EXPECT_EQ(1, visitor.push_promise_frame_count_); 273 EXPECT_EQ(1, visitor.push_promise_frame_count_);
258 EXPECT_EQ(headers, visitor.headers_); 274 EXPECT_EQ(headers, visitor.headers_);
259 EXPECT_EQ(1u, visitor.header_stream_id_); 275 EXPECT_EQ(1u, visitor.header_stream_id_);
260 EXPECT_EQ(2u, visitor.promised_stream_id_); 276 EXPECT_EQ(2u, visitor.promised_stream_id_);
261 } 277 }
262 278
263 TEST_F(BufferedSpdyFramerTest, GoAwayDebugData) { 279 TEST_F(BufferedSpdyFramerTest, GoAwayDebugData) {
264 BufferedSpdyFramer framer; 280 BufferedSpdyFramer framer;
265 std::unique_ptr<SpdySerializedFrame> goaway_frame( 281 std::unique_ptr<SpdySerializedFrame> goaway_frame(
266 framer.CreateGoAway(2u, ERROR_CODE_FRAME_SIZE_ERROR, "foo")); 282 framer.CreateGoAway(2u, ERROR_CODE_FRAME_SIZE_ERROR, "foo"));
267 283
268 TestBufferedSpdyVisitor visitor; 284 TestBufferedSpdyVisitor visitor;
269 visitor.SimulateInFramer( 285 visitor.SimulateInFramer(*goaway_frame);
270 reinterpret_cast<unsigned char*>(goaway_frame.get()->data()),
271 goaway_frame.get()->size());
272 EXPECT_EQ(0, visitor.error_count_); 286 EXPECT_EQ(0, visitor.error_count_);
273 EXPECT_EQ(1, visitor.goaway_count_); 287 EXPECT_EQ(1, visitor.goaway_count_);
274 EXPECT_EQ(2u, visitor.goaway_last_accepted_stream_id_); 288 EXPECT_EQ(2u, visitor.goaway_last_accepted_stream_id_);
275 EXPECT_EQ(ERROR_CODE_FRAME_SIZE_ERROR, visitor.goaway_error_code_); 289 EXPECT_EQ(ERROR_CODE_FRAME_SIZE_ERROR, visitor.goaway_error_code_);
276 EXPECT_EQ("foo", visitor.goaway_debug_data_); 290 EXPECT_EQ("foo", visitor.goaway_debug_data_);
277 } 291 }
278 292
279 TEST_F(BufferedSpdyFramerTest, OnAltSvc) { 293 TEST_F(BufferedSpdyFramerTest, OnAltSvc) {
280 const SpdyStreamId altsvc_stream_id(1); 294 const SpdyStreamId altsvc_stream_id(1);
281 const char altsvc_origin[] = "https://www.example.org"; 295 const char altsvc_origin[] = "https://www.example.org";
282 SpdyAltSvcIR altsvc_ir(altsvc_stream_id); 296 SpdyAltSvcIR altsvc_ir(altsvc_stream_id);
283 SpdyAltSvcWireFormat::AlternativeService alternative_service( 297 SpdyAltSvcWireFormat::AlternativeService alternative_service(
284 "quic", "alternative.example.org", 443, 86400, 298 "quic", "alternative.example.org", 443, 86400,
285 SpdyAltSvcWireFormat::VersionVector()); 299 SpdyAltSvcWireFormat::VersionVector());
286 altsvc_ir.add_altsvc(alternative_service); 300 altsvc_ir.add_altsvc(alternative_service);
287 altsvc_ir.set_origin(altsvc_origin); 301 altsvc_ir.set_origin(altsvc_origin);
288 BufferedSpdyFramer framer; 302 BufferedSpdyFramer framer;
289 SpdySerializedFrame altsvc_frame(framer.SerializeFrame(altsvc_ir)); 303 SpdySerializedFrame altsvc_frame(framer.SerializeFrame(altsvc_ir));
290 304
291 TestBufferedSpdyVisitor visitor; 305 TestBufferedSpdyVisitor visitor;
292 visitor.SimulateInFramer( 306 visitor.SimulateInFramer(altsvc_frame);
293 reinterpret_cast<unsigned char*>(altsvc_frame.data()),
294 altsvc_frame.size());
295 EXPECT_EQ(0, visitor.error_count_); 307 EXPECT_EQ(0, visitor.error_count_);
296 EXPECT_EQ(1, visitor.altsvc_count_); 308 EXPECT_EQ(1, visitor.altsvc_count_);
297 EXPECT_EQ(altsvc_stream_id, visitor.altsvc_stream_id_); 309 EXPECT_EQ(altsvc_stream_id, visitor.altsvc_stream_id_);
298 EXPECT_EQ(altsvc_origin, visitor.altsvc_origin_); 310 EXPECT_EQ(altsvc_origin, visitor.altsvc_origin_);
299 ASSERT_EQ(1u, visitor.altsvc_vector_.size()); 311 ASSERT_EQ(1u, visitor.altsvc_vector_.size());
300 EXPECT_EQ(alternative_service, visitor.altsvc_vector_[0]); 312 EXPECT_EQ(alternative_service, visitor.altsvc_vector_[0]);
301 } 313 }
302 314
303 } // namespace net 315 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/buffered_spdy_framer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698