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" |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 void OnSetting(SpdySettingsIds id, uint8 flags, uint32 value) override { | 147 void OnSetting(SpdySettingsIds id, uint8 flags, uint32 value) override { |
148 LOG(FATAL); | 148 LOG(FATAL); |
149 } | 149 } |
150 void OnPing(SpdyPingId unique_id, bool is_ack) override { LOG(FATAL); } | 150 void OnPing(SpdyPingId unique_id, bool is_ack) override { LOG(FATAL); } |
151 void OnSettingsEnd() override { LOG(FATAL); } | 151 void OnSettingsEnd() override { LOG(FATAL); } |
152 void OnGoAway(SpdyStreamId last_accepted_stream_id, | 152 void OnGoAway(SpdyStreamId last_accepted_stream_id, |
153 SpdyGoAwayStatus status) override { | 153 SpdyGoAwayStatus status) override { |
154 LOG(FATAL); | 154 LOG(FATAL); |
155 } | 155 } |
156 | 156 |
157 void OnHeaders(SpdyStreamId stream_id, bool fin, bool end) override { | 157 void OnHeaders(SpdyStreamId stream_id, bool has_priority, |
| 158 SpdyPriority priority, bool fin, bool end) override { |
158 SpdyFramer framer(version_); | 159 SpdyFramer framer(version_); |
159 framer.set_enable_compression(false); | 160 framer.set_enable_compression(false); |
160 SpdyHeadersIR headers(stream_id); | 161 SpdyHeadersIR headers(stream_id); |
| 162 headers.set_has_priority(has_priority); |
| 163 if (headers.has_priority()) { |
| 164 headers.set_priority(priority); |
| 165 } |
161 headers.set_fin(fin); | 166 headers.set_fin(fin); |
162 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers)); | 167 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers)); |
163 ResetBuffer(); | 168 ResetBuffer(); |
164 memcpy(buffer_.get(), frame->data(), framer.GetHeadersMinimumSize()); | 169 memcpy(buffer_.get(), frame->data(), framer.GetHeadersMinimumSize()); |
165 size_ += framer.GetHeadersMinimumSize(); | 170 size_ += framer.GetHeadersMinimumSize(); |
166 } | 171 } |
167 | 172 |
168 virtual void OnWindowUpdate(SpdyStreamId stream_id, int delta_window_size) { | 173 virtual void OnWindowUpdate(SpdyStreamId stream_id, int delta_window_size) { |
169 LOG(FATAL); | 174 LOG(FATAL); |
170 } | 175 } |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
382 ++settings_ack_sent_; | 387 ++settings_ack_sent_; |
383 } | 388 } |
384 | 389 |
385 void OnPing(SpdyPingId unique_id, bool is_ack) override { DLOG(FATAL); } | 390 void OnPing(SpdyPingId unique_id, bool is_ack) override { DLOG(FATAL); } |
386 | 391 |
387 void OnGoAway(SpdyStreamId last_accepted_stream_id, | 392 void OnGoAway(SpdyStreamId last_accepted_stream_id, |
388 SpdyGoAwayStatus status) override { | 393 SpdyGoAwayStatus status) override { |
389 ++goaway_count_; | 394 ++goaway_count_; |
390 } | 395 } |
391 | 396 |
392 void OnHeaders(SpdyStreamId stream_id, bool fin, bool end) override { | 397 void OnHeaders(SpdyStreamId stream_id, bool has_priority, |
| 398 SpdyPriority priority, bool fin, bool end) override { |
393 ++headers_frame_count_; | 399 ++headers_frame_count_; |
394 InitHeaderStreaming(HEADERS, stream_id); | 400 InitHeaderStreaming(HEADERS, stream_id); |
395 if (fin) { | 401 if (fin) { |
396 ++fin_flag_count_; | 402 ++fin_flag_count_; |
397 } | 403 } |
398 } | 404 } |
399 | 405 |
400 void OnWindowUpdate(SpdyStreamId stream_id, | 406 void OnWindowUpdate(SpdyStreamId stream_id, |
401 uint32 delta_window_size) override { | 407 uint32 delta_window_size) override { |
402 last_window_update_stream_ = stream_id; | 408 last_window_update_stream_ = stream_id; |
(...skipping 815 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1218 | 1224 |
1219 TestSpdyVisitor visitor(spdy_version_); | 1225 TestSpdyVisitor visitor(spdy_version_); |
1220 if (IsSpdy2()) { | 1226 if (IsSpdy2()) { |
1221 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input)); | 1227 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input)); |
1222 } else if (IsSpdy3()) { | 1228 } else if (IsSpdy3()) { |
1223 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); | 1229 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); |
1224 } else { | 1230 } else { |
1225 visitor.SimulateInFramer(kV4Input, sizeof(kV4Input)); | 1231 visitor.SimulateInFramer(kV4Input, sizeof(kV4Input)); |
1226 } | 1232 } |
1227 | 1233 |
1228 EXPECT_EQ(2, visitor.syn_frame_count_); | |
1229 EXPECT_EQ(0, visitor.syn_reply_frame_count_); | 1234 EXPECT_EQ(0, visitor.syn_reply_frame_count_); |
1230 EXPECT_EQ(1, visitor.headers_frame_count_); | |
1231 EXPECT_EQ(24, visitor.data_bytes_); | 1235 EXPECT_EQ(24, visitor.data_bytes_); |
1232 | |
1233 EXPECT_EQ(0, visitor.error_count_); | 1236 EXPECT_EQ(0, visitor.error_count_); |
1234 EXPECT_EQ(2, visitor.fin_frame_count_); | 1237 EXPECT_EQ(2, visitor.fin_frame_count_); |
1235 | 1238 |
1236 if (IsSpdy4()) { | 1239 if (IsSpdy4()) { |
| 1240 EXPECT_EQ(3, visitor.headers_frame_count_); |
| 1241 EXPECT_EQ(0, visitor.syn_frame_count_); |
1237 base::StringPiece reset_stream = "RESETSTREAM"; | 1242 base::StringPiece reset_stream = "RESETSTREAM"; |
1238 EXPECT_EQ(reset_stream, visitor.fin_opaque_data_); | 1243 EXPECT_EQ(reset_stream, visitor.fin_opaque_data_); |
1239 } else { | 1244 } else { |
| 1245 EXPECT_EQ(1, visitor.headers_frame_count_); |
| 1246 EXPECT_EQ(2, visitor.syn_frame_count_); |
1240 EXPECT_TRUE(visitor.fin_opaque_data_.empty()); | 1247 EXPECT_TRUE(visitor.fin_opaque_data_.empty()); |
1241 } | 1248 } |
1242 | 1249 |
1243 EXPECT_EQ(0, visitor.fin_flag_count_); | 1250 EXPECT_EQ(0, visitor.fin_flag_count_); |
1244 EXPECT_EQ(0, visitor.zero_length_data_frame_count_); | 1251 EXPECT_EQ(0, visitor.zero_length_data_frame_count_); |
1245 EXPECT_EQ(4, visitor.data_frame_count_); | 1252 EXPECT_EQ(4, visitor.data_frame_count_); |
1246 visitor.fin_opaque_data_.clear(); | 1253 visitor.fin_opaque_data_.clear(); |
1247 } | 1254 } |
1248 | 1255 |
1249 // Test that the FIN flag on a data frame signifies EOF. | 1256 // Test that the FIN flag on a data frame signifies EOF. |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1332 TestSpdyVisitor visitor(spdy_version_); | 1339 TestSpdyVisitor visitor(spdy_version_); |
1333 if (IsSpdy2()) { | 1340 if (IsSpdy2()) { |
1334 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input)); | 1341 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input)); |
1335 } else if (IsSpdy3()) { | 1342 } else if (IsSpdy3()) { |
1336 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); | 1343 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); |
1337 } else { | 1344 } else { |
1338 visitor.SimulateInFramer(kV4Input, sizeof(kV4Input)); | 1345 visitor.SimulateInFramer(kV4Input, sizeof(kV4Input)); |
1339 } | 1346 } |
1340 | 1347 |
1341 EXPECT_EQ(0, visitor.error_count_); | 1348 EXPECT_EQ(0, visitor.error_count_); |
1342 EXPECT_EQ(1, visitor.syn_frame_count_); | |
1343 if (IsSpdy4()) { | 1349 if (IsSpdy4()) { |
| 1350 EXPECT_EQ(0, visitor.syn_frame_count_); |
1344 EXPECT_EQ(0, visitor.syn_reply_frame_count_); | 1351 EXPECT_EQ(0, visitor.syn_reply_frame_count_); |
1345 EXPECT_EQ(1, visitor.headers_frame_count_); | 1352 EXPECT_EQ(2, visitor.headers_frame_count_); |
1346 } else { | 1353 } else { |
| 1354 EXPECT_EQ(1, visitor.syn_frame_count_); |
1347 EXPECT_EQ(1, visitor.syn_reply_frame_count_); | 1355 EXPECT_EQ(1, visitor.syn_reply_frame_count_); |
1348 EXPECT_EQ(0, visitor.headers_frame_count_); | 1356 EXPECT_EQ(0, visitor.headers_frame_count_); |
1349 } | 1357 } |
1350 EXPECT_EQ(16, visitor.data_bytes_); | 1358 EXPECT_EQ(16, visitor.data_bytes_); |
1351 EXPECT_EQ(0, visitor.fin_frame_count_); | 1359 EXPECT_EQ(0, visitor.fin_frame_count_); |
1352 EXPECT_EQ(0, visitor.fin_flag_count_); | 1360 EXPECT_EQ(0, visitor.fin_flag_count_); |
1353 EXPECT_EQ(1, visitor.zero_length_data_frame_count_); | 1361 EXPECT_EQ(1, visitor.zero_length_data_frame_count_); |
1354 EXPECT_EQ(2, visitor.data_frame_count_); | 1362 EXPECT_EQ(2, visitor.data_frame_count_); |
1355 } | 1363 } |
1356 | 1364 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1411 TestSpdyVisitor visitor(spdy_version_); | 1419 TestSpdyVisitor visitor(spdy_version_); |
1412 if (IsSpdy2()) { | 1420 if (IsSpdy2()) { |
1413 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input)); | 1421 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input)); |
1414 } else if (IsSpdy3()) { | 1422 } else if (IsSpdy3()) { |
1415 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); | 1423 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); |
1416 } else { | 1424 } else { |
1417 visitor.SimulateInFramer(kV4Input, sizeof(kV4Input)); | 1425 visitor.SimulateInFramer(kV4Input, sizeof(kV4Input)); |
1418 } | 1426 } |
1419 | 1427 |
1420 EXPECT_EQ(0, visitor.error_count_); | 1428 EXPECT_EQ(0, visitor.error_count_); |
1421 EXPECT_EQ(1, visitor.syn_frame_count_); | |
1422 if (IsSpdy4()) { | 1429 if (IsSpdy4()) { |
| 1430 EXPECT_EQ(0, visitor.syn_frame_count_); |
1423 EXPECT_EQ(0, visitor.syn_reply_frame_count_); | 1431 EXPECT_EQ(0, visitor.syn_reply_frame_count_); |
1424 EXPECT_EQ(1, visitor.headers_frame_count_); | 1432 EXPECT_EQ(2, visitor.headers_frame_count_); |
1425 } else { | 1433 } else { |
| 1434 EXPECT_EQ(1, visitor.syn_frame_count_); |
1426 EXPECT_EQ(1, visitor.syn_reply_frame_count_); | 1435 EXPECT_EQ(1, visitor.syn_reply_frame_count_); |
1427 EXPECT_EQ(0, visitor.headers_frame_count_); | 1436 EXPECT_EQ(0, visitor.headers_frame_count_); |
1428 } | 1437 } |
1429 EXPECT_EQ(0, visitor.data_bytes_); | 1438 EXPECT_EQ(0, visitor.data_bytes_); |
1430 EXPECT_EQ(0, visitor.fin_frame_count_); | 1439 EXPECT_EQ(0, visitor.fin_frame_count_); |
1431 EXPECT_EQ(1, visitor.fin_flag_count_); | 1440 EXPECT_EQ(1, visitor.fin_flag_count_); |
1432 EXPECT_EQ(1, visitor.zero_length_data_frame_count_); | 1441 EXPECT_EQ(1, visitor.zero_length_data_frame_count_); |
1433 EXPECT_EQ(0, visitor.data_frame_count_); | 1442 EXPECT_EQ(0, visitor.data_frame_count_); |
1434 } | 1443 } |
1435 | 1444 |
(...skipping 3767 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5203 if (!IsSpdy4() && flags & ~CONTROL_FLAG_FIN) { | 5212 if (!IsSpdy4() && flags & ~CONTROL_FLAG_FIN) { |
5204 EXPECT_CALL(visitor, OnError(_)); | 5213 EXPECT_CALL(visitor, OnError(_)); |
5205 } else if (IsSpdy4() && flags & ~(CONTROL_FLAG_FIN | | 5214 } else if (IsSpdy4() && flags & ~(CONTROL_FLAG_FIN | |
5206 HEADERS_FLAG_END_HEADERS | | 5215 HEADERS_FLAG_END_HEADERS | |
5207 HEADERS_FLAG_END_SEGMENT | | 5216 HEADERS_FLAG_END_SEGMENT | |
5208 HEADERS_FLAG_PADDED | | 5217 HEADERS_FLAG_PADDED | |
5209 HEADERS_FLAG_PRIORITY)) { | 5218 HEADERS_FLAG_PRIORITY)) { |
5210 EXPECT_CALL(visitor, OnError(_)); | 5219 EXPECT_CALL(visitor, OnError(_)); |
5211 } else { | 5220 } else { |
5212 if (spdy_version_ > SPDY3 && flags & HEADERS_FLAG_PRIORITY) { | 5221 if (spdy_version_ > SPDY3 && flags & HEADERS_FLAG_PRIORITY) { |
5213 EXPECT_CALL(visitor, OnSynStream(57, // stream id | 5222 EXPECT_CALL(visitor, OnHeaders(57, // stream id |
5214 0, // associated stream id | 5223 true, // has priority? |
5215 3, // priority | 5224 3, // priority |
5216 flags & CONTROL_FLAG_FIN, | 5225 flags & CONTROL_FLAG_FIN, // fin? |
5217 false)); // unidirectional | 5226 (flags & HEADERS_FLAG_END_HEADERS) || |
| 5227 !IsSpdy4())); // end headers? |
5218 } else { | 5228 } else { |
5219 EXPECT_CALL(visitor, OnHeaders(57, | 5229 EXPECT_CALL(visitor, OnHeaders(57, false, 0, |
5220 flags & CONTROL_FLAG_FIN, | 5230 flags & CONTROL_FLAG_FIN, |
5221 (flags & HEADERS_FLAG_END_HEADERS) || | 5231 (flags & HEADERS_FLAG_END_HEADERS) || |
5222 !IsSpdy4())); | 5232 !IsSpdy4())); |
5223 } | 5233 } |
5224 EXPECT_CALL(visitor, OnControlFrameHeaderData(57, _, _)) | 5234 EXPECT_CALL(visitor, OnControlFrameHeaderData(57, _, _)) |
5225 .WillRepeatedly(testing::Return(true)); | 5235 .WillRepeatedly(testing::Return(true)); |
5226 if (flags & DATA_FLAG_FIN && (!IsSpdy4() || | 5236 if (flags & DATA_FLAG_FIN && (!IsSpdy4() || |
5227 flags & HEADERS_FLAG_END_HEADERS)) { | 5237 flags & HEADERS_FLAG_END_HEADERS)) { |
5228 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)); | 5238 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)); |
5229 } else { | 5239 } else { |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5384 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 5394 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
5385 | 5395 |
5386 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5396 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
5387 testing::StrictMock<net::test::MockDebugVisitor> debug_visitor; | 5397 testing::StrictMock<net::test::MockDebugVisitor> debug_visitor; |
5388 SpdyFramer framer(spdy_version_); | 5398 SpdyFramer framer(spdy_version_); |
5389 framer.set_visitor(&visitor); | 5399 framer.set_visitor(&visitor); |
5390 framer.set_debug_visitor(&debug_visitor); | 5400 framer.set_debug_visitor(&debug_visitor); |
5391 | 5401 |
5392 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(42, HEADERS, _, _)); | 5402 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(42, HEADERS, _, _)); |
5393 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, HEADERS, _)); | 5403 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(42, HEADERS, _)); |
5394 EXPECT_CALL(visitor, OnHeaders(42, 0, false)); | 5404 EXPECT_CALL(visitor, OnHeaders(42, false, 0, 0, false)); |
5395 EXPECT_CALL(visitor, OnControlFrameHeaderData(42, _, _)) | 5405 EXPECT_CALL(visitor, OnControlFrameHeaderData(42, _, _)) |
5396 .WillRepeatedly(testing::Return(true)); | 5406 .WillRepeatedly(testing::Return(true)); |
5397 | 5407 |
5398 SpdyHeadersIR headers_ir(42); | 5408 SpdyHeadersIR headers_ir(42); |
5399 headers_ir.SetHeader("foo", "bar"); | 5409 headers_ir.SetHeader("foo", "bar"); |
5400 scoped_ptr<SpdyFrame> frame0(framer.SerializeHeaders(headers_ir)); | 5410 scoped_ptr<SpdyFrame> frame0(framer.SerializeHeaders(headers_ir)); |
5401 SetFrameFlags(frame0.get(), 0, spdy_version_); | 5411 SetFrameFlags(frame0.get(), 0, spdy_version_); |
5402 | 5412 |
5403 SpdyContinuationIR continuation(42); | 5413 SpdyContinuationIR continuation(42); |
5404 continuation.SetHeader("foo", "bar"); | 5414 continuation.SetHeader("foo", "bar"); |
(...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5915 TestSpdyVisitor visitor(spdy_version_); | 5925 TestSpdyVisitor visitor(spdy_version_); |
5916 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); | 5926 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); |
5917 | 5927 |
5918 EXPECT_EQ(SpdyFramer::SPDY_ERROR, visitor.framer_.state()); | 5928 EXPECT_EQ(SpdyFramer::SPDY_ERROR, visitor.framer_.state()); |
5919 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, | 5929 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, |
5920 visitor.framer_.error_code()) | 5930 visitor.framer_.error_code()) |
5921 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); | 5931 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); |
5922 } | 5932 } |
5923 | 5933 |
5924 } // namespace net | 5934 } // namespace net |
OLD | NEW |