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/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "net/spdy/spdy_framer.h" | 10 #include "net/spdy/spdy_framer.h" |
(...skipping 21 matching lines...) Expand all Loading... |
32 MOCK_METHOD3(OnControlFrameHeaderData, bool(SpdyStreamId stream_id, | 32 MOCK_METHOD3(OnControlFrameHeaderData, bool(SpdyStreamId stream_id, |
33 const char* header_data, | 33 const char* header_data, |
34 size_t len)); | 34 size_t len)); |
35 MOCK_METHOD2(OnCredentialFrameData, bool(const char* header_data, | 35 MOCK_METHOD2(OnCredentialFrameData, bool(const char* header_data, |
36 size_t len)); | 36 size_t len)); |
37 MOCK_METHOD1(OnDataFrameHeader, void(const SpdyDataFrame* frame)); | 37 MOCK_METHOD1(OnDataFrameHeader, void(const SpdyDataFrame* frame)); |
38 MOCK_METHOD3(OnStreamFrameData, void(SpdyStreamId stream_id, | 38 MOCK_METHOD3(OnStreamFrameData, void(SpdyStreamId stream_id, |
39 const char* data, | 39 const char* data, |
40 size_t len)); | 40 size_t len)); |
41 MOCK_METHOD3(OnSetting, void(SpdySettingsIds id, uint8 flags, uint32 value)); | 41 MOCK_METHOD3(OnSetting, void(SpdySettingsIds id, uint8 flags, uint32 value)); |
| 42 MOCK_METHOD2(OnControlFrameCompressed, |
| 43 void(const SpdyControlFrame& uncompressed_frame, |
| 44 const SpdyControlFrame& compressed_frame)); |
42 }; | 45 }; |
43 | 46 |
44 class SpdyFramerTestUtil { | 47 class SpdyFramerTestUtil { |
45 public: | 48 public: |
46 // Decompress a single frame using the decompression context held by | 49 // Decompress a single frame using the decompression context held by |
47 // the SpdyFramer. The implemention is meant for use only in tests | 50 // the SpdyFramer. The implemention is meant for use only in tests |
48 // and will CHECK fail if the input is anything other than a single, | 51 // and will CHECK fail if the input is anything other than a single, |
49 // well-formed compressed frame. | 52 // well-formed compressed frame. |
50 // | 53 // |
51 // Returns a new decompressed SpdyFrame. | 54 // Returns a new decompressed SpdyFrame. |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 LOG(FATAL) << "Unexpected data frame header"; | 128 LOG(FATAL) << "Unexpected data frame header"; |
126 } | 129 } |
127 virtual void OnStreamFrameData(SpdyStreamId stream_id, | 130 virtual void OnStreamFrameData(SpdyStreamId stream_id, |
128 const char* data, | 131 const char* data, |
129 size_t len) { | 132 size_t len) { |
130 LOG(FATAL); | 133 LOG(FATAL); |
131 } | 134 } |
132 virtual void OnSetting(SpdySettingsIds id, uint8 flags, uint32 value) { | 135 virtual void OnSetting(SpdySettingsIds id, uint8 flags, uint32 value) { |
133 LOG(FATAL); | 136 LOG(FATAL); |
134 } | 137 } |
| 138 virtual void OnControlFrameCompressed( |
| 139 const SpdyControlFrame& uncompressed_frame, |
| 140 const SpdyControlFrame& compressed_frame) { |
| 141 } |
135 | 142 |
136 char* ReleaseBuffer() { | 143 char* ReleaseBuffer() { |
137 CHECK(finished_); | 144 CHECK(finished_); |
138 return buffer_.release(); | 145 return buffer_.release(); |
139 } | 146 } |
140 | 147 |
141 size_t size() const { | 148 size_t size() const { |
142 CHECK(finished_); | 149 CHECK(finished_); |
143 return size_; | 150 return size_; |
144 } | 151 } |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 DLOG(FATAL); // Error! | 322 DLOG(FATAL); // Error! |
316 } | 323 } |
317 if (frame->flags() & CONTROL_FLAG_FIN) | 324 if (frame->flags() & CONTROL_FLAG_FIN) |
318 ++fin_flag_count_; | 325 ++fin_flag_count_; |
319 } | 326 } |
320 | 327 |
321 virtual void OnSetting(SpdySettingsIds id, uint8 flags, uint32 value) { | 328 virtual void OnSetting(SpdySettingsIds id, uint8 flags, uint32 value) { |
322 setting_count_++; | 329 setting_count_++; |
323 } | 330 } |
324 | 331 |
| 332 virtual void OnControlFrameCompressed( |
| 333 const SpdyControlFrame& uncompressed_frame, |
| 334 const SpdyControlFrame& compressed_frame) { |
| 335 } |
| 336 |
325 bool OnControlFrameHeaderData(SpdyStreamId stream_id, | 337 bool OnControlFrameHeaderData(SpdyStreamId stream_id, |
326 const char* header_data, | 338 const char* header_data, |
327 size_t len) { | 339 size_t len) { |
328 ++control_frame_header_data_count_; | 340 ++control_frame_header_data_count_; |
329 CHECK_EQ(header_stream_id_, stream_id); | 341 CHECK_EQ(header_stream_id_, stream_id); |
330 if (len == 0) { | 342 if (len == 0) { |
331 ++zero_length_control_frame_header_data_count_; | 343 ++zero_length_control_frame_header_data_count_; |
332 // Indicates end-of-header-block. | 344 // Indicates end-of-header-block. |
333 CHECK(header_buffer_valid_); | 345 CHECK(header_buffer_valid_); |
334 bool parsed_headers = framer_.ParseHeaderBlockInBuffer( | 346 bool parsed_headers = framer_.ParseHeaderBlockInBuffer( |
(...skipping 2678 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3013 } | 3025 } |
3014 } | 3026 } |
3015 | 3027 |
3016 TEST_P(SpdyFramerTest, EmptySynStream) { | 3028 TEST_P(SpdyFramerTest, EmptySynStream) { |
3017 SpdyHeaderBlock headers; | 3029 SpdyHeaderBlock headers; |
3018 | 3030 |
3019 testing::StrictMock<test::MockVisitor> visitor; | 3031 testing::StrictMock<test::MockVisitor> visitor; |
3020 SpdyFramer framer(spdy_version_); | 3032 SpdyFramer framer(spdy_version_); |
3021 framer.set_visitor(&visitor); | 3033 framer.set_visitor(&visitor); |
3022 | 3034 |
| 3035 EXPECT_CALL(visitor, OnControlFrameCompressed(_, _)); |
3023 scoped_ptr<SpdySynStreamControlFrame> | 3036 scoped_ptr<SpdySynStreamControlFrame> |
3024 frame(framer.CreateSynStream(1, 0, 1, 0, CONTROL_FLAG_NONE, true, | 3037 frame(framer.CreateSynStream(1, 0, 1, 0, CONTROL_FLAG_NONE, true, |
3025 &headers)); | 3038 &headers)); |
3026 // Adjust size to remove the name/value block. | 3039 // Adjust size to remove the name/value block. |
3027 frame->set_length( | 3040 frame->set_length( |
3028 SpdySynStreamControlFrame::size() - SpdyFrame::kHeaderSize); | 3041 SpdySynStreamControlFrame::size() - SpdyFrame::kHeaderSize); |
3029 | 3042 |
3030 EXPECT_CALL(visitor, OnControl(_)); | 3043 EXPECT_CALL(visitor, OnControl(_)); |
3031 EXPECT_CALL(visitor, OnControlFrameHeaderData(1, NULL, 0)); | 3044 EXPECT_CALL(visitor, OnControlFrameHeaderData(1, NULL, 0)); |
3032 | 3045 |
3033 size_t frame_size = frame->length() + SpdyFrame::kHeaderSize; | 3046 size_t frame_size = frame->length() + SpdyFrame::kHeaderSize; |
3034 framer.ProcessInput(frame->data(), frame_size); | 3047 framer.ProcessInput(frame->data(), frame_size); |
3035 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 3048 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
3036 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()); | 3049 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()); |
3037 } | 3050 } |
3038 | 3051 |
3039 TEST_P(SpdyFramerTest, SettingsFlagsAndId) { | 3052 TEST_P(SpdyFramerTest, SettingsFlagsAndId) { |
3040 const uint32 kId = 0x020304; | 3053 const uint32 kId = 0x020304; |
3041 const uint32 kFlags = 0x01; | 3054 const uint32 kFlags = 0x01; |
3042 const uint32 kWireFormat = htonl(IsSpdy2() ? 0x04030201 : 0x01020304); | 3055 const uint32 kWireFormat = htonl(IsSpdy2() ? 0x04030201 : 0x01020304); |
3043 | 3056 |
3044 SettingsFlagsAndId id_and_flags = | 3057 SettingsFlagsAndId id_and_flags = |
3045 SettingsFlagsAndId::FromWireFormat(spdy_version_, kWireFormat); | 3058 SettingsFlagsAndId::FromWireFormat(spdy_version_, kWireFormat); |
3046 EXPECT_EQ(kId, id_and_flags.id()); | 3059 EXPECT_EQ(kId, id_and_flags.id()); |
3047 EXPECT_EQ(kFlags, id_and_flags.flags()); | 3060 EXPECT_EQ(kFlags, id_and_flags.flags()); |
3048 EXPECT_EQ(kWireFormat, id_and_flags.GetWireFormat(spdy_version_)); | 3061 EXPECT_EQ(kWireFormat, id_and_flags.GetWireFormat(spdy_version_)); |
3049 } | 3062 } |
3050 | 3063 |
3051 } // namespace net | 3064 } // namespace net |
OLD | NEW |