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 1517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1528 frame.reset(framer.SerializeDataFrameHeader(data_header_ir)); | 1528 frame.reset(framer.SerializeDataFrameHeader(data_header_ir)); |
1529 CompareCharArraysWithHexError( | 1529 CompareCharArraysWithHexError( |
1530 kDescription, | 1530 kDescription, |
1531 reinterpret_cast<const unsigned char*>(frame->data()), | 1531 reinterpret_cast<const unsigned char*>(frame->data()), |
1532 framer.GetDataFrameMinimumSize(), | 1532 framer.GetDataFrameMinimumSize(), |
1533 IsSpdy4() ? kV4FrameData : kV3FrameData, | 1533 IsSpdy4() ? kV4FrameData : kV3FrameData, |
1534 framer.GetDataFrameMinimumSize()); | 1534 framer.GetDataFrameMinimumSize()); |
1535 } | 1535 } |
1536 | 1536 |
1537 { | 1537 { |
| 1538 const char kDescription[] = "'hello' data frame with padding, no FIN"; |
| 1539 const unsigned char kV3FrameData[] = { // Also applies for V2. |
| 1540 0x00, 0x00, 0x00, 0x01, |
| 1541 0x00, 0x00, 0x00, 0x05, |
| 1542 'h', 'e', 'l', 'l', |
| 1543 'o' |
| 1544 }; |
| 1545 |
| 1546 const unsigned char kV4FrameData[] = { |
| 1547 0x00, 0x15, 0x00, 0x10, // Length = 13. PAD_LOW set. |
| 1548 0x00, 0x00, 0x00, 0x01, |
| 1549 0x07, // Pad Low field. |
| 1550 'h', 'e', 'l', 'l', // Data |
| 1551 'o', |
| 1552 '0', '0', '0', '0', // Padding |
| 1553 '0', '0', '0' |
| 1554 }; |
| 1555 const char bytes[] = "hello"; |
| 1556 |
| 1557 SpdyDataIR data_ir(1, StringPiece(bytes, strlen(bytes))); |
| 1558 // 7 zeros and the pad low field make the overal padding to be 8 bytes. |
| 1559 data_ir.set_padding_len(8); |
| 1560 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); |
| 1561 if (IsSpdy4()) { |
| 1562 CompareFrame( |
| 1563 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
| 1564 } else { |
| 1565 CompareFrame( |
| 1566 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
| 1567 } |
| 1568 } |
| 1569 |
| 1570 { |
1538 const char kDescription[] = "Data frame with negative data byte, no FIN"; | 1571 const char kDescription[] = "Data frame with negative data byte, no FIN"; |
1539 const unsigned char kV3FrameData[] = { // Also applies for V2. | 1572 const unsigned char kV3FrameData[] = { // Also applies for V2. |
1540 0x00, 0x00, 0x00, 0x01, | 1573 0x00, 0x00, 0x00, 0x01, |
1541 0x00, 0x00, 0x00, 0x01, | 1574 0x00, 0x00, 0x00, 0x01, |
1542 0xff | 1575 0xff |
1543 }; | 1576 }; |
1544 const unsigned char kV4FrameData[] = { | 1577 const unsigned char kV4FrameData[] = { |
1545 0x00, 0x09, 0x00, 0x00, | 1578 0x00, 0x09, 0x00, 0x00, |
1546 0x00, 0x00, 0x00, 0x01, | 1579 0x00, 0x00, 0x00, 0x01, |
1547 0xff | 1580 0xff |
(...skipping 1735 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3283 | 3316 |
3284 TestSpdyVisitor visitor(spdy_version_); | 3317 TestSpdyVisitor visitor(spdy_version_); |
3285 visitor.use_compression_ = false; | 3318 visitor.use_compression_ = false; |
3286 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); | 3319 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); |
3287 | 3320 |
3288 EXPECT_EQ(0, visitor.error_count_); | 3321 EXPECT_EQ(0, visitor.error_count_); |
3289 EXPECT_EQ(0, visitor.setting_count_); | 3322 EXPECT_EQ(0, visitor.setting_count_); |
3290 EXPECT_EQ(1, visitor.settings_ack_received_); | 3323 EXPECT_EQ(1, visitor.settings_ack_received_); |
3291 } | 3324 } |
3292 | 3325 |
| 3326 |
| 3327 TEST_P(SpdyFramerTest, ProcessDataFrameWithPadding) { |
| 3328 if (spdy_version_ < 4) { |
| 3329 return; |
| 3330 } |
| 3331 |
| 3332 const int kPaddingLen = 512; // So we get two bytes for padding length field. |
| 3333 const char data_payload[] = "hello"; |
| 3334 |
| 3335 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 3336 SpdyFramer framer(spdy_version_); |
| 3337 framer.set_visitor(&visitor); |
| 3338 |
| 3339 SpdyDataIR data_ir(1, StringPiece(data_payload, strlen(data_payload))); |
| 3340 data_ir.set_padding_len(kPaddingLen); |
| 3341 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); |
| 3342 ASSERT_TRUE(frame.get() != NULL); |
| 3343 |
| 3344 int bytes_consumed = 0; |
| 3345 |
| 3346 // Send the frame header. |
| 3347 EXPECT_CALL(visitor, OnDataFrameHeader(1, |
| 3348 kPaddingLen + strlen(data_payload), |
| 3349 false)); |
| 3350 CHECK_EQ(8u, framer.ProcessInput(frame->data(), 8)); |
| 3351 CHECK_EQ(framer.state(), SpdyFramer::SPDY_READ_PADDING_LENGTH); |
| 3352 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); |
| 3353 bytes_consumed += 8; |
| 3354 |
| 3355 // Send the first byte of the padding length field. |
| 3356 CHECK_EQ(1u, framer.ProcessInput(frame->data() + bytes_consumed, 1)); |
| 3357 CHECK_EQ(framer.state(), SpdyFramer::SPDY_READ_PADDING_LENGTH); |
| 3358 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); |
| 3359 bytes_consumed += 1; |
| 3360 |
| 3361 // Send the second byte of the padding length field. |
| 3362 CHECK_EQ(1u, framer.ProcessInput(frame->data() + bytes_consumed, 1)); |
| 3363 CHECK_EQ(framer.state(), SpdyFramer::SPDY_FORWARD_STREAM_FRAME); |
| 3364 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); |
| 3365 bytes_consumed += 1; |
| 3366 |
| 3367 // Send the first two bytes of the data payload. |
| 3368 EXPECT_CALL(visitor, OnStreamFrameData(1, _, 2, false)); |
| 3369 CHECK_EQ(2u, framer.ProcessInput(frame->data() + bytes_consumed, 2)); |
| 3370 CHECK_EQ(framer.state(), SpdyFramer::SPDY_FORWARD_STREAM_FRAME); |
| 3371 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); |
| 3372 bytes_consumed += 2; |
| 3373 |
| 3374 // Send the rest three bytes of the data payload. |
| 3375 EXPECT_CALL(visitor, OnStreamFrameData(1, _, 3, false)); |
| 3376 CHECK_EQ(3u, framer.ProcessInput(frame->data() + bytes_consumed, 3)); |
| 3377 CHECK_EQ(framer.state(), SpdyFramer::SPDY_CONSUME_PADDING); |
| 3378 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); |
| 3379 bytes_consumed += 3; |
| 3380 |
| 3381 // Send the first 100 bytes of the padding payload. |
| 3382 EXPECT_CALL(visitor, OnStreamFrameData(1, NULL, 100, false)); |
| 3383 CHECK_EQ(100u, framer.ProcessInput(frame->data() + bytes_consumed, 100)); |
| 3384 CHECK_EQ(framer.state(), SpdyFramer::SPDY_CONSUME_PADDING); |
| 3385 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); |
| 3386 bytes_consumed += 100; |
| 3387 |
| 3388 // Send rest of the padding payload. |
| 3389 EXPECT_CALL(visitor, OnStreamFrameData(1, NULL, 410, false)); |
| 3390 CHECK_EQ(412u, framer.ProcessInput(frame->data() + bytes_consumed, 412)); |
| 3391 CHECK_EQ(framer.state(), SpdyFramer::SPDY_READING_COMMON_HEADER); |
| 3392 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); |
| 3393 } |
| 3394 |
3293 TEST_P(SpdyFramerTest, ReadWindowUpdate) { | 3395 TEST_P(SpdyFramerTest, ReadWindowUpdate) { |
3294 SpdyFramer framer(spdy_version_); | 3396 SpdyFramer framer(spdy_version_); |
3295 scoped_ptr<SpdyFrame> control_frame( | 3397 scoped_ptr<SpdyFrame> control_frame( |
3296 framer.SerializeWindowUpdate(net::SpdyWindowUpdateIR(1, 2))); | 3398 framer.SerializeWindowUpdate(net::SpdyWindowUpdateIR(1, 2))); |
3297 TestSpdyVisitor visitor(spdy_version_); | 3399 TestSpdyVisitor visitor(spdy_version_); |
3298 visitor.SimulateInFramer( | 3400 visitor.SimulateInFramer( |
3299 reinterpret_cast<unsigned char*>(control_frame->data()), | 3401 reinterpret_cast<unsigned char*>(control_frame->data()), |
3300 control_frame->size()); | 3402 control_frame->size()); |
3301 EXPECT_EQ(1u, visitor.last_window_update_stream_); | 3403 EXPECT_EQ(1u, visitor.last_window_update_stream_); |
3302 EXPECT_EQ(2u, visitor.last_window_update_delta_); | 3404 EXPECT_EQ(2u, visitor.last_window_update_delta_); |
(...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3885 | 3987 |
3886 EXPECT_CALL(visitor, OnError(_)); | 3988 EXPECT_CALL(visitor, OnError(_)); |
3887 framer.ProcessInput("HTTP/1.0", 8); | 3989 framer.ProcessInput("HTTP/1.0", 8); |
3888 EXPECT_TRUE(framer.probable_http_response()); | 3990 EXPECT_TRUE(framer.probable_http_response()); |
3889 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | 3991 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
3890 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code()) | 3992 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code()) |
3891 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 3993 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
3892 } | 3994 } |
3893 } | 3995 } |
3894 | 3996 |
3895 TEST_P(SpdyFramerTest, DataFrameFlags) { | 3997 TEST_P(SpdyFramerTest, DataFrameFlagsV2V3) { |
| 3998 if (spdy_version_ >= 4) { |
| 3999 return; |
| 4000 } |
| 4001 |
3896 for (int flags = 0; flags < 256; ++flags) { | 4002 for (int flags = 0; flags < 256; ++flags) { |
3897 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 4003 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
3898 | 4004 |
3899 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 4005 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
3900 SpdyFramer framer(spdy_version_); | 4006 SpdyFramer framer(spdy_version_); |
3901 framer.set_visitor(&visitor); | 4007 framer.set_visitor(&visitor); |
3902 | 4008 |
3903 net::SpdyDataIR data_ir(1, StringPiece("hello", 5)); | 4009 net::SpdyDataIR data_ir(1, StringPiece("hello", 5)); |
3904 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); | 4010 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); |
3905 SetFrameFlags(frame.get(), flags, spdy_version_); | 4011 SetFrameFlags(frame.get(), flags, spdy_version_); |
(...skipping 15 matching lines...) Expand all Loading... |
3921 framer.error_code()) | 4027 framer.error_code()) |
3922 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4028 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
3923 } else { | 4029 } else { |
3924 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 4030 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
3925 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 4031 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
3926 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4032 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
3927 } | 4033 } |
3928 } | 4034 } |
3929 } | 4035 } |
3930 | 4036 |
| 4037 TEST_P(SpdyFramerTest, DataFrameFlagsV4) { |
| 4038 if (spdy_version_ < 4) { |
| 4039 return; |
| 4040 } |
| 4041 |
| 4042 uint8 valid_data_flags = DATA_FLAG_FIN | DATA_FLAG_END_SEGMENT | |
| 4043 DATA_FLAG_PAD_LOW | DATA_FLAG_PAD_HIGH; |
| 4044 |
| 4045 for (int flags = 0; flags < 256; ++flags) { |
| 4046 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
| 4047 |
| 4048 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 4049 SpdyFramer framer(spdy_version_); |
| 4050 framer.set_visitor(&visitor); |
| 4051 |
| 4052 net::SpdyDataIR data_ir(1, StringPiece("hello", 5)); |
| 4053 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); |
| 4054 SetFrameFlags(frame.get(), flags, spdy_version_); |
| 4055 |
| 4056 if (flags & ~valid_data_flags) { |
| 4057 EXPECT_CALL(visitor, OnError(_)); |
| 4058 } else { |
| 4059 EXPECT_CALL(visitor, OnDataFrameHeader(1, 5, flags & DATA_FLAG_FIN)); |
| 4060 if ((flags & DATA_FLAG_PAD_LOW) || (flags & DATA_FLAG_PAD_HIGH)) { |
| 4061 // Expect Error since we don't set pad_high and pad_low in payload. |
| 4062 EXPECT_CALL(visitor, OnError(_)); |
| 4063 } else { |
| 4064 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 5, false)); |
| 4065 if (flags & DATA_FLAG_FIN) { |
| 4066 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true)); |
| 4067 } |
| 4068 } |
| 4069 } |
| 4070 |
| 4071 framer.ProcessInput(frame->data(), frame->size()); |
| 4072 if ((flags & ~valid_data_flags) || (flags & DATA_FLAG_PAD_LOW) || |
| 4073 (flags & DATA_FLAG_PAD_HIGH)) { |
| 4074 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
| 4075 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, |
| 4076 framer.error_code()) |
| 4077 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 4078 } else { |
| 4079 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
| 4080 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
| 4081 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 4082 } |
| 4083 } |
| 4084 } |
| 4085 |
3931 TEST_P(SpdyFramerTest, SynStreamFrameFlags) { | 4086 TEST_P(SpdyFramerTest, SynStreamFrameFlags) { |
3932 for (int flags = 0; flags < 256; ++flags) { | 4087 for (int flags = 0; flags < 256; ++flags) { |
3933 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 4088 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
3934 | 4089 |
3935 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 4090 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
3936 testing::StrictMock<test::MockDebugVisitor> debug_visitor; | 4091 testing::StrictMock<test::MockDebugVisitor> debug_visitor; |
3937 SpdyFramer framer(spdy_version_); | 4092 SpdyFramer framer(spdy_version_); |
3938 framer.set_visitor(&visitor); | 4093 framer.set_visitor(&visitor); |
3939 framer.set_debug_visitor(&debug_visitor); | 4094 framer.set_debug_visitor(&debug_visitor); |
3940 | 4095 |
(...skipping 645 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4586 SpdyBlockedIR blocked_ir(0); | 4741 SpdyBlockedIR blocked_ir(0); |
4587 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(blocked_ir)); | 4742 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(blocked_ir)); |
4588 framer.ProcessInput(frame->data(), framer.GetBlockedSize()); | 4743 framer.ProcessInput(frame->data(), framer.GetBlockedSize()); |
4589 | 4744 |
4590 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 4745 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
4591 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 4746 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
4592 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4747 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
4593 } | 4748 } |
4594 | 4749 |
4595 } // namespace net | 4750 } // namespace net |
OLD | NEW |