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 "net/spdy/buffered_spdy_framer.h" | 5 #include "net/spdy/buffered_spdy_framer.h" |
6 | 6 |
7 #include "net/spdy/spdy_test_util_spdy2.h" | 7 #include "net/spdy/spdy_test_util_spdy2.h" |
8 #include "testing/platform_test.h" | 8 #include "testing/platform_test.h" |
9 | 9 |
10 using namespace net::test_spdy2; | 10 using namespace net::test_spdy2; |
11 | 11 |
12 namespace spdy { | 12 namespace spdy { |
13 | 13 |
14 namespace { | 14 namespace { |
15 | 15 |
16 class TestBufferedSpdyVisitor : public BufferedSpdyFramerVisitorInterface { | 16 class TestBufferedSpdyVisitor : public BufferedSpdyFramerVisitorInterface { |
17 public: | 17 public: |
18 TestBufferedSpdyVisitor() | 18 TestBufferedSpdyVisitor() |
19 : buffered_spdy_framer_(2), | 19 : buffered_spdy_framer_(2), |
20 error_count_(0), | 20 error_count_(0), |
| 21 setting_count_(0), |
21 syn_frame_count_(0), | 22 syn_frame_count_(0), |
22 syn_reply_frame_count_(0), | 23 syn_reply_frame_count_(0), |
23 headers_frame_count_(0), | 24 headers_frame_count_(0), |
24 header_stream_id_(-1) { | 25 header_stream_id_(-1) { |
25 } | 26 } |
26 | 27 |
27 void OnError(int error_code) { | 28 void OnError(int error_code) { |
28 LOG(INFO) << "SpdyFramer Error: " << error_code; | 29 LOG(INFO) << "SpdyFramer Error: " << error_code; |
29 error_count_++; | 30 error_count_++; |
30 } | 31 } |
(...skipping 28 matching lines...) Expand all Loading... |
59 headers_frame_count_++; | 60 headers_frame_count_++; |
60 headers_ = *headers; | 61 headers_ = *headers; |
61 } | 62 } |
62 | 63 |
63 void OnStreamFrameData(SpdyStreamId stream_id, | 64 void OnStreamFrameData(SpdyStreamId stream_id, |
64 const char* data, | 65 const char* data, |
65 size_t len) { | 66 size_t len) { |
66 LOG(FATAL) << "Unexpected OnStreamFrameData call."; | 67 LOG(FATAL) << "Unexpected OnStreamFrameData call."; |
67 } | 68 } |
68 | 69 |
| 70 void OnSetting(SpdySettingsIds id, uint8 flags, uint32 value) { |
| 71 setting_count_++; |
| 72 } |
| 73 |
69 bool OnCredentialFrameData(const char*, size_t) { | 74 bool OnCredentialFrameData(const char*, size_t) { |
70 LOG(FATAL) << "Unexpected OnCredentialFrameData call."; | 75 LOG(FATAL) << "Unexpected OnCredentialFrameData call."; |
71 return false; | 76 return false; |
72 } | 77 } |
73 | 78 |
74 void OnDataFrameHeader(const SpdyDataFrame* frame) { | 79 void OnDataFrameHeader(const SpdyDataFrame* frame) { |
75 LOG(FATAL) << "Unexpected OnDataFrameHeader call."; | 80 LOG(FATAL) << "Unexpected OnDataFrameHeader call."; |
76 } | 81 } |
77 | 82 |
78 void OnControl(const SpdyControlFrame* frame) { | 83 void OnControl(const SpdyControlFrame* frame) { |
79 uint32 type = frame->type(); | 84 uint32 type = frame->type(); |
80 switch (type) { | 85 switch (type) { |
81 case SYN_STREAM: | 86 case SYN_STREAM: |
82 case SYN_REPLY: | 87 case SYN_REPLY: |
83 case HEADERS: | 88 case HEADERS: |
84 header_stream_id_ = SpdyFramer::GetControlFrameStreamId(frame); | 89 header_stream_id_ = SpdyFramer::GetControlFrameStreamId(frame); |
85 EXPECT_NE(header_stream_id_, SpdyFramer::kInvalidStream); | 90 EXPECT_NE(header_stream_id_, SpdyFramer::kInvalidStream); |
86 buffered_spdy_framer_.OnControl(frame); | 91 buffered_spdy_framer_.OnControl(frame); |
87 break; | 92 break; |
88 default: | 93 default: |
89 LOG(FATAL) << "Unexpected frame type." << type; | 94 LOG(FATAL) << "Unexpected frame type." << type; |
90 } | 95 } |
91 } | 96 } |
92 | 97 |
93 void OnRstStream(const spdy::SpdyRstStreamControlFrame& frame) {} | 98 void OnRstStream(const spdy::SpdyRstStreamControlFrame& frame) {} |
94 void OnGoAway(const spdy::SpdyGoAwayControlFrame& frame) {} | 99 void OnGoAway(const spdy::SpdyGoAwayControlFrame& frame) {} |
95 void OnPing(const spdy::SpdyPingControlFrame& frame) {} | 100 void OnPing(const spdy::SpdyPingControlFrame& frame) {} |
96 void OnSettings(const spdy::SpdySettingsControlFrame& frame) {} | |
97 void OnWindowUpdate(const spdy::SpdyWindowUpdateControlFrame& frame) {} | 101 void OnWindowUpdate(const spdy::SpdyWindowUpdateControlFrame& frame) {} |
98 void OnCredential(const spdy::SpdyCredentialControlFrame& frame) {} | 102 void OnCredential(const spdy::SpdyCredentialControlFrame& frame) {} |
99 | 103 |
100 // Convenience function which runs a framer simulation with particular input. | 104 // Convenience function which runs a framer simulation with particular input. |
101 void SimulateInFramer(const unsigned char* input, size_t size) { | 105 void SimulateInFramer(const unsigned char* input, size_t size) { |
102 buffered_spdy_framer_.set_visitor(this); | 106 buffered_spdy_framer_.set_visitor(this); |
103 size_t input_remaining = size; | 107 size_t input_remaining = size; |
104 const char* input_ptr = reinterpret_cast<const char*>(input); | 108 const char* input_ptr = reinterpret_cast<const char*>(input); |
105 while (input_remaining > 0 && | 109 while (input_remaining > 0 && |
106 buffered_spdy_framer_.error_code() == SpdyFramer::SPDY_NO_ERROR) { | 110 buffered_spdy_framer_.error_code() == SpdyFramer::SPDY_NO_ERROR) { |
107 // To make the tests more interesting, we feed random (amd small) chunks | 111 // To make the tests more interesting, we feed random (amd small) chunks |
108 // into the framer. This simulates getting strange-sized reads from | 112 // into the framer. This simulates getting strange-sized reads from |
109 // the socket. | 113 // the socket. |
110 const size_t kMaxReadSize = 32; | 114 const size_t kMaxReadSize = 32; |
111 size_t bytes_read = | 115 size_t bytes_read = |
112 (rand() % std::min(input_remaining, kMaxReadSize)) + 1; | 116 (rand() % std::min(input_remaining, kMaxReadSize)) + 1; |
113 size_t bytes_processed = | 117 size_t bytes_processed = |
114 buffered_spdy_framer_.ProcessInput(input_ptr, bytes_read); | 118 buffered_spdy_framer_.ProcessInput(input_ptr, bytes_read); |
115 input_remaining -= bytes_processed; | 119 input_remaining -= bytes_processed; |
116 input_ptr += bytes_processed; | 120 input_ptr += bytes_processed; |
117 if (buffered_spdy_framer_.state() == SpdyFramer::SPDY_DONE) | 121 if (buffered_spdy_framer_.state() == SpdyFramer::SPDY_DONE) |
118 buffered_spdy_framer_.Reset(); | 122 buffered_spdy_framer_.Reset(); |
119 } | 123 } |
120 } | 124 } |
121 | 125 |
122 BufferedSpdyFramer buffered_spdy_framer_; | 126 BufferedSpdyFramer buffered_spdy_framer_; |
123 | 127 |
124 // Counters from the visitor callbacks. | 128 // Counters from the visitor callbacks. |
125 int error_count_; | 129 int error_count_; |
| 130 int setting_count_; |
126 int syn_frame_count_; | 131 int syn_frame_count_; |
127 int syn_reply_frame_count_; | 132 int syn_reply_frame_count_; |
128 int headers_frame_count_; | 133 int headers_frame_count_; |
129 | 134 |
130 // Header block streaming state: | 135 // Header block streaming state: |
131 SpdyStreamId header_stream_id_; | 136 SpdyStreamId header_stream_id_; |
132 | 137 |
133 // Headers from OnSyn, OnSynReply and OnHeaders for verification. | 138 // Headers from OnSyn, OnSynReply and OnHeaders for verification. |
134 SpdyHeaderBlock headers_; | 139 SpdyHeaderBlock headers_; |
135 }; | 140 }; |
(...skipping 27 matching lines...) Expand all Loading... |
163 << "' to have a value of '" << it->second | 168 << "' to have a value of '" << it->second |
164 << "'. The actual value received was '" << it2->second | 169 << "'. The actual value received was '" << it2->second |
165 << "'."; | 170 << "'."; |
166 return false; | 171 return false; |
167 } | 172 } |
168 } | 173 } |
169 return true; | 174 return true; |
170 } | 175 } |
171 }; | 176 }; |
172 | 177 |
| 178 TEST_F(BufferedSpdyFramerSpdy2Test, OnSetting) { |
| 179 EnableCompression(false); |
| 180 |
| 181 SpdyFramer framer(2); |
| 182 SpdySettings settings; |
| 183 settings.push_back(SpdySetting(SettingsFlagsAndId(0, 1), 0x00000002)); |
| 184 settings.push_back(SpdySetting(SettingsFlagsAndId(0, 1), 0x00000003)); |
| 185 |
| 186 scoped_ptr<SpdyFrame> control_frame(framer.CreateSettings(settings)); |
| 187 TestBufferedSpdyVisitor visitor; |
| 188 |
| 189 visitor.SimulateInFramer( |
| 190 reinterpret_cast<unsigned char*>(control_frame->data()), |
| 191 control_frame->length() + SpdyControlFrame::kHeaderSize); |
| 192 EXPECT_EQ(1, visitor.error_count_); |
| 193 EXPECT_EQ(1, visitor.setting_count_); |
| 194 } |
| 195 |
173 TEST_F(BufferedSpdyFramerSpdy2Test, ReadSynStreamHeaderBlock) { | 196 TEST_F(BufferedSpdyFramerSpdy2Test, ReadSynStreamHeaderBlock) { |
174 EnableCompression(false); | 197 EnableCompression(false); |
175 | 198 |
176 SpdyHeaderBlock headers; | 199 SpdyHeaderBlock headers; |
177 headers["aa"] = "vv"; | 200 headers["aa"] = "vv"; |
178 headers["bb"] = "ww"; | 201 headers["bb"] = "ww"; |
179 BufferedSpdyFramer framer(2); | 202 BufferedSpdyFramer framer(2); |
180 scoped_ptr<SpdySynStreamControlFrame> control_frame( | 203 scoped_ptr<SpdySynStreamControlFrame> control_frame( |
181 framer.CreateSynStream(1, // stream_id | 204 framer.CreateSynStream(1, // stream_id |
182 0, // associated_stream_id | 205 0, // associated_stream_id |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
240 visitor.SimulateInFramer( | 263 visitor.SimulateInFramer( |
241 reinterpret_cast<unsigned char*>(control_frame.get()->data()), | 264 reinterpret_cast<unsigned char*>(control_frame.get()->data()), |
242 control_frame.get()->length() + SpdyControlFrame::kHeaderSize); | 265 control_frame.get()->length() + SpdyControlFrame::kHeaderSize); |
243 EXPECT_EQ(0, visitor.error_count_); | 266 EXPECT_EQ(0, visitor.error_count_); |
244 EXPECT_EQ(0, visitor.syn_frame_count_); | 267 EXPECT_EQ(0, visitor.syn_frame_count_); |
245 EXPECT_EQ(0, visitor.syn_reply_frame_count_); | 268 EXPECT_EQ(0, visitor.syn_reply_frame_count_); |
246 EXPECT_EQ(1, visitor.headers_frame_count_); | 269 EXPECT_EQ(1, visitor.headers_frame_count_); |
247 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); | 270 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); |
248 } | 271 } |
249 } // namespace spdy | 272 } // namespace spdy |
OLD | NEW |