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

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: Apply review feedback. 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) {
131 const char* input_ptr = frame.data();
132 size_t input_remaining = frame.size();
131 buffered_spdy_framer_.set_visitor(this); 133 buffered_spdy_framer_.set_visitor(this);
132 size_t input_remaining = size;
133 const char* input_ptr = reinterpret_cast<const char*>(input);
134 while (input_remaining > 0 && 134 while (input_remaining > 0 &&
135 buffered_spdy_framer_.spdy_framer_error() == 135 buffered_spdy_framer_.spdy_framer_error() ==
136 SpdyFramer::SPDY_NO_ERROR) { 136 SpdyFramer::SPDY_NO_ERROR) {
137 // To make the tests more interesting, we feed random (amd small) chunks 137 // To make the tests more interesting, we feed random (amd small) chunks
138 // into the framer. This simulates getting strange-sized reads from 138 // into the framer. This simulates getting strange-sized reads from
139 // the socket. 139 // the socket.
140 const size_t kMaxReadSize = 32; 140 const size_t kMaxReadSize = 32;
141 size_t bytes_read = 141 size_t bytes_read =
142 (rand() % std::min(input_remaining, kMaxReadSize)) + 1; 142 (rand() % std::min(input_remaining, kMaxReadSize)) + 1;
143 size_t bytes_processed = 143 size_t bytes_processed =
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 class BufferedSpdyFramerTest : public PlatformTest {}; 180 class BufferedSpdyFramerTest : public PlatformTest {};
181 181
182 TEST_F(BufferedSpdyFramerTest, OnSetting) { 182 TEST_F(BufferedSpdyFramerTest, OnSetting) {
183 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); 183 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
184 SpdySettingsIR settings_ir; 184 SpdySettingsIR settings_ir;
185 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 2); 185 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 2);
186 settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, 3); 186 settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, 3);
187 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir)); 187 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir));
188 TestBufferedSpdyVisitor visitor; 188 TestBufferedSpdyVisitor visitor;
189 189
190 visitor.SimulateInFramer( 190 visitor.SimulateInFramer(control_frame);
191 reinterpret_cast<unsigned char*>(control_frame.data()),
192 control_frame.size());
193 EXPECT_EQ(0, visitor.error_count_); 191 EXPECT_EQ(0, visitor.error_count_);
194 EXPECT_EQ(2, visitor.setting_count_); 192 EXPECT_EQ(2, visitor.setting_count_);
195 } 193 }
196 194
197 TEST_F(BufferedSpdyFramerTest, HeaderListTooLarge) { 195 TEST_F(BufferedSpdyFramerTest, HeaderListTooLarge) {
198 SpdyHeaderBlock headers; 196 SpdyHeaderBlock headers;
199 std::string long_header_value(256 * 1024, 'x'); 197 std::string long_header_value(256 * 1024, 'x');
200 headers["foo"] = long_header_value; 198 headers["foo"] = long_header_value;
201 BufferedSpdyFramer framer; 199 BufferedSpdyFramer framer;
202 std::unique_ptr<SpdySerializedFrame> control_frame( 200 std::unique_ptr<SpdySerializedFrame> control_frame(
203 framer.CreateHeaders(1, // stream_id 201 framer.CreateHeaders(1, // stream_id
204 CONTROL_FLAG_NONE, 202 CONTROL_FLAG_NONE,
205 255, // weight 203 255, // weight
206 std::move(headers))); 204 std::move(headers)));
207 EXPECT_TRUE(control_frame); 205 EXPECT_TRUE(control_frame);
208 206
209 TestBufferedSpdyVisitor visitor; 207 TestBufferedSpdyVisitor visitor;
210 visitor.SimulateInFramer( 208 visitor.SimulateInFramer(*control_frame);
211 reinterpret_cast<unsigned char*>(control_frame.get()->data()),
212 control_frame.get()->size());
213 209
214 EXPECT_EQ(1, visitor.error_count_); 210 EXPECT_EQ(1, visitor.error_count_);
215 EXPECT_EQ(0, visitor.headers_frame_count_); 211 EXPECT_EQ(0, visitor.headers_frame_count_);
216 EXPECT_EQ(0, visitor.push_promise_frame_count_); 212 EXPECT_EQ(0, visitor.push_promise_frame_count_);
217 EXPECT_EQ(SpdyHeaderBlock(), visitor.headers_); 213 EXPECT_EQ(SpdyHeaderBlock(), visitor.headers_);
218 } 214 }
219 215
216 TEST_F(BufferedSpdyFramerTest, ValidHeadersAfterInvalidHeaders) {
217 SpdyHeaderBlock headers;
218 headers["invalid"] = "\r\n\r\n";
219
220 SpdyHeaderBlock headers2;
221 headers["alpha"] = "beta";
222
223 SpdyTestUtil spdy_test_util;
224 SpdySerializedFrame headers_frame(
225 spdy_test_util.ConstructSpdyReply(1, std::move(headers)));
226 SpdySerializedFrame headers_frame2(
227 spdy_test_util.ConstructSpdyReply(2, std::move(headers2)));
228
229 TestBufferedSpdyVisitor visitor;
230 visitor.SimulateInFramer(headers_frame);
231 EXPECT_EQ(1, visitor.error_count_);
232 EXPECT_EQ(0, visitor.headers_frame_count_);
233
234 visitor.SimulateInFramer(headers_frame2);
235 EXPECT_EQ(1, visitor.error_count_);
236 EXPECT_EQ(1, visitor.headers_frame_count_);
237 }
238
220 TEST_F(BufferedSpdyFramerTest, ReadHeadersHeaderBlock) { 239 TEST_F(BufferedSpdyFramerTest, ReadHeadersHeaderBlock) {
221 SpdyHeaderBlock headers; 240 SpdyHeaderBlock headers;
222 headers["alpha"] = "beta"; 241 headers["alpha"] = "beta";
223 headers["gamma"] = "delta"; 242 headers["gamma"] = "delta";
224 BufferedSpdyFramer framer; 243 BufferedSpdyFramer framer;
225 std::unique_ptr<SpdySerializedFrame> control_frame( 244 std::unique_ptr<SpdySerializedFrame> control_frame(
226 framer.CreateHeaders(1, // stream_id 245 framer.CreateHeaders(1, // stream_id
227 CONTROL_FLAG_NONE, 246 CONTROL_FLAG_NONE,
228 255, // weight 247 255, // weight
229 headers.Clone())); 248 headers.Clone()));
230 EXPECT_TRUE(control_frame.get() != NULL); 249 EXPECT_TRUE(control_frame.get() != NULL);
231 250
232 TestBufferedSpdyVisitor visitor; 251 TestBufferedSpdyVisitor visitor;
233 visitor.SimulateInFramer( 252 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_); 253 EXPECT_EQ(0, visitor.error_count_);
237 EXPECT_EQ(1, visitor.headers_frame_count_); 254 EXPECT_EQ(1, visitor.headers_frame_count_);
238 EXPECT_EQ(0, visitor.push_promise_frame_count_); 255 EXPECT_EQ(0, visitor.push_promise_frame_count_);
239 EXPECT_EQ(headers, visitor.headers_); 256 EXPECT_EQ(headers, visitor.headers_);
240 } 257 }
241 258
242 TEST_F(BufferedSpdyFramerTest, ReadPushPromiseHeaderBlock) { 259 TEST_F(BufferedSpdyFramerTest, ReadPushPromiseHeaderBlock) {
243 SpdyHeaderBlock headers; 260 SpdyHeaderBlock headers;
244 headers["alpha"] = "beta"; 261 headers["alpha"] = "beta";
245 headers["gamma"] = "delta"; 262 headers["gamma"] = "delta";
246 BufferedSpdyFramer framer; 263 BufferedSpdyFramer framer;
247 std::unique_ptr<SpdySerializedFrame> control_frame( 264 std::unique_ptr<SpdySerializedFrame> control_frame(
248 framer.CreatePushPromise(1, 2, headers.Clone())); 265 framer.CreatePushPromise(1, 2, headers.Clone()));
249 EXPECT_TRUE(control_frame.get() != NULL); 266 EXPECT_TRUE(control_frame.get() != NULL);
250 267
251 TestBufferedSpdyVisitor visitor; 268 TestBufferedSpdyVisitor visitor;
252 visitor.SimulateInFramer( 269 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_); 270 EXPECT_EQ(0, visitor.error_count_);
256 EXPECT_EQ(0, visitor.headers_frame_count_); 271 EXPECT_EQ(0, visitor.headers_frame_count_);
257 EXPECT_EQ(1, visitor.push_promise_frame_count_); 272 EXPECT_EQ(1, visitor.push_promise_frame_count_);
258 EXPECT_EQ(headers, visitor.headers_); 273 EXPECT_EQ(headers, visitor.headers_);
259 EXPECT_EQ(1u, visitor.header_stream_id_); 274 EXPECT_EQ(1u, visitor.header_stream_id_);
260 EXPECT_EQ(2u, visitor.promised_stream_id_); 275 EXPECT_EQ(2u, visitor.promised_stream_id_);
261 } 276 }
262 277
263 TEST_F(BufferedSpdyFramerTest, GoAwayDebugData) { 278 TEST_F(BufferedSpdyFramerTest, GoAwayDebugData) {
264 BufferedSpdyFramer framer; 279 BufferedSpdyFramer framer;
265 std::unique_ptr<SpdySerializedFrame> goaway_frame( 280 std::unique_ptr<SpdySerializedFrame> goaway_frame(
266 framer.CreateGoAway(2u, ERROR_CODE_FRAME_SIZE_ERROR, "foo")); 281 framer.CreateGoAway(2u, ERROR_CODE_FRAME_SIZE_ERROR, "foo"));
267 282
268 TestBufferedSpdyVisitor visitor; 283 TestBufferedSpdyVisitor visitor;
269 visitor.SimulateInFramer( 284 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_); 285 EXPECT_EQ(0, visitor.error_count_);
273 EXPECT_EQ(1, visitor.goaway_count_); 286 EXPECT_EQ(1, visitor.goaway_count_);
274 EXPECT_EQ(2u, visitor.goaway_last_accepted_stream_id_); 287 EXPECT_EQ(2u, visitor.goaway_last_accepted_stream_id_);
275 EXPECT_EQ(ERROR_CODE_FRAME_SIZE_ERROR, visitor.goaway_error_code_); 288 EXPECT_EQ(ERROR_CODE_FRAME_SIZE_ERROR, visitor.goaway_error_code_);
276 EXPECT_EQ("foo", visitor.goaway_debug_data_); 289 EXPECT_EQ("foo", visitor.goaway_debug_data_);
277 } 290 }
278 291
279 TEST_F(BufferedSpdyFramerTest, OnAltSvc) { 292 TEST_F(BufferedSpdyFramerTest, OnAltSvc) {
280 const SpdyStreamId altsvc_stream_id(1); 293 const SpdyStreamId altsvc_stream_id(1);
281 const char altsvc_origin[] = "https://www.example.org"; 294 const char altsvc_origin[] = "https://www.example.org";
282 SpdyAltSvcIR altsvc_ir(altsvc_stream_id); 295 SpdyAltSvcIR altsvc_ir(altsvc_stream_id);
283 SpdyAltSvcWireFormat::AlternativeService alternative_service( 296 SpdyAltSvcWireFormat::AlternativeService alternative_service(
284 "quic", "alternative.example.org", 443, 86400, 297 "quic", "alternative.example.org", 443, 86400,
285 SpdyAltSvcWireFormat::VersionVector()); 298 SpdyAltSvcWireFormat::VersionVector());
286 altsvc_ir.add_altsvc(alternative_service); 299 altsvc_ir.add_altsvc(alternative_service);
287 altsvc_ir.set_origin(altsvc_origin); 300 altsvc_ir.set_origin(altsvc_origin);
288 BufferedSpdyFramer framer; 301 BufferedSpdyFramer framer;
289 SpdySerializedFrame altsvc_frame(framer.SerializeFrame(altsvc_ir)); 302 SpdySerializedFrame altsvc_frame(framer.SerializeFrame(altsvc_ir));
290 303
291 TestBufferedSpdyVisitor visitor; 304 TestBufferedSpdyVisitor visitor;
292 visitor.SimulateInFramer( 305 visitor.SimulateInFramer(altsvc_frame);
293 reinterpret_cast<unsigned char*>(altsvc_frame.data()),
294 altsvc_frame.size());
295 EXPECT_EQ(0, visitor.error_count_); 306 EXPECT_EQ(0, visitor.error_count_);
296 EXPECT_EQ(1, visitor.altsvc_count_); 307 EXPECT_EQ(1, visitor.altsvc_count_);
297 EXPECT_EQ(altsvc_stream_id, visitor.altsvc_stream_id_); 308 EXPECT_EQ(altsvc_stream_id, visitor.altsvc_stream_id_);
298 EXPECT_EQ(altsvc_origin, visitor.altsvc_origin_); 309 EXPECT_EQ(altsvc_origin, visitor.altsvc_origin_);
299 ASSERT_EQ(1u, visitor.altsvc_vector_.size()); 310 ASSERT_EQ(1u, visitor.altsvc_vector_.size());
300 EXPECT_EQ(alternative_service, visitor.altsvc_vector_[0]); 311 EXPECT_EQ(alternative_service, visitor.altsvc_vector_[0]);
301 } 312 }
302 313
303 } // namespace net 314 } // 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