OLD | NEW |
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 <algorithm> | 5 #include <algorithm> |
6 #include <iostream> | 6 #include <iostream> |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
11 #include "net/spdy/hpack_output_stream.h" | 11 #include "net/spdy/hpack_output_stream.h" |
12 #include "net/spdy/mock_spdy_framer_visitor.h" | 12 #include "net/spdy/mock_spdy_framer_visitor.h" |
13 #include "net/spdy/spdy_frame_builder.h" | 13 #include "net/spdy/spdy_frame_builder.h" |
14 #include "net/spdy/spdy_frame_reader.h" | 14 #include "net/spdy/spdy_frame_reader.h" |
15 #include "net/spdy/spdy_framer.h" | 15 #include "net/spdy/spdy_framer.h" |
16 #include "net/spdy/spdy_protocol.h" | 16 #include "net/spdy/spdy_protocol.h" |
17 #include "net/spdy/spdy_test_utils.h" | 17 #include "net/spdy/spdy_test_utils.h" |
18 #include "testing/gmock/include/gmock/gmock.h" | 18 #include "testing/gmock/include/gmock/gmock.h" |
19 #include "testing/platform_test.h" | 19 #include "testing/platform_test.h" |
20 | 20 |
21 using base::StringPiece; | |
22 using std::string; | 21 using std::string; |
23 using std::max; | |
24 using std::min; | |
25 using std::numeric_limits; | |
26 using testing::ElementsAre; | |
27 using testing::Pair; | |
28 using testing::_; | 22 using testing::_; |
29 | 23 |
30 namespace net { | 24 namespace net { |
31 | 25 |
32 namespace test { | 26 namespace test { |
33 | 27 |
34 static const size_t kMaxDecompressedSize = 1024; | 28 static const size_t kMaxDecompressedSize = 1024; |
35 | 29 |
36 class MockDebugVisitor : public SpdyFramerDebugVisitorInterface { | 30 class MockDebugVisitor : public SpdyFramerDebugVisitorInterface { |
37 public: | 31 public: |
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 } | 355 } |
362 } | 356 } |
363 | 357 |
364 void OnRstStream(SpdyStreamId stream_id, | 358 void OnRstStream(SpdyStreamId stream_id, |
365 SpdyRstStreamStatus status) override { | 359 SpdyRstStreamStatus status) override { |
366 ++fin_frame_count_; | 360 ++fin_frame_count_; |
367 } | 361 } |
368 | 362 |
369 bool OnRstStreamFrameData(const char* rst_stream_data, size_t len) override { | 363 bool OnRstStreamFrameData(const char* rst_stream_data, size_t len) override { |
370 if ((rst_stream_data != NULL) && (len > 0)) { | 364 if ((rst_stream_data != NULL) && (len > 0)) { |
371 fin_opaque_data_ += std::string(rst_stream_data, len); | 365 fin_opaque_data_ += string(rst_stream_data, len); |
372 } | 366 } |
373 return true; | 367 return true; |
374 } | 368 } |
375 | 369 |
376 void OnSetting(SpdySettingsIds id, uint8 flags, uint32 value) override { | 370 void OnSetting(SpdySettingsIds id, uint8 flags, uint32 value) override { |
377 ++setting_count_; | 371 ++setting_count_; |
378 } | 372 } |
379 | 373 |
380 void OnSettingsAck() override { | 374 void OnSettingsAck() override { |
381 DCHECK_LT(SPDY3, framer_.protocol_version()); | 375 DCHECK_LT(SPDY3, framer_.protocol_version()); |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
471 framer_.set_visitor(this); | 465 framer_.set_visitor(this); |
472 size_t input_remaining = size; | 466 size_t input_remaining = size; |
473 const char* input_ptr = reinterpret_cast<const char*>(input); | 467 const char* input_ptr = reinterpret_cast<const char*>(input); |
474 while (input_remaining > 0 && | 468 while (input_remaining > 0 && |
475 framer_.error_code() == SpdyFramer::SPDY_NO_ERROR) { | 469 framer_.error_code() == SpdyFramer::SPDY_NO_ERROR) { |
476 // To make the tests more interesting, we feed random (amd small) chunks | 470 // To make the tests more interesting, we feed random (amd small) chunks |
477 // into the framer. This simulates getting strange-sized reads from | 471 // into the framer. This simulates getting strange-sized reads from |
478 // the socket. | 472 // the socket. |
479 const size_t kMaxReadSize = 32; | 473 const size_t kMaxReadSize = 32; |
480 size_t bytes_read = | 474 size_t bytes_read = |
481 (rand() % min(input_remaining, kMaxReadSize)) + 1; | 475 (rand() % std::min(input_remaining, kMaxReadSize)) + 1; |
482 size_t bytes_processed = framer_.ProcessInput(input_ptr, bytes_read); | 476 size_t bytes_processed = framer_.ProcessInput(input_ptr, bytes_read); |
483 input_remaining -= bytes_processed; | 477 input_remaining -= bytes_processed; |
484 input_ptr += bytes_processed; | 478 input_ptr += bytes_processed; |
485 } | 479 } |
486 } | 480 } |
487 | 481 |
488 void InitHeaderStreaming(SpdyFrameType header_control_type, | 482 void InitHeaderStreaming(SpdyFrameType header_control_type, |
489 SpdyStreamId stream_id) { | 483 SpdyStreamId stream_id) { |
490 if (!SpdyConstants::IsValidFrameType(framer_.protocol_version(), | 484 if (!SpdyConstants::IsValidFrameType(framer_.protocol_version(), |
491 SpdyConstants::SerializeFrameType(framer_.protocol_version(), | 485 SpdyConstants::SerializeFrameType(framer_.protocol_version(), |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 int altsvc_count_; | 529 int altsvc_count_; |
536 int priority_count_; | 530 int priority_count_; |
537 SpdyAltSvcIR test_altsvc_ir_; | 531 SpdyAltSvcIR test_altsvc_ir_; |
538 bool on_unknown_frame_result_; | 532 bool on_unknown_frame_result_; |
539 SpdyStreamId last_window_update_stream_; | 533 SpdyStreamId last_window_update_stream_; |
540 uint32 last_window_update_delta_; | 534 uint32 last_window_update_delta_; |
541 SpdyStreamId last_push_promise_stream_; | 535 SpdyStreamId last_push_promise_stream_; |
542 SpdyStreamId last_push_promise_promised_stream_; | 536 SpdyStreamId last_push_promise_promised_stream_; |
543 int data_bytes_; | 537 int data_bytes_; |
544 int fin_frame_count_; // The count of RST_STREAM type frames received. | 538 int fin_frame_count_; // The count of RST_STREAM type frames received. |
545 std::string fin_opaque_data_; | 539 string fin_opaque_data_; |
546 int fin_flag_count_; // The count of frames with the FIN flag set. | 540 int fin_flag_count_; // The count of frames with the FIN flag set. |
547 int zero_length_data_frame_count_; // The count of zero-length data frames. | 541 int zero_length_data_frame_count_; // The count of zero-length data frames. |
548 int control_frame_header_data_count_; // The count of chunks received. | 542 int control_frame_header_data_count_; // The count of chunks received. |
549 // The count of zero-length control frame header data chunks received. | 543 // The count of zero-length control frame header data chunks received. |
550 int zero_length_control_frame_header_data_count_; | 544 int zero_length_control_frame_header_data_count_; |
551 int data_frame_count_; | 545 int data_frame_count_; |
552 size_t last_payload_len_; | 546 size_t last_payload_len_; |
553 size_t last_frame_len_; | 547 size_t last_frame_len_; |
554 | 548 |
555 // Header block streaming state: | 549 // Header block streaming state: |
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
943 | 937 |
944 framer.set_enable_compression(false); | 938 framer.set_enable_compression(false); |
945 scoped_ptr<SpdyFrame> control_frame(frame.take()); | 939 scoped_ptr<SpdyFrame> control_frame(frame.take()); |
946 | 940 |
947 TestSpdyVisitor visitor(spdy_version_); | 941 TestSpdyVisitor visitor(spdy_version_); |
948 visitor.use_compression_ = false; | 942 visitor.use_compression_ = false; |
949 visitor.SimulateInFramer( | 943 visitor.SimulateInFramer( |
950 reinterpret_cast<unsigned char*>(control_frame->data()), | 944 reinterpret_cast<unsigned char*>(control_frame->data()), |
951 control_frame->size()); | 945 control_frame->size()); |
952 | 946 |
953 EXPECT_THAT(visitor.headers_, ElementsAre( | 947 EXPECT_THAT(visitor.headers_, |
954 Pair("name", value))); | 948 testing::ElementsAre(testing::Pair("name", value))); |
955 } | 949 } |
956 | 950 |
957 TEST_P(SpdyFramerTest, BasicCompression) { | 951 TEST_P(SpdyFramerTest, BasicCompression) { |
958 if (spdy_version_ > SPDY3) { | 952 if (spdy_version_ > SPDY3) { |
959 // Deflate compression doesn't apply to HPACK. | 953 // Deflate compression doesn't apply to HPACK. |
960 return; | 954 return; |
961 } | 955 } |
962 scoped_ptr<TestSpdyVisitor> visitor(new TestSpdyVisitor(spdy_version_)); | 956 scoped_ptr<TestSpdyVisitor> visitor(new TestSpdyVisitor(spdy_version_)); |
963 SpdyFramer framer(spdy_version_); | 957 SpdyFramer framer(spdy_version_); |
964 framer.set_debug_visitor(visitor.get()); | 958 framer.set_debug_visitor(visitor.get()); |
(...skipping 2798 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3763 EXPECT_EQ(1, visitor.error_count_); | 3757 EXPECT_EQ(1, visitor.error_count_); |
3764 EXPECT_EQ(SpdyFramer::SPDY_DECOMPRESS_FAILURE, visitor.framer_.error_code()) | 3758 EXPECT_EQ(SpdyFramer::SPDY_DECOMPRESS_FAILURE, visitor.framer_.error_code()) |
3765 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 3759 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
3766 EXPECT_EQ(0u, visitor.header_buffer_length_); | 3760 EXPECT_EQ(0u, visitor.header_buffer_length_); |
3767 } | 3761 } |
3768 | 3762 |
3769 TEST_P(SpdyFramerTest, ControlFrameSizesAreValidated) { | 3763 TEST_P(SpdyFramerTest, ControlFrameSizesAreValidated) { |
3770 SpdyFramer framer(spdy_version_); | 3764 SpdyFramer framer(spdy_version_); |
3771 // Create a GoAway frame that has a few extra bytes at the end. | 3765 // Create a GoAway frame that has a few extra bytes at the end. |
3772 // We create enough overhead to overflow the framer's control frame buffer. | 3766 // We create enough overhead to overflow the framer's control frame buffer. |
3773 ASSERT_GE(250u, SpdyFramer::kControlFrameBufferSize); | 3767 ASSERT_LE(SpdyFramer::kControlFrameBufferSize, 250u); |
3774 const unsigned char length = 1 + SpdyFramer::kControlFrameBufferSize; | 3768 const size_t length = SpdyFramer::kControlFrameBufferSize + 1; |
3775 const unsigned char kV3FrameData[] = { // Also applies for V2. | 3769 const unsigned char kV3FrameData[] = { // Also applies for V2. |
3776 0x80, spdy_version_ch_, 0x00, 0x07, | 3770 0x80, spdy_version_ch_, 0x00, 0x07, |
3777 0x00, 0x00, 0x00, length, | 3771 0x00, 0x00, 0x00, static_cast<unsigned char>(length), |
3778 0x00, 0x00, 0x00, 0x00, // Stream ID | 3772 0x00, 0x00, 0x00, 0x00, // Stream ID |
3779 0x00, 0x00, 0x00, 0x00, // Status | 3773 0x00, 0x00, 0x00, 0x00, // Status |
3780 }; | 3774 }; |
3781 | 3775 |
3782 // SPDY version 4 and up GOAWAY frames are only bound to a minimal length, | 3776 // SPDY version 4 and up GOAWAY frames are only bound to a minimal length, |
3783 // since it may carry opaque data. Verify that minimal length is tested. | 3777 // since it may carry opaque data. Verify that minimal length is tested. |
3784 const unsigned char less_than_min_length = | 3778 ASSERT_GT(framer.GetGoAwayMinimumSize(), framer.GetControlFrameHeaderSize()); |
| 3779 const size_t less_than_min_length = |
3785 framer.GetGoAwayMinimumSize() - framer.GetControlFrameHeaderSize() - 1; | 3780 framer.GetGoAwayMinimumSize() - framer.GetControlFrameHeaderSize() - 1; |
| 3781 ASSERT_LE(less_than_min_length, std::numeric_limits<unsigned char>::max()); |
3786 const unsigned char kV4FrameData[] = { | 3782 const unsigned char kV4FrameData[] = { |
3787 0x00, 0x00, static_cast<uint8>(less_than_min_length), 0x07, | 3783 0x00, 0x00, static_cast<unsigned char>(less_than_min_length), 0x07, |
3788 0x00, 0x00, 0x00, 0x00, | 3784 0x00, 0x00, 0x00, 0x00, |
3789 0x00, 0x00, 0x00, 0x00, // Stream Id | 3785 0x00, 0x00, 0x00, 0x00, // Stream Id |
3790 0x00, 0x00, 0x00, 0x00, // Status | 3786 0x00, 0x00, 0x00, 0x00, // Status |
3791 0x00, | 3787 0x00, |
3792 }; | 3788 }; |
3793 const size_t pad_length = | 3789 const size_t pad_length = |
3794 length + framer.GetControlFrameHeaderSize() - | 3790 length + framer.GetControlFrameHeaderSize() - |
3795 (IsSpdy4() ? sizeof(kV4FrameData) : sizeof(kV3FrameData)); | 3791 (IsSpdy4() ? sizeof(kV4FrameData) : sizeof(kV3FrameData)); |
3796 string pad('A', pad_length); | 3792 string pad(pad_length, 'A'); |
3797 TestSpdyVisitor visitor(spdy_version_); | 3793 TestSpdyVisitor visitor(spdy_version_); |
3798 | 3794 |
3799 if (IsSpdy4()) { | 3795 if (IsSpdy4()) { |
3800 visitor.SimulateInFramer(kV4FrameData, sizeof(kV4FrameData)); | 3796 visitor.SimulateInFramer(kV4FrameData, sizeof(kV4FrameData)); |
3801 } else { | 3797 } else { |
3802 visitor.SimulateInFramer(kV3FrameData, sizeof(kV3FrameData)); | 3798 visitor.SimulateInFramer(kV3FrameData, sizeof(kV3FrameData)); |
3803 } | 3799 } |
3804 visitor.SimulateInFramer( | 3800 visitor.SimulateInFramer( |
3805 reinterpret_cast<const unsigned char*>(pad.c_str()), | 3801 reinterpret_cast<const unsigned char*>(pad.c_str()), |
3806 pad.length()); | 3802 pad.length()); |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3886 EXPECT_EQ(3, visitor.setting_count_); | 3882 EXPECT_EQ(3, visitor.setting_count_); |
3887 if (spdy_version_ > SPDY3) { | 3883 if (spdy_version_ > SPDY3) { |
3888 EXPECT_EQ(1, visitor.settings_ack_sent_); | 3884 EXPECT_EQ(1, visitor.settings_ack_sent_); |
3889 } | 3885 } |
3890 | 3886 |
3891 // Read data in small chunks. | 3887 // Read data in small chunks. |
3892 size_t framed_data = 0; | 3888 size_t framed_data = 0; |
3893 size_t unframed_data = control_frame->size(); | 3889 size_t unframed_data = control_frame->size(); |
3894 size_t kReadChunkSize = 5; // Read five bytes at a time. | 3890 size_t kReadChunkSize = 5; // Read five bytes at a time. |
3895 while (unframed_data > 0) { | 3891 while (unframed_data > 0) { |
3896 size_t to_read = min(kReadChunkSize, unframed_data); | 3892 size_t to_read = std::min(kReadChunkSize, unframed_data); |
3897 visitor.SimulateInFramer( | 3893 visitor.SimulateInFramer( |
3898 reinterpret_cast<unsigned char*>(control_frame->data() + framed_data), | 3894 reinterpret_cast<unsigned char*>(control_frame->data() + framed_data), |
3899 to_read); | 3895 to_read); |
3900 unframed_data -= to_read; | 3896 unframed_data -= to_read; |
3901 framed_data += to_read; | 3897 framed_data += to_read; |
3902 } | 3898 } |
3903 EXPECT_EQ(0, visitor.error_count_); | 3899 EXPECT_EQ(0, visitor.error_count_); |
3904 EXPECT_EQ(3 * 2, visitor.setting_count_); | 3900 EXPECT_EQ(3 * 2, visitor.setting_count_); |
3905 if (spdy_version_ > SPDY3) { | 3901 if (spdy_version_ > SPDY3) { |
3906 EXPECT_EQ(2, visitor.settings_ack_sent_); | 3902 EXPECT_EQ(2, visitor.settings_ack_sent_); |
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4287 | 4283 |
4288 TestSpdyVisitor visitor(spdy_version_); | 4284 TestSpdyVisitor visitor(spdy_version_); |
4289 visitor.SimulateInFramer(kInput, sizeof(kInput)); | 4285 visitor.SimulateInFramer(kInput, sizeof(kInput)); |
4290 | 4286 |
4291 EXPECT_EQ(0, visitor.error_count_); | 4287 EXPECT_EQ(0, visitor.error_count_); |
4292 EXPECT_EQ(1, visitor.headers_frame_count_); | 4288 EXPECT_EQ(1, visitor.headers_frame_count_); |
4293 EXPECT_EQ(2, visitor.continuation_count_); | 4289 EXPECT_EQ(2, visitor.continuation_count_); |
4294 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); | 4290 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); |
4295 EXPECT_EQ(0, visitor.zero_length_data_frame_count_); | 4291 EXPECT_EQ(0, visitor.zero_length_data_frame_count_); |
4296 | 4292 |
4297 EXPECT_THAT(visitor.headers_, ElementsAre( | 4293 EXPECT_THAT(visitor.headers_, |
4298 Pair("cookie", "foo=bar; baz=bing; "), | 4294 testing::ElementsAre( |
4299 Pair("name", "value"))); | 4295 testing::Pair("cookie", "foo=bar; baz=bing; "), |
| 4296 testing::Pair("name", "value"))); |
4300 } | 4297 } |
4301 | 4298 |
4302 TEST_P(SpdyFramerTest, ReadHeadersWithContinuationAndFin) { | 4299 TEST_P(SpdyFramerTest, ReadHeadersWithContinuationAndFin) { |
4303 if (spdy_version_ <= SPDY3) { | 4300 if (spdy_version_ <= SPDY3) { |
4304 return; | 4301 return; |
4305 } | 4302 } |
4306 | 4303 |
4307 const unsigned char kInput[] = { | 4304 const unsigned char kInput[] = { |
4308 0x00, 0x00, 0x10, 0x01, 0x01, // HEADERS: FIN | 4305 0x00, 0x00, 0x10, 0x01, 0x01, // HEADERS: FIN |
4309 0x00, 0x00, 0x00, 0x01, // Stream 1 | 4306 0x00, 0x00, 0x00, 0x01, // Stream 1 |
(...skipping 23 matching lines...) Expand all Loading... |
4333 TestSpdyVisitor visitor(spdy_version_); | 4330 TestSpdyVisitor visitor(spdy_version_); |
4334 visitor.SimulateInFramer(kInput, sizeof(kInput)); | 4331 visitor.SimulateInFramer(kInput, sizeof(kInput)); |
4335 | 4332 |
4336 EXPECT_EQ(0, visitor.error_count_); | 4333 EXPECT_EQ(0, visitor.error_count_); |
4337 EXPECT_EQ(1, visitor.headers_frame_count_); | 4334 EXPECT_EQ(1, visitor.headers_frame_count_); |
4338 EXPECT_EQ(2, visitor.continuation_count_); | 4335 EXPECT_EQ(2, visitor.continuation_count_); |
4339 EXPECT_EQ(1, visitor.fin_flag_count_); | 4336 EXPECT_EQ(1, visitor.fin_flag_count_); |
4340 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); | 4337 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); |
4341 EXPECT_EQ(1, visitor.zero_length_data_frame_count_); | 4338 EXPECT_EQ(1, visitor.zero_length_data_frame_count_); |
4342 | 4339 |
4343 EXPECT_THAT(visitor.headers_, ElementsAre( | 4340 EXPECT_THAT(visitor.headers_, |
4344 Pair("cookie", "foo=bar; baz=bing; "), | 4341 testing::ElementsAre( |
4345 Pair("name", "value"))); | 4342 testing::Pair("cookie", "foo=bar; baz=bing; "), |
| 4343 testing::Pair("name", "value"))); |
4346 } | 4344 } |
4347 | 4345 |
4348 TEST_P(SpdyFramerTest, ReadPushPromiseWithContinuation) { | 4346 TEST_P(SpdyFramerTest, ReadPushPromiseWithContinuation) { |
4349 if (spdy_version_ <= SPDY3) { | 4347 if (spdy_version_ <= SPDY3) { |
4350 return; | 4348 return; |
4351 } | 4349 } |
4352 | 4350 |
4353 const unsigned char kInput[] = { | 4351 const unsigned char kInput[] = { |
4354 0x00, 0x00, 0x17, 0x05, // PUSH_PROMISE | 4352 0x00, 0x00, 0x17, 0x05, // PUSH_PROMISE |
4355 0x08, 0x00, 0x00, 0x00, // PADDED | 4353 0x08, 0x00, 0x00, 0x00, // PADDED |
(...skipping 26 matching lines...) Expand all Loading... |
4382 TestSpdyVisitor visitor(spdy_version_); | 4380 TestSpdyVisitor visitor(spdy_version_); |
4383 visitor.SimulateInFramer(kInput, sizeof(kInput)); | 4381 visitor.SimulateInFramer(kInput, sizeof(kInput)); |
4384 | 4382 |
4385 EXPECT_EQ(0, visitor.error_count_); | 4383 EXPECT_EQ(0, visitor.error_count_); |
4386 EXPECT_EQ(1u, visitor.last_push_promise_stream_); | 4384 EXPECT_EQ(1u, visitor.last_push_promise_stream_); |
4387 EXPECT_EQ(42u, visitor.last_push_promise_promised_stream_); | 4385 EXPECT_EQ(42u, visitor.last_push_promise_promised_stream_); |
4388 EXPECT_EQ(2, visitor.continuation_count_); | 4386 EXPECT_EQ(2, visitor.continuation_count_); |
4389 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); | 4387 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); |
4390 EXPECT_EQ(0, visitor.zero_length_data_frame_count_); | 4388 EXPECT_EQ(0, visitor.zero_length_data_frame_count_); |
4391 | 4389 |
4392 EXPECT_THAT(visitor.headers_, ElementsAre( | 4390 EXPECT_THAT(visitor.headers_, |
4393 Pair("cookie", "foo=bar; baz=bing; "), | 4391 testing::ElementsAre( |
4394 Pair("name", "value"))); | 4392 testing::Pair("cookie", "foo=bar; baz=bing; "), |
| 4393 testing::Pair("name", "value"))); |
4395 } | 4394 } |
4396 | 4395 |
4397 TEST_P(SpdyFramerTest, ReadContinuationWithWrongStreamId) { | 4396 TEST_P(SpdyFramerTest, ReadContinuationWithWrongStreamId) { |
4398 if (spdy_version_ <= SPDY3) { | 4397 if (spdy_version_ <= SPDY3) { |
4399 return; | 4398 return; |
4400 } | 4399 } |
4401 | 4400 |
4402 const unsigned char kInput[] = { | 4401 const unsigned char kInput[] = { |
4403 0x00, 0x00, 0x10, 0x01, 0x00, // HEADERS | 4402 0x00, 0x00, 0x10, 0x01, 0x00, // HEADERS |
4404 0x00, 0x00, 0x00, 0x01, // Stream 1 | 4403 0x00, 0x00, 0x00, 0x01, // Stream 1 |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4563 }; | 4562 }; |
4564 | 4563 |
4565 TestSpdyVisitor visitor(spdy_version_); | 4564 TestSpdyVisitor visitor(spdy_version_); |
4566 visitor.SimulateInFramer(kInput, sizeof(kInput)); | 4565 visitor.SimulateInFramer(kInput, sizeof(kInput)); |
4567 | 4566 |
4568 // TODO(jgraettinger): Verify END_SEGMENT when support is added. | 4567 // TODO(jgraettinger): Verify END_SEGMENT when support is added. |
4569 EXPECT_EQ(0, visitor.error_count_); | 4568 EXPECT_EQ(0, visitor.error_count_); |
4570 EXPECT_EQ(1, visitor.headers_frame_count_); | 4569 EXPECT_EQ(1, visitor.headers_frame_count_); |
4571 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); | 4570 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); |
4572 | 4571 |
4573 EXPECT_THAT(visitor.headers_, ElementsAre( | 4572 EXPECT_THAT(visitor.headers_, |
4574 Pair("cookie", "foo=bar"))); | 4573 testing::ElementsAre(testing::Pair("cookie", "foo=bar"))); |
4575 } | 4574 } |
4576 | 4575 |
4577 TEST_P(SpdyFramerTest, ReadGarbage) { | 4576 TEST_P(SpdyFramerTest, ReadGarbage) { |
4578 SpdyFramer framer(spdy_version_); | 4577 SpdyFramer framer(spdy_version_); |
4579 unsigned char garbage_frame[256]; | 4578 unsigned char garbage_frame[256]; |
4580 memset(garbage_frame, ~0, sizeof(garbage_frame)); | 4579 memset(garbage_frame, ~0, sizeof(garbage_frame)); |
4581 TestSpdyVisitor visitor(spdy_version_); | 4580 TestSpdyVisitor visitor(spdy_version_); |
4582 visitor.use_compression_ = false; | 4581 visitor.use_compression_ = false; |
4583 visitor.SimulateInFramer(garbage_frame, sizeof(garbage_frame)); | 4582 visitor.SimulateInFramer(garbage_frame, sizeof(garbage_frame)); |
4584 EXPECT_EQ(1, visitor.error_count_); | 4583 EXPECT_EQ(1, visitor.error_count_); |
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4853 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code()) | 4852 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code()) |
4854 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4853 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
4855 } | 4854 } |
4856 } | 4855 } |
4857 | 4856 |
4858 TEST_P(SpdyFramerTest, DataFrameFlagsV2V3) { | 4857 TEST_P(SpdyFramerTest, DataFrameFlagsV2V3) { |
4859 if (spdy_version_ > SPDY3) { | 4858 if (spdy_version_ > SPDY3) { |
4860 return; | 4859 return; |
4861 } | 4860 } |
4862 | 4861 |
4863 for (int flags = 0; flags < 256; ++flags) { | 4862 uint8 flags = 0; |
| 4863 do { |
4864 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 4864 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
4865 | 4865 |
4866 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 4866 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
4867 SpdyFramer framer(spdy_version_); | 4867 SpdyFramer framer(spdy_version_); |
4868 framer.set_visitor(&visitor); | 4868 framer.set_visitor(&visitor); |
4869 | 4869 |
4870 SpdyDataIR data_ir(1, StringPiece("hello", 5)); | 4870 SpdyDataIR data_ir(1, StringPiece("hello", 5)); |
4871 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); | 4871 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); |
4872 SetFrameFlags(frame.get(), flags, spdy_version_); | 4872 SetFrameFlags(frame.get(), flags, spdy_version_); |
4873 | 4873 |
(...skipping 11 matching lines...) Expand all Loading... |
4885 if (flags & ~DATA_FLAG_FIN) { | 4885 if (flags & ~DATA_FLAG_FIN) { |
4886 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | 4886 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
4887 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, | 4887 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, |
4888 framer.error_code()) | 4888 framer.error_code()) |
4889 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4889 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
4890 } else { | 4890 } else { |
4891 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 4891 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
4892 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 4892 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
4893 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4893 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
4894 } | 4894 } |
4895 } | 4895 } while (++flags != 0); |
4896 } | 4896 } |
4897 | 4897 |
4898 TEST_P(SpdyFramerTest, DataFrameFlagsV4) { | 4898 TEST_P(SpdyFramerTest, DataFrameFlagsV4) { |
4899 if (spdy_version_ <= SPDY3) { | 4899 if (spdy_version_ <= SPDY3) { |
4900 return; | 4900 return; |
4901 } | 4901 } |
4902 | 4902 |
4903 uint8 valid_data_flags = DATA_FLAG_FIN | DATA_FLAG_END_SEGMENT | | 4903 uint8 valid_data_flags = DATA_FLAG_FIN | DATA_FLAG_END_SEGMENT | |
4904 DATA_FLAG_PADDED; | 4904 DATA_FLAG_PADDED; |
4905 | 4905 |
4906 for (int flags = 0; flags < 256; ++flags) { | 4906 uint8 flags = 0; |
| 4907 do { |
4907 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 4908 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
4908 | 4909 |
4909 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 4910 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
4910 SpdyFramer framer(spdy_version_); | 4911 SpdyFramer framer(spdy_version_); |
4911 framer.set_visitor(&visitor); | 4912 framer.set_visitor(&visitor); |
4912 | 4913 |
4913 SpdyDataIR data_ir(1, StringPiece("hello", 5)); | 4914 SpdyDataIR data_ir(1, StringPiece("hello", 5)); |
4914 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); | 4915 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); |
4915 SetFrameFlags(frame.get(), flags, spdy_version_); | 4916 SetFrameFlags(frame.get(), flags, spdy_version_); |
4916 | 4917 |
(...skipping 16 matching lines...) Expand all Loading... |
4933 if ((flags & ~valid_data_flags) || (flags & DATA_FLAG_PADDED)) { | 4934 if ((flags & ~valid_data_flags) || (flags & DATA_FLAG_PADDED)) { |
4934 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | 4935 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
4935 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, | 4936 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, |
4936 framer.error_code()) | 4937 framer.error_code()) |
4937 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4938 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
4938 } else { | 4939 } else { |
4939 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 4940 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
4940 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 4941 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
4941 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4942 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
4942 } | 4943 } |
4943 } | 4944 } while (++flags != 0); |
4944 } | 4945 } |
4945 | 4946 |
4946 TEST_P(SpdyFramerTest, SynStreamFrameFlags) { | 4947 TEST_P(SpdyFramerTest, SynStreamFrameFlags) { |
4947 if (!IsSpdy2() && !IsSpdy3()) { | 4948 if (!IsSpdy2() && !IsSpdy3()) { |
4948 // SYN_STREAM not supported in SPDY>3 | 4949 // SYN_STREAM not supported in SPDY>3 |
4949 return; | 4950 return; |
4950 } | 4951 } |
4951 for (int flags = 0; flags < 256; ++flags) { | 4952 uint8 flags = 0; |
| 4953 do { |
4952 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 4954 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
4953 | 4955 |
4954 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 4956 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
4955 testing::StrictMock<test::MockDebugVisitor> debug_visitor; | 4957 testing::StrictMock<test::MockDebugVisitor> debug_visitor; |
4956 SpdyFramer framer(spdy_version_); | 4958 SpdyFramer framer(spdy_version_); |
4957 framer.set_visitor(&visitor); | 4959 framer.set_visitor(&visitor); |
4958 framer.set_debug_visitor(&debug_visitor); | 4960 framer.set_debug_visitor(&debug_visitor); |
4959 | 4961 |
4960 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(8, SYN_STREAM, _, _)); | 4962 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(8, SYN_STREAM, _, _)); |
4961 | 4963 |
4962 SpdySynStreamIR syn_stream(8); | 4964 SpdySynStreamIR syn_stream(8); |
4963 syn_stream.set_associated_to_stream_id(3); | 4965 syn_stream.set_associated_to_stream_id(3); |
4964 syn_stream.set_priority(1); | 4966 syn_stream.set_priority(1); |
4965 syn_stream.SetHeader("foo", "bar"); | 4967 syn_stream.SetHeader("foo", "bar"); |
4966 scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream)); | 4968 scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream)); |
4967 int set_flags = flags; | 4969 SetFrameFlags(frame.get(), flags, spdy_version_); |
4968 SetFrameFlags(frame.get(), set_flags, spdy_version_); | |
4969 | 4970 |
4970 if (flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) { | 4971 if (flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) { |
4971 EXPECT_CALL(visitor, OnError(_)); | 4972 EXPECT_CALL(visitor, OnError(_)); |
4972 } else { | 4973 } else { |
4973 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(8, SYN_STREAM, _)); | 4974 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(8, SYN_STREAM, _)); |
4974 EXPECT_CALL(visitor, OnSynStream(8, 3, 1, flags & CONTROL_FLAG_FIN, | 4975 EXPECT_CALL(visitor, OnSynStream(8, 3, 1, flags & CONTROL_FLAG_FIN, |
4975 flags & CONTROL_FLAG_UNIDIRECTIONAL)); | 4976 flags & CONTROL_FLAG_UNIDIRECTIONAL)); |
4976 EXPECT_CALL(visitor, OnControlFrameHeaderData(8, _, _)) | 4977 EXPECT_CALL(visitor, OnControlFrameHeaderData(8, _, _)) |
4977 .WillRepeatedly(testing::Return(true)); | 4978 .WillRepeatedly(testing::Return(true)); |
4978 if (flags & DATA_FLAG_FIN) { | 4979 if (flags & DATA_FLAG_FIN) { |
4979 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)); | 4980 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)); |
4980 } else { | 4981 } else { |
4981 // Do not close the stream if we are expecting a CONTINUATION frame. | 4982 // Do not close the stream if we are expecting a CONTINUATION frame. |
4982 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)).Times(0); | 4983 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)).Times(0); |
4983 } | 4984 } |
4984 } | 4985 } |
4985 | 4986 |
4986 framer.ProcessInput(frame->data(), frame->size()); | 4987 framer.ProcessInput(frame->data(), frame->size()); |
4987 if (flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) { | 4988 if (flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) { |
4988 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | 4989 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
4989 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, | 4990 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, |
4990 framer.error_code()) | 4991 framer.error_code()) |
4991 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4992 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
4992 } else { | 4993 } else { |
4993 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 4994 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
4994 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 4995 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
4995 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4996 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
4996 } | 4997 } |
4997 } | 4998 } while (++flags != 0); |
4998 } | 4999 } |
4999 | 5000 |
5000 TEST_P(SpdyFramerTest, SynReplyFrameFlags) { | 5001 TEST_P(SpdyFramerTest, SynReplyFrameFlags) { |
5001 if (!IsSpdy2() && !IsSpdy3()) { | 5002 if (!IsSpdy2() && !IsSpdy3()) { |
5002 // SYN_REPLY not supported in SPDY>3 | 5003 // SYN_REPLY not supported in SPDY>3 |
5003 return; | 5004 return; |
5004 } | 5005 } |
5005 for (int flags = 0; flags < 256; ++flags) { | 5006 uint8 flags = 0; |
| 5007 do { |
5006 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 5008 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
5007 | 5009 |
5008 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5010 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
5009 SpdyFramer framer(spdy_version_); | 5011 SpdyFramer framer(spdy_version_); |
5010 framer.set_visitor(&visitor); | 5012 framer.set_visitor(&visitor); |
5011 | 5013 |
5012 SpdySynReplyIR syn_reply(37); | 5014 SpdySynReplyIR syn_reply(37); |
5013 syn_reply.SetHeader("foo", "bar"); | 5015 syn_reply.SetHeader("foo", "bar"); |
5014 scoped_ptr<SpdyFrame> frame(framer.SerializeSynReply(syn_reply)); | 5016 scoped_ptr<SpdyFrame> frame(framer.SerializeSynReply(syn_reply)); |
5015 SetFrameFlags(frame.get(), flags, spdy_version_); | 5017 SetFrameFlags(frame.get(), flags, spdy_version_); |
(...skipping 13 matching lines...) Expand all Loading... |
5029 if (flags & ~CONTROL_FLAG_FIN) { | 5031 if (flags & ~CONTROL_FLAG_FIN) { |
5030 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | 5032 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
5031 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, | 5033 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, |
5032 framer.error_code()) | 5034 framer.error_code()) |
5033 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5035 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5034 } else { | 5036 } else { |
5035 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 5037 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
5036 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5038 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
5037 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5039 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5038 } | 5040 } |
5039 } | 5041 } while (++flags != 0); |
5040 } | 5042 } |
5041 | 5043 |
5042 TEST_P(SpdyFramerTest, RstStreamFrameFlags) { | 5044 TEST_P(SpdyFramerTest, RstStreamFrameFlags) { |
5043 for (int flags = 0; flags < 256; ++flags) { | 5045 uint8 flags = 0; |
| 5046 do { |
5044 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 5047 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
5045 | 5048 |
5046 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5049 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
5047 SpdyFramer framer(spdy_version_); | 5050 SpdyFramer framer(spdy_version_); |
5048 framer.set_visitor(&visitor); | 5051 framer.set_visitor(&visitor); |
5049 | 5052 |
5050 SpdyRstStreamIR rst_stream(13, RST_STREAM_CANCEL, ""); | 5053 SpdyRstStreamIR rst_stream(13, RST_STREAM_CANCEL, ""); |
5051 scoped_ptr<SpdyFrame> frame(framer.SerializeRstStream(rst_stream)); | 5054 scoped_ptr<SpdyFrame> frame(framer.SerializeRstStream(rst_stream)); |
5052 SetFrameFlags(frame.get(), flags, spdy_version_); | 5055 SetFrameFlags(frame.get(), flags, spdy_version_); |
5053 | 5056 |
5054 if (flags != 0) { | 5057 if (flags != 0) { |
5055 EXPECT_CALL(visitor, OnError(_)); | 5058 EXPECT_CALL(visitor, OnError(_)); |
5056 } else { | 5059 } else { |
5057 EXPECT_CALL(visitor, OnRstStream(13, RST_STREAM_CANCEL)); | 5060 EXPECT_CALL(visitor, OnRstStream(13, RST_STREAM_CANCEL)); |
5058 } | 5061 } |
5059 | 5062 |
5060 framer.ProcessInput(frame->data(), frame->size()); | 5063 framer.ProcessInput(frame->data(), frame->size()); |
5061 if (flags != 0) { | 5064 if (flags != 0) { |
5062 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | 5065 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
5063 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, | 5066 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, |
5064 framer.error_code()) | 5067 framer.error_code()) |
5065 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5068 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5066 } else { | 5069 } else { |
5067 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 5070 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
5068 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5071 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
5069 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5072 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5070 } | 5073 } |
5071 } | 5074 } while (++flags != 0); |
5072 } | 5075 } |
5073 | 5076 |
5074 TEST_P(SpdyFramerTest, SettingsFrameFlagsOldFormat) { | 5077 TEST_P(SpdyFramerTest, SettingsFrameFlagsOldFormat) { |
5075 if (spdy_version_ > SPDY3) { return; } | 5078 if (spdy_version_ > SPDY3) { return; } |
5076 for (int flags = 0; flags < 256; ++flags) { | 5079 uint8 flags = 0; |
| 5080 do { |
5077 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 5081 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
5078 | 5082 |
5079 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5083 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
5080 SpdyFramer framer(spdy_version_); | 5084 SpdyFramer framer(spdy_version_); |
5081 framer.set_visitor(&visitor); | 5085 framer.set_visitor(&visitor); |
5082 | 5086 |
5083 SpdySettingsIR settings_ir; | 5087 SpdySettingsIR settings_ir; |
5084 settings_ir.AddSetting(SETTINGS_UPLOAD_BANDWIDTH, | 5088 settings_ir.AddSetting(SETTINGS_UPLOAD_BANDWIDTH, |
5085 false, | 5089 false, |
5086 false, | 5090 false, |
(...skipping 15 matching lines...) Expand all Loading... |
5102 if (flags & ~SETTINGS_FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS) { | 5106 if (flags & ~SETTINGS_FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS) { |
5103 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | 5107 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
5104 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, | 5108 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, |
5105 framer.error_code()) | 5109 framer.error_code()) |
5106 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5110 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5107 } else { | 5111 } else { |
5108 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 5112 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
5109 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5113 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
5110 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5114 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5111 } | 5115 } |
5112 } | 5116 } while (++flags != 0); |
5113 } | 5117 } |
5114 | 5118 |
5115 TEST_P(SpdyFramerTest, SettingsFrameFlags) { | 5119 TEST_P(SpdyFramerTest, SettingsFrameFlags) { |
5116 if (spdy_version_ <= SPDY3) { return; } | 5120 if (spdy_version_ <= SPDY3) { return; } |
5117 for (int flags = 0; flags < 256; ++flags) { | 5121 uint8 flags = 0; |
| 5122 do { |
5118 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 5123 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
5119 | 5124 |
5120 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5125 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
5121 SpdyFramer framer(spdy_version_); | 5126 SpdyFramer framer(spdy_version_); |
5122 framer.set_visitor(&visitor); | 5127 framer.set_visitor(&visitor); |
5123 | 5128 |
5124 SpdySettingsIR settings_ir; | 5129 SpdySettingsIR settings_ir; |
5125 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 0, 0, 16); | 5130 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 0, 0, 16); |
5126 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir)); | 5131 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir)); |
5127 SetFrameFlags(frame.get(), flags, spdy_version_); | 5132 SetFrameFlags(frame.get(), flags, spdy_version_); |
(...skipping 16 matching lines...) Expand all Loading... |
5144 // The frame is invalid because ACK frames should have no payload. | 5149 // The frame is invalid because ACK frames should have no payload. |
5145 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | 5150 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
5146 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, | 5151 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, |
5147 framer.error_code()) | 5152 framer.error_code()) |
5148 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5153 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5149 } else { | 5154 } else { |
5150 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 5155 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
5151 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5156 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
5152 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5157 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5153 } | 5158 } |
5154 } | 5159 } while (++flags != 0); |
5155 } | 5160 } |
5156 | 5161 |
5157 TEST_P(SpdyFramerTest, GoawayFrameFlags) { | 5162 TEST_P(SpdyFramerTest, GoawayFrameFlags) { |
5158 for (int flags = 0; flags < 256; ++flags) { | 5163 uint8 flags = 0; |
| 5164 do { |
5159 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 5165 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
5160 | 5166 |
5161 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5167 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
5162 SpdyFramer framer(spdy_version_); | 5168 SpdyFramer framer(spdy_version_); |
5163 framer.set_visitor(&visitor); | 5169 framer.set_visitor(&visitor); |
5164 | 5170 |
5165 SpdyGoAwayIR goaway_ir(97, GOAWAY_OK, "test"); | 5171 SpdyGoAwayIR goaway_ir(97, GOAWAY_OK, "test"); |
5166 scoped_ptr<SpdyFrame> frame(framer.SerializeGoAway(goaway_ir)); | 5172 scoped_ptr<SpdyFrame> frame(framer.SerializeGoAway(goaway_ir)); |
5167 SetFrameFlags(frame.get(), flags, spdy_version_); | 5173 SetFrameFlags(frame.get(), flags, spdy_version_); |
5168 | 5174 |
5169 if (flags != 0) { | 5175 if (flags != 0) { |
5170 EXPECT_CALL(visitor, OnError(_)); | 5176 EXPECT_CALL(visitor, OnError(_)); |
5171 } else { | 5177 } else { |
5172 EXPECT_CALL(visitor, OnGoAway(97, GOAWAY_OK)); | 5178 EXPECT_CALL(visitor, OnGoAway(97, GOAWAY_OK)); |
5173 } | 5179 } |
5174 | 5180 |
5175 framer.ProcessInput(frame->data(), frame->size()); | 5181 framer.ProcessInput(frame->data(), frame->size()); |
5176 if (flags != 0) { | 5182 if (flags != 0) { |
5177 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | 5183 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
5178 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, | 5184 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, |
5179 framer.error_code()) | 5185 framer.error_code()) |
5180 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5186 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5181 } else { | 5187 } else { |
5182 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 5188 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
5183 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5189 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
5184 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5190 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5185 } | 5191 } |
5186 } | 5192 } while (++flags != 0); |
5187 } | 5193 } |
5188 | 5194 |
5189 TEST_P(SpdyFramerTest, HeadersFrameFlags) { | 5195 TEST_P(SpdyFramerTest, HeadersFrameFlags) { |
5190 for (int flags = 0; flags < 256; ++flags) { | 5196 uint8 flags = 0; |
| 5197 do { |
5191 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 5198 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
5192 | 5199 |
5193 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5200 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
5194 SpdyFramer framer(spdy_version_); | 5201 SpdyFramer framer(spdy_version_); |
5195 framer.set_visitor(&visitor); | 5202 framer.set_visitor(&visitor); |
5196 | 5203 |
5197 SpdyHeadersIR headers_ir(57); | 5204 SpdyHeadersIR headers_ir(57); |
5198 if (IsSpdy4() && (flags & HEADERS_FLAG_PRIORITY)) { | 5205 if (IsSpdy4() && (flags & HEADERS_FLAG_PRIORITY)) { |
5199 headers_ir.set_priority(3); | 5206 headers_ir.set_priority(3); |
5200 headers_ir.set_has_priority(true); | 5207 headers_ir.set_has_priority(true); |
5201 } | 5208 } |
5202 headers_ir.SetHeader("foo", "bar"); | 5209 headers_ir.SetHeader("foo", "bar"); |
5203 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); | 5210 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); |
5204 int set_flags = flags; | 5211 uint8 set_flags = flags; |
5205 if (IsSpdy4()) { | 5212 if (IsSpdy4()) { |
5206 // TODO(jgraettinger): Add padding to SpdyHeadersIR, | 5213 // TODO(jgraettinger): Add padding to SpdyHeadersIR, |
5207 // and implement framing. | 5214 // and implement framing. |
5208 set_flags &= ~HEADERS_FLAG_PADDED; | 5215 set_flags &= ~HEADERS_FLAG_PADDED; |
5209 } | 5216 } |
5210 SetFrameFlags(frame.get(), set_flags, spdy_version_); | 5217 SetFrameFlags(frame.get(), set_flags, spdy_version_); |
5211 | 5218 |
5212 if (!IsSpdy4() && flags & ~CONTROL_FLAG_FIN) { | 5219 if (!IsSpdy4() && flags & ~CONTROL_FLAG_FIN) { |
5213 EXPECT_CALL(visitor, OnError(_)); | 5220 EXPECT_CALL(visitor, OnError(_)); |
5214 } else if (IsSpdy4() && flags & ~(CONTROL_FLAG_FIN | | 5221 } else if (IsSpdy4() && flags & ~(CONTROL_FLAG_FIN | |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5259 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5266 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5260 } else if (IsSpdy4() && ~(flags & HEADERS_FLAG_END_HEADERS)) { | 5267 } else if (IsSpdy4() && ~(flags & HEADERS_FLAG_END_HEADERS)) { |
5261 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 5268 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
5262 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5269 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
5263 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5270 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5264 } else { | 5271 } else { |
5265 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 5272 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
5266 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5273 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
5267 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5274 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5268 } | 5275 } |
5269 } | 5276 } while (++flags != 0); |
5270 } | 5277 } |
5271 | 5278 |
5272 TEST_P(SpdyFramerTest, PingFrameFlags) { | 5279 TEST_P(SpdyFramerTest, PingFrameFlags) { |
5273 for (int flags = 0; flags < 256; ++flags) { | 5280 uint8 flags = 0; |
| 5281 do { |
5274 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 5282 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
5275 | 5283 |
5276 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5284 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
5277 SpdyFramer framer(spdy_version_); | 5285 SpdyFramer framer(spdy_version_); |
5278 framer.set_visitor(&visitor); | 5286 framer.set_visitor(&visitor); |
5279 | 5287 |
5280 scoped_ptr<SpdyFrame> frame(framer.SerializePing(SpdyPingIR(42))); | 5288 scoped_ptr<SpdyFrame> frame(framer.SerializePing(SpdyPingIR(42))); |
5281 SetFrameFlags(frame.get(), flags, spdy_version_); | 5289 SetFrameFlags(frame.get(), flags, spdy_version_); |
5282 | 5290 |
5283 if (spdy_version_ > SPDY3 && | 5291 if (spdy_version_ > SPDY3 && |
(...skipping 10 matching lines...) Expand all Loading... |
5294 flags == 0) { | 5302 flags == 0) { |
5295 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 5303 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
5296 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5304 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
5297 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5305 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5298 } else { | 5306 } else { |
5299 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | 5307 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
5300 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, | 5308 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, |
5301 framer.error_code()) | 5309 framer.error_code()) |
5302 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5310 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5303 } | 5311 } |
5304 } | 5312 } while (++flags != 0); |
5305 } | 5313 } |
5306 | 5314 |
5307 TEST_P(SpdyFramerTest, WindowUpdateFrameFlags) { | 5315 TEST_P(SpdyFramerTest, WindowUpdateFrameFlags) { |
5308 for (int flags = 0; flags < 256; ++flags) { | 5316 uint8 flags = 0; |
| 5317 do { |
5309 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 5318 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
5310 | 5319 |
5311 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5320 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
5312 SpdyFramer framer(spdy_version_); | 5321 SpdyFramer framer(spdy_version_); |
5313 framer.set_visitor(&visitor); | 5322 framer.set_visitor(&visitor); |
5314 | 5323 |
5315 scoped_ptr<SpdyFrame> frame(framer.SerializeWindowUpdate( | 5324 scoped_ptr<SpdyFrame> frame(framer.SerializeWindowUpdate( |
5316 SpdyWindowUpdateIR(4, 1024))); | 5325 SpdyWindowUpdateIR(4, 1024))); |
5317 SetFrameFlags(frame.get(), flags, spdy_version_); | 5326 SetFrameFlags(frame.get(), flags, spdy_version_); |
5318 | 5327 |
5319 if (flags != 0) { | 5328 if (flags != 0) { |
5320 EXPECT_CALL(visitor, OnError(_)); | 5329 EXPECT_CALL(visitor, OnError(_)); |
5321 } else { | 5330 } else { |
5322 EXPECT_CALL(visitor, OnWindowUpdate(4, 1024)); | 5331 EXPECT_CALL(visitor, OnWindowUpdate(4, 1024)); |
5323 } | 5332 } |
5324 | 5333 |
5325 framer.ProcessInput(frame->data(), frame->size()); | 5334 framer.ProcessInput(frame->data(), frame->size()); |
5326 if (flags != 0) { | 5335 if (flags != 0) { |
5327 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | 5336 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
5328 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, | 5337 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, |
5329 framer.error_code()) | 5338 framer.error_code()) |
5330 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5339 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5331 } else { | 5340 } else { |
5332 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 5341 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
5333 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5342 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
5334 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5343 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5335 } | 5344 } |
5336 } | 5345 } while (++flags != 0); |
5337 } | 5346 } |
5338 | 5347 |
5339 TEST_P(SpdyFramerTest, PushPromiseFrameFlags) { | 5348 TEST_P(SpdyFramerTest, PushPromiseFrameFlags) { |
5340 if (spdy_version_ <= SPDY3) { | 5349 if (spdy_version_ <= SPDY3) { |
5341 return; | 5350 return; |
5342 } | 5351 } |
5343 | 5352 |
5344 for (int flags = 0; flags < 256; ++flags) { | 5353 uint8 flags = 0; |
| 5354 do { |
5345 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 5355 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
5346 | 5356 |
5347 testing::StrictMock<net::test::MockSpdyFramerVisitor> visitor; | 5357 testing::StrictMock<net::test::MockSpdyFramerVisitor> visitor; |
5348 testing::StrictMock<net::test::MockDebugVisitor> debug_visitor; | 5358 testing::StrictMock<net::test::MockDebugVisitor> debug_visitor; |
5349 SpdyFramer framer(spdy_version_); | 5359 SpdyFramer framer(spdy_version_); |
5350 framer.set_visitor(&visitor); | 5360 framer.set_visitor(&visitor); |
5351 framer.set_debug_visitor(&debug_visitor); | 5361 framer.set_debug_visitor(&debug_visitor); |
5352 | 5362 |
5353 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(42, PUSH_PROMISE, _, _)); | 5363 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(42, PUSH_PROMISE, _, _)); |
5354 | 5364 |
5355 SpdyPushPromiseIR push_promise(42, 57); | 5365 SpdyPushPromiseIR push_promise(42, 57); |
5356 push_promise.SetHeader("foo", "bar"); | 5366 push_promise.SetHeader("foo", "bar"); |
5357 scoped_ptr<SpdySerializedFrame> frame( | 5367 scoped_ptr<SpdySerializedFrame> frame( |
5358 framer.SerializePushPromise(push_promise)); | 5368 framer.SerializePushPromise(push_promise)); |
5359 // TODO(jgraettinger): Add padding to SpdyPushPromiseIR, | 5369 // TODO(jgraettinger): Add padding to SpdyPushPromiseIR, |
5360 // and implement framing. | 5370 // and implement framing. |
5361 int set_flags = flags & ~HEADERS_FLAG_PADDED; | 5371 SetFrameFlags(frame.get(), flags & ~HEADERS_FLAG_PADDED, spdy_version_); |
5362 SetFrameFlags(frame.get(), set_flags, spdy_version_); | |
5363 | 5372 |
5364 if (flags & ~(PUSH_PROMISE_FLAG_END_PUSH_PROMISE | HEADERS_FLAG_PADDED)) { | 5373 if (flags & ~(PUSH_PROMISE_FLAG_END_PUSH_PROMISE | HEADERS_FLAG_PADDED)) { |
5365 EXPECT_CALL(visitor, OnError(_)); | 5374 EXPECT_CALL(visitor, OnError(_)); |
5366 } else { | 5375 } else { |
5367 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, PUSH_PROMISE, _)); | 5376 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, PUSH_PROMISE, _)); |
5368 EXPECT_CALL(visitor, OnPushPromise(42, 57, | 5377 EXPECT_CALL(visitor, OnPushPromise(42, 57, |
5369 flags & PUSH_PROMISE_FLAG_END_PUSH_PROMISE)); | 5378 flags & PUSH_PROMISE_FLAG_END_PUSH_PROMISE)); |
5370 EXPECT_CALL(visitor, OnControlFrameHeaderData(42, _, _)) | 5379 EXPECT_CALL(visitor, OnControlFrameHeaderData(42, _, _)) |
5371 .WillRepeatedly(testing::Return(true)); | 5380 .WillRepeatedly(testing::Return(true)); |
5372 } | 5381 } |
5373 | 5382 |
5374 framer.ProcessInput(frame->data(), frame->size()); | 5383 framer.ProcessInput(frame->data(), frame->size()); |
5375 if (flags & ~(PUSH_PROMISE_FLAG_END_PUSH_PROMISE | HEADERS_FLAG_PADDED)) { | 5384 if (flags & ~(PUSH_PROMISE_FLAG_END_PUSH_PROMISE | HEADERS_FLAG_PADDED)) { |
5376 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | 5385 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
5377 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, | 5386 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, |
5378 framer.error_code()) | 5387 framer.error_code()) |
5379 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5388 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5380 } else { | 5389 } else { |
5381 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 5390 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
5382 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5391 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
5383 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5392 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5384 } | 5393 } |
5385 } | 5394 } while (++flags != 0); |
5386 } | 5395 } |
5387 | 5396 |
5388 TEST_P(SpdyFramerTest, ContinuationFrameFlags) { | 5397 TEST_P(SpdyFramerTest, ContinuationFrameFlags) { |
5389 if (spdy_version_ <= SPDY3) { | 5398 if (spdy_version_ <= SPDY3) { |
5390 return; | 5399 return; |
5391 } | 5400 } |
5392 | 5401 |
5393 for (int flags = 0; flags < 256; ++flags) { | 5402 uint8 flags = 0; |
| 5403 do { |
5394 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 5404 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
5395 | 5405 |
5396 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5406 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
5397 testing::StrictMock<net::test::MockDebugVisitor> debug_visitor; | 5407 testing::StrictMock<net::test::MockDebugVisitor> debug_visitor; |
5398 SpdyFramer framer(spdy_version_); | 5408 SpdyFramer framer(spdy_version_); |
5399 framer.set_visitor(&visitor); | 5409 framer.set_visitor(&visitor); |
5400 framer.set_debug_visitor(&debug_visitor); | 5410 framer.set_debug_visitor(&debug_visitor); |
5401 | 5411 |
5402 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(42, HEADERS, _, _)); | 5412 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(42, HEADERS, _, _)); |
5403 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, HEADERS, _)); | 5413 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, HEADERS, _)); |
(...skipping 27 matching lines...) Expand all Loading... |
5431 if (flags & ~(HEADERS_FLAG_END_HEADERS)) { | 5441 if (flags & ~(HEADERS_FLAG_END_HEADERS)) { |
5432 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | 5442 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
5433 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, | 5443 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, |
5434 framer.error_code()) | 5444 framer.error_code()) |
5435 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5445 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5436 } else { | 5446 } else { |
5437 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 5447 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
5438 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5448 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
5439 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5449 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5440 } | 5450 } |
5441 } | 5451 } while (++flags != 0); |
5442 } | 5452 } |
5443 | 5453 |
5444 // TODO(mlavan): Add TEST_P(SpdyFramerTest, AltSvcFrameFlags) | 5454 // TODO(mlavan): Add TEST_P(SpdyFramerTest, AltSvcFrameFlags) |
5445 | 5455 |
5446 // TODO(hkhalil): Add TEST_P(SpdyFramerTest, BlockedFrameFlags) | 5456 // TODO(hkhalil): Add TEST_P(SpdyFramerTest, BlockedFrameFlags) |
5447 | 5457 |
5448 TEST_P(SpdyFramerTest, EmptySynStream) { | 5458 TEST_P(SpdyFramerTest, EmptySynStream) { |
5449 if (!IsSpdy2() && !IsSpdy3()) { | 5459 if (!IsSpdy2() && !IsSpdy3()) { |
5450 // SYN_STREAM not supported in SPDY>3. | 5460 // SYN_STREAM not supported in SPDY>3. |
5451 return; | 5461 return; |
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5835 | 5845 |
5836 scoped_ptr<SpdyFrame> control_frame(framer.SerializeAltSvc(altsvc_ir)); | 5846 scoped_ptr<SpdyFrame> control_frame(framer.SerializeAltSvc(altsvc_ir)); |
5837 TestSpdyVisitor visitor(spdy_version_); | 5847 TestSpdyVisitor visitor(spdy_version_); |
5838 visitor.use_compression_ = false; | 5848 visitor.use_compression_ = false; |
5839 | 5849 |
5840 // Read data in small chunks. | 5850 // Read data in small chunks. |
5841 size_t framed_data = 0; | 5851 size_t framed_data = 0; |
5842 size_t unframed_data = control_frame->size(); | 5852 size_t unframed_data = control_frame->size(); |
5843 size_t kReadChunkSize = 5; // Read five bytes at a time. | 5853 size_t kReadChunkSize = 5; // Read five bytes at a time. |
5844 while (unframed_data > 0) { | 5854 while (unframed_data > 0) { |
5845 size_t to_read = min(kReadChunkSize, unframed_data); | 5855 size_t to_read = std::min(kReadChunkSize, unframed_data); |
5846 visitor.SimulateInFramer( | 5856 visitor.SimulateInFramer( |
5847 reinterpret_cast<unsigned char*>(control_frame->data() + framed_data), | 5857 reinterpret_cast<unsigned char*>(control_frame->data() + framed_data), |
5848 to_read); | 5858 to_read); |
5849 unframed_data -= to_read; | 5859 unframed_data -= to_read; |
5850 framed_data += to_read; | 5860 framed_data += to_read; |
5851 } | 5861 } |
5852 EXPECT_EQ(0, visitor.error_count_); | 5862 EXPECT_EQ(0, visitor.error_count_); |
5853 EXPECT_EQ(1, visitor.altsvc_count_); | 5863 EXPECT_EQ(1, visitor.altsvc_count_); |
5854 EXPECT_EQ(20u, visitor.test_altsvc_ir_.max_age()); | 5864 EXPECT_EQ(20u, visitor.test_altsvc_ir_.max_age()); |
5855 EXPECT_EQ(443u, visitor.test_altsvc_ir_.port()); | 5865 EXPECT_EQ(443u, visitor.test_altsvc_ir_.port()); |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5925 TestSpdyVisitor visitor(spdy_version_); | 5935 TestSpdyVisitor visitor(spdy_version_); |
5926 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); | 5936 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); |
5927 | 5937 |
5928 EXPECT_EQ(SpdyFramer::SPDY_ERROR, visitor.framer_.state()); | 5938 EXPECT_EQ(SpdyFramer::SPDY_ERROR, visitor.framer_.state()); |
5929 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, | 5939 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, |
5930 visitor.framer_.error_code()) | 5940 visitor.framer_.error_code()) |
5931 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); | 5941 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); |
5932 } | 5942 } |
5933 | 5943 |
5934 } // namespace net | 5944 } // namespace net |
OLD | NEW |