Index: net/spdy/spdy_alt_svc_wire_format_test.cc |
diff --git a/net/spdy/spdy_alt_svc_wire_format_test.cc b/net/spdy/spdy_alt_svc_wire_format_test.cc |
deleted file mode 100644 |
index 1650c3509875c0e742e76fa0ee4bce6aaf3a4146..0000000000000000000000000000000000000000 |
--- a/net/spdy/spdy_alt_svc_wire_format_test.cc |
+++ /dev/null |
@@ -1,553 +0,0 @@ |
-// Copyright (c) 2015 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "net/spdy/spdy_alt_svc_wire_format.h" |
- |
-#include "base/logging.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/platform_test.h" |
- |
-using ::testing::_; |
- |
-namespace net { |
- |
-namespace test { |
- |
-// Expose all private methods of class SpdyAltSvcWireFormat. |
-class SpdyAltSvcWireFormatPeer { |
- public: |
- static void SkipWhiteSpace(SpdyStringPiece::const_iterator* c, |
- SpdyStringPiece::const_iterator end) { |
- SpdyAltSvcWireFormat::SkipWhiteSpace(c, end); |
- } |
- static bool PercentDecode(SpdyStringPiece::const_iterator c, |
- SpdyStringPiece::const_iterator end, |
- SpdyString* output) { |
- return SpdyAltSvcWireFormat::PercentDecode(c, end, output); |
- } |
- static bool ParseAltAuthority(SpdyStringPiece::const_iterator c, |
- SpdyStringPiece::const_iterator end, |
- SpdyString* host, |
- uint16_t* port) { |
- return SpdyAltSvcWireFormat::ParseAltAuthority(c, end, host, port); |
- } |
- static bool ParsePositiveInteger16(SpdyStringPiece::const_iterator c, |
- SpdyStringPiece::const_iterator end, |
- uint16_t* max_age) { |
- return SpdyAltSvcWireFormat::ParsePositiveInteger16(c, end, max_age); |
- } |
- static bool ParsePositiveInteger32(SpdyStringPiece::const_iterator c, |
- SpdyStringPiece::const_iterator end, |
- uint32_t* max_age) { |
- return SpdyAltSvcWireFormat::ParsePositiveInteger32(c, end, max_age); |
- } |
-}; |
- |
-} // namespace test |
- |
-namespace { |
- |
-// Generate header field values, possibly with multiply defined parameters and |
-// random case, and corresponding AlternativeService entries. |
-void FuzzHeaderFieldValue( |
- int i, |
- SpdyString* header_field_value, |
- SpdyAltSvcWireFormat::AlternativeService* expected_altsvc) { |
- if (!header_field_value->empty()) { |
- header_field_value->push_back(','); |
- } |
- expected_altsvc->protocol_id = "a=b%c"; |
- header_field_value->append("a%3Db%25c=\""); |
- expected_altsvc->host = ""; |
- if (i & 1 << 0) { |
- expected_altsvc->host = "foo\"bar\\baz"; |
- header_field_value->append("foo\\\"bar\\\\baz"); |
- } |
- expected_altsvc->port = 42; |
- header_field_value->append(":42\""); |
- if (i & 1 << 1) { |
- header_field_value->append(" "); |
- } |
- if (i & 3 << 2) { |
- expected_altsvc->max_age = 1111; |
- header_field_value->append(";"); |
- if (i & 1 << 2) { |
- header_field_value->append(" "); |
- } |
- header_field_value->append("mA=1111"); |
- if (i & 2 << 2) { |
- header_field_value->append(" "); |
- } |
- } |
- if (i & 1 << 4) { |
- header_field_value->append("; J=s"); |
- } |
- if (i & 1 << 5) { |
- expected_altsvc->version.push_back(24); |
- header_field_value->append("; v=\"24\""); |
- } |
- if (i & 1 << 6) { |
- expected_altsvc->max_age = 999999999; |
- header_field_value->append("; Ma=999999999"); |
- } |
- if (i & 1 << 7) { |
- header_field_value->append(";"); |
- } |
- if (i & 1 << 8) { |
- header_field_value->append(" "); |
- } |
- if (i & 1 << 9) { |
- header_field_value->append(","); |
- } |
- if (i & 1 << 10) { |
- header_field_value->append(" "); |
- } |
-} |
- |
-// Generate AlternativeService entries and corresponding header field values in |
-// canonical form, that is, what SerializeHeaderFieldValue() should output. |
-void FuzzAlternativeService(int i, |
- SpdyAltSvcWireFormat::AlternativeService* altsvc, |
- SpdyString* expected_header_field_value) { |
- if (!expected_header_field_value->empty()) { |
- expected_header_field_value->push_back(','); |
- } |
- altsvc->protocol_id = "a=b%c"; |
- altsvc->port = 42; |
- expected_header_field_value->append("a%3Db%25c=\""); |
- if (i & 1 << 0) { |
- altsvc->host = "foo\"bar\\baz"; |
- expected_header_field_value->append("foo\\\"bar\\\\baz"); |
- } |
- expected_header_field_value->append(":42\""); |
- if (i & 1 << 1) { |
- altsvc->max_age = 1111; |
- expected_header_field_value->append("; ma=1111"); |
- } |
- if (i & 1 << 2) { |
- altsvc->version.push_back(24); |
- altsvc->version.push_back(25); |
- expected_header_field_value->append("; v=\"24,25\""); |
- } |
-} |
- |
-class SpdyAltSvcWireFormatTest : public ::testing::Test {}; |
- |
-// Tests of public API. |
- |
-TEST(SpdyAltSvcWireFormatTest, DefaultValues) { |
- SpdyAltSvcWireFormat::AlternativeService altsvc; |
- EXPECT_EQ("", altsvc.protocol_id); |
- EXPECT_EQ("", altsvc.host); |
- EXPECT_EQ(0u, altsvc.port); |
- EXPECT_EQ(86400u, altsvc.max_age); |
- EXPECT_TRUE(altsvc.version.empty()); |
-} |
- |
-TEST(SpdyAltSvcWireFormatTest, ParseInvalidEmptyHeaderFieldValue) { |
- SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; |
- ASSERT_FALSE(SpdyAltSvcWireFormat::ParseHeaderFieldValue("", &altsvc_vector)); |
-} |
- |
-TEST(SpdyAltSvcWireFormatTest, ParseHeaderFieldValueClear) { |
- SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; |
- ASSERT_TRUE( |
- SpdyAltSvcWireFormat::ParseHeaderFieldValue("clear", &altsvc_vector)); |
- EXPECT_EQ(0u, altsvc_vector.size()); |
-} |
- |
-// Fuzz test of ParseHeaderFieldValue() with optional whitespaces, ignored |
-// parameters, duplicate parameters, trailing space, trailing alternate service |
-// separator, etc. Single alternative service at a time. |
-TEST(SpdyAltSvcWireFormatTest, ParseHeaderFieldValue) { |
- for (int i = 0; i < 1 << 11; ++i) { |
- SpdyString header_field_value; |
- SpdyAltSvcWireFormat::AlternativeService expected_altsvc; |
- FuzzHeaderFieldValue(i, &header_field_value, &expected_altsvc); |
- SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; |
- ASSERT_TRUE(SpdyAltSvcWireFormat::ParseHeaderFieldValue(header_field_value, |
- &altsvc_vector)); |
- ASSERT_EQ(1u, altsvc_vector.size()); |
- EXPECT_EQ(expected_altsvc.protocol_id, altsvc_vector[0].protocol_id); |
- EXPECT_EQ(expected_altsvc.host, altsvc_vector[0].host); |
- EXPECT_EQ(expected_altsvc.port, altsvc_vector[0].port); |
- EXPECT_EQ(expected_altsvc.max_age, altsvc_vector[0].max_age); |
- EXPECT_EQ(expected_altsvc.version, altsvc_vector[0].version); |
- |
- // Roundtrip test starting with |altsvc_vector|. |
- SpdyString reserialized_header_field_value = |
- SpdyAltSvcWireFormat::SerializeHeaderFieldValue(altsvc_vector); |
- SpdyAltSvcWireFormat::AlternativeServiceVector roundtrip_altsvc_vector; |
- ASSERT_TRUE(SpdyAltSvcWireFormat::ParseHeaderFieldValue( |
- reserialized_header_field_value, &roundtrip_altsvc_vector)); |
- ASSERT_EQ(1u, roundtrip_altsvc_vector.size()); |
- EXPECT_EQ(expected_altsvc.protocol_id, |
- roundtrip_altsvc_vector[0].protocol_id); |
- EXPECT_EQ(expected_altsvc.host, roundtrip_altsvc_vector[0].host); |
- EXPECT_EQ(expected_altsvc.port, roundtrip_altsvc_vector[0].port); |
- EXPECT_EQ(expected_altsvc.max_age, roundtrip_altsvc_vector[0].max_age); |
- EXPECT_EQ(expected_altsvc.version, roundtrip_altsvc_vector[0].version); |
- } |
-} |
- |
-// Fuzz test of ParseHeaderFieldValue() with optional whitespaces, ignored |
-// parameters, duplicate parameters, trailing space, trailing alternate service |
-// separator, etc. Possibly multiple alternative service at a time. |
-TEST(SpdyAltSvcWireFormatTest, ParseHeaderFieldValueMultiple) { |
- for (int i = 0; i < 1 << 11;) { |
- SpdyString header_field_value; |
- SpdyAltSvcWireFormat::AlternativeServiceVector expected_altsvc_vector; |
- // This will generate almost two hundred header field values with two, |
- // three, four, five, six, and seven alternative services each, and |
- // thousands with a single one. |
- do { |
- SpdyAltSvcWireFormat::AlternativeService expected_altsvc; |
- FuzzHeaderFieldValue(i, &header_field_value, &expected_altsvc); |
- expected_altsvc_vector.push_back(expected_altsvc); |
- ++i; |
- } while ((i < 1 << 13) && (i % 6 < i % 7)); |
- SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; |
- ASSERT_TRUE(SpdyAltSvcWireFormat::ParseHeaderFieldValue(header_field_value, |
- &altsvc_vector)); |
- ASSERT_EQ(expected_altsvc_vector.size(), altsvc_vector.size()); |
- for (unsigned int j = 0; j < altsvc_vector.size(); ++j) { |
- EXPECT_EQ(expected_altsvc_vector[j].protocol_id, |
- altsvc_vector[j].protocol_id); |
- EXPECT_EQ(expected_altsvc_vector[j].host, altsvc_vector[j].host); |
- EXPECT_EQ(expected_altsvc_vector[j].port, altsvc_vector[j].port); |
- EXPECT_EQ(expected_altsvc_vector[j].max_age, altsvc_vector[j].max_age); |
- EXPECT_EQ(expected_altsvc_vector[j].version, altsvc_vector[j].version); |
- } |
- |
- // Roundtrip test starting with |altsvc_vector|. |
- SpdyString reserialized_header_field_value = |
- SpdyAltSvcWireFormat::SerializeHeaderFieldValue(altsvc_vector); |
- SpdyAltSvcWireFormat::AlternativeServiceVector roundtrip_altsvc_vector; |
- ASSERT_TRUE(SpdyAltSvcWireFormat::ParseHeaderFieldValue( |
- reserialized_header_field_value, &roundtrip_altsvc_vector)); |
- ASSERT_EQ(expected_altsvc_vector.size(), roundtrip_altsvc_vector.size()); |
- for (unsigned int j = 0; j < roundtrip_altsvc_vector.size(); ++j) { |
- EXPECT_EQ(expected_altsvc_vector[j].protocol_id, |
- roundtrip_altsvc_vector[j].protocol_id); |
- EXPECT_EQ(expected_altsvc_vector[j].host, |
- roundtrip_altsvc_vector[j].host); |
- EXPECT_EQ(expected_altsvc_vector[j].port, |
- roundtrip_altsvc_vector[j].port); |
- EXPECT_EQ(expected_altsvc_vector[j].max_age, |
- roundtrip_altsvc_vector[j].max_age); |
- EXPECT_EQ(expected_altsvc_vector[j].version, |
- roundtrip_altsvc_vector[j].version); |
- } |
- } |
-} |
- |
-TEST(SpdyAltSvcWireFormatTest, SerializeEmptyHeaderFieldValue) { |
- SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; |
- EXPECT_EQ("clear", |
- SpdyAltSvcWireFormat::SerializeHeaderFieldValue(altsvc_vector)); |
-} |
- |
-// Test ParseHeaderFieldValue() and SerializeHeaderFieldValue() on the same pair |
-// of |expected_header_field_value| and |altsvc|, with and without hostname and |
-// each |
-// parameter. Single alternative service at a time. |
-TEST(SpdyAltSvcWireFormatTest, RoundTrip) { |
- for (int i = 0; i < 1 << 3; ++i) { |
- SpdyAltSvcWireFormat::AlternativeService altsvc; |
- SpdyString expected_header_field_value; |
- FuzzAlternativeService(i, &altsvc, &expected_header_field_value); |
- |
- // Test ParseHeaderFieldValue(). |
- SpdyAltSvcWireFormat::AlternativeServiceVector parsed_altsvc_vector; |
- ASSERT_TRUE(SpdyAltSvcWireFormat::ParseHeaderFieldValue( |
- expected_header_field_value, &parsed_altsvc_vector)); |
- ASSERT_EQ(1u, parsed_altsvc_vector.size()); |
- EXPECT_EQ(altsvc.protocol_id, parsed_altsvc_vector[0].protocol_id); |
- EXPECT_EQ(altsvc.host, parsed_altsvc_vector[0].host); |
- EXPECT_EQ(altsvc.port, parsed_altsvc_vector[0].port); |
- EXPECT_EQ(altsvc.max_age, parsed_altsvc_vector[0].max_age); |
- EXPECT_EQ(altsvc.version, parsed_altsvc_vector[0].version); |
- |
- // Test SerializeHeaderFieldValue(). |
- SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; |
- altsvc_vector.push_back(altsvc); |
- EXPECT_EQ(expected_header_field_value, |
- SpdyAltSvcWireFormat::SerializeHeaderFieldValue(altsvc_vector)); |
- } |
-} |
- |
-// Test ParseHeaderFieldValue() and SerializeHeaderFieldValue() on the same pair |
-// of |expected_header_field_value| and |altsvc|, with and without hostname and |
-// each |
-// parameter. Multiple alternative services at a time. |
-TEST(SpdyAltSvcWireFormatTest, RoundTripMultiple) { |
- SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; |
- SpdyString expected_header_field_value; |
- for (int i = 0; i < 1 << 3; ++i) { |
- SpdyAltSvcWireFormat::AlternativeService altsvc; |
- FuzzAlternativeService(i, &altsvc, &expected_header_field_value); |
- altsvc_vector.push_back(altsvc); |
- } |
- |
- // Test ParseHeaderFieldValue(). |
- SpdyAltSvcWireFormat::AlternativeServiceVector parsed_altsvc_vector; |
- ASSERT_TRUE(SpdyAltSvcWireFormat::ParseHeaderFieldValue( |
- expected_header_field_value, &parsed_altsvc_vector)); |
- ASSERT_EQ(altsvc_vector.size(), parsed_altsvc_vector.size()); |
- SpdyAltSvcWireFormat::AlternativeServiceVector::iterator expected_it = |
- altsvc_vector.begin(); |
- SpdyAltSvcWireFormat::AlternativeServiceVector::iterator parsed_it = |
- parsed_altsvc_vector.begin(); |
- for (; expected_it != altsvc_vector.end(); ++expected_it, ++parsed_it) { |
- EXPECT_EQ(expected_it->protocol_id, parsed_it->protocol_id); |
- EXPECT_EQ(expected_it->host, parsed_it->host); |
- EXPECT_EQ(expected_it->port, parsed_it->port); |
- EXPECT_EQ(expected_it->max_age, parsed_it->max_age); |
- EXPECT_EQ(expected_it->version, parsed_it->version); |
- } |
- |
- // Test SerializeHeaderFieldValue(). |
- EXPECT_EQ(expected_header_field_value, |
- SpdyAltSvcWireFormat::SerializeHeaderFieldValue(altsvc_vector)); |
-} |
- |
-// ParseHeaderFieldValue() should return false on malformed field values: |
-// invalid percent encoding, unmatched quotation mark, empty port, non-numeric |
-// characters in numeric fields. |
-TEST(SpdyAltSvcWireFormatTest, ParseHeaderFieldValueInvalid) { |
- SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; |
- const char* invalid_field_value_array[] = {"a%", |
- "a%x", |
- "a%b", |
- "a%9z", |
- "a=", |
- "a=\"", |
- "a=\"b\"", |
- "a=\":\"", |
- "a=\"c:\"", |
- "a=\"c:foo\"", |
- "a=\"c:42foo\"", |
- "a=\"b:42\"bar", |
- "a=\"b:42\" ; m", |
- "a=\"b:42\" ; min-age", |
- "a=\"b:42\" ; ma", |
- "a=\"b:42\" ; ma=", |
- "a=\"b:42\" ; v=\"..\"", |
- "a=\"b:42\" ; ma=ma", |
- "a=\"b:42\" ; ma=123bar", |
- "a=\"b:42\" ; v=24", |
- "a=\"b:42\" ; v=24,25", |
- "a=\"b:42\" ; v=\"-3\"", |
- "a=\"b:42\" ; v=\"1.2\"", |
- "a=\"b:42\" ; v=\"24,\""}; |
- for (const char* invalid_field_value : invalid_field_value_array) { |
- EXPECT_FALSE(SpdyAltSvcWireFormat::ParseHeaderFieldValue( |
- invalid_field_value, &altsvc_vector)) |
- << invalid_field_value; |
- } |
-} |
- |
-// ParseHeaderFieldValue() should return false on a field values truncated |
-// before closing quotation mark, without trying to access memory beyond the end |
-// of the input. |
-TEST(SpdyAltSvcWireFormatTest, ParseTruncatedHeaderFieldValue) { |
- SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; |
- const char* field_value_array[] = {"a=\":137\"", "a=\"foo:137\"", |
- "a%25=\"foo\\\"bar\\\\baz:137\""}; |
- for (const SpdyString& field_value : field_value_array) { |
- for (size_t len = 1; len < field_value.size(); ++len) { |
- EXPECT_FALSE(SpdyAltSvcWireFormat::ParseHeaderFieldValue( |
- field_value.substr(0, len), &altsvc_vector)) |
- << len; |
- } |
- } |
-} |
- |
-// Tests of private methods. |
- |
-// Test SkipWhiteSpace(). |
-TEST(SpdyAltSvcWireFormatTest, SkipWhiteSpace) { |
- SpdyStringPiece input("a \tb "); |
- SpdyStringPiece::const_iterator c = input.begin(); |
- test::SpdyAltSvcWireFormatPeer::SkipWhiteSpace(&c, input.end()); |
- ASSERT_EQ(input.begin(), c); |
- ++c; |
- test::SpdyAltSvcWireFormatPeer::SkipWhiteSpace(&c, input.end()); |
- ASSERT_EQ(input.begin() + 3, c); |
- ++c; |
- test::SpdyAltSvcWireFormatPeer::SkipWhiteSpace(&c, input.end()); |
- ASSERT_EQ(input.end(), c); |
-} |
- |
-// Test PercentDecode() on valid input. |
-TEST(SpdyAltSvcWireFormatTest, PercentDecodeValid) { |
- SpdyStringPiece input(""); |
- SpdyString output; |
- ASSERT_TRUE(test::SpdyAltSvcWireFormatPeer::PercentDecode( |
- input.begin(), input.end(), &output)); |
- EXPECT_EQ("", output); |
- |
- input = SpdyStringPiece("foo"); |
- output.clear(); |
- ASSERT_TRUE(test::SpdyAltSvcWireFormatPeer::PercentDecode( |
- input.begin(), input.end(), &output)); |
- EXPECT_EQ("foo", output); |
- |
- input = SpdyStringPiece("%2ca%5Cb"); |
- output.clear(); |
- ASSERT_TRUE(test::SpdyAltSvcWireFormatPeer::PercentDecode( |
- input.begin(), input.end(), &output)); |
- EXPECT_EQ(",a\\b", output); |
-} |
- |
-// Test PercentDecode() on invalid input. |
-TEST(SpdyAltSvcWireFormatTest, PercentDecodeInvalid) { |
- const char* invalid_input_array[] = {"a%", "a%x", "a%b", "%J22", "%9z"}; |
- for (const char* invalid_input : invalid_input_array) { |
- SpdyStringPiece input(invalid_input); |
- SpdyString output; |
- EXPECT_FALSE(test::SpdyAltSvcWireFormatPeer::PercentDecode( |
- input.begin(), input.end(), &output)) |
- << input; |
- } |
-} |
- |
-// Test ParseAltAuthority() on valid input. |
-TEST(SpdyAltSvcWireFormatTest, ParseAltAuthorityValid) { |
- SpdyStringPiece input(":42"); |
- SpdyString host; |
- uint16_t port; |
- ASSERT_TRUE(test::SpdyAltSvcWireFormatPeer::ParseAltAuthority( |
- input.begin(), input.end(), &host, &port)); |
- EXPECT_TRUE(host.empty()); |
- EXPECT_EQ(42, port); |
- |
- input = SpdyStringPiece("foo:137"); |
- ASSERT_TRUE(test::SpdyAltSvcWireFormatPeer::ParseAltAuthority( |
- input.begin(), input.end(), &host, &port)); |
- EXPECT_EQ("foo", host); |
- EXPECT_EQ(137, port); |
- |
- input = SpdyStringPiece("[2003:8:0:16::509d:9615]:443"); |
- ASSERT_TRUE(test::SpdyAltSvcWireFormatPeer::ParseAltAuthority( |
- input.begin(), input.end(), &host, &port)); |
- EXPECT_EQ("[2003:8:0:16::509d:9615]", host); |
- EXPECT_EQ(443, port); |
-} |
- |
-// Test ParseAltAuthority() on invalid input: empty string, no port, zero port, |
-// non-digit characters following port. |
-TEST(SpdyAltSvcWireFormatTest, ParseAltAuthorityInvalid) { |
- const char* invalid_input_array[] = {"", |
- ":", |
- "foo:", |
- ":bar", |
- ":0", |
- "foo:0", |
- ":12bar", |
- "foo:23bar", |
- " ", |
- ":12 ", |
- "foo:12 ", |
- "[2003:8:0:16::509d:9615]", |
- "[2003:8:0:16::509d:9615]:", |
- "[2003:8:0:16::509d:9615]foo:443", |
- "[2003:8:0:16::509d:9615:443", |
- "2003:8:0:16::509d:9615]:443"}; |
- for (const char* invalid_input : invalid_input_array) { |
- SpdyStringPiece input(invalid_input); |
- SpdyString host; |
- uint16_t port; |
- EXPECT_FALSE(test::SpdyAltSvcWireFormatPeer::ParseAltAuthority( |
- input.begin(), input.end(), &host, &port)) |
- << input; |
- } |
-} |
- |
-// Test ParseInteger() on valid input. |
-TEST(SpdyAltSvcWireFormatTest, ParseIntegerValid) { |
- SpdyStringPiece input("3"); |
- uint16_t value; |
- ASSERT_TRUE(test::SpdyAltSvcWireFormatPeer::ParsePositiveInteger16( |
- input.begin(), input.end(), &value)); |
- EXPECT_EQ(3, value); |
- |
- input = SpdyStringPiece("1337"); |
- ASSERT_TRUE(test::SpdyAltSvcWireFormatPeer::ParsePositiveInteger16( |
- input.begin(), input.end(), &value)); |
- EXPECT_EQ(1337, value); |
-} |
- |
-// Test ParseIntegerValid() on invalid input: empty, zero, non-numeric, trailing |
-// non-numeric characters. |
-TEST(SpdyAltSvcWireFormatTest, ParseIntegerInvalid) { |
- const char* invalid_input_array[] = {"", " ", "a", "0", "00", "1 ", "12b"}; |
- for (const char* invalid_input : invalid_input_array) { |
- SpdyStringPiece input(invalid_input); |
- uint16_t value; |
- EXPECT_FALSE(test::SpdyAltSvcWireFormatPeer::ParsePositiveInteger16( |
- input.begin(), input.end(), &value)) |
- << input; |
- } |
-} |
- |
-// Test ParseIntegerValid() around overflow limit. |
-TEST(SpdyAltSvcWireFormatTest, ParseIntegerOverflow) { |
- // Largest possible uint16_t value. |
- SpdyStringPiece input("65535"); |
- uint16_t value16; |
- ASSERT_TRUE(test::SpdyAltSvcWireFormatPeer::ParsePositiveInteger16( |
- input.begin(), input.end(), &value16)); |
- EXPECT_EQ(65535, value16); |
- |
- // Overflow uint16_t, ParsePositiveInteger16() should return false. |
- input = SpdyStringPiece("65536"); |
- ASSERT_FALSE(test::SpdyAltSvcWireFormatPeer::ParsePositiveInteger16( |
- input.begin(), input.end(), &value16)); |
- |
- // However, even if overflow is not checked for, 65536 overflows to 0, which |
- // returns false anyway. Check for a larger number which overflows to 1. |
- input = SpdyStringPiece("65537"); |
- ASSERT_FALSE(test::SpdyAltSvcWireFormatPeer::ParsePositiveInteger16( |
- input.begin(), input.end(), &value16)); |
- |
- // Largest possible uint32_t value. |
- input = SpdyStringPiece("4294967295"); |
- uint32_t value32; |
- ASSERT_TRUE(test::SpdyAltSvcWireFormatPeer::ParsePositiveInteger32( |
- input.begin(), input.end(), &value32)); |
- EXPECT_EQ(4294967295, value32); |
- |
- // Overflow uint32_t, ParsePositiveInteger32() should return false. |
- input = SpdyStringPiece("4294967296"); |
- ASSERT_FALSE(test::SpdyAltSvcWireFormatPeer::ParsePositiveInteger32( |
- input.begin(), input.end(), &value32)); |
- |
- // However, even if overflow is not checked for, 4294967296 overflows to 0, |
- // which returns false anyway. Check for a larger number which overflows to |
- // 1. |
- input = SpdyStringPiece("4294967297"); |
- ASSERT_FALSE(test::SpdyAltSvcWireFormatPeer::ParsePositiveInteger32( |
- input.begin(), input.end(), &value32)); |
-} |
- |
-// Test parsing an Alt-Svc entry with IP literal hostname. |
-// Regression test for https://crbug.com/664173. |
-TEST(SpdyAltSvcWireFormatTest, ParseIPLiteral) { |
- const char* input = |
- "quic=\"[2003:8:0:16::509d:9615]:443\"; v=\"36,35\"; ma=60"; |
- SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector; |
- ASSERT_TRUE( |
- SpdyAltSvcWireFormat::ParseHeaderFieldValue(input, &altsvc_vector)); |
- EXPECT_EQ(1u, altsvc_vector.size()); |
- EXPECT_EQ("quic", altsvc_vector[0].protocol_id); |
- EXPECT_EQ("[2003:8:0:16::509d:9615]", altsvc_vector[0].host); |
- EXPECT_EQ(443u, altsvc_vector[0].port); |
- EXPECT_EQ(60u, altsvc_vector[0].max_age); |
- EXPECT_THAT(altsvc_vector[0].version, ::testing::ElementsAre(36, 35)); |
-} |
- |
-} // namespace |
- |
-} // namespace net |