1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "net/http/http_server_properties_impl.h"
10 #include "base/basictypes.h"
11 #include "base/containers/hash_tables.h"
12 #include "base/logging.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/values.h"
15 #include "net/base/host_port_pair.h"
16 #include "testing/gtest/include/gtest/gtest.h"
26 class HttpServerPropertiesImplTest
: public testing::Test
{
28 HttpServerPropertiesImpl impl_
;
31 typedef HttpServerPropertiesImplTest SpdyServerPropertiesTest
;
33 TEST_F(SpdyServerPropertiesTest
, Initialize
) {
34 HostPortPair
spdy_server_google("www.google.com", 443);
35 std::string spdy_server_g
=
36 HttpServerPropertiesImpl::GetFlattenedSpdyServer(spdy_server_google
);
38 HostPortPair
spdy_server_docs("docs.google.com", 443);
39 std::string spdy_server_d
=
40 HttpServerPropertiesImpl::GetFlattenedSpdyServer(spdy_server_docs
);
42 // Check by initializing NULL spdy servers.
43 impl_
.InitializeSpdyServers(NULL
, true);
44 EXPECT_FALSE(impl_
.SupportsSpdy(spdy_server_google
));
46 // Check by initializing empty spdy servers.
47 std::vector
<std::string
> spdy_servers
;
48 impl_
.InitializeSpdyServers(&spdy_servers
, true);
49 EXPECT_FALSE(impl_
.SupportsSpdy(spdy_server_google
));
51 // Check by initializing with www.google.com:443 spdy server.
52 std::vector
<std::string
> spdy_servers1
;
53 spdy_servers1
.push_back(spdy_server_g
);
54 impl_
.InitializeSpdyServers(&spdy_servers1
, true);
55 EXPECT_TRUE(impl_
.SupportsSpdy(spdy_server_google
));
57 // Check by initializing with www.google.com:443 and docs.google.com:443 spdy
59 std::vector
<std::string
> spdy_servers2
;
60 spdy_servers2
.push_back(spdy_server_g
);
61 spdy_servers2
.push_back(spdy_server_d
);
62 impl_
.InitializeSpdyServers(&spdy_servers2
, true);
63 EXPECT_TRUE(impl_
.SupportsSpdy(spdy_server_google
));
64 EXPECT_TRUE(impl_
.SupportsSpdy(spdy_server_docs
));
67 TEST_F(SpdyServerPropertiesTest
, SupportsSpdyTest
) {
68 HostPortPair
spdy_server_empty(std::string(), 443);
69 EXPECT_FALSE(impl_
.SupportsSpdy(spdy_server_empty
));
71 // Add www.google.com:443 as supporting SPDY.
72 HostPortPair
spdy_server_google("www.google.com", 443);
73 impl_
.SetSupportsSpdy(spdy_server_google
, true);
74 EXPECT_TRUE(impl_
.SupportsSpdy(spdy_server_google
));
76 // Add mail.google.com:443 as not supporting SPDY.
77 HostPortPair
spdy_server_mail("mail.google.com", 443);
78 EXPECT_FALSE(impl_
.SupportsSpdy(spdy_server_mail
));
80 // Add docs.google.com:443 as supporting SPDY.
81 HostPortPair
spdy_server_docs("docs.google.com", 443);
82 impl_
.SetSupportsSpdy(spdy_server_docs
, true);
83 EXPECT_TRUE(impl_
.SupportsSpdy(spdy_server_docs
));
85 // Verify all the entries are the same after additions.
86 EXPECT_TRUE(impl_
.SupportsSpdy(spdy_server_google
));
87 EXPECT_FALSE(impl_
.SupportsSpdy(spdy_server_mail
));
88 EXPECT_TRUE(impl_
.SupportsSpdy(spdy_server_docs
));
91 TEST_F(SpdyServerPropertiesTest
, SetSupportsSpdy
) {
92 HostPortPair
spdy_server_empty(std::string(), 443);
93 impl_
.SetSupportsSpdy(spdy_server_empty
, true);
94 EXPECT_FALSE(impl_
.SupportsSpdy(spdy_server_empty
));
96 // Add www.google.com:443 as supporting SPDY.
97 HostPortPair
spdy_server_google("www.google.com", 443);
98 EXPECT_FALSE(impl_
.SupportsSpdy(spdy_server_google
));
99 impl_
.SetSupportsSpdy(spdy_server_google
, true);
100 EXPECT_TRUE(impl_
.SupportsSpdy(spdy_server_google
));
102 // Make www.google.com:443 as not supporting SPDY.
103 impl_
.SetSupportsSpdy(spdy_server_google
, false);
104 EXPECT_FALSE(impl_
.SupportsSpdy(spdy_server_google
));
106 // Add mail.google.com:443 as supporting SPDY.
107 HostPortPair
spdy_server_mail("mail.google.com", 443);
108 EXPECT_FALSE(impl_
.SupportsSpdy(spdy_server_mail
));
109 impl_
.SetSupportsSpdy(spdy_server_mail
, true);
110 EXPECT_TRUE(impl_
.SupportsSpdy(spdy_server_mail
));
111 EXPECT_FALSE(impl_
.SupportsSpdy(spdy_server_google
));
114 TEST_F(SpdyServerPropertiesTest
, Clear
) {
115 // Add www.google.com:443 and mail.google.com:443 as supporting SPDY.
116 HostPortPair
spdy_server_google("www.google.com", 443);
117 impl_
.SetSupportsSpdy(spdy_server_google
, true);
118 HostPortPair
spdy_server_mail("mail.google.com", 443);
119 impl_
.SetSupportsSpdy(spdy_server_mail
, true);
121 EXPECT_TRUE(impl_
.SupportsSpdy(spdy_server_google
));
122 EXPECT_TRUE(impl_
.SupportsSpdy(spdy_server_mail
));
125 EXPECT_FALSE(impl_
.SupportsSpdy(spdy_server_google
));
126 EXPECT_FALSE(impl_
.SupportsSpdy(spdy_server_mail
));
129 TEST_F(SpdyServerPropertiesTest
, GetSpdyServerList
) {
130 base::ListValue spdy_server_list
;
132 // Check there are no spdy_servers.
133 impl_
.GetSpdyServerList(&spdy_server_list
);
134 EXPECT_EQ(0U, spdy_server_list
.GetSize());
136 // Check empty server is not added.
137 HostPortPair
spdy_server_empty(std::string(), 443);
138 impl_
.SetSupportsSpdy(spdy_server_empty
, true);
139 impl_
.GetSpdyServerList(&spdy_server_list
);
140 EXPECT_EQ(0U, spdy_server_list
.GetSize());
142 std::string string_value_g
;
143 std::string string_value_m
;
144 HostPortPair
spdy_server_google("www.google.com", 443);
145 std::string spdy_server_g
=
146 HttpServerPropertiesImpl::GetFlattenedSpdyServer(spdy_server_google
);
147 HostPortPair
spdy_server_mail("mail.google.com", 443);
148 std::string spdy_server_m
=
149 HttpServerPropertiesImpl::GetFlattenedSpdyServer(spdy_server_mail
);
151 // Add www.google.com:443 as not supporting SPDY.
152 impl_
.SetSupportsSpdy(spdy_server_google
, false);
153 impl_
.GetSpdyServerList(&spdy_server_list
);
154 EXPECT_EQ(0U, spdy_server_list
.GetSize());
156 // Add www.google.com:443 as supporting SPDY.
157 impl_
.SetSupportsSpdy(spdy_server_google
, true);
158 impl_
.GetSpdyServerList(&spdy_server_list
);
159 ASSERT_EQ(1U, spdy_server_list
.GetSize());
160 ASSERT_TRUE(spdy_server_list
.GetString(0, &string_value_g
));
161 ASSERT_EQ(spdy_server_g
, string_value_g
);
163 // Add mail.google.com:443 as not supporting SPDY.
164 impl_
.SetSupportsSpdy(spdy_server_mail
, false);
165 impl_
.GetSpdyServerList(&spdy_server_list
);
166 ASSERT_EQ(1U, spdy_server_list
.GetSize());
167 ASSERT_TRUE(spdy_server_list
.GetString(0, &string_value_g
));
168 ASSERT_EQ(spdy_server_g
, string_value_g
);
170 // Add mail.google.com:443 as supporting SPDY.
171 impl_
.SetSupportsSpdy(spdy_server_mail
, true);
172 impl_
.GetSpdyServerList(&spdy_server_list
);
173 ASSERT_EQ(2U, spdy_server_list
.GetSize());
175 // Verify www.google.com:443 and mail.google.com:443 are in the list.
176 ASSERT_TRUE(spdy_server_list
.GetString(0, &string_value_g
));
177 ASSERT_TRUE(spdy_server_list
.GetString(1, &string_value_m
));
178 if (string_value_g
.compare(spdy_server_g
) == 0) {
179 ASSERT_EQ(spdy_server_g
, string_value_g
);
180 ASSERT_EQ(spdy_server_m
, string_value_m
);
182 ASSERT_EQ(spdy_server_g
, string_value_m
);
183 ASSERT_EQ(spdy_server_m
, string_value_g
);
187 typedef HttpServerPropertiesImplTest AlternateProtocolServerPropertiesTest
;
189 TEST_F(AlternateProtocolServerPropertiesTest
, Basic
) {
190 HostPortPair
test_host_port_pair("foo", 80);
191 EXPECT_FALSE(impl_
.HasAlternateProtocol(test_host_port_pair
));
192 impl_
.SetAlternateProtocol(test_host_port_pair
, 443, NPN_SPDY_1
);
193 ASSERT_TRUE(impl_
.HasAlternateProtocol(test_host_port_pair
));
194 const PortAlternateProtocolPair alternate
=
195 impl_
.GetAlternateProtocol(test_host_port_pair
);
196 EXPECT_EQ(443, alternate
.port
);
197 EXPECT_EQ(NPN_SPDY_1
, alternate
.protocol
);
200 EXPECT_FALSE(impl_
.HasAlternateProtocol(test_host_port_pair
));
203 TEST_F(AlternateProtocolServerPropertiesTest
, Initialize
) {
204 HostPortPair
test_host_port_pair1("foo1", 80);
205 impl_
.SetBrokenAlternateProtocol(test_host_port_pair1
);
206 HostPortPair
test_host_port_pair2("foo2", 80);
207 impl_
.SetAlternateProtocol(test_host_port_pair2
, 443, NPN_SPDY_1
);
209 AlternateProtocolMap alternate_protocol_map
;
210 PortAlternateProtocolPair port_alternate_protocol_pair
;
211 port_alternate_protocol_pair
.port
= 123;
212 port_alternate_protocol_pair
.protocol
= NPN_SPDY_2
;
213 alternate_protocol_map
[test_host_port_pair2
] = port_alternate_protocol_pair
;
214 impl_
.InitializeAlternateProtocolServers(&alternate_protocol_map
);
216 ASSERT_TRUE(impl_
.HasAlternateProtocol(test_host_port_pair1
));
217 ASSERT_TRUE(impl_
.HasAlternateProtocol(test_host_port_pair2
));
218 port_alternate_protocol_pair
=
219 impl_
.GetAlternateProtocol(test_host_port_pair1
);
220 EXPECT_EQ(ALTERNATE_PROTOCOL_BROKEN
, port_alternate_protocol_pair
.protocol
);
221 port_alternate_protocol_pair
=
222 impl_
.GetAlternateProtocol(test_host_port_pair2
);
223 EXPECT_EQ(123, port_alternate_protocol_pair
.port
);
224 EXPECT_EQ(NPN_SPDY_2
, port_alternate_protocol_pair
.protocol
);
227 TEST_F(AlternateProtocolServerPropertiesTest
, SetBroken
) {
228 HostPortPair
test_host_port_pair("foo", 80);
229 impl_
.SetBrokenAlternateProtocol(test_host_port_pair
);
230 ASSERT_TRUE(impl_
.HasAlternateProtocol(test_host_port_pair
));
231 PortAlternateProtocolPair alternate
=
232 impl_
.GetAlternateProtocol(test_host_port_pair
);
233 EXPECT_EQ(ALTERNATE_PROTOCOL_BROKEN
, alternate
.protocol
);
235 impl_
.SetAlternateProtocol(
239 alternate
= impl_
.GetAlternateProtocol(test_host_port_pair
);
240 EXPECT_EQ(ALTERNATE_PROTOCOL_BROKEN
, alternate
.protocol
)
241 << "Second attempt should be ignored.";
244 TEST_F(AlternateProtocolServerPropertiesTest
, Forced
) {
245 // Test forced alternate protocols.
247 PortAlternateProtocolPair default_protocol
;
248 default_protocol
.port
= 1234;
249 default_protocol
.protocol
= NPN_SPDY_2
;
250 HttpServerPropertiesImpl::ForceAlternateProtocol(default_protocol
);
252 // Verify the forced protocol.
253 HostPortPair
test_host_port_pair("foo", 80);
254 EXPECT_TRUE(impl_
.HasAlternateProtocol(test_host_port_pair
));
255 PortAlternateProtocolPair alternate
=
256 impl_
.GetAlternateProtocol(test_host_port_pair
);
257 EXPECT_EQ(default_protocol
.port
, alternate
.port
);
258 EXPECT_EQ(default_protocol
.protocol
, alternate
.protocol
);
260 // Verify the real protocol overrides the forced protocol.
261 impl_
.SetAlternateProtocol(test_host_port_pair
, 443, NPN_SPDY_1
);
262 ASSERT_TRUE(impl_
.HasAlternateProtocol(test_host_port_pair
));
263 alternate
= impl_
.GetAlternateProtocol(test_host_port_pair
);
264 EXPECT_EQ(443, alternate
.port
);
265 EXPECT_EQ(NPN_SPDY_1
, alternate
.protocol
);
267 // Turn off the static, forced alternate protocol so that tests don't
269 HttpServerPropertiesImpl::DisableForcedAlternateProtocol();
271 // Verify the forced protocol is off.
272 HostPortPair
test_host_port_pair2("bar", 80);
273 EXPECT_FALSE(impl_
.HasAlternateProtocol(test_host_port_pair2
));
276 typedef HttpServerPropertiesImplTest SpdySettingsServerPropertiesTest
;
278 TEST_F(SpdySettingsServerPropertiesTest
, Initialize
) {
279 HostPortPair
spdy_server_google("www.google.com", 443);
281 // Check by initializing empty spdy settings.
282 SpdySettingsMap spdy_settings_map
;
283 impl_
.InitializeSpdySettingsServers(&spdy_settings_map
);
284 EXPECT_TRUE(impl_
.GetSpdySettings(spdy_server_google
).empty());
286 // Check by initializing with www.google.com:443 spdy server settings.
287 SettingsMap settings_map
;
288 const SpdySettingsIds id
= SETTINGS_UPLOAD_BANDWIDTH
;
289 const SpdySettingsFlags flags
= SETTINGS_FLAG_PERSISTED
;
290 const uint32 value
= 31337;
291 SettingsFlagsAndValue
flags_and_value(flags
, value
);
292 settings_map
[id
] = flags_and_value
;
293 spdy_settings_map
[spdy_server_google
] = settings_map
;
294 impl_
.InitializeSpdySettingsServers(&spdy_settings_map
);
296 const SettingsMap
& settings_map2
= impl_
.GetSpdySettings(spdy_server_google
);
297 ASSERT_EQ(1U, settings_map2
.size());
298 SettingsMap::const_iterator it
= settings_map2
.find(id
);
299 EXPECT_TRUE(it
!= settings_map2
.end());
300 SettingsFlagsAndValue flags_and_value2
= it
->second
;
301 EXPECT_EQ(flags
, flags_and_value2
.first
);
302 EXPECT_EQ(value
, flags_and_value2
.second
);
305 TEST_F(SpdySettingsServerPropertiesTest
, SetSpdySetting
) {
306 HostPortPair
spdy_server_empty(std::string(), 443);
307 const SettingsMap
& settings_map0
= impl_
.GetSpdySettings(spdy_server_empty
);
308 EXPECT_EQ(0U, settings_map0
.size()); // Returns kEmptySettingsMap.
310 // Add www.google.com:443 as persisting.
311 HostPortPair
spdy_server_google("www.google.com", 443);
312 const SpdySettingsIds id1
= SETTINGS_UPLOAD_BANDWIDTH
;
313 const SpdySettingsFlags flags1
= SETTINGS_FLAG_PLEASE_PERSIST
;
314 const uint32 value1
= 31337;
315 EXPECT_TRUE(impl_
.SetSpdySetting(spdy_server_google
, id1
, flags1
, value1
));
317 const SettingsMap
& settings_map1_ret
=
318 impl_
.GetSpdySettings(spdy_server_google
);
319 ASSERT_EQ(1U, settings_map1_ret
.size());
320 SettingsMap::const_iterator it1_ret
= settings_map1_ret
.find(id1
);
321 EXPECT_TRUE(it1_ret
!= settings_map1_ret
.end());
322 SettingsFlagsAndValue flags_and_value1_ret
= it1_ret
->second
;
323 EXPECT_EQ(SETTINGS_FLAG_PERSISTED
, flags_and_value1_ret
.first
);
324 EXPECT_EQ(value1
, flags_and_value1_ret
.second
);
326 // Add mail.google.com:443 as not persisting.
327 HostPortPair
spdy_server_mail("mail.google.com", 443);
328 const SpdySettingsIds id2
= SETTINGS_DOWNLOAD_BANDWIDTH
;
329 const SpdySettingsFlags flags2
= SETTINGS_FLAG_NONE
;
330 const uint32 value2
= 62667;
331 EXPECT_FALSE(impl_
.SetSpdySetting(spdy_server_mail
, id2
, flags2
, value2
));
332 const SettingsMap
& settings_map2_ret
=
333 impl_
.GetSpdySettings(spdy_server_mail
);
334 EXPECT_EQ(0U, settings_map2_ret
.size()); // Returns kEmptySettingsMap.
336 // Add docs.google.com:443 as persisting
337 HostPortPair
spdy_server_docs("docs.google.com", 443);
338 const SpdySettingsIds id3
= SETTINGS_ROUND_TRIP_TIME
;
339 const SpdySettingsFlags flags3
= SETTINGS_FLAG_PLEASE_PERSIST
;
340 const uint32 value3
= 93997;
341 SettingsFlagsAndValue
flags_and_value3(flags3
, value3
);
342 EXPECT_TRUE(impl_
.SetSpdySetting(spdy_server_docs
, id3
, flags3
, value3
));
344 const SettingsMap
& settings_map3_ret
=
345 impl_
.GetSpdySettings(spdy_server_docs
);
346 ASSERT_EQ(1U, settings_map3_ret
.size());
347 SettingsMap::const_iterator it3_ret
= settings_map3_ret
.find(id3
);
348 EXPECT_TRUE(it3_ret
!= settings_map3_ret
.end());
349 SettingsFlagsAndValue flags_and_value3_ret
= it3_ret
->second
;
350 EXPECT_EQ(SETTINGS_FLAG_PERSISTED
, flags_and_value3_ret
.first
);
351 EXPECT_EQ(value3
, flags_and_value3_ret
.second
);
353 // Check data for www.google.com:443 (id1).
354 const SettingsMap
& settings_map4_ret
=
355 impl_
.GetSpdySettings(spdy_server_google
);
356 ASSERT_EQ(1U, settings_map4_ret
.size());
357 SettingsMap::const_iterator it4_ret
= settings_map4_ret
.find(id1
);
358 EXPECT_TRUE(it4_ret
!= settings_map4_ret
.end());
359 SettingsFlagsAndValue flags_and_value4_ret
= it4_ret
->second
;
360 EXPECT_EQ(SETTINGS_FLAG_PERSISTED
, flags_and_value4_ret
.first
);
361 EXPECT_EQ(value1
, flags_and_value1_ret
.second
);
363 // Clear www.google.com:443 as persisting.
364 impl_
.ClearSpdySettings(spdy_server_google
);
366 const SettingsMap
& settings_map5_ret
=
367 impl_
.GetSpdySettings(spdy_server_google
);
368 ASSERT_EQ(0U, settings_map5_ret
.size());
370 // Clear all settings.
371 ASSERT_GT(impl_
.spdy_settings_map().size(), 0U);
372 impl_
.ClearAllSpdySettings();
373 ASSERT_EQ(0U, impl_
.spdy_settings_map().size());
376 TEST_F(SpdySettingsServerPropertiesTest
, Clear
) {
377 // Add www.google.com:443 as persisting.
378 HostPortPair
spdy_server_google("www.google.com", 443);
379 const SpdySettingsIds id1
= SETTINGS_UPLOAD_BANDWIDTH
;
380 const SpdySettingsFlags flags1
= SETTINGS_FLAG_PLEASE_PERSIST
;
381 const uint32 value1
= 31337;
382 EXPECT_TRUE(impl_
.SetSpdySetting(spdy_server_google
, id1
, flags1
, value1
));
384 const SettingsMap
& settings_map1_ret
=
385 impl_
.GetSpdySettings(spdy_server_google
);
386 ASSERT_EQ(1U, settings_map1_ret
.size());
387 SettingsMap::const_iterator it1_ret
= settings_map1_ret
.find(id1
);
388 EXPECT_TRUE(it1_ret
!= settings_map1_ret
.end());
389 SettingsFlagsAndValue flags_and_value1_ret
= it1_ret
->second
;
390 EXPECT_EQ(SETTINGS_FLAG_PERSISTED
, flags_and_value1_ret
.first
);
391 EXPECT_EQ(value1
, flags_and_value1_ret
.second
);
393 // Add docs.google.com:443 as persisting
394 HostPortPair
spdy_server_docs("docs.google.com", 443);
395 const SpdySettingsIds id3
= SETTINGS_ROUND_TRIP_TIME
;
396 const SpdySettingsFlags flags3
= SETTINGS_FLAG_PLEASE_PERSIST
;
397 const uint32 value3
= 93997;
398 EXPECT_TRUE(impl_
.SetSpdySetting(spdy_server_docs
, id3
, flags3
, value3
));
400 const SettingsMap
& settings_map3_ret
=
401 impl_
.GetSpdySettings(spdy_server_docs
);
402 ASSERT_EQ(1U, settings_map3_ret
.size());
403 SettingsMap::const_iterator it3_ret
= settings_map3_ret
.find(id3
);
404 EXPECT_TRUE(it3_ret
!= settings_map3_ret
.end());
405 SettingsFlagsAndValue flags_and_value3_ret
= it3_ret
->second
;
406 EXPECT_EQ(SETTINGS_FLAG_PERSISTED
, flags_and_value3_ret
.first
);
407 EXPECT_EQ(value3
, flags_and_value3_ret
.second
);
410 EXPECT_EQ(0U, impl_
.GetSpdySettings(spdy_server_google
).size());
411 EXPECT_EQ(0U, impl_
.GetSpdySettings(spdy_server_docs
).size());