Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(39)

Side by Side Diff: net/spdy/spdy_framer_test.cc

Issue 199843005: Implement padding for SPDY4/HTTP2 DATA frames. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: nullptr => NULL & discard padding at SpdySession visitor call. Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/spdy/spdy_framer.cc ('k') | net/spdy/spdy_protocol.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/spdy/spdy_framer.cc ('k') | net/spdy/spdy_protocol.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698