OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 #include "net/quic/core/spdy_utils.h" | 4 #include "net/quic/core/spdy_utils.h" |
5 | 5 |
6 #include <memory> | 6 #include <memory> |
7 | 7 |
8 #include "base/macros.h" | 8 #include "base/macros.h" |
| 9 #include "net/quic/platform/api/quic_flag_utils.h" |
| 10 #include "net/quic/platform/api/quic_flags.h" |
9 #include "net/quic/platform/api/quic_string_piece.h" | 11 #include "net/quic/platform/api/quic_string_piece.h" |
10 #include "net/quic/platform/api/quic_test.h" | |
11 #include "net/quic/platform/api/quic_text_utils.h" | 12 #include "net/quic/platform/api/quic_text_utils.h" |
12 #include "net/test/gtest_util.h" | 13 #include "net/test/gtest_util.h" |
13 | 14 |
14 using std::string; | 15 using std::string; |
15 using testing::UnorderedElementsAre; | 16 using testing::UnorderedElementsAre; |
16 using testing::Pair; | 17 using testing::Pair; |
17 | 18 |
18 namespace net { | 19 namespace net { |
19 namespace test { | 20 namespace test { |
20 | 21 |
21 static std::unique_ptr<QuicHeaderList> FromList( | 22 static std::unique_ptr<QuicHeaderList> FromList( |
22 const QuicHeaderList::ListType& src) { | 23 const QuicHeaderList::ListType& src) { |
23 std::unique_ptr<QuicHeaderList> headers(new QuicHeaderList); | 24 std::unique_ptr<QuicHeaderList> headers(new QuicHeaderList); |
24 headers->OnHeaderBlockStart(); | 25 headers->OnHeaderBlockStart(); |
25 for (const auto& p : src) { | 26 for (const auto& p : src) { |
26 headers->OnHeader(p.first, p.second); | 27 headers->OnHeader(p.first, p.second); |
27 } | 28 } |
28 headers->OnHeaderBlockEnd(0, 0); | 29 headers->OnHeaderBlockEnd(0, 0); |
29 return headers; | 30 return headers; |
30 } | 31 } |
31 | 32 |
32 class SpdyUtilsTest : public QuicTest {}; | 33 TEST(CopyAndValidateHeaders, NormalUsage) { |
33 | |
34 TEST_F(SpdyUtilsTest, CopyAndValidateHeaders) { | |
35 auto headers = FromList({// All cookie crumbs are joined. | 34 auto headers = FromList({// All cookie crumbs are joined. |
36 {"cookie", " part 1"}, | 35 {"cookie", " part 1"}, |
37 {"cookie", "part 2 "}, | 36 {"cookie", "part 2 "}, |
38 {"cookie", "part3"}, | 37 {"cookie", "part3"}, |
39 | 38 |
40 // Already-delimited headers are passed through. | 39 // Already-delimited headers are passed through. |
41 {"passed-through", string("foo\0baz", 7)}, | 40 {"passed-through", string("foo\0baz", 7)}, |
42 | 41 |
43 // Other headers are joined on \0. | 42 // Other headers are joined on \0. |
44 {"joined", "value 1"}, | 43 {"joined", "value 1"}, |
(...skipping 18 matching lines...) Expand all Loading... |
63 EXPECT_THAT(block, | 62 EXPECT_THAT(block, |
64 UnorderedElementsAre( | 63 UnorderedElementsAre( |
65 Pair("cookie", " part 1; part 2 ; part3; fin!"), | 64 Pair("cookie", " part 1; part 2 ; part3; fin!"), |
66 Pair("passed-through", QuicStringPiece("foo\0baz", 7)), | 65 Pair("passed-through", QuicStringPiece("foo\0baz", 7)), |
67 Pair("joined", QuicStringPiece("value 1\0value 2", 15)), | 66 Pair("joined", QuicStringPiece("value 1\0value 2", 15)), |
68 Pair("empty", ""), | 67 Pair("empty", ""), |
69 Pair("empty-joined", QuicStringPiece("\0foo\0\0", 6)))); | 68 Pair("empty-joined", QuicStringPiece("\0foo\0\0", 6)))); |
70 EXPECT_EQ(-1, content_length); | 69 EXPECT_EQ(-1, content_length); |
71 } | 70 } |
72 | 71 |
73 TEST_F(SpdyUtilsTest, CopyAndValidateHeadersEmptyName) { | 72 TEST(CopyAndValidateHeaders, EmptyName) { |
74 auto headers = FromList({{"foo", "foovalue"}, {"", "barvalue"}, {"baz", ""}}); | 73 auto headers = FromList({{"foo", "foovalue"}, {"", "barvalue"}, {"baz", ""}}); |
75 int64_t content_length = -1; | 74 int64_t content_length = -1; |
76 SpdyHeaderBlock block; | 75 SpdyHeaderBlock block; |
77 ASSERT_FALSE( | 76 ASSERT_FALSE( |
78 SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block)); | 77 SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block)); |
79 } | 78 } |
80 | 79 |
81 TEST_F(SpdyUtilsTest, CopyAndValidateHeadersUpperCaseName) { | 80 TEST(CopyAndValidateHeaders, UpperCaseName) { |
82 auto headers = | 81 auto headers = |
83 FromList({{"foo", "foovalue"}, {"bar", "barvalue"}, {"bAz", ""}}); | 82 FromList({{"foo", "foovalue"}, {"bar", "barvalue"}, {"bAz", ""}}); |
84 int64_t content_length = -1; | 83 int64_t content_length = -1; |
85 SpdyHeaderBlock block; | 84 SpdyHeaderBlock block; |
86 ASSERT_FALSE( | 85 ASSERT_FALSE( |
87 SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block)); | 86 SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block)); |
88 } | 87 } |
89 | 88 |
90 TEST_F(SpdyUtilsTest, CopyAndValidateHeadersMultipleContentLengths) { | 89 TEST(CopyAndValidateHeaders, MultipleContentLengths) { |
91 auto headers = FromList({{"content-length", "9"}, | 90 auto headers = FromList({{"content-length", "9"}, |
92 {"foo", "foovalue"}, | 91 {"foo", "foovalue"}, |
93 {"content-length", "9"}, | 92 {"content-length", "9"}, |
94 {"bar", "barvalue"}, | 93 {"bar", "barvalue"}, |
95 {"baz", ""}}); | 94 {"baz", ""}}); |
96 int64_t content_length = -1; | 95 int64_t content_length = -1; |
97 SpdyHeaderBlock block; | 96 SpdyHeaderBlock block; |
98 ASSERT_TRUE( | 97 ASSERT_TRUE( |
99 SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block)); | 98 SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block)); |
100 EXPECT_THAT(block, UnorderedElementsAre( | 99 EXPECT_THAT(block, UnorderedElementsAre( |
101 Pair("foo", "foovalue"), Pair("bar", "barvalue"), | 100 Pair("foo", "foovalue"), Pair("bar", "barvalue"), |
102 Pair("content-length", QuicStringPiece("9" | 101 Pair("content-length", QuicStringPiece("9" |
103 "\0" | 102 "\0" |
104 "9", | 103 "9", |
105 3)), | 104 3)), |
106 Pair("baz", ""))); | 105 Pair("baz", ""))); |
107 EXPECT_EQ(9, content_length); | 106 EXPECT_EQ(9, content_length); |
108 } | 107 } |
109 | 108 |
110 TEST_F(SpdyUtilsTest, CopyAndValidateHeadersInconsistentContentLengths) { | 109 TEST(CopyAndValidateHeaders, InconsistentContentLengths) { |
111 auto headers = FromList({{"content-length", "9"}, | 110 auto headers = FromList({{"content-length", "9"}, |
112 {"foo", "foovalue"}, | 111 {"foo", "foovalue"}, |
113 {"content-length", "8"}, | 112 {"content-length", "8"}, |
114 {"bar", "barvalue"}, | 113 {"bar", "barvalue"}, |
115 {"baz", ""}}); | 114 {"baz", ""}}); |
116 int64_t content_length = -1; | 115 int64_t content_length = -1; |
117 SpdyHeaderBlock block; | 116 SpdyHeaderBlock block; |
118 ASSERT_FALSE( | 117 ASSERT_FALSE( |
119 SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block)); | 118 SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block)); |
120 } | 119 } |
121 | 120 |
122 TEST_F(SpdyUtilsTest, CopyAndValidateHeadersLargeContentLength) { | 121 TEST(CopyAndValidateHeaders, LargeContentLength) { |
123 auto headers = FromList({{"content-length", "9000000000"}, | 122 auto headers = FromList({{"content-length", "9000000000"}, |
124 {"foo", "foovalue"}, | 123 {"foo", "foovalue"}, |
125 {"bar", "barvalue"}, | 124 {"bar", "barvalue"}, |
126 {"baz", ""}}); | 125 {"baz", ""}}); |
127 int64_t content_length = -1; | 126 int64_t content_length = -1; |
128 SpdyHeaderBlock block; | 127 SpdyHeaderBlock block; |
129 ASSERT_TRUE( | 128 ASSERT_TRUE( |
130 SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block)); | 129 SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block)); |
131 EXPECT_THAT(block, UnorderedElementsAre( | 130 EXPECT_THAT(block, UnorderedElementsAre( |
132 Pair("foo", "foovalue"), Pair("bar", "barvalue"), | 131 Pair("foo", "foovalue"), Pair("bar", "barvalue"), |
133 Pair("content-length", QuicStringPiece("9000000000")), | 132 Pair("content-length", QuicStringPiece("9000000000")), |
134 Pair("baz", ""))); | 133 Pair("baz", ""))); |
135 EXPECT_EQ(9000000000, content_length); | 134 EXPECT_EQ(9000000000, content_length); |
136 } | 135 } |
137 | 136 |
138 TEST_F(SpdyUtilsTest, CopyAndValidateHeadersMultipleValues) { | 137 TEST(CopyAndValidateHeaders, MultipleValues) { |
139 auto headers = FromList({{"foo", "foovalue"}, | 138 auto headers = FromList({{"foo", "foovalue"}, |
140 {"bar", "barvalue"}, | 139 {"bar", "barvalue"}, |
141 {"baz", ""}, | 140 {"baz", ""}, |
142 {"foo", "boo"}, | 141 {"foo", "boo"}, |
143 {"baz", "buzz"}}); | 142 {"baz", "buzz"}}); |
144 int64_t content_length = -1; | 143 int64_t content_length = -1; |
145 SpdyHeaderBlock block; | 144 SpdyHeaderBlock block; |
146 ASSERT_TRUE( | 145 ASSERT_TRUE( |
147 SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block)); | 146 SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block)); |
148 EXPECT_THAT(block, UnorderedElementsAre( | 147 EXPECT_THAT(block, UnorderedElementsAre( |
149 Pair("foo", QuicStringPiece("foovalue\0boo", 12)), | 148 Pair("foo", QuicStringPiece("foovalue\0boo", 12)), |
150 Pair("bar", "barvalue"), | 149 Pair("bar", "barvalue"), |
151 Pair("baz", QuicStringPiece("\0buzz", 5)))); | 150 Pair("baz", QuicStringPiece("\0buzz", 5)))); |
152 EXPECT_EQ(-1, content_length); | 151 EXPECT_EQ(-1, content_length); |
153 } | 152 } |
154 | 153 |
155 TEST_F(SpdyUtilsTest, CopyAndValidateHeadersMoreThanTwoValues) { | 154 TEST(CopyAndValidateHeaders, MoreThanTwoValues) { |
156 auto headers = FromList({{"set-cookie", "value1"}, | 155 auto headers = FromList({{"set-cookie", "value1"}, |
157 {"set-cookie", "value2"}, | 156 {"set-cookie", "value2"}, |
158 {"set-cookie", "value3"}}); | 157 {"set-cookie", "value3"}}); |
159 int64_t content_length = -1; | 158 int64_t content_length = -1; |
160 SpdyHeaderBlock block; | 159 SpdyHeaderBlock block; |
161 ASSERT_TRUE( | 160 ASSERT_TRUE( |
162 SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block)); | 161 SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block)); |
163 EXPECT_THAT( | 162 EXPECT_THAT( |
164 block, UnorderedElementsAre(Pair( | 163 block, UnorderedElementsAre(Pair( |
165 "set-cookie", QuicStringPiece("value1\0value2\0value3", 20)))); | 164 "set-cookie", QuicStringPiece("value1\0value2\0value3", 20)))); |
166 EXPECT_EQ(-1, content_length); | 165 EXPECT_EQ(-1, content_length); |
167 } | 166 } |
168 | 167 |
169 TEST_F(SpdyUtilsTest, CopyAndValidateHeadersCookie) { | 168 TEST(CopyAndValidateHeaders, Cookie) { |
170 auto headers = FromList({{"foo", "foovalue"}, | 169 auto headers = FromList({{"foo", "foovalue"}, |
171 {"bar", "barvalue"}, | 170 {"bar", "barvalue"}, |
172 {"cookie", "value1"}, | 171 {"cookie", "value1"}, |
173 {"baz", ""}}); | 172 {"baz", ""}}); |
174 int64_t content_length = -1; | 173 int64_t content_length = -1; |
175 SpdyHeaderBlock block; | 174 SpdyHeaderBlock block; |
176 ASSERT_TRUE( | 175 ASSERT_TRUE( |
177 SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block)); | 176 SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block)); |
178 EXPECT_THAT(block, UnorderedElementsAre( | 177 EXPECT_THAT(block, UnorderedElementsAre( |
179 Pair("foo", "foovalue"), Pair("bar", "barvalue"), | 178 Pair("foo", "foovalue"), Pair("bar", "barvalue"), |
180 Pair("cookie", "value1"), Pair("baz", ""))); | 179 Pair("cookie", "value1"), Pair("baz", ""))); |
181 EXPECT_EQ(-1, content_length); | 180 EXPECT_EQ(-1, content_length); |
182 } | 181 } |
183 | 182 |
184 TEST_F(SpdyUtilsTest, CopyAndValidateHeadersMultipleCookies) { | 183 TEST(CopyAndValidateHeaders, MultipleCookies) { |
185 auto headers = FromList({{"foo", "foovalue"}, | 184 auto headers = FromList({{"foo", "foovalue"}, |
186 {"bar", "barvalue"}, | 185 {"bar", "barvalue"}, |
187 {"cookie", "value1"}, | 186 {"cookie", "value1"}, |
188 {"baz", ""}, | 187 {"baz", ""}, |
189 {"cookie", "value2"}}); | 188 {"cookie", "value2"}}); |
190 int64_t content_length = -1; | 189 int64_t content_length = -1; |
191 SpdyHeaderBlock block; | 190 SpdyHeaderBlock block; |
192 ASSERT_TRUE( | 191 ASSERT_TRUE( |
193 SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block)); | 192 SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block)); |
194 EXPECT_THAT(block, UnorderedElementsAre( | 193 EXPECT_THAT(block, UnorderedElementsAre( |
195 Pair("foo", "foovalue"), Pair("bar", "barvalue"), | 194 Pair("foo", "foovalue"), Pair("bar", "barvalue"), |
196 Pair("cookie", "value1; value2"), Pair("baz", ""))); | 195 Pair("cookie", "value1; value2"), Pair("baz", ""))); |
197 EXPECT_EQ(-1, content_length); | 196 EXPECT_EQ(-1, content_length); |
198 } | 197 } |
199 | 198 |
200 TEST_F(SpdyUtilsTest, GetUrlFromHeaderBlock) { | 199 TEST(CopyAndValidateTrailers, SimplestValidList) { |
| 200 // Verify that the simplest trailers are valid: just a final byte offset that |
| 201 // gets parsed successfully. |
| 202 auto trailers = FromList({{kFinalOffsetHeaderKey, "1234"}}); |
| 203 size_t final_byte_offset = 0; |
| 204 SpdyHeaderBlock block; |
| 205 EXPECT_TRUE(SpdyUtils::CopyAndValidateTrailers(*trailers, &final_byte_offset, |
| 206 &block)); |
| 207 EXPECT_EQ(1234u, final_byte_offset); |
| 208 } |
| 209 |
| 210 TEST(CopyAndValidateTrailers, EmptyTrailerList) { |
| 211 // An empty trailer list will fail as required key kFinalOffsetHeaderKey is |
| 212 // not present. |
| 213 QuicHeaderList trailers; |
| 214 size_t final_byte_offset = 0; |
| 215 SpdyHeaderBlock block; |
| 216 EXPECT_FALSE( |
| 217 SpdyUtils::CopyAndValidateTrailers(trailers, &final_byte_offset, &block)); |
| 218 } |
| 219 |
| 220 TEST(CopyAndValidateTrailers, FinalByteOffsetNotPresent) { |
| 221 // Validation fails if required kFinalOffsetHeaderKey is not present, even if |
| 222 // the rest of the header block is valid. |
| 223 auto trailers = FromList({{"key", "value"}}); |
| 224 size_t final_byte_offset = 0; |
| 225 SpdyHeaderBlock block; |
| 226 EXPECT_FALSE(SpdyUtils::CopyAndValidateTrailers(*trailers, &final_byte_offset, |
| 227 &block)); |
| 228 } |
| 229 |
| 230 TEST(CopyAndValidateTrailers, EmptyName) { |
| 231 // Trailer validation will fail with an empty header key, in an otherwise |
| 232 // valid block of trailers. |
| 233 auto trailers = FromList({{"", "value"}, {kFinalOffsetHeaderKey, "1234"}}); |
| 234 size_t final_byte_offset = 0; |
| 235 SpdyHeaderBlock block; |
| 236 EXPECT_FALSE(SpdyUtils::CopyAndValidateTrailers(*trailers, &final_byte_offset, |
| 237 &block)); |
| 238 } |
| 239 |
| 240 TEST(CopyAndValidateTrailers, PseudoHeaderInTrailers) { |
| 241 // Pseudo headers are illegal in trailers. |
| 242 auto trailers = |
| 243 FromList({{":pseudo_key", "value"}, {kFinalOffsetHeaderKey, "1234"}}); |
| 244 size_t final_byte_offset = 0; |
| 245 SpdyHeaderBlock block; |
| 246 EXPECT_FALSE(SpdyUtils::CopyAndValidateTrailers(*trailers, &final_byte_offset, |
| 247 &block)); |
| 248 } |
| 249 |
| 250 TEST(CopyAndValidateTrailers, DuplicateTrailers) { |
| 251 // Duplicate trailers are allowed, and their values are concatenated into a |
| 252 // single string delimted with '\0'. Some of the duplicate headers |
| 253 // deliberately have an empty value. |
| 254 FLAGS_quic_reloadable_flag_quic_handle_duplicate_trailers = true; |
| 255 auto trailers = FromList({{"key", "value0"}, |
| 256 {"key", "value1"}, |
| 257 {"key", ""}, |
| 258 {"key", ""}, |
| 259 {"key", "value2"}, |
| 260 {"key", ""}, |
| 261 {kFinalOffsetHeaderKey, "1234"}, |
| 262 {"other_key", "value"}, |
| 263 {"key", "non_contiguous_duplicate"}}); |
| 264 size_t final_byte_offset = 0; |
| 265 SpdyHeaderBlock block; |
| 266 EXPECT_TRUE(SpdyUtils::CopyAndValidateTrailers(*trailers, &final_byte_offset, |
| 267 &block)); |
| 268 EXPECT_THAT( |
| 269 block, |
| 270 UnorderedElementsAre( |
| 271 Pair("key", |
| 272 QuicStringPiece( |
| 273 "value0\0value1\0\0\0value2\0\0non_contiguous_duplicate", |
| 274 48)), |
| 275 Pair("other_key", "value"))); |
| 276 } |
| 277 |
| 278 TEST(CopyAndValidateTrailers, DuplicateCookies) { |
| 279 // Duplicate cookie headers in trailers should be concatenated into a single |
| 280 // "; " delimted string. |
| 281 FLAGS_quic_reloadable_flag_quic_handle_duplicate_trailers = true; |
| 282 auto headers = FromList({{"cookie", " part 1"}, |
| 283 {"cookie", "part 2 "}, |
| 284 {"cookie", "part3"}, |
| 285 {"key", "value"}, |
| 286 {kFinalOffsetHeaderKey, "1234"}, |
| 287 {"cookie", " non_contiguous_cookie!"}}); |
| 288 |
| 289 size_t final_byte_offset = 0; |
| 290 SpdyHeaderBlock block; |
| 291 EXPECT_TRUE( |
| 292 SpdyUtils::CopyAndValidateTrailers(*headers, &final_byte_offset, &block)); |
| 293 EXPECT_THAT( |
| 294 block, |
| 295 UnorderedElementsAre( |
| 296 Pair("cookie", " part 1; part 2 ; part3; non_contiguous_cookie!"), |
| 297 Pair("key", "value"))); |
| 298 } |
| 299 |
| 300 TEST(GetUrlFromHeaderBlock, Basic) { |
201 SpdyHeaderBlock headers; | 301 SpdyHeaderBlock headers; |
202 EXPECT_EQ(SpdyUtils::GetUrlFromHeaderBlock(headers), ""); | 302 EXPECT_EQ(SpdyUtils::GetUrlFromHeaderBlock(headers), ""); |
203 headers[":scheme"] = "https"; | 303 headers[":scheme"] = "https"; |
204 EXPECT_EQ(SpdyUtils::GetUrlFromHeaderBlock(headers), ""); | 304 EXPECT_EQ(SpdyUtils::GetUrlFromHeaderBlock(headers), ""); |
205 headers[":authority"] = "www.google.com"; | 305 headers[":authority"] = "www.google.com"; |
206 EXPECT_EQ(SpdyUtils::GetUrlFromHeaderBlock(headers), ""); | 306 EXPECT_EQ(SpdyUtils::GetUrlFromHeaderBlock(headers), ""); |
207 headers[":path"] = "/index.html"; | 307 headers[":path"] = "/index.html"; |
208 EXPECT_EQ(SpdyUtils::GetUrlFromHeaderBlock(headers), | 308 EXPECT_EQ(SpdyUtils::GetUrlFromHeaderBlock(headers), |
209 "https://www.google.com/index.html"); | 309 "https://www.google.com/index.html"); |
210 headers["key1"] = "value1"; | 310 headers["key1"] = "value1"; |
211 headers["key2"] = "value2"; | 311 headers["key2"] = "value2"; |
212 EXPECT_EQ(SpdyUtils::GetUrlFromHeaderBlock(headers), | 312 EXPECT_EQ(SpdyUtils::GetUrlFromHeaderBlock(headers), |
213 "https://www.google.com/index.html"); | 313 "https://www.google.com/index.html"); |
214 } | 314 } |
215 | 315 |
216 TEST_F(SpdyUtilsTest, GetHostNameFromHeaderBlock) { | 316 TEST(GetHostNameFromHeaderBlock, NormalUsage) { |
217 SpdyHeaderBlock headers; | 317 SpdyHeaderBlock headers; |
218 EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), ""); | 318 EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), ""); |
219 headers[":scheme"] = "https"; | 319 headers[":scheme"] = "https"; |
220 EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), ""); | 320 EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), ""); |
221 headers[":authority"] = "www.google.com"; | 321 headers[":authority"] = "www.google.com"; |
222 EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), ""); | 322 EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), ""); |
223 headers[":path"] = "/index.html"; | 323 headers[":path"] = "/index.html"; |
224 EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), "www.google.com"); | 324 EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), "www.google.com"); |
225 headers["key1"] = "value1"; | 325 headers["key1"] = "value1"; |
226 headers["key2"] = "value2"; | 326 headers["key2"] = "value2"; |
227 EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), "www.google.com"); | 327 EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), "www.google.com"); |
228 headers[":authority"] = "www.google.com:6666"; | 328 headers[":authority"] = "www.google.com:6666"; |
229 EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), "www.google.com"); | 329 EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), "www.google.com"); |
230 headers[":authority"] = "192.168.1.1"; | 330 headers[":authority"] = "192.168.1.1"; |
231 EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), "192.168.1.1"); | 331 EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), "192.168.1.1"); |
232 headers[":authority"] = "192.168.1.1:6666"; | 332 headers[":authority"] = "192.168.1.1:6666"; |
233 EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), "192.168.1.1"); | 333 EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), "192.168.1.1"); |
234 } | 334 } |
235 | 335 |
236 TEST_F(SpdyUtilsTest, PopulateHeaderBlockFromUrl) { | 336 TEST(PopulateHeaderBlockFromUrl, NormalUsage) { |
237 string url = "https://www.google.com/index.html"; | 337 string url = "https://www.google.com/index.html"; |
238 SpdyHeaderBlock headers; | 338 SpdyHeaderBlock headers; |
239 EXPECT_TRUE(SpdyUtils::PopulateHeaderBlockFromUrl(url, &headers)); | 339 EXPECT_TRUE(SpdyUtils::PopulateHeaderBlockFromUrl(url, &headers)); |
240 EXPECT_EQ("https", headers[":scheme"].as_string()); | 340 EXPECT_EQ("https", headers[":scheme"].as_string()); |
241 EXPECT_EQ("www.google.com", headers[":authority"].as_string()); | 341 EXPECT_EQ("www.google.com", headers[":authority"].as_string()); |
242 EXPECT_EQ("/index.html", headers[":path"].as_string()); | 342 EXPECT_EQ("/index.html", headers[":path"].as_string()); |
243 } | 343 } |
244 | 344 |
245 TEST_F(SpdyUtilsTest, PopulateHeaderBlockFromUrlWithNoPath) { | 345 TEST(PopulateHeaderBlockFromUrl, UrlWithNoPath) { |
246 string url = "https://www.google.com"; | 346 string url = "https://www.google.com"; |
247 SpdyHeaderBlock headers; | 347 SpdyHeaderBlock headers; |
248 EXPECT_TRUE(SpdyUtils::PopulateHeaderBlockFromUrl(url, &headers)); | 348 EXPECT_TRUE(SpdyUtils::PopulateHeaderBlockFromUrl(url, &headers)); |
249 EXPECT_EQ("https", headers[":scheme"].as_string()); | 349 EXPECT_EQ("https", headers[":scheme"].as_string()); |
250 EXPECT_EQ("www.google.com", headers[":authority"].as_string()); | 350 EXPECT_EQ("www.google.com", headers[":authority"].as_string()); |
251 EXPECT_EQ("/", headers[":path"].as_string()); | 351 EXPECT_EQ("/", headers[":path"].as_string()); |
252 } | 352 } |
253 | 353 |
254 TEST_F(SpdyUtilsTest, PopulateHeaderBlockFromUrlFails) { | 354 TEST(PopulateHeaderBlockFromUrl, Failure) { |
255 SpdyHeaderBlock headers; | 355 SpdyHeaderBlock headers; |
256 EXPECT_FALSE(SpdyUtils::PopulateHeaderBlockFromUrl("/", &headers)); | 356 EXPECT_FALSE(SpdyUtils::PopulateHeaderBlockFromUrl("/", &headers)); |
257 EXPECT_FALSE(SpdyUtils::PopulateHeaderBlockFromUrl("/index.html", &headers)); | 357 EXPECT_FALSE(SpdyUtils::PopulateHeaderBlockFromUrl("/index.html", &headers)); |
258 EXPECT_FALSE( | 358 EXPECT_FALSE( |
259 SpdyUtils::PopulateHeaderBlockFromUrl("www.google.com/", &headers)); | 359 SpdyUtils::PopulateHeaderBlockFromUrl("www.google.com/", &headers)); |
260 } | 360 } |
261 | 361 |
262 } // namespace test | 362 } // namespace test |
263 } // namespace net | 363 } // namespace net |
OLD | NEW |