| 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 |