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