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

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

Issue 1777163003: OnStreamEnd is now called instead of the sentinel call of OnStreamFrameData(stream_id, nullptr, 0, … (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@116266391
Patch Set: Merge spdy_framer_test.cc Created 4 years, 9 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
« net/quic/quic_headers_stream.cc ('K') | « net/spdy/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/spdy_framer.h" 5 #include "net/spdy/spdy_framer.h"
6 6
7 #include <stdlib.h> 7 #include <stdlib.h>
8 #include <string.h> 8 #include <string.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
11 #include <limits> 11 #include <limits>
12 #include <memory> 12 #include <memory>
13 #include <string> 13 #include <string>
14 #include <vector> 14 #include <vector>
15 15
16 #include "base/compiler_specific.h" 16 #include "base/compiler_specific.h"
17 #include "base/macros.h" 17 #include "base/macros.h"
18 #include "base/memory/scoped_ptr.h" 18 #include "base/memory/scoped_ptr.h"
19 #include "net/quic/quic_flags.h"
19 #include "net/spdy/hpack/hpack_constants.h" 20 #include "net/spdy/hpack/hpack_constants.h"
20 #include "net/spdy/mock_spdy_framer_visitor.h" 21 #include "net/spdy/mock_spdy_framer_visitor.h"
21 #include "net/spdy/spdy_frame_builder.h" 22 #include "net/spdy/spdy_frame_builder.h"
22 #include "net/spdy/spdy_frame_reader.h" 23 #include "net/spdy/spdy_frame_reader.h"
23 #include "net/spdy/spdy_protocol.h" 24 #include "net/spdy/spdy_protocol.h"
24 #include "net/spdy/spdy_test_utils.h" 25 #include "net/spdy/spdy_test_utils.h"
25 #include "testing/gmock/include/gmock/gmock.h" 26 #include "testing/gmock/include/gmock/gmock.h"
26 #include "testing/platform_test.h" 27 #include "testing/platform_test.h"
27 28
28 using base::StringPiece; 29 using base::StringPiece;
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 test_altsvc_ir_(0), 275 test_altsvc_ir_(0),
275 on_unknown_frame_result_(false), 276 on_unknown_frame_result_(false),
276 last_window_update_stream_(0), 277 last_window_update_stream_(0),
277 last_window_update_delta_(0), 278 last_window_update_delta_(0),
278 last_push_promise_stream_(0), 279 last_push_promise_stream_(0),
279 last_push_promise_promised_stream_(0), 280 last_push_promise_promised_stream_(0),
280 data_bytes_(0), 281 data_bytes_(0),
281 fin_frame_count_(0), 282 fin_frame_count_(0),
282 fin_opaque_data_(), 283 fin_opaque_data_(),
283 fin_flag_count_(0), 284 fin_flag_count_(0),
284 zero_length_data_frame_count_(0), 285 end_of_stream_count_(0),
285 control_frame_header_data_count_(0), 286 control_frame_header_data_count_(0),
286 zero_length_control_frame_header_data_count_(0), 287 zero_length_control_frame_header_data_count_(0),
287 data_frame_count_(0), 288 data_frame_count_(0),
288 last_payload_len_(0), 289 last_payload_len_(0),
289 last_frame_len_(0), 290 last_frame_len_(0),
290 header_buffer_(new char[kDefaultHeaderBufferSize]), 291 header_buffer_(new char[kDefaultHeaderBufferSize]),
291 header_buffer_length_(0), 292 header_buffer_length_(0),
292 header_buffer_size_(kDefaultHeaderBufferSize), 293 header_buffer_size_(kDefaultHeaderBufferSize),
293 header_stream_id_(static_cast<SpdyStreamId>(-1)), 294 header_stream_id_(static_cast<SpdyStreamId>(-1)),
294 header_control_type_(DATA), 295 header_control_type_(DATA),
(...skipping 10 matching lines...) Expand all
305 bool fin) override { 306 bool fin) override {
306 ++data_frame_count_; 307 ++data_frame_count_;
307 header_stream_id_ = stream_id; 308 header_stream_id_ = stream_id;
308 } 309 }
309 310
310 void OnStreamFrameData(SpdyStreamId stream_id, 311 void OnStreamFrameData(SpdyStreamId stream_id,
311 const char* data, 312 const char* data,
312 size_t len, 313 size_t len,
313 bool fin) override { 314 bool fin) override {
314 EXPECT_EQ(header_stream_id_, stream_id); 315 EXPECT_EQ(header_stream_id_, stream_id);
315 if (len == 0) { 316 if (!FLAGS_spdy_on_stream_end) {
316 ++zero_length_data_frame_count_; 317 if (len == 0) {
318 ++end_of_stream_count_;
319 }
317 } 320 }
318 321
319 data_bytes_ += len; 322 data_bytes_ += len;
320 LOG(INFO) << "OnStreamFrameData(" << stream_id << ", \""; 323 LOG(INFO) << "OnStreamFrameData(" << stream_id << ", \"";
321 if (len > 0) { 324 if (len > 0) {
322 for (size_t i = 0 ; i < len; ++i) { 325 for (size_t i = 0 ; i < len; ++i) {
323 LOG(INFO) << std::hex << (0xFF & static_cast<unsigned int>(data[i])) 326 LOG(INFO) << std::hex << (0xFF & static_cast<unsigned int>(data[i]))
324 << std::dec; 327 << std::dec;
325 } 328 }
326 } 329 }
327 LOG(INFO) << "\", " << len << ")\n"; 330 LOG(INFO) << "\", " << len << ")\n";
328 } 331 }
329 332
330 void OnStreamEnd(SpdyStreamId stream_id) override { 333 void OnStreamEnd(SpdyStreamId stream_id) override {
331 LOG(DFATAL) << "Unimplemented."; 334 LOG(INFO) << "OnStreamEnd(" << stream_id << ")";
335 EXPECT_EQ(header_stream_id_, stream_id);
336 ++end_of_stream_count_;
332 } 337 }
333 338
334 void OnStreamPadding(SpdyStreamId stream_id, size_t len) override { 339 void OnStreamPadding(SpdyStreamId stream_id, size_t len) override {
335 EXPECT_EQ(header_stream_id_, stream_id); 340 EXPECT_EQ(header_stream_id_, stream_id);
336 data_bytes_ += len; 341 data_bytes_ += len;
337 LOG(INFO) << "OnStreamPadding(" << stream_id << ", " << len << ")\n"; 342 LOG(INFO) << "OnStreamPadding(" << stream_id << ", " << len << ")\n";
338 } 343 }
339 344
340 SpdyHeadersHandlerInterface* OnHeaderFrameStart( 345 SpdyHeadersHandlerInterface* OnHeaderFrameStart(
341 SpdyStreamId stream_id) override { 346 SpdyStreamId stream_id) override {
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
580 SpdyAltSvcIR test_altsvc_ir_; 585 SpdyAltSvcIR test_altsvc_ir_;
581 bool on_unknown_frame_result_; 586 bool on_unknown_frame_result_;
582 SpdyStreamId last_window_update_stream_; 587 SpdyStreamId last_window_update_stream_;
583 int last_window_update_delta_; 588 int last_window_update_delta_;
584 SpdyStreamId last_push_promise_stream_; 589 SpdyStreamId last_push_promise_stream_;
585 SpdyStreamId last_push_promise_promised_stream_; 590 SpdyStreamId last_push_promise_promised_stream_;
586 int data_bytes_; 591 int data_bytes_;
587 int fin_frame_count_; // The count of RST_STREAM type frames received. 592 int fin_frame_count_; // The count of RST_STREAM type frames received.
588 string fin_opaque_data_; 593 string fin_opaque_data_;
589 int fin_flag_count_; // The count of frames with the FIN flag set. 594 int fin_flag_count_; // The count of frames with the FIN flag set.
590 int zero_length_data_frame_count_; // The count of zero-length data frames. 595 int end_of_stream_count_; // The count of zero-length data frames.
591 int control_frame_header_data_count_; // The count of chunks received. 596 int control_frame_header_data_count_; // The count of chunks received.
592 // The count of zero-length control frame header data chunks received. 597 // The count of zero-length control frame header data chunks received.
593 int zero_length_control_frame_header_data_count_; 598 int zero_length_control_frame_header_data_count_;
594 int data_frame_count_; 599 int data_frame_count_;
595 size_t last_payload_len_; 600 size_t last_payload_len_;
596 size_t last_frame_len_; 601 size_t last_frame_len_;
597 602
598 // Header block streaming state: 603 // Header block streaming state:
599 scoped_ptr<char[]> header_buffer_; 604 scoped_ptr<char[]> header_buffer_;
600 size_t header_buffer_length_; 605 size_t header_buffer_length_;
(...skipping 599 matching lines...) Expand 10 before | Expand all | Expand 10 after
1200 EXPECT_EQ(2, visitor.syn_frame_count_); 1205 EXPECT_EQ(2, visitor.syn_frame_count_);
1201 EXPECT_TRUE(visitor.fin_opaque_data_.empty()); 1206 EXPECT_TRUE(visitor.fin_opaque_data_.empty());
1202 } else { 1207 } else {
1203 EXPECT_EQ(3, visitor.headers_frame_count_); 1208 EXPECT_EQ(3, visitor.headers_frame_count_);
1204 EXPECT_EQ(0, visitor.syn_frame_count_); 1209 EXPECT_EQ(0, visitor.syn_frame_count_);
1205 StringPiece reset_stream = "RESETSTREAM"; 1210 StringPiece reset_stream = "RESETSTREAM";
1206 EXPECT_EQ(reset_stream, visitor.fin_opaque_data_); 1211 EXPECT_EQ(reset_stream, visitor.fin_opaque_data_);
1207 } 1212 }
1208 1213
1209 EXPECT_EQ(0, visitor.fin_flag_count_); 1214 EXPECT_EQ(0, visitor.fin_flag_count_);
1210 EXPECT_EQ(0, visitor.zero_length_data_frame_count_); 1215 EXPECT_EQ(0, visitor.end_of_stream_count_);
1211 EXPECT_EQ(4, visitor.data_frame_count_); 1216 EXPECT_EQ(4, visitor.data_frame_count_);
1212 visitor.fin_opaque_data_.clear(); 1217 visitor.fin_opaque_data_.clear();
1213 } 1218 }
1214 1219
1215 // Test that the FIN flag on a data frame signifies EOF. 1220 // Test that the FIN flag on a data frame signifies EOF.
1216 TEST_P(SpdyFramerTest, FinOnDataFrame) { 1221 TEST_P(SpdyFramerTest, FinOnDataFrame) {
1217 const unsigned char kV3Input[] = { 1222 const unsigned char kV3Input[] = {
1218 0x80, 0x03, 0x00, 0x01, // SYN Stream #1 1223 0x80, 0x03, 0x00, 0x01, // SYN Stream #1
1219 0x00, 0x00, 0x00, 0x1a, 1224 0x00, 0x00, 0x00, 0x1a,
1220 0x00, 0x00, 0x00, 0x01, 1225 0x00, 0x00, 0x00, 0x01,
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1282 EXPECT_EQ(1, visitor.syn_reply_frame_count_); 1287 EXPECT_EQ(1, visitor.syn_reply_frame_count_);
1283 EXPECT_EQ(0, visitor.headers_frame_count_); 1288 EXPECT_EQ(0, visitor.headers_frame_count_);
1284 } else { 1289 } else {
1285 EXPECT_EQ(0, visitor.syn_frame_count_); 1290 EXPECT_EQ(0, visitor.syn_frame_count_);
1286 EXPECT_EQ(0, visitor.syn_reply_frame_count_); 1291 EXPECT_EQ(0, visitor.syn_reply_frame_count_);
1287 EXPECT_EQ(2, visitor.headers_frame_count_); 1292 EXPECT_EQ(2, visitor.headers_frame_count_);
1288 } 1293 }
1289 EXPECT_EQ(16, visitor.data_bytes_); 1294 EXPECT_EQ(16, visitor.data_bytes_);
1290 EXPECT_EQ(0, visitor.fin_frame_count_); 1295 EXPECT_EQ(0, visitor.fin_frame_count_);
1291 EXPECT_EQ(0, visitor.fin_flag_count_); 1296 EXPECT_EQ(0, visitor.fin_flag_count_);
1292 EXPECT_EQ(1, visitor.zero_length_data_frame_count_); 1297 EXPECT_EQ(1, visitor.end_of_stream_count_);
1293 EXPECT_EQ(2, visitor.data_frame_count_); 1298 EXPECT_EQ(2, visitor.data_frame_count_);
1294 } 1299 }
1295 1300
1296 // Test that the FIN flag on a SYN reply frame signifies EOF. 1301 // Test that the FIN flag on a SYN reply frame signifies EOF.
1297 TEST_P(SpdyFramerTest, FinOnSynReplyFrame) { 1302 TEST_P(SpdyFramerTest, FinOnSynReplyFrame) {
1298 const unsigned char kV3Input[] = { 1303 const unsigned char kV3Input[] = {
1299 0x80, 0x03, 0x00, // SYN Stream #1 1304 0x80, 0x03, 0x00, // SYN Stream #1
1300 0x01, 0x00, 0x00, 0x00, 1305 0x01, 0x00, 0x00, 0x00,
1301 0x1a, 0x00, 0x00, 0x00, 1306 0x1a, 0x00, 0x00, 0x00,
1302 0x01, 0x00, 0x00, 0x00, 1307 0x01, 0x00, 0x00, 0x00,
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1341 EXPECT_EQ(1, visitor.syn_reply_frame_count_); 1346 EXPECT_EQ(1, visitor.syn_reply_frame_count_);
1342 EXPECT_EQ(0, visitor.headers_frame_count_); 1347 EXPECT_EQ(0, visitor.headers_frame_count_);
1343 } else { 1348 } else {
1344 EXPECT_EQ(0, visitor.syn_frame_count_); 1349 EXPECT_EQ(0, visitor.syn_frame_count_);
1345 EXPECT_EQ(0, visitor.syn_reply_frame_count_); 1350 EXPECT_EQ(0, visitor.syn_reply_frame_count_);
1346 EXPECT_EQ(2, visitor.headers_frame_count_); 1351 EXPECT_EQ(2, visitor.headers_frame_count_);
1347 } 1352 }
1348 EXPECT_EQ(0, visitor.data_bytes_); 1353 EXPECT_EQ(0, visitor.data_bytes_);
1349 EXPECT_EQ(0, visitor.fin_frame_count_); 1354 EXPECT_EQ(0, visitor.fin_frame_count_);
1350 EXPECT_EQ(1, visitor.fin_flag_count_); 1355 EXPECT_EQ(1, visitor.fin_flag_count_);
1351 EXPECT_EQ(1, visitor.zero_length_data_frame_count_); 1356 EXPECT_EQ(1, visitor.end_of_stream_count_);
1352 EXPECT_EQ(0, visitor.data_frame_count_); 1357 EXPECT_EQ(0, visitor.data_frame_count_);
1353 } 1358 }
1354 1359
1355 TEST_P(SpdyFramerTest, HeaderCompression) { 1360 TEST_P(SpdyFramerTest, HeaderCompression) {
1356 if (!IsSpdy3()) { 1361 if (!IsSpdy3()) {
1357 // Deflate compression doesn't apply to HPACK. 1362 // Deflate compression doesn't apply to HPACK.
1358 return; 1363 return;
1359 } 1364 }
1360 1365
1361 SpdyFramer send_framer(spdy_version_); 1366 SpdyFramer send_framer(spdy_version_);
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
1459 ASSERT_EQ(0, visitor.error_count_); 1464 ASSERT_EQ(0, visitor.error_count_);
1460 } 1465 }
1461 1466
1462 EXPECT_EQ(0, visitor.error_count_); 1467 EXPECT_EQ(0, visitor.error_count_);
1463 EXPECT_EQ(0, visitor.syn_frame_count_); 1468 EXPECT_EQ(0, visitor.syn_frame_count_);
1464 EXPECT_EQ(0, visitor.syn_reply_frame_count_); 1469 EXPECT_EQ(0, visitor.syn_reply_frame_count_);
1465 EXPECT_EQ(1, visitor.headers_frame_count_); 1470 EXPECT_EQ(1, visitor.headers_frame_count_);
1466 EXPECT_EQ(arraysize(bytes), static_cast<unsigned>(visitor.data_bytes_)); 1471 EXPECT_EQ(arraysize(bytes), static_cast<unsigned>(visitor.data_bytes_));
1467 EXPECT_EQ(0, visitor.fin_frame_count_); 1472 EXPECT_EQ(0, visitor.fin_frame_count_);
1468 EXPECT_EQ(0, visitor.fin_flag_count_); 1473 EXPECT_EQ(0, visitor.fin_flag_count_);
1469 EXPECT_EQ(1, visitor.zero_length_data_frame_count_); 1474 EXPECT_EQ(1, visitor.end_of_stream_count_);
1470 EXPECT_EQ(1, visitor.data_frame_count_); 1475 EXPECT_EQ(1, visitor.data_frame_count_);
1471 } 1476 }
1472 1477
1473 TEST_P(SpdyFramerTest, WindowUpdateFrame) { 1478 TEST_P(SpdyFramerTest, WindowUpdateFrame) {
1474 SpdyFramer framer(spdy_version_); 1479 SpdyFramer framer(spdy_version_);
1475 scoped_ptr<SpdyFrame> frame(framer.SerializeWindowUpdate( 1480 scoped_ptr<SpdyFrame> frame(framer.SerializeWindowUpdate(
1476 SpdyWindowUpdateIR(1, 0x12345678))); 1481 SpdyWindowUpdateIR(1, 0x12345678)));
1477 1482
1478 const char kDescription[] = "WINDOW_UPDATE frame, stream 1, delta 0x12345678"; 1483 const char kDescription[] = "WINDOW_UPDATE frame, stream 1, delta 0x12345678";
1479 const unsigned char kV3FrameData[] = { 1484 const unsigned char kV3FrameData[] = {
(...skipping 1709 matching lines...) Expand 10 before | Expand all | Expand 10 after
3189 visitor.SimulateInFramer( 3194 visitor.SimulateInFramer(
3190 reinterpret_cast<unsigned char*>(control_frame->data()), 3195 reinterpret_cast<unsigned char*>(control_frame->data()),
3191 control_frame->size()); 3196 control_frame->size());
3192 EXPECT_EQ(1, visitor.headers_frame_count_); 3197 EXPECT_EQ(1, visitor.headers_frame_count_);
3193 // control_frame_header_data_count_ depends on the random sequence 3198 // control_frame_header_data_count_ depends on the random sequence
3194 // produced by rand(), so adding, removing or running single tests 3199 // produced by rand(), so adding, removing or running single tests
3195 // alters this value. The best we can do is assert that it happens 3200 // alters this value. The best we can do is assert that it happens
3196 // at least twice. 3201 // at least twice.
3197 EXPECT_LE(2, visitor.control_frame_header_data_count_); 3202 EXPECT_LE(2, visitor.control_frame_header_data_count_);
3198 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); 3203 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_);
3199 EXPECT_EQ(0, visitor.zero_length_data_frame_count_); 3204 EXPECT_EQ(0, visitor.end_of_stream_count_);
3200 EXPECT_EQ(headers, visitor.headers_); 3205 EXPECT_EQ(headers, visitor.headers_);
3201 } 3206 }
3202 3207
3203 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlockWithHalfClose) { 3208 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlockWithHalfClose) {
3204 SpdyFramer framer(spdy_version_); 3209 SpdyFramer framer(spdy_version_);
3205 SpdyHeadersIR headers_ir(1); 3210 SpdyHeadersIR headers_ir(1);
3206 headers_ir.set_fin(true); 3211 headers_ir.set_fin(true);
3207 headers_ir.SetHeader("alpha", "beta"); 3212 headers_ir.SetHeader("alpha", "beta");
3208 headers_ir.SetHeader("gamma", "delta"); 3213 headers_ir.SetHeader("gamma", "delta");
3209 SpdyHeaderBlock headers = headers_ir.header_block(); 3214 SpdyHeaderBlock headers = headers_ir.header_block();
3210 scoped_ptr<SpdyFrame> control_frame(framer.SerializeHeaders(headers_ir)); 3215 scoped_ptr<SpdyFrame> control_frame(framer.SerializeHeaders(headers_ir));
3211 EXPECT_TRUE(control_frame.get() != NULL); 3216 EXPECT_TRUE(control_frame.get() != NULL);
3212 TestSpdyVisitor visitor(spdy_version_); 3217 TestSpdyVisitor visitor(spdy_version_);
3213 visitor.use_compression_ = true; 3218 visitor.use_compression_ = true;
3214 visitor.SimulateInFramer( 3219 visitor.SimulateInFramer(
3215 reinterpret_cast<unsigned char*>(control_frame->data()), 3220 reinterpret_cast<unsigned char*>(control_frame->data()),
3216 control_frame->size()); 3221 control_frame->size());
3217 EXPECT_EQ(1, visitor.headers_frame_count_); 3222 EXPECT_EQ(1, visitor.headers_frame_count_);
3218 // control_frame_header_data_count_ depends on the random sequence 3223 // control_frame_header_data_count_ depends on the random sequence
3219 // produced by rand(), so adding, removing or running single tests 3224 // produced by rand(), so adding, removing or running single tests
3220 // alters this value. The best we can do is assert that it happens 3225 // alters this value. The best we can do is assert that it happens
3221 // at least twice. 3226 // at least twice.
3222 EXPECT_LE(2, visitor.control_frame_header_data_count_); 3227 EXPECT_LE(2, visitor.control_frame_header_data_count_);
3223 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); 3228 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_);
3224 EXPECT_EQ(1, visitor.zero_length_data_frame_count_); 3229 EXPECT_EQ(1, visitor.end_of_stream_count_);
3225 EXPECT_EQ(headers, visitor.headers_); 3230 EXPECT_EQ(headers, visitor.headers_);
3226 } 3231 }
3227 3232
3228 TEST_P(SpdyFramerTest, ControlFrameAtMaxSizeLimit) { 3233 TEST_P(SpdyFramerTest, ControlFrameAtMaxSizeLimit) {
3229 if (!IsSpdy3()) { 3234 if (!IsSpdy3()) {
3230 // TODO(jgraettinger): This test setup doesn't work with HPACK. 3235 // TODO(jgraettinger): This test setup doesn't work with HPACK.
3231 return; 3236 return;
3232 } 3237 }
3233 3238
3234 // First find the size of the header value in order to just reach the control 3239 // First find the size of the header value in order to just reach the control
(...skipping 16 matching lines...) Expand all
3251 control_frame->size()); 3256 control_frame->size());
3252 3257
3253 TestSpdyVisitor visitor(spdy_version_); 3258 TestSpdyVisitor visitor(spdy_version_);
3254 visitor.SimulateInFramer( 3259 visitor.SimulateInFramer(
3255 reinterpret_cast<unsigned char*>(control_frame->data()), 3260 reinterpret_cast<unsigned char*>(control_frame->data()),
3256 control_frame->size()); 3261 control_frame->size());
3257 EXPECT_TRUE(visitor.header_buffer_valid_); 3262 EXPECT_TRUE(visitor.header_buffer_valid_);
3258 EXPECT_EQ(0, visitor.error_count_); 3263 EXPECT_EQ(0, visitor.error_count_);
3259 EXPECT_EQ(1, visitor.syn_frame_count_); 3264 EXPECT_EQ(1, visitor.syn_frame_count_);
3260 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); 3265 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_);
3261 EXPECT_EQ(0, visitor.zero_length_data_frame_count_); 3266 EXPECT_EQ(0, visitor.end_of_stream_count_);
3262 EXPECT_LT(kBigValueSize, visitor.header_buffer_length_); 3267 EXPECT_LT(kBigValueSize, visitor.header_buffer_length_);
3263 } 3268 }
3264 3269
3265 TEST_P(SpdyFramerTest, ControlFrameMaximumSize) { 3270 TEST_P(SpdyFramerTest, ControlFrameMaximumSize) {
3266 if (!IsSpdy3()) { 3271 if (!IsSpdy3()) {
3267 // TODO(jgraettinger): This test setup doesn't work with HPACK. 3272 // TODO(jgraettinger): This test setup doesn't work with HPACK.
3268 return; 3273 return;
3269 } 3274 }
3270 3275
3271 // First find the size of the header value in order to just reach the control 3276 // First find the size of the header value in order to just reach the control
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
3396 // 3401 //
3397 // control_frame_header_data_count_ depends on the random sequence 3402 // control_frame_header_data_count_ depends on the random sequence
3398 // produced by rand(), so adding, removing or running single tests 3403 // produced by rand(), so adding, removing or running single tests
3399 // alters this value. The best we can do is assert that it happens 3404 // alters this value. The best we can do is assert that it happens
3400 // at least kHeaderBufferChunks + 1. 3405 // at least kHeaderBufferChunks + 1.
3401 EXPECT_LE(kHeaderBufferChunks + 1, 3406 EXPECT_LE(kHeaderBufferChunks + 1,
3402 static_cast<unsigned>(visitor.control_frame_header_data_count_)); 3407 static_cast<unsigned>(visitor.control_frame_header_data_count_));
3403 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); 3408 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_);
3404 3409
3405 // The framer should not have sent half-close to the visitor. 3410 // The framer should not have sent half-close to the visitor.
3406 EXPECT_EQ(0, visitor.zero_length_data_frame_count_); 3411 EXPECT_EQ(0, visitor.end_of_stream_count_);
3407 } 3412 }
3408 3413
3409 TEST_P(SpdyFramerTest, DecompressCorruptHeaderBlock) { 3414 TEST_P(SpdyFramerTest, DecompressCorruptHeaderBlock) {
3410 if (!IsSpdy3()) { 3415 if (!IsSpdy3()) {
3411 // Deflate compression doesn't apply to HPACK. 3416 // Deflate compression doesn't apply to HPACK.
3412 return; 3417 return;
3413 } 3418 }
3414 3419
3415 SpdyFramer framer(spdy_version_); 3420 SpdyFramer framer(spdy_version_);
3416 framer.set_enable_compression(false); 3421 framer.set_enable_compression(false);
(...skipping 436 matching lines...) Expand 10 before | Expand all | Expand 10 after
3853 3858
3854 SpdyFramer framer(spdy_version_); 3859 SpdyFramer framer(spdy_version_);
3855 TestSpdyVisitor visitor(spdy_version_); 3860 TestSpdyVisitor visitor(spdy_version_);
3856 visitor.SimulateInFramer(kInput, sizeof(kInput)); 3861 visitor.SimulateInFramer(kInput, sizeof(kInput));
3857 3862
3858 EXPECT_EQ(0, visitor.error_count_); 3863 EXPECT_EQ(0, visitor.error_count_);
3859 EXPECT_EQ(1, visitor.headers_frame_count_); 3864 EXPECT_EQ(1, visitor.headers_frame_count_);
3860 EXPECT_EQ(2, visitor.continuation_count_); 3865 EXPECT_EQ(2, visitor.continuation_count_);
3861 EXPECT_EQ(1, visitor.fin_flag_count_); 3866 EXPECT_EQ(1, visitor.fin_flag_count_);
3862 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); 3867 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_);
3863 EXPECT_EQ(1, visitor.zero_length_data_frame_count_); 3868 EXPECT_EQ(1, visitor.end_of_stream_count_);
3864 3869
3865 EXPECT_THAT(visitor.headers_, 3870 EXPECT_THAT(visitor.headers_,
3866 testing::ElementsAre( 3871 testing::ElementsAre(
3867 testing::Pair("cookie", "foo=bar; baz=bing; "), 3872 testing::Pair("cookie", "foo=bar; baz=bing; "),
3868 testing::Pair("name", "value"))); 3873 testing::Pair("name", "value")));
3869 } 3874 }
3870 3875
3871 TEST_P(SpdyFramerTest, ReadPushPromiseWithContinuation) { 3876 TEST_P(SpdyFramerTest, ReadPushPromiseWithContinuation) {
3872 if (!IsHttp2()) { 3877 if (!IsHttp2()) {
3873 return; 3878 return;
(...skipping 29 matching lines...) Expand all
3903 3908
3904 SpdyFramer framer(spdy_version_); 3909 SpdyFramer framer(spdy_version_);
3905 TestSpdyVisitor visitor(spdy_version_); 3910 TestSpdyVisitor visitor(spdy_version_);
3906 visitor.SimulateInFramer(kInput, sizeof(kInput)); 3911 visitor.SimulateInFramer(kInput, sizeof(kInput));
3907 3912
3908 EXPECT_EQ(0, visitor.error_count_); 3913 EXPECT_EQ(0, visitor.error_count_);
3909 EXPECT_EQ(1u, visitor.last_push_promise_stream_); 3914 EXPECT_EQ(1u, visitor.last_push_promise_stream_);
3910 EXPECT_EQ(42u, visitor.last_push_promise_promised_stream_); 3915 EXPECT_EQ(42u, visitor.last_push_promise_promised_stream_);
3911 EXPECT_EQ(2, visitor.continuation_count_); 3916 EXPECT_EQ(2, visitor.continuation_count_);
3912 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); 3917 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_);
3913 EXPECT_EQ(0, visitor.zero_length_data_frame_count_); 3918 EXPECT_EQ(0, visitor.end_of_stream_count_);
3914 3919
3915 EXPECT_THAT(visitor.headers_, 3920 EXPECT_THAT(visitor.headers_,
3916 testing::ElementsAre( 3921 testing::ElementsAre(
3917 testing::Pair("cookie", "foo=bar; baz=bing; "), 3922 testing::Pair("cookie", "foo=bar; baz=bing; "),
3918 testing::Pair("name", "value"))); 3923 testing::Pair("name", "value")));
3919 } 3924 }
3920 3925
3921 TEST_P(SpdyFramerTest, ReadContinuationWithWrongStreamId) { 3926 TEST_P(SpdyFramerTest, ReadContinuationWithWrongStreamId) {
3922 if (!IsHttp2()) { 3927 if (!IsHttp2()) {
3923 return; 3928 return;
(...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after
4377 EXPECT_CALL(visitor, OnError(_)); 4382 EXPECT_CALL(visitor, OnError(_));
4378 framer.ProcessInput("HTTP/1.0", 8); 4383 framer.ProcessInput("HTTP/1.0", 8);
4379 EXPECT_TRUE(framer.probable_http_response()); 4384 EXPECT_TRUE(framer.probable_http_response());
4380 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 4385 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4381 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code()) 4386 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code())
4382 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4387 << SpdyFramer::ErrorCodeToString(framer.error_code());
4383 } 4388 }
4384 } 4389 }
4385 4390
4386 TEST_P(SpdyFramerTest, DataFrameFlagsV2V3) { 4391 TEST_P(SpdyFramerTest, DataFrameFlagsV2V3) {
4392 FLAGS_spdy_on_stream_end = true;
4393
4387 if (!IsSpdy3()) { 4394 if (!IsSpdy3()) {
4388 return; 4395 return;
4389 } 4396 }
4397
4398 uint8_t flags = 0;
4399 do {
4400 SCOPED_TRACE(testing::Message() << "Flags " << flags);
4401
4402 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4403 SpdyFramer framer(spdy_version_);
4404 framer.set_visitor(&visitor);
4405
4406 SpdyDataIR data_ir(1, "hello");
4407 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir));
4408 SetFrameFlags(frame.get(), flags, spdy_version_);
4409
4410 if (flags & ~DATA_FLAG_FIN) {
4411 EXPECT_CALL(visitor, OnError(_));
4412 } else {
4413 EXPECT_CALL(visitor, OnDataFrameHeader(1, 5, flags & DATA_FLAG_FIN));
4414 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 5, false));
4415 if (flags & DATA_FLAG_FIN) {
4416 EXPECT_CALL(visitor, OnStreamEnd(_));
4417 }
4418 }
4419
4420 framer.ProcessInput(frame->data(), frame->size());
4421 if (flags & ~DATA_FLAG_FIN) {
4422 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4423 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code())
4424 << SpdyFramer::ErrorCodeToString(framer.error_code());
4425 } else {
4426 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4427 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4428 << SpdyFramer::ErrorCodeToString(framer.error_code());
4429 }
4430 } while (++flags != 0);
4431 }
4432
4433 TEST_P(SpdyFramerTest, DataFrameFlagsV2V3disabled) {
4434 FLAGS_spdy_on_stream_end = false;
4435
4436 if (!IsSpdy3()) {
4437 return;
4438 }
4390 4439
4391 uint8_t flags = 0; 4440 uint8_t flags = 0;
4392 do { 4441 do {
4393 SCOPED_TRACE(testing::Message() << "Flags " << flags); 4442 SCOPED_TRACE(testing::Message() << "Flags " << flags);
4394 4443
4395 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4444 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4396 SpdyFramer framer(spdy_version_); 4445 SpdyFramer framer(spdy_version_);
4397 framer.set_visitor(&visitor); 4446 framer.set_visitor(&visitor);
4398 4447
4399 SpdyDataIR data_ir(1, "hello"); 4448 SpdyDataIR data_ir(1, "hello");
(...skipping 18 matching lines...) Expand all
4418 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4467 << SpdyFramer::ErrorCodeToString(framer.error_code());
4419 } else { 4468 } else {
4420 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 4469 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4421 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4470 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4422 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4471 << SpdyFramer::ErrorCodeToString(framer.error_code());
4423 } 4472 }
4424 } while (++flags != 0); 4473 } while (++flags != 0);
4425 } 4474 }
4426 4475
4427 TEST_P(SpdyFramerTest, DataFrameFlagsV4) { 4476 TEST_P(SpdyFramerTest, DataFrameFlagsV4) {
4477 FLAGS_spdy_on_stream_end = true;
4478
4428 if (!IsHttp2()) { 4479 if (!IsHttp2()) {
4429 return; 4480 return;
4430 } 4481 }
4482
4483 uint8_t valid_data_flags =
4484 DATA_FLAG_FIN | DATA_FLAG_END_SEGMENT | DATA_FLAG_PADDED;
4485
4486 uint8_t flags = 0;
4487 do {
4488 SCOPED_TRACE(testing::Message() << "Flags " << flags);
4489
4490 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4491 SpdyFramer framer(spdy_version_);
4492 framer.set_visitor(&visitor);
4493
4494 SpdyDataIR data_ir(1, "hello");
4495 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir));
4496 SetFrameFlags(frame.get(), flags, spdy_version_);
4497
4498 if (flags & ~valid_data_flags) {
4499 EXPECT_CALL(visitor, OnError(_));
4500 } else {
4501 EXPECT_CALL(visitor, OnDataFrameHeader(1, 5, flags & DATA_FLAG_FIN));
4502 if (flags & DATA_FLAG_PADDED) {
4503 // The first byte of payload is parsed as padding length.
4504 EXPECT_CALL(visitor, OnStreamPadding(_, 1));
4505 // Expect Error since the frame ends prematurely.
4506 EXPECT_CALL(visitor, OnError(_));
4507 } else {
4508 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 5, false));
4509 if (flags & DATA_FLAG_FIN) {
4510 EXPECT_CALL(visitor, OnStreamEnd(_));
4511 }
4512 }
4513 }
4514
4515 framer.ProcessInput(frame->data(), frame->size());
4516 if ((flags & ~valid_data_flags) || (flags & DATA_FLAG_PADDED)) {
4517 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4518 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code())
4519 << SpdyFramer::ErrorCodeToString(framer.error_code());
4520 } else {
4521 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4522 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4523 << SpdyFramer::ErrorCodeToString(framer.error_code());
4524 }
4525 } while (++flags != 0);
4526 }
4527
4528 TEST_P(SpdyFramerTest, DataFrameFlagsV4disabled) {
4529 FLAGS_spdy_on_stream_end = false;
4530
4531 if (!IsHttp2()) {
4532 return;
4533 }
4431 4534
4432 uint8_t valid_data_flags = 4535 uint8_t valid_data_flags =
4433 DATA_FLAG_FIN | DATA_FLAG_END_SEGMENT | DATA_FLAG_PADDED; 4536 DATA_FLAG_FIN | DATA_FLAG_END_SEGMENT | DATA_FLAG_PADDED;
4434 4537
4435 uint8_t flags = 0; 4538 uint8_t flags = 0;
4436 do { 4539 do {
4437 SCOPED_TRACE(testing::Message() << "Flags " << flags); 4540 SCOPED_TRACE(testing::Message() << "Flags " << flags);
4438 4541
4439 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4542 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4440 SpdyFramer framer(spdy_version_); 4543 SpdyFramer framer(spdy_version_);
(...skipping 27 matching lines...) Expand all
4468 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4571 << SpdyFramer::ErrorCodeToString(framer.error_code());
4469 } else { 4572 } else {
4470 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 4573 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4471 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4574 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4472 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4575 << SpdyFramer::ErrorCodeToString(framer.error_code());
4473 } 4576 }
4474 } while (++flags != 0); 4577 } while (++flags != 0);
4475 } 4578 }
4476 4579
4477 TEST_P(SpdyFramerTest, SynStreamFrameFlags) { 4580 TEST_P(SpdyFramerTest, SynStreamFrameFlags) {
4581 FLAGS_spdy_on_stream_end = true;
4582
4478 if (!IsSpdy3()) { 4583 if (!IsSpdy3()) {
4479 return; 4584 return;
4480 } 4585 }
4586
4587 uint8_t flags = 0;
4588 do {
4589 SCOPED_TRACE(testing::Message() << "Flags " << flags);
4590
4591 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4592 testing::StrictMock<test::MockDebugVisitor> debug_visitor;
4593 SpdyFramer framer(spdy_version_);
4594 framer.set_visitor(&visitor);
4595 framer.set_debug_visitor(&debug_visitor);
4596
4597 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(8, SYN_STREAM, _, _));
4598
4599 SpdySynStreamIR syn_stream(8);
4600 syn_stream.set_associated_to_stream_id(3);
4601 syn_stream.set_priority(1);
4602 syn_stream.SetHeader("foo", "bar");
4603 scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream));
4604 SetFrameFlags(frame.get(), flags, spdy_version_);
4605
4606 if (flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) {
4607 EXPECT_CALL(visitor, OnError(_));
4608 } else {
4609 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(8, SYN_STREAM, _));
4610 EXPECT_CALL(visitor, OnSynStream(8, 3, 1, flags & CONTROL_FLAG_FIN,
4611 flags & CONTROL_FLAG_UNIDIRECTIONAL));
4612 EXPECT_CALL(visitor, OnControlFrameHeaderData(8, _, _))
4613 .WillRepeatedly(testing::Return(true));
4614 if (flags & DATA_FLAG_FIN) {
4615 EXPECT_CALL(visitor, OnStreamEnd(_));
4616 } else {
4617 // Do not close the stream if we are expecting a CONTINUATION frame.
4618 EXPECT_CALL(visitor, OnStreamEnd(_)).Times(0);
4619 }
4620 }
4621
4622 framer.ProcessInput(frame->data(), frame->size());
4623 if (flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) {
4624 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4625 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
4626 framer.error_code())
4627 << SpdyFramer::ErrorCodeToString(framer.error_code());
4628 } else {
4629 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4630 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4631 << SpdyFramer::ErrorCodeToString(framer.error_code());
4632 }
4633 } while (++flags != 0);
4634 }
4635
4636 TEST_P(SpdyFramerTest, SynStreamFrameFlagsDisabled) {
4637 FLAGS_spdy_on_stream_end = false;
4638
4639 if (!IsSpdy3()) {
4640 return;
4641 }
4481 4642
4482 uint8_t flags = 0; 4643 uint8_t flags = 0;
4483 do { 4644 do {
4484 SCOPED_TRACE(testing::Message() << "Flags " << flags); 4645 SCOPED_TRACE(testing::Message() << "Flags " << flags);
4485 4646
4486 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4647 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4487 testing::StrictMock<test::MockDebugVisitor> debug_visitor; 4648 testing::StrictMock<test::MockDebugVisitor> debug_visitor;
4488 SpdyFramer framer(spdy_version_); 4649 SpdyFramer framer(spdy_version_);
4489 framer.set_visitor(&visitor); 4650 framer.set_visitor(&visitor);
4490 framer.set_debug_visitor(&debug_visitor); 4651 framer.set_debug_visitor(&debug_visitor);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
4522 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4683 << SpdyFramer::ErrorCodeToString(framer.error_code());
4523 } else { 4684 } else {
4524 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 4685 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4525 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4686 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4526 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4687 << SpdyFramer::ErrorCodeToString(framer.error_code());
4527 } 4688 }
4528 } while (++flags != 0); 4689 } while (++flags != 0);
4529 } 4690 }
4530 4691
4531 TEST_P(SpdyFramerTest, SynReplyFrameFlags) { 4692 TEST_P(SpdyFramerTest, SynReplyFrameFlags) {
4693 FLAGS_spdy_on_stream_end = true;
4694
4532 if (!IsSpdy3()) { 4695 if (!IsSpdy3()) {
4533 return; 4696 return;
4534 } 4697 }
4698
4699 uint8_t flags = 0;
4700 do {
4701 SCOPED_TRACE(testing::Message() << "Flags " << flags);
4702
4703 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4704 SpdyFramer framer(spdy_version_);
4705 framer.set_visitor(&visitor);
4706
4707 SpdySynReplyIR syn_reply(37);
4708 syn_reply.SetHeader("foo", "bar");
4709 scoped_ptr<SpdyFrame> frame(framer.SerializeSynReply(syn_reply));
4710 SetFrameFlags(frame.get(), flags, spdy_version_);
4711
4712 if (flags & ~CONTROL_FLAG_FIN) {
4713 EXPECT_CALL(visitor, OnError(_));
4714 } else {
4715 EXPECT_CALL(visitor, OnSynReply(37, flags & CONTROL_FLAG_FIN));
4716 EXPECT_CALL(visitor, OnControlFrameHeaderData(37, _, _))
4717 .WillRepeatedly(testing::Return(true));
4718 if (flags & DATA_FLAG_FIN) {
4719 EXPECT_CALL(visitor, OnStreamEnd(_));
4720 }
4721 }
4722
4723 framer.ProcessInput(frame->data(), frame->size());
4724 if (flags & ~CONTROL_FLAG_FIN) {
4725 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4726 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
4727 framer.error_code())
4728 << SpdyFramer::ErrorCodeToString(framer.error_code());
4729 } else {
4730 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4731 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4732 << SpdyFramer::ErrorCodeToString(framer.error_code());
4733 }
4734 } while (++flags != 0);
4735 }
4736
4737 TEST_P(SpdyFramerTest, SynReplyFrameFlagsDisabled) {
4738 FLAGS_spdy_on_stream_end = false;
4739
4740 if (!IsSpdy3()) {
4741 return;
4742 }
4535 4743
4536 uint8_t flags = 0; 4744 uint8_t flags = 0;
4537 do { 4745 do {
4538 SCOPED_TRACE(testing::Message() << "Flags " << flags); 4746 SCOPED_TRACE(testing::Message() << "Flags " << flags);
4539 4747
4540 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4748 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4541 SpdyFramer framer(spdy_version_); 4749 SpdyFramer framer(spdy_version_);
4542 framer.set_visitor(&visitor); 4750 framer.set_visitor(&visitor);
4543 4751
4544 SpdySynReplyIR syn_reply(37); 4752 SpdySynReplyIR syn_reply(37);
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
4722 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4930 << SpdyFramer::ErrorCodeToString(framer.error_code());
4723 } else { 4931 } else {
4724 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); 4932 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
4725 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4933 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4726 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4934 << SpdyFramer::ErrorCodeToString(framer.error_code());
4727 } 4935 }
4728 } while (++flags != 0); 4936 } while (++flags != 0);
4729 } 4937 }
4730 4938
4731 TEST_P(SpdyFramerTest, HeadersFrameFlags) { 4939 TEST_P(SpdyFramerTest, HeadersFrameFlags) {
4940 FLAGS_spdy_on_stream_end = true;
4941
4732 uint8_t flags = 0; 4942 uint8_t flags = 0;
4733 do { 4943 do {
4734 SCOPED_TRACE(testing::Message() << "Flags " << flags); 4944 SCOPED_TRACE(testing::Message() << "Flags " << flags);
4945
4946 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4947 SpdyFramer framer(spdy_version_);
4948 framer.set_visitor(&visitor);
4949
4950 SpdyHeadersIR headers_ir(57);
4951 if (IsHttp2() && (flags & HEADERS_FLAG_PRIORITY)) {
4952 headers_ir.set_priority(3);
4953 headers_ir.set_has_priority(true);
4954 headers_ir.set_parent_stream_id(5);
4955 headers_ir.set_exclusive(true);
4956 }
4957 headers_ir.SetHeader("foo", "bar");
4958 std::unique_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir));
4959 uint8_t set_flags = flags;
4960 if (IsHttp2()) {
4961 // TODO(jgraettinger): Add padding to SpdyHeadersIR,
4962 // and implement framing.
4963 set_flags &= ~HEADERS_FLAG_PADDED;
4964 }
4965 SetFrameFlags(frame.get(), set_flags, spdy_version_);
4966
4967 if (!IsHttp2() && flags & ~CONTROL_FLAG_FIN) {
4968 EXPECT_CALL(visitor, OnError(_));
4969 } else if (IsHttp2() &&
4970 flags &
4971 ~(CONTROL_FLAG_FIN | HEADERS_FLAG_END_HEADERS |
4972 HEADERS_FLAG_END_SEGMENT | HEADERS_FLAG_PADDED |
4973 HEADERS_FLAG_PRIORITY)) {
4974 EXPECT_CALL(visitor, OnError(_));
4975 } else {
4976 // Expected callback values
4977 SpdyStreamId stream_id = 57;
4978 bool has_priority = false;
4979 SpdyPriority priority = 0;
4980 SpdyStreamId parent_stream_id = 0;
4981 bool exclusive = false;
4982 bool fin = flags & CONTROL_FLAG_FIN;
4983 bool end = IsSpdy3() || (flags & HEADERS_FLAG_END_HEADERS);
4984 if (IsHttp2() && flags & HEADERS_FLAG_PRIORITY) {
4985 has_priority = true;
4986 priority = 3;
4987 parent_stream_id = 5;
4988 exclusive = true;
4989 }
4990 EXPECT_CALL(visitor, OnHeaders(stream_id, has_priority, priority,
4991 parent_stream_id, exclusive, fin, end));
4992 EXPECT_CALL(visitor, OnControlFrameHeaderData(57, _, _))
4993 .WillRepeatedly(testing::Return(true));
4994 if (flags & DATA_FLAG_FIN &&
4995 (IsSpdy3() || flags & HEADERS_FLAG_END_HEADERS)) {
4996 EXPECT_CALL(visitor, OnStreamEnd(_));
4997 } else {
4998 // Do not close the stream if we are expecting a CONTINUATION frame.
4999 EXPECT_CALL(visitor, OnStreamEnd(_)).Times(0);
5000 }
5001 }
5002
5003 framer.ProcessInput(frame->data(), frame->size());
5004 if (IsSpdy3() && flags & ~CONTROL_FLAG_FIN) {
5005 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
5006 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
5007 framer.error_code())
5008 << SpdyFramer::ErrorCodeToString(framer.error_code());
5009 } else if (IsHttp2() &&
5010 flags &
5011 ~(CONTROL_FLAG_FIN | HEADERS_FLAG_END_HEADERS |
5012 HEADERS_FLAG_END_SEGMENT | HEADERS_FLAG_PADDED |
5013 HEADERS_FLAG_PRIORITY)) {
5014 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
5015 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
5016 framer.error_code())
5017 << SpdyFramer::ErrorCodeToString(framer.error_code());
5018 } else if (IsHttp2() && ~(flags & HEADERS_FLAG_END_HEADERS)) {
5019 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
5020 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
5021 << SpdyFramer::ErrorCodeToString(framer.error_code());
5022 } else {
5023 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state());
5024 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
5025 << SpdyFramer::ErrorCodeToString(framer.error_code());
5026 }
5027 } while (++flags != 0);
5028 }
5029
5030 TEST_P(SpdyFramerTest, HeadersFrameFlagsDisabled) {
5031 FLAGS_spdy_on_stream_end = false;
5032
5033 uint8_t flags = 0;
5034 do {
5035 SCOPED_TRACE(testing::Message() << "Flags " << flags);
4735 5036
4736 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 5037 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4737 SpdyFramer framer(spdy_version_); 5038 SpdyFramer framer(spdy_version_);
4738 framer.set_visitor(&visitor); 5039 framer.set_visitor(&visitor);
4739 5040
4740 SpdyHeadersIR headers_ir(57); 5041 SpdyHeadersIR headers_ir(57);
4741 if (IsHttp2() && (flags & HEADERS_FLAG_PRIORITY)) { 5042 if (IsHttp2() && (flags & HEADERS_FLAG_PRIORITY)) {
4742 headers_ir.set_priority(3); 5043 headers_ir.set_priority(3);
4743 headers_ir.set_has_priority(true); 5044 headers_ir.set_has_priority(true);
4744 headers_ir.set_parent_stream_id(5); 5045 headers_ir.set_parent_stream_id(5);
4745 headers_ir.set_exclusive(true); 5046 headers_ir.set_exclusive(true);
4746 } 5047 }
4747 headers_ir.SetHeader("foo", "bar"); 5048 headers_ir.SetHeader("foo", "bar");
4748 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); 5049 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir));
4749 uint8_t set_flags = flags; 5050 uint8_t set_flags = flags;
4750 if (IsHttp2()) { 5051 if (IsHttp2()) {
4751 // TODO(jgraettinger): Add padding to SpdyHeadersIR, 5052 // TODO(jgraettinger): Add padding to SpdyHeadersIR,
4752 // and implement framing. 5053 // and implement framing.
4753 set_flags &= ~HEADERS_FLAG_PADDED; 5054 set_flags &= ~HEADERS_FLAG_PADDED;
4754 } 5055 }
4755 SetFrameFlags(frame.get(), set_flags, spdy_version_); 5056 SetFrameFlags(frame.get(), set_flags, spdy_version_);
4756 5057
4757 if (!IsHttp2() && flags & ~CONTROL_FLAG_FIN) { 5058 if (!IsHttp2() && flags & ~CONTROL_FLAG_FIN) {
4758 EXPECT_CALL(visitor, OnError(_)); 5059 EXPECT_CALL(visitor, OnError(_));
4759 } else if (IsHttp2() && flags & ~(CONTROL_FLAG_FIN | 5060 } else if (IsHttp2() &&
4760 HEADERS_FLAG_END_HEADERS | 5061 flags &
4761 HEADERS_FLAG_END_SEGMENT | 5062 ~(CONTROL_FLAG_FIN | HEADERS_FLAG_END_HEADERS |
4762 HEADERS_FLAG_PADDED | 5063 HEADERS_FLAG_END_SEGMENT | HEADERS_FLAG_PADDED |
4763 HEADERS_FLAG_PRIORITY)) { 5064 HEADERS_FLAG_PRIORITY)) {
4764 EXPECT_CALL(visitor, OnError(_)); 5065 EXPECT_CALL(visitor, OnError(_));
4765 } else { 5066 } else {
4766 // Expected callback values 5067 // Expected callback values
4767 SpdyStreamId stream_id = 57; 5068 SpdyStreamId stream_id = 57;
4768 bool has_priority = false; 5069 bool has_priority = false;
4769 SpdyPriority priority = 0; 5070 SpdyPriority priority = 0;
4770 SpdyStreamId parent_stream_id = 0; 5071 SpdyStreamId parent_stream_id = 0;
4771 bool exclusive = false; 5072 bool exclusive = false;
4772 bool fin = flags & CONTROL_FLAG_FIN; 5073 bool fin = flags & CONTROL_FLAG_FIN;
4773 bool end = IsSpdy3() || (flags & HEADERS_FLAG_END_HEADERS); 5074 bool end = IsSpdy3() || (flags & HEADERS_FLAG_END_HEADERS);
(...skipping 778 matching lines...) Expand 10 before | Expand all | Expand 10 after
5552 5853
5553 EXPECT_EQ(1, visitor->data_frame_count_); 5854 EXPECT_EQ(1, visitor->data_frame_count_);
5554 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_)); 5855 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_));
5555 EXPECT_EQ(0, visitor->headers_frame_count_); 5856 EXPECT_EQ(0, visitor->headers_frame_count_);
5556 } 5857 }
5557 } 5858 }
5558 5859
5559 } // namespace test 5860 } // namespace test
5560 5861
5561 } // namespace net 5862 } // namespace net
OLDNEW
« net/quic/quic_headers_stream.cc ('K') | « net/spdy/spdy_framer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698