OLD | NEW |
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 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_alt_svc_wire_format.h" | 5 #include "net/spdy/spdy_alt_svc_wire_format.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "testing/gmock/include/gmock/gmock.h" | 8 #include "testing/gmock/include/gmock/gmock.h" |
9 #include "testing/platform_test.h" | 9 #include "testing/platform_test.h" |
10 | 10 |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 } | 87 } |
88 if (i & 1 << 4) { | 88 if (i & 1 << 4) { |
89 header_field_value->append("; J=s"); | 89 header_field_value->append("; J=s"); |
90 } | 90 } |
91 if (i & 1 << 5) { | 91 if (i & 1 << 5) { |
92 expected_altsvc->probability = 0.33; | 92 expected_altsvc->probability = 0.33; |
93 header_field_value->append("; P=\".33\""); | 93 header_field_value->append("; P=\".33\""); |
94 } | 94 } |
95 if (i & 1 << 6) { | 95 if (i & 1 << 6) { |
96 expected_altsvc->probability = 0.0; | 96 expected_altsvc->probability = 0.0; |
97 expected_altsvc->version = 24; | 97 expected_altsvc->version.push_back(24); |
98 header_field_value->append("; p=\"0\";v=24"); | 98 header_field_value->append("; p=\"0\";v=\"24\""); |
99 } | 99 } |
100 if (i & 1 << 7) { | 100 if (i & 1 << 7) { |
101 expected_altsvc->max_age = 999999999; | 101 expected_altsvc->max_age = 999999999; |
102 header_field_value->append("; Ma=999999999"); | 102 header_field_value->append("; Ma=999999999"); |
103 } | 103 } |
104 if (i & 1 << 8) { | 104 if (i & 1 << 8) { |
105 expected_altsvc->probability = 0.0; | 105 expected_altsvc->probability = 0.1; |
106 header_field_value->append("; P=\"0.\""); | 106 header_field_value->append("; P=\"0.1\""); |
107 } | 107 } |
108 if (i & 1 << 9) { | 108 if (i & 1 << 9) { |
109 header_field_value->append(";"); | 109 header_field_value->append(";"); |
110 } | 110 } |
111 if (i & 1 << 10) { | 111 if (i & 1 << 10) { |
112 header_field_value->append(" "); | 112 header_field_value->append(" "); |
113 } | 113 } |
114 if (i & 1 << 11) { | 114 if (i & 1 << 11) { |
115 header_field_value->append(","); | 115 header_field_value->append(","); |
116 } | 116 } |
(...skipping 12 matching lines...) Expand all Loading... |
129 } | 129 } |
130 altsvc->protocol_id = "a=b%c"; | 130 altsvc->protocol_id = "a=b%c"; |
131 altsvc->port = 42; | 131 altsvc->port = 42; |
132 expected_header_field_value->append("a%3Db%25c=\""); | 132 expected_header_field_value->append("a%3Db%25c=\""); |
133 if (i & 1 << 0) { | 133 if (i & 1 << 0) { |
134 altsvc->host = "foo\"bar\\baz"; | 134 altsvc->host = "foo\"bar\\baz"; |
135 expected_header_field_value->append("foo\\\"bar\\\\baz"); | 135 expected_header_field_value->append("foo\\\"bar\\\\baz"); |
136 } | 136 } |
137 expected_header_field_value->append(":42\""); | 137 expected_header_field_value->append(":42\""); |
138 if (i & 1 << 1) { | 138 if (i & 1 << 1) { |
139 altsvc->version = 24; | |
140 expected_header_field_value->append("; v=24"); | |
141 } | |
142 if (i & 1 << 2) { | |
143 altsvc->max_age = 1111; | 139 altsvc->max_age = 1111; |
144 expected_header_field_value->append("; ma=1111"); | 140 expected_header_field_value->append("; ma=1111"); |
145 } | 141 } |
146 if (i & 1 << 3) { | 142 if (i & 1 << 2) { |
147 altsvc->probability = 0.33; | 143 altsvc->probability = 0.33; |
148 expected_header_field_value->append("; p=\"0.33\""); | 144 expected_header_field_value->append("; p=\"0.33\""); |
149 } | 145 } |
| 146 if (i & 1 << 3) { |
| 147 altsvc->version.push_back(24); |
| 148 altsvc->version.push_back(25); |
| 149 expected_header_field_value->append("; v=\"24,25\""); |
| 150 } |
150 } | 151 } |
151 | 152 |
152 class SpdyAltSvcWireFormatTest : public ::testing::Test {}; | 153 class SpdyAltSvcWireFormatTest : public ::testing::Test {}; |
153 | 154 |
154 // Tests of public API. | 155 // Tests of public API. |
155 | 156 |
156 TEST(SpdyAltSvcWireFormatTest, DefaultValues) { | 157 TEST(SpdyAltSvcWireFormatTest, DefaultValues) { |
157 SpdyAltSvcWireFormat::AlternativeService altsvc; | 158 SpdyAltSvcWireFormat::AlternativeService altsvc; |
158 EXPECT_EQ("", altsvc.protocol_id); | 159 EXPECT_EQ("", altsvc.protocol_id); |
159 EXPECT_EQ("", altsvc.host); | 160 EXPECT_EQ("", altsvc.host); |
160 EXPECT_EQ(0u, altsvc.port); | 161 EXPECT_EQ(0u, altsvc.port); |
161 EXPECT_EQ(0u, altsvc.version); | |
162 EXPECT_EQ(86400u, altsvc.max_age); | 162 EXPECT_EQ(86400u, altsvc.max_age); |
163 EXPECT_DOUBLE_EQ(1.0, altsvc.probability); | 163 EXPECT_DOUBLE_EQ(1.0, altsvc.probability); |
| 164 EXPECT_TRUE(altsvc.version.empty()); |
164 } | 165 } |
165 | 166 |
166 TEST(SpdyAltSvcWireFormatTest, ParseInvalidEmptyHeaderFieldValue) { | 167 TEST(SpdyAltSvcWireFormatTest, ParseInvalidEmptyHeaderFieldValue) { |
167 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; | 168 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; |
168 ASSERT_FALSE(SpdyAltSvcWireFormat::ParseHeaderFieldValue("", &altsvc_vector)); | 169 ASSERT_FALSE(SpdyAltSvcWireFormat::ParseHeaderFieldValue("", &altsvc_vector)); |
169 } | 170 } |
170 | 171 |
171 TEST(SpdyAltSvcWireFormatTest, ParseHeaderFieldValueClear) { | 172 TEST(SpdyAltSvcWireFormatTest, ParseHeaderFieldValueClear) { |
172 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; | 173 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; |
173 ASSERT_TRUE( | 174 ASSERT_TRUE( |
174 SpdyAltSvcWireFormat::ParseHeaderFieldValue("clear", &altsvc_vector)); | 175 SpdyAltSvcWireFormat::ParseHeaderFieldValue("clear", &altsvc_vector)); |
175 EXPECT_EQ(0u, altsvc_vector.size()); | 176 EXPECT_EQ(0u, altsvc_vector.size()); |
176 } | 177 } |
177 | 178 |
178 // Fuzz test of ParseHeaderFieldValue() with optional whitespaces, ignored | 179 // Fuzz test of ParseHeaderFieldValue() with optional whitespaces, ignored |
179 // parameters, duplicate parameters, trailing space, trailing alternate service | 180 // parameters, duplicate parameters, trailing space, trailing alternate service |
180 // separator, etc. Single alternative service at a time. | 181 // separator, etc. Single alternative service at a time. |
181 TEST(SpdyAltSvcWireFormatTest, ParseHeaderFieldValue) { | 182 TEST(SpdyAltSvcWireFormatTest, ParseHeaderFieldValue) { |
182 for (int i = 0; i < 1 << 13; ++i) { | 183 for (int i = 0; i < 1 << 13; ++i) { |
183 std::string header_field_value; | 184 std::string header_field_value; |
184 SpdyAltSvcWireFormat::AlternativeService expected_altsvc; | 185 SpdyAltSvcWireFormat::AlternativeService expected_altsvc; |
185 FuzzHeaderFieldValue(i, &header_field_value, &expected_altsvc); | 186 FuzzHeaderFieldValue(i, &header_field_value, &expected_altsvc); |
186 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; | 187 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; |
187 ASSERT_TRUE(SpdyAltSvcWireFormat::ParseHeaderFieldValue(header_field_value, | 188 ASSERT_TRUE(SpdyAltSvcWireFormat::ParseHeaderFieldValue(header_field_value, |
188 &altsvc_vector)); | 189 &altsvc_vector)); |
189 ASSERT_EQ(1u, altsvc_vector.size()); | 190 ASSERT_EQ(1u, altsvc_vector.size()); |
190 EXPECT_EQ(expected_altsvc.protocol_id, altsvc_vector[0].protocol_id); | 191 EXPECT_EQ(expected_altsvc.protocol_id, altsvc_vector[0].protocol_id); |
191 EXPECT_EQ(expected_altsvc.host, altsvc_vector[0].host); | 192 EXPECT_EQ(expected_altsvc.host, altsvc_vector[0].host); |
192 EXPECT_EQ(expected_altsvc.port, altsvc_vector[0].port); | 193 EXPECT_EQ(expected_altsvc.port, altsvc_vector[0].port); |
193 EXPECT_EQ(expected_altsvc.version, altsvc_vector[0].version); | |
194 EXPECT_EQ(expected_altsvc.max_age, altsvc_vector[0].max_age); | 194 EXPECT_EQ(expected_altsvc.max_age, altsvc_vector[0].max_age); |
195 EXPECT_DOUBLE_EQ(expected_altsvc.probability, altsvc_vector[0].probability); | 195 EXPECT_DOUBLE_EQ(expected_altsvc.probability, altsvc_vector[0].probability); |
| 196 EXPECT_EQ(expected_altsvc.version, altsvc_vector[0].version); |
196 | 197 |
197 // Roundtrip test starting with |altsvc_vector|. | 198 // Roundtrip test starting with |altsvc_vector|. |
198 std::string reserialized_header_field_value = | 199 std::string reserialized_header_field_value = |
199 SpdyAltSvcWireFormat::SerializeHeaderFieldValue(altsvc_vector); | 200 SpdyAltSvcWireFormat::SerializeHeaderFieldValue(altsvc_vector); |
200 SpdyAltSvcWireFormat::AlternativeServiceVector roundtrip_altsvc_vector; | 201 SpdyAltSvcWireFormat::AlternativeServiceVector roundtrip_altsvc_vector; |
201 ASSERT_TRUE(SpdyAltSvcWireFormat::ParseHeaderFieldValue( | 202 ASSERT_TRUE(SpdyAltSvcWireFormat::ParseHeaderFieldValue( |
202 reserialized_header_field_value, &roundtrip_altsvc_vector)); | 203 reserialized_header_field_value, &roundtrip_altsvc_vector)); |
203 ASSERT_EQ(1u, roundtrip_altsvc_vector.size()); | 204 ASSERT_EQ(1u, roundtrip_altsvc_vector.size()); |
204 EXPECT_EQ(expected_altsvc.protocol_id, | 205 EXPECT_EQ(expected_altsvc.protocol_id, |
205 roundtrip_altsvc_vector[0].protocol_id); | 206 roundtrip_altsvc_vector[0].protocol_id); |
206 EXPECT_EQ(expected_altsvc.host, roundtrip_altsvc_vector[0].host); | 207 EXPECT_EQ(expected_altsvc.host, roundtrip_altsvc_vector[0].host); |
207 EXPECT_EQ(expected_altsvc.port, roundtrip_altsvc_vector[0].port); | 208 EXPECT_EQ(expected_altsvc.port, roundtrip_altsvc_vector[0].port); |
208 EXPECT_EQ(expected_altsvc.version, roundtrip_altsvc_vector[0].version); | |
209 EXPECT_EQ(expected_altsvc.max_age, roundtrip_altsvc_vector[0].max_age); | 209 EXPECT_EQ(expected_altsvc.max_age, roundtrip_altsvc_vector[0].max_age); |
210 EXPECT_DOUBLE_EQ(expected_altsvc.probability, | 210 EXPECT_DOUBLE_EQ(expected_altsvc.probability, |
211 roundtrip_altsvc_vector[0].probability); | 211 roundtrip_altsvc_vector[0].probability); |
| 212 EXPECT_EQ(expected_altsvc.version, roundtrip_altsvc_vector[0].version); |
212 } | 213 } |
213 } | 214 } |
214 | 215 |
215 // Fuzz test of ParseHeaderFieldValue() with optional whitespaces, ignored | 216 // Fuzz test of ParseHeaderFieldValue() with optional whitespaces, ignored |
216 // parameters, duplicate parameters, trailing space, trailing alternate service | 217 // parameters, duplicate parameters, trailing space, trailing alternate service |
217 // separator, etc. Possibly multiple alternative service at a time. | 218 // separator, etc. Possibly multiple alternative service at a time. |
218 TEST(SpdyAltSvcWireFormatTest, ParseHeaderFieldValueMultiple) { | 219 TEST(SpdyAltSvcWireFormatTest, ParseHeaderFieldValueMultiple) { |
219 for (int i = 0; i < 1 << 13;) { | 220 for (int i = 0; i < 1 << 13;) { |
220 std::string header_field_value; | 221 std::string header_field_value; |
221 SpdyAltSvcWireFormat::AlternativeServiceVector expected_altsvc_vector; | 222 SpdyAltSvcWireFormat::AlternativeServiceVector expected_altsvc_vector; |
222 // This will generate almost two hundred header field values with two, | 223 // This will generate almost two hundred header field values with two, |
223 // three, four, five, six, and seven alternative services each, and | 224 // three, four, five, six, and seven alternative services each, and |
224 // thousands with a single one. | 225 // thousands with a single one. |
225 do { | 226 do { |
226 SpdyAltSvcWireFormat::AlternativeService expected_altsvc; | 227 SpdyAltSvcWireFormat::AlternativeService expected_altsvc; |
227 FuzzHeaderFieldValue(i, &header_field_value, &expected_altsvc); | 228 FuzzHeaderFieldValue(i, &header_field_value, &expected_altsvc); |
228 expected_altsvc_vector.push_back(expected_altsvc); | 229 expected_altsvc_vector.push_back(expected_altsvc); |
229 ++i; | 230 ++i; |
230 } while ((i < 1 << 13) && (i % 6 < i % 7)); | 231 } while ((i < 1 << 13) && (i % 6 < i % 7)); |
231 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; | 232 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; |
232 ASSERT_TRUE(SpdyAltSvcWireFormat::ParseHeaderFieldValue(header_field_value, | 233 ASSERT_TRUE(SpdyAltSvcWireFormat::ParseHeaderFieldValue(header_field_value, |
233 &altsvc_vector)); | 234 &altsvc_vector)); |
234 ASSERT_EQ(expected_altsvc_vector.size(), altsvc_vector.size()); | 235 ASSERT_EQ(expected_altsvc_vector.size(), altsvc_vector.size()); |
235 for (unsigned int j = 0; j < altsvc_vector.size(); ++j) { | 236 for (unsigned int j = 0; j < altsvc_vector.size(); ++j) { |
236 EXPECT_EQ(expected_altsvc_vector[j].protocol_id, | 237 EXPECT_EQ(expected_altsvc_vector[j].protocol_id, |
237 altsvc_vector[j].protocol_id); | 238 altsvc_vector[j].protocol_id); |
238 EXPECT_EQ(expected_altsvc_vector[j].host, altsvc_vector[j].host); | 239 EXPECT_EQ(expected_altsvc_vector[j].host, altsvc_vector[j].host); |
239 EXPECT_EQ(expected_altsvc_vector[j].port, altsvc_vector[j].port); | 240 EXPECT_EQ(expected_altsvc_vector[j].port, altsvc_vector[j].port); |
240 EXPECT_EQ(expected_altsvc_vector[j].version, altsvc_vector[j].version); | |
241 EXPECT_EQ(expected_altsvc_vector[j].max_age, altsvc_vector[j].max_age); | 241 EXPECT_EQ(expected_altsvc_vector[j].max_age, altsvc_vector[j].max_age); |
242 EXPECT_DOUBLE_EQ(expected_altsvc_vector[j].probability, | 242 EXPECT_DOUBLE_EQ(expected_altsvc_vector[j].probability, |
243 altsvc_vector[j].probability); | 243 altsvc_vector[j].probability); |
| 244 EXPECT_EQ(expected_altsvc_vector[j].version, altsvc_vector[j].version); |
244 } | 245 } |
245 | 246 |
246 // Roundtrip test starting with |altsvc_vector|. | 247 // Roundtrip test starting with |altsvc_vector|. |
247 std::string reserialized_header_field_value = | 248 std::string reserialized_header_field_value = |
248 SpdyAltSvcWireFormat::SerializeHeaderFieldValue(altsvc_vector); | 249 SpdyAltSvcWireFormat::SerializeHeaderFieldValue(altsvc_vector); |
249 SpdyAltSvcWireFormat::AlternativeServiceVector roundtrip_altsvc_vector; | 250 SpdyAltSvcWireFormat::AlternativeServiceVector roundtrip_altsvc_vector; |
250 ASSERT_TRUE(SpdyAltSvcWireFormat::ParseHeaderFieldValue( | 251 ASSERT_TRUE(SpdyAltSvcWireFormat::ParseHeaderFieldValue( |
251 reserialized_header_field_value, &roundtrip_altsvc_vector)); | 252 reserialized_header_field_value, &roundtrip_altsvc_vector)); |
252 ASSERT_EQ(expected_altsvc_vector.size(), roundtrip_altsvc_vector.size()); | 253 ASSERT_EQ(expected_altsvc_vector.size(), roundtrip_altsvc_vector.size()); |
253 for (unsigned int j = 0; j < roundtrip_altsvc_vector.size(); ++j) { | 254 for (unsigned int j = 0; j < roundtrip_altsvc_vector.size(); ++j) { |
254 EXPECT_EQ(expected_altsvc_vector[j].protocol_id, | 255 EXPECT_EQ(expected_altsvc_vector[j].protocol_id, |
255 roundtrip_altsvc_vector[j].protocol_id); | 256 roundtrip_altsvc_vector[j].protocol_id); |
256 EXPECT_EQ(expected_altsvc_vector[j].host, | 257 EXPECT_EQ(expected_altsvc_vector[j].host, |
257 roundtrip_altsvc_vector[j].host); | 258 roundtrip_altsvc_vector[j].host); |
258 EXPECT_EQ(expected_altsvc_vector[j].port, | 259 EXPECT_EQ(expected_altsvc_vector[j].port, |
259 roundtrip_altsvc_vector[j].port); | 260 roundtrip_altsvc_vector[j].port); |
260 EXPECT_EQ(expected_altsvc_vector[j].version, | |
261 roundtrip_altsvc_vector[j].version); | |
262 EXPECT_EQ(expected_altsvc_vector[j].max_age, | 261 EXPECT_EQ(expected_altsvc_vector[j].max_age, |
263 roundtrip_altsvc_vector[j].max_age); | 262 roundtrip_altsvc_vector[j].max_age); |
264 EXPECT_DOUBLE_EQ(expected_altsvc_vector[j].probability, | 263 EXPECT_DOUBLE_EQ(expected_altsvc_vector[j].probability, |
265 roundtrip_altsvc_vector[j].probability); | 264 roundtrip_altsvc_vector[j].probability); |
| 265 EXPECT_EQ(expected_altsvc_vector[j].version, |
| 266 roundtrip_altsvc_vector[j].version); |
266 } | 267 } |
267 } | 268 } |
268 } | 269 } |
269 | 270 |
270 TEST(SpdyAltSvcWireFormatTest, SerializeEmptyHeaderFieldValue) { | 271 TEST(SpdyAltSvcWireFormatTest, SerializeEmptyHeaderFieldValue) { |
271 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; | 272 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; |
272 EXPECT_EQ("clear", | 273 EXPECT_EQ("clear", |
273 SpdyAltSvcWireFormat::SerializeHeaderFieldValue(altsvc_vector)); | 274 SpdyAltSvcWireFormat::SerializeHeaderFieldValue(altsvc_vector)); |
274 } | 275 } |
275 | 276 |
276 // Test ParseHeaderFieldValue() and SerializeHeaderFieldValue() on the same pair | 277 // Test ParseHeaderFieldValue() and SerializeHeaderFieldValue() on the same pair |
277 // of |expected_header_field_value| and |altsvc|, with and without hostname and | 278 // of |expected_header_field_value| and |altsvc|, with and without hostname and |
278 // each | 279 // each |
279 // parameter. Single alternative service at a time. | 280 // parameter. Single alternative service at a time. |
280 TEST(SpdyAltSvcWireFormatTest, RoundTrip) { | 281 TEST(SpdyAltSvcWireFormatTest, RoundTrip) { |
281 for (int i = 0; i < 1 << 4; ++i) { | 282 for (int i = 0; i < 1 << 4; ++i) { |
282 SpdyAltSvcWireFormat::AlternativeService altsvc; | 283 SpdyAltSvcWireFormat::AlternativeService altsvc; |
283 std::string expected_header_field_value; | 284 std::string expected_header_field_value; |
284 FuzzAlternativeService(i, &altsvc, &expected_header_field_value); | 285 FuzzAlternativeService(i, &altsvc, &expected_header_field_value); |
285 | 286 |
286 // Test ParseHeaderFieldValue(). | 287 // Test ParseHeaderFieldValue(). |
287 SpdyAltSvcWireFormat::AlternativeServiceVector parsed_altsvc_vector; | 288 SpdyAltSvcWireFormat::AlternativeServiceVector parsed_altsvc_vector; |
288 ASSERT_TRUE(SpdyAltSvcWireFormat::ParseHeaderFieldValue( | 289 ASSERT_TRUE(SpdyAltSvcWireFormat::ParseHeaderFieldValue( |
289 expected_header_field_value, &parsed_altsvc_vector)); | 290 expected_header_field_value, &parsed_altsvc_vector)); |
290 ASSERT_EQ(1u, parsed_altsvc_vector.size()); | 291 ASSERT_EQ(1u, parsed_altsvc_vector.size()); |
291 EXPECT_EQ(altsvc.protocol_id, parsed_altsvc_vector[0].protocol_id); | 292 EXPECT_EQ(altsvc.protocol_id, parsed_altsvc_vector[0].protocol_id); |
292 EXPECT_EQ(altsvc.host, parsed_altsvc_vector[0].host); | 293 EXPECT_EQ(altsvc.host, parsed_altsvc_vector[0].host); |
293 EXPECT_EQ(altsvc.port, parsed_altsvc_vector[0].port); | 294 EXPECT_EQ(altsvc.port, parsed_altsvc_vector[0].port); |
294 EXPECT_EQ(altsvc.version, parsed_altsvc_vector[0].version); | |
295 EXPECT_EQ(altsvc.max_age, parsed_altsvc_vector[0].max_age); | 295 EXPECT_EQ(altsvc.max_age, parsed_altsvc_vector[0].max_age); |
296 EXPECT_DOUBLE_EQ(altsvc.probability, parsed_altsvc_vector[0].probability); | 296 EXPECT_DOUBLE_EQ(altsvc.probability, parsed_altsvc_vector[0].probability); |
| 297 EXPECT_EQ(altsvc.version, parsed_altsvc_vector[0].version); |
297 | 298 |
298 // Test SerializeHeaderFieldValue(). | 299 // Test SerializeHeaderFieldValue(). |
299 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; | 300 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; |
300 altsvc_vector.push_back(altsvc); | 301 altsvc_vector.push_back(altsvc); |
301 EXPECT_EQ(expected_header_field_value, | 302 EXPECT_EQ(expected_header_field_value, |
302 SpdyAltSvcWireFormat::SerializeHeaderFieldValue(altsvc_vector)); | 303 SpdyAltSvcWireFormat::SerializeHeaderFieldValue(altsvc_vector)); |
303 } | 304 } |
304 } | 305 } |
305 | 306 |
306 // Test ParseHeaderFieldValue() and SerializeHeaderFieldValue() on the same pair | 307 // Test ParseHeaderFieldValue() and SerializeHeaderFieldValue() on the same pair |
(...skipping 15 matching lines...) Expand all Loading... |
322 expected_header_field_value, &parsed_altsvc_vector)); | 323 expected_header_field_value, &parsed_altsvc_vector)); |
323 ASSERT_EQ(altsvc_vector.size(), parsed_altsvc_vector.size()); | 324 ASSERT_EQ(altsvc_vector.size(), parsed_altsvc_vector.size()); |
324 SpdyAltSvcWireFormat::AlternativeServiceVector::iterator expected_it = | 325 SpdyAltSvcWireFormat::AlternativeServiceVector::iterator expected_it = |
325 altsvc_vector.begin(); | 326 altsvc_vector.begin(); |
326 SpdyAltSvcWireFormat::AlternativeServiceVector::iterator parsed_it = | 327 SpdyAltSvcWireFormat::AlternativeServiceVector::iterator parsed_it = |
327 parsed_altsvc_vector.begin(); | 328 parsed_altsvc_vector.begin(); |
328 for (; expected_it != altsvc_vector.end(); ++expected_it, ++parsed_it) { | 329 for (; expected_it != altsvc_vector.end(); ++expected_it, ++parsed_it) { |
329 EXPECT_EQ(expected_it->protocol_id, parsed_it->protocol_id); | 330 EXPECT_EQ(expected_it->protocol_id, parsed_it->protocol_id); |
330 EXPECT_EQ(expected_it->host, parsed_it->host); | 331 EXPECT_EQ(expected_it->host, parsed_it->host); |
331 EXPECT_EQ(expected_it->port, parsed_it->port); | 332 EXPECT_EQ(expected_it->port, parsed_it->port); |
332 EXPECT_EQ(expected_it->version, parsed_it->version); | |
333 EXPECT_EQ(expected_it->max_age, parsed_it->max_age); | 333 EXPECT_EQ(expected_it->max_age, parsed_it->max_age); |
334 EXPECT_DOUBLE_EQ(expected_it->probability, parsed_it->probability); | 334 EXPECT_DOUBLE_EQ(expected_it->probability, parsed_it->probability); |
| 335 EXPECT_EQ(expected_it->version, parsed_it->version); |
335 } | 336 } |
336 | 337 |
337 // Test SerializeHeaderFieldValue(). | 338 // Test SerializeHeaderFieldValue(). |
338 EXPECT_EQ(expected_header_field_value, | 339 EXPECT_EQ(expected_header_field_value, |
339 SpdyAltSvcWireFormat::SerializeHeaderFieldValue(altsvc_vector)); | 340 SpdyAltSvcWireFormat::SerializeHeaderFieldValue(altsvc_vector)); |
340 } | 341 } |
341 | 342 |
342 // ParseHeaderFieldValue() should return false on malformed field values: | 343 // ParseHeaderFieldValue() should return false on malformed field values: |
343 // invalid percent encoding, unmatched quotation mark, empty port, non-numeric | 344 // invalid percent encoding, unmatched quotation mark, empty port, non-numeric |
344 // characters in numeric fields, negative or larger than 1.0 probability. | 345 // characters in numeric fields, negative or larger than 1.0 probability. |
345 TEST(SpdyAltSvcWireFormatTest, ParseHeaderFieldValueInvalid) { | 346 TEST(SpdyAltSvcWireFormatTest, ParseHeaderFieldValueInvalid) { |
346 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; | 347 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; |
347 const char* invalid_field_value_array[] = {"a%", "a%x", "a%b", "a%9z", | 348 const char* invalid_field_value_array[] = {"a%", "a%x", "a%b", "a%9z", |
348 "a=", "a=\"", "a=\"b\"", "a=\":\"", "a=\"c:\"", "a=\"c:foo\"", | 349 "a=", "a=\"", "a=\"b\"", "a=\":\"", "a=\"c:\"", "a=\"c:foo\"", |
349 "a=\"c:42foo\"", "a=\"b:42\"bar", "a=\"b:42\" ; m", | 350 "a=\"c:42foo\"", "a=\"b:42\"bar", "a=\"b:42\" ; m", |
350 "a=\"b:42\" ; min-age", "a=\"b:42\" ; ma", "a=\"b:42\" ; ma=", | 351 "a=\"b:42\" ; min-age", "a=\"b:42\" ; ma", "a=\"b:42\" ; ma=", |
351 "a=\"b:42\" ; ma=ma", "a=\"b:42\" ; ma=123bar", "a=\"b:42\" ; p=\"-2\"", | 352 "a=\"b:42\" ; ma=ma", "a=\"b:42\" ; ma=123bar", "a=\"b:42\" ; p=\"-2\"", |
352 "a=\"b:42\" ; p=\"..\"", "a=\"b:42\" ; p=\"1.05\"", "a=\"b:42\" ; p=0.4", | 353 "a=\"b:42\" ; p=\"..\"", "a=\"b:42\" ; p=\"1.05\"", "a=\"b:42\" ; p=0.4", |
353 "a=\"b:42\" ; p=\" 1.0\"", "a=\"b:42\" ; v=-3", "a=\"b:42\" ; v=1.2"}; | 354 "a=\"b:42\" ; p=\" 1.0\"", "a=\"b:42\" ; v=24", "a=\"b:42\" ; v=24,25", |
| 355 "a=\"b:42\" ; v=\"-3\"", "a=\"b:42\" ; v=\"1.2\"", |
| 356 "a=\"b:42\" ; v=\"24,\""}; |
354 for (const char* invalid_field_value : invalid_field_value_array) { | 357 for (const char* invalid_field_value : invalid_field_value_array) { |
355 EXPECT_FALSE(SpdyAltSvcWireFormat::ParseHeaderFieldValue( | 358 EXPECT_FALSE(SpdyAltSvcWireFormat::ParseHeaderFieldValue( |
356 invalid_field_value, &altsvc_vector)) | 359 invalid_field_value, &altsvc_vector)) |
357 << invalid_field_value; | 360 << invalid_field_value; |
358 } | 361 } |
359 } | 362 } |
360 | 363 |
361 // ParseHeaderFieldValue() should return false on a field values truncated | 364 // ParseHeaderFieldValue() should return false on a field values truncated |
362 // before closing quotation mark, without trying to access memory beyond the end | 365 // before closing quotation mark, without trying to access memory beyond the end |
363 // of the input. | 366 // of the input. |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
583 StringPiece input(invalid_input); | 586 StringPiece input(invalid_input); |
584 double probability; | 587 double probability; |
585 EXPECT_FALSE(test::SpdyAltSvcWireFormatPeer::ParseProbability( | 588 EXPECT_FALSE(test::SpdyAltSvcWireFormatPeer::ParseProbability( |
586 input.begin(), input.end(), &probability)); | 589 input.begin(), input.end(), &probability)); |
587 } | 590 } |
588 } | 591 } |
589 | 592 |
590 } // namespace | 593 } // namespace |
591 | 594 |
592 } // namespace net | 595 } // namespace net |
OLD | NEW |