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