| 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_protocol.h" | 5 #include "net/spdy/spdy_protocol.h" |
| 6 | 6 |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "net/spdy/spdy_bitmasks.h" | 8 #include "net/spdy/spdy_bitmasks.h" |
| 9 #include "net/spdy/spdy_framer.h" | 9 #include "net/spdy/spdy_framer.h" |
| 10 #include "testing/platform_test.h" | 10 #include "testing/platform_test.h" |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 using spdy::SpdyStatusCodes; | 37 using spdy::SpdyStatusCodes; |
| 38 using spdy::SpdySynReplyControlFrame; | 38 using spdy::SpdySynReplyControlFrame; |
| 39 using spdy::SpdySynStreamControlFrame; | 39 using spdy::SpdySynStreamControlFrame; |
| 40 using spdy::SpdyWindowUpdateControlFrame; | 40 using spdy::SpdyWindowUpdateControlFrame; |
| 41 using spdy::WINDOW_UPDATE; | 41 using spdy::WINDOW_UPDATE; |
| 42 using spdy::kLengthMask; | 42 using spdy::kLengthMask; |
| 43 using spdy::kStreamIdMask; | 43 using spdy::kStreamIdMask; |
| 44 | 44 |
| 45 namespace { | 45 namespace { |
| 46 | 46 |
| 47 // Default SPDY version for unit tests. | 47 enum SpdyProtocolTestTypes { |
| 48 const int SPDY_VERSION_FOR_TESTS = 3; | 48 SPDY2, |
| 49 SPDY3, |
| 50 }; |
| 51 |
| 52 class SpdyProtocolTest |
| 53 : public ::testing::TestWithParam<SpdyProtocolTestTypes> { |
| 54 protected: |
| 55 virtual void SetUp() { |
| 56 spdy_version_ = (GetParam() == SPDY2) ? 2 : 3; |
| 57 } |
| 58 |
| 59 virtual void TearDown() {} |
| 60 |
| 61 bool IsSpdy2() { return spdy_version_ < 3; } |
| 62 |
| 63 // Version of SPDY protocol to be used. |
| 64 int spdy_version_; |
| 65 }; |
| 66 |
| 67 //----------------------------------------------------------------------------- |
| 68 // All tests are run with two different SPDY versions: SPDY/2 and SPDY/3. |
| 69 INSTANTIATE_TEST_CASE_P(SpdyProtocolTests, |
| 70 SpdyProtocolTest, |
| 71 ::testing::Values(SPDY2, SPDY3)); |
| 49 | 72 |
| 50 // Test our protocol constants | 73 // Test our protocol constants |
| 51 TEST(SpdyProtocolSpdy3Test, ProtocolConstants) { | 74 TEST_P(SpdyProtocolTest, ProtocolConstants) { |
| 52 EXPECT_EQ(8u, SpdyFrame::kHeaderSize); | 75 EXPECT_EQ(8u, SpdyFrame::kHeaderSize); |
| 53 EXPECT_EQ(8u, SpdyDataFrame::size()); | 76 EXPECT_EQ(8u, SpdyDataFrame::size()); |
| 54 EXPECT_EQ(8u, SpdyControlFrame::kHeaderSize); | 77 EXPECT_EQ(8u, SpdyControlFrame::kHeaderSize); |
| 55 EXPECT_EQ(18u, SpdySynStreamControlFrame::size()); | 78 EXPECT_EQ(18u, SpdySynStreamControlFrame::size()); |
| 56 EXPECT_EQ(12u, SpdySynReplyControlFrame::size()); | 79 EXPECT_EQ(12u, SpdySynReplyControlFrame::size()); |
| 57 EXPECT_EQ(16u, SpdyRstStreamControlFrame::size()); | 80 EXPECT_EQ(16u, SpdyRstStreamControlFrame::size()); |
| 58 EXPECT_EQ(12u, SpdySettingsControlFrame::size()); | 81 EXPECT_EQ(12u, SpdySettingsControlFrame::size()); |
| 59 EXPECT_EQ(12u, SpdyPingControlFrame::size()); | 82 EXPECT_EQ(12u, SpdyPingControlFrame::size()); |
| 60 EXPECT_EQ(12u, SpdyGoAwayControlFrame::size()); | 83 EXPECT_EQ(12u, SpdyGoAwayControlFrame::size()); |
| 61 EXPECT_EQ(12u, SpdyHeadersControlFrame::size()); | 84 EXPECT_EQ(12u, SpdyHeadersControlFrame::size()); |
| 62 EXPECT_EQ(16u, SpdyWindowUpdateControlFrame::size()); | 85 EXPECT_EQ(16u, SpdyWindowUpdateControlFrame::size()); |
| 63 EXPECT_EQ(4u, sizeof(FlagsAndLength)); | 86 EXPECT_EQ(4u, sizeof(FlagsAndLength)); |
| 64 EXPECT_EQ(1, SYN_STREAM); | 87 EXPECT_EQ(1, SYN_STREAM); |
| 65 EXPECT_EQ(2, SYN_REPLY); | 88 EXPECT_EQ(2, SYN_REPLY); |
| 66 EXPECT_EQ(3, RST_STREAM); | 89 EXPECT_EQ(3, RST_STREAM); |
| 67 EXPECT_EQ(4, SETTINGS); | 90 EXPECT_EQ(4, SETTINGS); |
| 68 EXPECT_EQ(5, NOOP); | 91 EXPECT_EQ(5, NOOP); |
| 69 EXPECT_EQ(6, PING); | 92 EXPECT_EQ(6, PING); |
| 70 EXPECT_EQ(7, GOAWAY); | 93 EXPECT_EQ(7, GOAWAY); |
| 71 EXPECT_EQ(8, HEADERS); | 94 EXPECT_EQ(8, HEADERS); |
| 72 EXPECT_EQ(9, WINDOW_UPDATE); | 95 EXPECT_EQ(9, WINDOW_UPDATE); |
| 73 } | 96 } |
| 74 | 97 |
| 75 // Test some of the protocol helper functions | 98 // Test some of the protocol helper functions |
| 76 TEST(SpdyProtocolSpdy3Test, FrameStructs) { | 99 TEST_P(SpdyProtocolTest, FrameStructs) { |
| 77 SpdyFrame frame(SpdyFrame::kHeaderSize); | 100 SpdyFrame frame(SpdyFrame::kHeaderSize); |
| 78 frame.set_length(12345); | 101 frame.set_length(12345); |
| 79 frame.set_flags(10); | 102 frame.set_flags(10); |
| 80 EXPECT_EQ(12345u, frame.length()); | 103 EXPECT_EQ(12345u, frame.length()); |
| 81 EXPECT_EQ(10u, frame.flags()); | 104 EXPECT_EQ(10u, frame.flags()); |
| 82 EXPECT_FALSE(frame.is_control_frame()); | 105 EXPECT_FALSE(frame.is_control_frame()); |
| 83 | 106 |
| 84 frame.set_length(0); | 107 frame.set_length(0); |
| 85 frame.set_flags(10); | 108 frame.set_flags(10); |
| 86 EXPECT_EQ(0u, frame.length()); | 109 EXPECT_EQ(0u, frame.length()); |
| 87 EXPECT_EQ(10u, frame.flags()); | 110 EXPECT_EQ(10u, frame.flags()); |
| 88 EXPECT_FALSE(frame.is_control_frame()); | 111 EXPECT_FALSE(frame.is_control_frame()); |
| 89 } | 112 } |
| 90 | 113 |
| 91 TEST(SpdyProtocolSpdy3Test, DataFrameStructs) { | 114 TEST_P(SpdyProtocolTest, DataFrameStructs) { |
| 92 SpdyDataFrame data_frame; | 115 SpdyDataFrame data_frame; |
| 93 data_frame.set_stream_id(12345); | 116 data_frame.set_stream_id(12345); |
| 94 EXPECT_EQ(12345u, data_frame.stream_id()); | 117 EXPECT_EQ(12345u, data_frame.stream_id()); |
| 95 } | 118 } |
| 96 | 119 |
| 97 TEST(SpdyProtocolSpdy3Test, ControlFrameStructs) { | 120 TEST_P(SpdyProtocolTest, ControlFrameStructs) { |
| 98 SpdyFramer framer(SPDY_VERSION_FOR_TESTS); | 121 SpdyFramer framer(spdy_version_); |
| 99 SpdyHeaderBlock headers; | 122 SpdyHeaderBlock headers; |
| 100 | 123 |
| 101 scoped_ptr<SpdySynStreamControlFrame> syn_frame( | 124 scoped_ptr<SpdySynStreamControlFrame> syn_frame( |
| 102 framer.CreateSynStream(123, 456, 2, CONTROL_FLAG_FIN, false, &headers)); | 125 framer.CreateSynStream(123, 456, 2, CONTROL_FLAG_FIN, false, &headers)); |
| 103 EXPECT_EQ(framer.protocol_version(), syn_frame->version()); | 126 EXPECT_EQ(framer.protocol_version(), syn_frame->version()); |
| 104 EXPECT_TRUE(syn_frame->is_control_frame()); | 127 EXPECT_TRUE(syn_frame->is_control_frame()); |
| 105 EXPECT_EQ(SYN_STREAM, syn_frame->type()); | 128 EXPECT_EQ(SYN_STREAM, syn_frame->type()); |
| 106 EXPECT_EQ(123u, syn_frame->stream_id()); | 129 EXPECT_EQ(123u, syn_frame->stream_id()); |
| 107 EXPECT_EQ(456u, syn_frame->associated_stream_id()); | 130 EXPECT_EQ(456u, syn_frame->associated_stream_id()); |
| 108 EXPECT_EQ(2u, syn_frame->priority()); | 131 EXPECT_EQ(2u, syn_frame->priority()); |
| 109 EXPECT_EQ((SPDY_VERSION_FOR_TESTS < 3) ? 2 : 4, | 132 EXPECT_EQ(IsSpdy2() ? 2 : 4, syn_frame->header_block_len()); |
| 110 syn_frame->header_block_len()); | |
| 111 EXPECT_EQ(1u, syn_frame->flags()); | 133 EXPECT_EQ(1u, syn_frame->flags()); |
| 112 syn_frame->set_associated_stream_id(999u); | 134 syn_frame->set_associated_stream_id(999u); |
| 113 EXPECT_EQ(123u, syn_frame->stream_id()); | 135 EXPECT_EQ(123u, syn_frame->stream_id()); |
| 114 EXPECT_EQ(999u, syn_frame->associated_stream_id()); | 136 EXPECT_EQ(999u, syn_frame->associated_stream_id()); |
| 115 | 137 |
| 116 scoped_ptr<SpdySynReplyControlFrame> syn_reply( | 138 scoped_ptr<SpdySynReplyControlFrame> syn_reply( |
| 117 framer.CreateSynReply(123, CONTROL_FLAG_NONE, false, &headers)); | 139 framer.CreateSynReply(123, CONTROL_FLAG_NONE, false, &headers)); |
| 118 EXPECT_EQ(framer.protocol_version(), syn_reply->version()); | 140 EXPECT_EQ(framer.protocol_version(), syn_reply->version()); |
| 119 EXPECT_TRUE(syn_reply->is_control_frame()); | 141 EXPECT_TRUE(syn_reply->is_control_frame()); |
| 120 EXPECT_EQ(SYN_REPLY, syn_reply->type()); | 142 EXPECT_EQ(SYN_REPLY, syn_reply->type()); |
| 121 EXPECT_EQ(123u, syn_reply->stream_id()); | 143 EXPECT_EQ(123u, syn_reply->stream_id()); |
| 122 EXPECT_EQ((SPDY_VERSION_FOR_TESTS < 3) ? 2 : 4, | 144 EXPECT_EQ(IsSpdy2() ? 2 : 4, syn_reply->header_block_len()); |
| 123 syn_reply->header_block_len()); | |
| 124 EXPECT_EQ(0, syn_reply->flags()); | 145 EXPECT_EQ(0, syn_reply->flags()); |
| 125 | 146 |
| 126 scoped_ptr<SpdyRstStreamControlFrame> rst_frame( | 147 scoped_ptr<SpdyRstStreamControlFrame> rst_frame( |
| 127 framer.CreateRstStream(123, spdy::PROTOCOL_ERROR)); | 148 framer.CreateRstStream(123, spdy::PROTOCOL_ERROR)); |
| 128 EXPECT_EQ(framer.protocol_version(), rst_frame->version()); | 149 EXPECT_EQ(framer.protocol_version(), rst_frame->version()); |
| 129 EXPECT_TRUE(rst_frame->is_control_frame()); | 150 EXPECT_TRUE(rst_frame->is_control_frame()); |
| 130 EXPECT_EQ(RST_STREAM, rst_frame->type()); | 151 EXPECT_EQ(RST_STREAM, rst_frame->type()); |
| 131 EXPECT_EQ(123u, rst_frame->stream_id()); | 152 EXPECT_EQ(123u, rst_frame->stream_id()); |
| 132 EXPECT_EQ(spdy::PROTOCOL_ERROR, rst_frame->status()); | 153 EXPECT_EQ(spdy::PROTOCOL_ERROR, rst_frame->status()); |
| 133 rst_frame->set_status(spdy::INVALID_STREAM); | 154 rst_frame->set_status(spdy::INVALID_STREAM); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 151 EXPECT_TRUE(goaway_frame->is_control_frame()); | 172 EXPECT_TRUE(goaway_frame->is_control_frame()); |
| 152 EXPECT_EQ(GOAWAY, goaway_frame->type()); | 173 EXPECT_EQ(GOAWAY, goaway_frame->type()); |
| 153 EXPECT_EQ(123u, goaway_frame->last_accepted_stream_id()); | 174 EXPECT_EQ(123u, goaway_frame->last_accepted_stream_id()); |
| 154 | 175 |
| 155 scoped_ptr<SpdyHeadersControlFrame> headers_frame( | 176 scoped_ptr<SpdyHeadersControlFrame> headers_frame( |
| 156 framer.CreateHeaders(123, CONTROL_FLAG_NONE, false, &headers)); | 177 framer.CreateHeaders(123, CONTROL_FLAG_NONE, false, &headers)); |
| 157 EXPECT_EQ(framer.protocol_version(), headers_frame->version()); | 178 EXPECT_EQ(framer.protocol_version(), headers_frame->version()); |
| 158 EXPECT_TRUE(headers_frame->is_control_frame()); | 179 EXPECT_TRUE(headers_frame->is_control_frame()); |
| 159 EXPECT_EQ(HEADERS, headers_frame->type()); | 180 EXPECT_EQ(HEADERS, headers_frame->type()); |
| 160 EXPECT_EQ(123u, headers_frame->stream_id()); | 181 EXPECT_EQ(123u, headers_frame->stream_id()); |
| 161 EXPECT_EQ((SPDY_VERSION_FOR_TESTS < 3) ? 2 : 4, | 182 EXPECT_EQ(IsSpdy2() ? 2 : 4, headers_frame->header_block_len()); |
| 162 headers_frame->header_block_len()); | |
| 163 EXPECT_EQ(0, headers_frame->flags()); | 183 EXPECT_EQ(0, headers_frame->flags()); |
| 164 | 184 |
| 165 scoped_ptr<SpdyWindowUpdateControlFrame> window_update_frame( | 185 scoped_ptr<SpdyWindowUpdateControlFrame> window_update_frame( |
| 166 framer.CreateWindowUpdate(123, 456)); | 186 framer.CreateWindowUpdate(123, 456)); |
| 167 EXPECT_EQ(framer.protocol_version(), window_update_frame->version()); | 187 EXPECT_EQ(framer.protocol_version(), window_update_frame->version()); |
| 168 EXPECT_TRUE(window_update_frame->is_control_frame()); | 188 EXPECT_TRUE(window_update_frame->is_control_frame()); |
| 169 EXPECT_EQ(WINDOW_UPDATE, window_update_frame->type()); | 189 EXPECT_EQ(WINDOW_UPDATE, window_update_frame->type()); |
| 170 EXPECT_EQ(123u, window_update_frame->stream_id()); | 190 EXPECT_EQ(123u, window_update_frame->stream_id()); |
| 171 EXPECT_EQ(456u, window_update_frame->delta_window_size()); | 191 EXPECT_EQ(456u, window_update_frame->delta_window_size()); |
| 172 } | 192 } |
| 173 | 193 |
| 174 TEST(SpdyProtocolSpdy3Test, TestDataFrame) { | 194 TEST_P(SpdyProtocolTest, TestDataFrame) { |
| 175 SpdyDataFrame frame; | 195 SpdyDataFrame frame; |
| 176 | 196 |
| 177 // Set the stream ID to various values. | 197 // Set the stream ID to various values. |
| 178 frame.set_stream_id(0); | 198 frame.set_stream_id(0); |
| 179 EXPECT_EQ(0u, frame.stream_id()); | 199 EXPECT_EQ(0u, frame.stream_id()); |
| 180 EXPECT_FALSE(frame.is_control_frame()); | 200 EXPECT_FALSE(frame.is_control_frame()); |
| 181 frame.set_stream_id(~0 & kStreamIdMask); | 201 frame.set_stream_id(~0 & kStreamIdMask); |
| 182 EXPECT_EQ(~0 & kStreamIdMask, frame.stream_id()); | 202 EXPECT_EQ(~0 & kStreamIdMask, frame.stream_id()); |
| 183 EXPECT_FALSE(frame.is_control_frame()); | 203 EXPECT_FALSE(frame.is_control_frame()); |
| 184 | 204 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 207 frame.set_flags(all_flags); | 227 frame.set_flags(all_flags); |
| 208 flags = frame.flags(); | 228 flags = frame.flags(); |
| 209 EXPECT_EQ(all_flags, flags); | 229 EXPECT_EQ(all_flags, flags); |
| 210 EXPECT_EQ(length, frame.length()); | 230 EXPECT_EQ(length, frame.length()); |
| 211 frame.set_flags(5u); | 231 frame.set_flags(5u); |
| 212 EXPECT_EQ(5u, frame.flags()); | 232 EXPECT_EQ(5u, frame.flags()); |
| 213 EXPECT_EQ(length, frame.length()); | 233 EXPECT_EQ(length, frame.length()); |
| 214 } | 234 } |
| 215 | 235 |
| 216 // Test various types of SETTINGS frames. | 236 // Test various types of SETTINGS frames. |
| 217 TEST(SpdyProtocolSpdy3Test, TestSpdySettingsFrame) { | 237 TEST_P(SpdyProtocolTest, TestSpdySettingsFrame) { |
| 218 SpdyFramer framer(SPDY_VERSION_FOR_TESTS); | 238 SpdyFramer framer(spdy_version_); |
| 219 | 239 |
| 220 // Create a settings frame with no settings. | 240 // Create a settings frame with no settings. |
| 221 SpdySettings settings; | 241 SpdySettings settings; |
| 222 scoped_ptr<SpdySettingsControlFrame> settings_frame( | 242 scoped_ptr<SpdySettingsControlFrame> settings_frame( |
| 223 framer.CreateSettings(settings)); | 243 framer.CreateSettings(settings)); |
| 224 EXPECT_EQ(framer.protocol_version(), settings_frame->version()); | 244 EXPECT_EQ(framer.protocol_version(), settings_frame->version()); |
| 225 EXPECT_TRUE(settings_frame->is_control_frame()); | 245 EXPECT_TRUE(settings_frame->is_control_frame()); |
| 226 EXPECT_EQ(SETTINGS, settings_frame->type()); | 246 EXPECT_EQ(SETTINGS, settings_frame->type()); |
| 227 EXPECT_EQ(0u, settings_frame->num_entries()); | 247 EXPECT_EQ(0u, settings_frame->num_entries()); |
| 228 | 248 |
| 229 // We'll add several different ID/Flag combinations and then verify | 249 // We'll add several different ID/Flag combinations and then verify |
| 230 // that they encode and decode properly. | 250 // that they encode and decode properly. |
| 231 SettingsFlagsAndId ids[] = { | 251 SettingsFlagsAndId ids[] = { |
| 232 SettingsFlagsAndId::FromWireFormat(SPDY_VERSION_FOR_TESTS, 0x00000000), | 252 SettingsFlagsAndId::FromWireFormat(spdy_version_, 0x00000000), |
| 233 SettingsFlagsAndId::FromWireFormat(SPDY_VERSION_FOR_TESTS, 0xffffffff), | 253 SettingsFlagsAndId::FromWireFormat(spdy_version_, 0xffffffff), |
| 234 SettingsFlagsAndId::FromWireFormat(SPDY_VERSION_FOR_TESTS, 0xff000001), | 254 SettingsFlagsAndId::FromWireFormat(spdy_version_, 0xff000001), |
| 235 SettingsFlagsAndId::FromWireFormat(SPDY_VERSION_FOR_TESTS, 0xffffffff), | 255 SettingsFlagsAndId::FromWireFormat(spdy_version_, 0xffffffff), |
| 236 SettingsFlagsAndId::FromWireFormat(SPDY_VERSION_FOR_TESTS, 0x01000002), | 256 SettingsFlagsAndId::FromWireFormat(spdy_version_, 0x01000002), |
| 237 SettingsFlagsAndId(3, 1) | 257 SettingsFlagsAndId(3, 1) |
| 238 }; | 258 }; |
| 239 | 259 |
| 240 for (size_t index = 0; index < arraysize(ids); ++index) { | 260 for (size_t index = 0; index < arraysize(ids); ++index) { |
| 241 settings.insert(settings.end(), std::make_pair(ids[index], index)); | 261 settings.insert(settings.end(), std::make_pair(ids[index], index)); |
| 242 settings_frame.reset(framer.CreateSettings(settings)); | 262 settings_frame.reset(framer.CreateSettings(settings)); |
| 243 EXPECT_EQ(framer.protocol_version(), settings_frame->version()); | 263 EXPECT_EQ(framer.protocol_version(), settings_frame->version()); |
| 244 EXPECT_TRUE(settings_frame->is_control_frame()); | 264 EXPECT_TRUE(settings_frame->is_control_frame()); |
| 245 EXPECT_EQ(SETTINGS, settings_frame->type()); | 265 EXPECT_EQ(SETTINGS, settings_frame->type()); |
| 246 EXPECT_EQ(index + 1, settings_frame->num_entries()); | 266 EXPECT_EQ(index + 1, settings_frame->num_entries()); |
| 247 | 267 |
| 248 SpdySettings parsed_settings; | 268 SpdySettings parsed_settings; |
| 249 EXPECT_TRUE(framer.ParseSettings(settings_frame.get(), &parsed_settings)); | 269 EXPECT_TRUE(framer.ParseSettings(settings_frame.get(), &parsed_settings)); |
| 250 EXPECT_EQ(settings.size(), parsed_settings.size()); | 270 EXPECT_EQ(settings.size(), parsed_settings.size()); |
| 251 SpdySettings::const_iterator it = parsed_settings.begin(); | 271 SpdySettings::const_iterator it = parsed_settings.begin(); |
| 252 int pos = 0; | 272 int pos = 0; |
| 253 while (it != parsed_settings.end()) { | 273 while (it != parsed_settings.end()) { |
| 254 SettingsFlagsAndId parsed = it->first; | 274 SettingsFlagsAndId parsed = it->first; |
| 255 uint32 value = it->second; | 275 uint32 value = it->second; |
| 256 EXPECT_EQ(ids[pos].flags(), parsed.flags()); | 276 EXPECT_EQ(ids[pos].flags(), parsed.flags()); |
| 257 EXPECT_EQ(ids[pos].id(), parsed.id()); | 277 EXPECT_EQ(ids[pos].id(), parsed.id()); |
| 258 EXPECT_EQ(static_cast<uint32>(pos), value); | 278 EXPECT_EQ(static_cast<uint32>(pos), value); |
| 259 ++it; | 279 ++it; |
| 260 ++pos; | 280 ++pos; |
| 261 } | 281 } |
| 262 } | 282 } |
| 263 } | 283 } |
| 264 | 284 |
| 265 TEST(SpdyProtocolSpdy3Test, HasHeaderBlock) { | 285 TEST_P(SpdyProtocolTest, HasHeaderBlock) { |
| 266 SpdyControlFrame frame(SpdyControlFrame::kHeaderSize); | 286 SpdyControlFrame frame(SpdyControlFrame::kHeaderSize); |
| 267 for (SpdyControlType type = SYN_STREAM; | 287 for (SpdyControlType type = SYN_STREAM; |
| 268 type < NUM_CONTROL_FRAME_TYPES; | 288 type < NUM_CONTROL_FRAME_TYPES; |
| 269 type = static_cast<SpdyControlType>(type + 1)) { | 289 type = static_cast<SpdyControlType>(type + 1)) { |
| 270 frame.set_type(type); | 290 frame.set_type(type); |
| 271 if (type == SYN_STREAM || type == SYN_REPLY || type == HEADERS) { | 291 if (type == SYN_STREAM || type == SYN_REPLY || type == HEADERS) { |
| 272 EXPECT_TRUE(frame.has_header_block()); | 292 EXPECT_TRUE(frame.has_header_block()); |
| 273 } else { | 293 } else { |
| 274 EXPECT_FALSE(frame.has_header_block()); | 294 EXPECT_FALSE(frame.has_header_block()); |
| 275 } | 295 } |
| 276 } | 296 } |
| 277 } | 297 } |
| 278 | 298 |
| 299 //----------------------------------------------------------------------------- |
| 300 // All tests are run with two different SPDY versions: SPDY/2 and SPDY/3. |
| 301 class SpdyProtocolDeathTest : public SpdyProtocolTest {}; |
| 302 |
| 303 INSTANTIATE_TEST_CASE_P(SpdyProtocolDeathTests, |
| 304 SpdyProtocolDeathTest, |
| 305 ::testing::Values(SPDY2, SPDY3)); |
| 306 |
| 279 // Make sure that overflows both die in debug mode, and do not cause problems | 307 // Make sure that overflows both die in debug mode, and do not cause problems |
| 280 // in opt mode. Note: The EXPECT_DEBUG_DEATH call does not work on Win32 yet, | 308 // in opt mode. Note: The EXPECT_DEBUG_DEATH call does not work on Win32 yet, |
| 281 // so we comment it out. | 309 // so we comment it out. |
| 282 TEST(SpdyProtocolDeathSpdy3Test, TestDataFrame) { | 310 TEST_P(SpdyProtocolDeathTest, TestDataFrame) { |
| 283 SpdyDataFrame frame; | 311 SpdyDataFrame frame; |
| 284 | 312 |
| 285 frame.set_stream_id(0); | 313 frame.set_stream_id(0); |
| 286 // TODO(mbelshe): implement EXPECT_DEBUG_DEATH on windows. | 314 // TODO(mbelshe): implement EXPECT_DEBUG_DEATH on windows. |
| 287 #if !defined(WIN32) && defined(GTEST_HAS_DEATH_TEST) | 315 #if !defined(WIN32) && defined(GTEST_HAS_DEATH_TEST) |
| 288 #if !defined(DCHECK_ALWAYS_ON) | 316 #if !defined(DCHECK_ALWAYS_ON) |
| 289 EXPECT_DEBUG_DEATH(frame.set_stream_id(~0), ""); | 317 EXPECT_DEBUG_DEATH(frame.set_stream_id(~0), ""); |
| 290 #else | 318 #else |
| 291 EXPECT_DEATH(frame.set_stream_id(~0), ""); | 319 EXPECT_DEATH(frame.set_stream_id(~0), ""); |
| 292 #endif | 320 #endif |
| 293 #endif | 321 #endif |
| 294 EXPECT_FALSE(frame.is_control_frame()); | 322 EXPECT_FALSE(frame.is_control_frame()); |
| 295 | 323 |
| 296 frame.set_flags(0); | 324 frame.set_flags(0); |
| 297 #if !defined(WIN32) && defined(GTEST_HAS_DEATH_TEST) | 325 #if !defined(WIN32) && defined(GTEST_HAS_DEATH_TEST) |
| 298 #if !defined(DCHECK_ALWAYS_ON) | 326 #if !defined(DCHECK_ALWAYS_ON) |
| 299 EXPECT_DEBUG_DEATH(frame.set_length(~0), ""); | 327 EXPECT_DEBUG_DEATH(frame.set_length(~0), ""); |
| 300 #else | 328 #else |
| 301 EXPECT_DEATH(frame.set_length(~0), ""); | 329 EXPECT_DEATH(frame.set_length(~0), ""); |
| 302 #endif | 330 #endif |
| 303 #endif | 331 #endif |
| 304 EXPECT_EQ(0, frame.flags()); | 332 EXPECT_EQ(0, frame.flags()); |
| 305 } | 333 } |
| 306 | 334 |
| 307 TEST(SpdyProtocolDeathSpdy3Test, TestSpdyControlFrameStreamId) { | 335 TEST_P(SpdyProtocolDeathTest, TestSpdyControlFrameStreamId) { |
| 308 SpdyControlFrame frame_store(SpdySynStreamControlFrame::size()); | 336 SpdyControlFrame frame_store(SpdySynStreamControlFrame::size()); |
| 309 memset(frame_store.data(), '1', SpdyControlFrame::kHeaderSize); | 337 memset(frame_store.data(), '1', SpdyControlFrame::kHeaderSize); |
| 310 SpdySynStreamControlFrame* frame = | 338 SpdySynStreamControlFrame* frame = |
| 311 reinterpret_cast<SpdySynStreamControlFrame*>(&frame_store); | 339 reinterpret_cast<SpdySynStreamControlFrame*>(&frame_store); |
| 312 | 340 |
| 313 // Set the stream ID to various values. | 341 // Set the stream ID to various values. |
| 314 frame->set_stream_id(0); | 342 frame->set_stream_id(0); |
| 315 EXPECT_EQ(0u, frame->stream_id()); | 343 EXPECT_EQ(0u, frame->stream_id()); |
| 316 EXPECT_FALSE(frame->is_control_frame()); | 344 EXPECT_FALSE(frame->is_control_frame()); |
| 317 frame->set_stream_id(kStreamIdMask); | 345 frame->set_stream_id(kStreamIdMask); |
| 318 EXPECT_EQ(kStreamIdMask, frame->stream_id()); | 346 EXPECT_EQ(kStreamIdMask, frame->stream_id()); |
| 319 EXPECT_FALSE(frame->is_control_frame()); | 347 EXPECT_FALSE(frame->is_control_frame()); |
| 320 } | 348 } |
| 321 | 349 |
| 322 TEST(SpdyProtocolDeathSpdy3Test, TestSpdyControlFrameVersion) { | 350 TEST_P(SpdyProtocolDeathTest, TestSpdyControlFrameVersion) { |
| 323 const unsigned int kVersionMask = 0x7fff; | 351 const unsigned int kVersionMask = 0x7fff; |
| 324 SpdyControlFrame frame(SpdySynStreamControlFrame::size()); | 352 SpdyControlFrame frame(SpdySynStreamControlFrame::size()); |
| 325 memset(frame.data(), '1', SpdyControlFrame::kHeaderSize); | 353 memset(frame.data(), '1', SpdyControlFrame::kHeaderSize); |
| 326 | 354 |
| 327 // Set the version to various values, and make sure it does not affect the | 355 // Set the version to various values, and make sure it does not affect the |
| 328 // type. | 356 // type. |
| 329 frame.set_type(SYN_STREAM); | 357 frame.set_type(SYN_STREAM); |
| 330 frame.set_version(0); | 358 frame.set_version(0); |
| 331 EXPECT_EQ(0, frame.version()); | 359 EXPECT_EQ(0, frame.version()); |
| 332 EXPECT_TRUE(frame.is_control_frame()); | 360 EXPECT_TRUE(frame.is_control_frame()); |
| 333 EXPECT_EQ(SYN_STREAM, frame.type()); | 361 EXPECT_EQ(SYN_STREAM, frame.type()); |
| 334 | 362 |
| 335 SpdySynStreamControlFrame* syn_stream = | 363 SpdySynStreamControlFrame* syn_stream = |
| 336 reinterpret_cast<SpdySynStreamControlFrame*>(&frame); | 364 reinterpret_cast<SpdySynStreamControlFrame*>(&frame); |
| 337 syn_stream->set_stream_id(~0 & kVersionMask); | 365 syn_stream->set_stream_id(~0 & kVersionMask); |
| 338 EXPECT_EQ(~0 & kVersionMask, syn_stream->stream_id()); | 366 EXPECT_EQ(~0 & kVersionMask, syn_stream->stream_id()); |
| 339 EXPECT_TRUE(frame.is_control_frame()); | 367 EXPECT_TRUE(frame.is_control_frame()); |
| 340 EXPECT_EQ(SYN_STREAM, frame.type()); | 368 EXPECT_EQ(SYN_STREAM, frame.type()); |
| 341 } | 369 } |
| 342 | 370 |
| 343 TEST(SpdyProtocolDeathSpdy3Test, TestSpdyControlFrameType) { | 371 TEST_P(SpdyProtocolDeathTest, TestSpdyControlFrameType) { |
| 344 SpdyControlFrame frame(SpdyControlFrame::kHeaderSize); | 372 SpdyControlFrame frame(SpdyControlFrame::kHeaderSize); |
| 345 memset(frame.data(), 255, SpdyControlFrame::kHeaderSize); | 373 memset(frame.data(), 255, SpdyControlFrame::kHeaderSize); |
| 346 | 374 |
| 347 // type() should be out of bounds. | 375 // type() should be out of bounds. |
| 348 EXPECT_FALSE(frame.AppearsToBeAValidControlFrame()); | 376 EXPECT_FALSE(frame.AppearsToBeAValidControlFrame()); |
| 349 | 377 |
| 350 frame.set_version(SPDY_VERSION_FOR_TESTS); | 378 frame.set_version(spdy_version_); |
| 351 uint16 version = frame.version(); | 379 uint16 version = frame.version(); |
| 352 | 380 |
| 353 for (int i = SYN_STREAM; i <= spdy::WINDOW_UPDATE; ++i) { | 381 for (int i = SYN_STREAM; i <= spdy::WINDOW_UPDATE; ++i) { |
| 354 frame.set_type(static_cast<SpdyControlType>(i)); | 382 frame.set_type(static_cast<SpdyControlType>(i)); |
| 355 EXPECT_EQ(i, static_cast<int>(frame.type())); | 383 EXPECT_EQ(i, static_cast<int>(frame.type())); |
| 356 if (i == spdy::NOOP) { | 384 if (!IsSpdy2() && i == spdy::NOOP) { |
| 357 // NOOP frames aren't 'valid'. | 385 // NOOP frames aren't 'valid'. |
| 358 EXPECT_FALSE(frame.AppearsToBeAValidControlFrame()); | 386 EXPECT_FALSE(frame.AppearsToBeAValidControlFrame()); |
| 359 } else { | 387 } else { |
| 360 EXPECT_TRUE(frame.AppearsToBeAValidControlFrame()); | 388 EXPECT_TRUE(frame.AppearsToBeAValidControlFrame()); |
| 361 } | 389 } |
| 362 // Make sure setting type does not alter the version block. | 390 // Make sure setting type does not alter the version block. |
| 363 EXPECT_EQ(version, frame.version()); | 391 EXPECT_EQ(version, frame.version()); |
| 364 EXPECT_TRUE(frame.is_control_frame()); | 392 EXPECT_TRUE(frame.is_control_frame()); |
| 365 } | 393 } |
| 366 } | 394 } |
| 367 | 395 |
| 368 TEST(SpdyProtocolDeathSpdy3Test, TestRstStreamStatusBounds) { | 396 TEST_P(SpdyProtocolDeathTest, TestRstStreamStatusBounds) { |
| 369 SpdyFramer framer(SPDY_VERSION_FOR_TESTS); | 397 SpdyFramer framer(spdy_version_); |
| 370 scoped_ptr<SpdyRstStreamControlFrame> rst_frame; | 398 scoped_ptr<SpdyRstStreamControlFrame> rst_frame; |
| 371 | 399 |
| 372 rst_frame.reset(framer.CreateRstStream(123, spdy::PROTOCOL_ERROR)); | 400 rst_frame.reset(framer.CreateRstStream(123, spdy::PROTOCOL_ERROR)); |
| 373 EXPECT_EQ(spdy::PROTOCOL_ERROR, rst_frame->status()); | 401 EXPECT_EQ(spdy::PROTOCOL_ERROR, rst_frame->status()); |
| 374 | 402 |
| 375 rst_frame->set_status(spdy::INVALID); | 403 rst_frame->set_status(spdy::INVALID); |
| 376 EXPECT_EQ(spdy::INVALID, rst_frame->status()); | 404 EXPECT_EQ(spdy::INVALID, rst_frame->status()); |
| 377 | 405 |
| 378 rst_frame->set_status( | 406 rst_frame->set_status( |
| 379 static_cast<spdy::SpdyStatusCodes>(spdy::INVALID - 1)); | 407 static_cast<spdy::SpdyStatusCodes>(spdy::INVALID - 1)); |
| 380 EXPECT_EQ(spdy::INVALID, rst_frame->status()); | 408 EXPECT_EQ(spdy::INVALID, rst_frame->status()); |
| 381 | 409 |
| 382 rst_frame->set_status(spdy::NUM_STATUS_CODES); | 410 rst_frame->set_status(spdy::NUM_STATUS_CODES); |
| 383 EXPECT_EQ(spdy::INVALID, rst_frame->status()); | 411 EXPECT_EQ(spdy::INVALID, rst_frame->status()); |
| 384 } | 412 } |
| 385 | 413 |
| 386 } // namespace | 414 } // namespace |
| OLD | NEW |