• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2010 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.
4 //
5 // HttpAlternateProtocols is an in-memory data structure used for keeping track
6 // of which HTTP HostPortPairs have an alternate protocol that can be used
7 // instead of HTTP on a different port.
8 
9 #include "net/http/http_alternate_protocols.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 
12 namespace net {
13 namespace {
14 
TEST(HttpAlternateProtocols,Basic)15 TEST(HttpAlternateProtocols, Basic) {
16   HttpAlternateProtocols alternate_protocols;
17   HostPortPair test_host_port_pair("foo", 80);
18   EXPECT_FALSE(
19       alternate_protocols.HasAlternateProtocolFor(test_host_port_pair));
20   alternate_protocols.SetAlternateProtocolFor(
21       test_host_port_pair, 443, HttpAlternateProtocols::NPN_SPDY_1);
22   ASSERT_TRUE(alternate_protocols.HasAlternateProtocolFor(test_host_port_pair));
23   const HttpAlternateProtocols::PortProtocolPair alternate =
24       alternate_protocols.GetAlternateProtocolFor(test_host_port_pair);
25   EXPECT_EQ(443, alternate.port);
26   EXPECT_EQ(HttpAlternateProtocols::NPN_SPDY_1, alternate.protocol);
27 }
28 
TEST(HttpAlternateProtocols,SetBroken)29 TEST(HttpAlternateProtocols, SetBroken) {
30   HttpAlternateProtocols alternate_protocols;
31   HostPortPair test_host_port_pair("foo", 80);
32   alternate_protocols.MarkBrokenAlternateProtocolFor(test_host_port_pair);
33   ASSERT_TRUE(alternate_protocols.HasAlternateProtocolFor(test_host_port_pair));
34   HttpAlternateProtocols::PortProtocolPair alternate =
35       alternate_protocols.GetAlternateProtocolFor(test_host_port_pair);
36   EXPECT_EQ(HttpAlternateProtocols::BROKEN, alternate.protocol);
37 
38   alternate_protocols.SetAlternateProtocolFor(
39       test_host_port_pair,
40       1234,
41       HttpAlternateProtocols::NPN_SPDY_1);
42   alternate = alternate_protocols.GetAlternateProtocolFor(test_host_port_pair);
43   EXPECT_EQ(HttpAlternateProtocols::BROKEN, alternate.protocol)
44       << "Second attempt should be ignored.";
45 }
46 
TEST(HttpAlternateProtocols,Forced)47 TEST(HttpAlternateProtocols, Forced) {
48   // Test forced alternate protocols.
49 
50   HttpAlternateProtocols::PortProtocolPair default_protocol;
51   default_protocol.port = 1234;
52   default_protocol.protocol = HttpAlternateProtocols::NPN_SPDY_2;
53   HttpAlternateProtocols::ForceAlternateProtocol(default_protocol);
54 
55   HttpAlternateProtocols alternate_protocols;
56 
57   // Verify the forced protocol.
58   HostPortPair test_host_port_pair("foo", 80);
59   EXPECT_TRUE(
60       alternate_protocols.HasAlternateProtocolFor(test_host_port_pair));
61   HttpAlternateProtocols::PortProtocolPair alternate =
62       alternate_protocols.GetAlternateProtocolFor(test_host_port_pair);
63   EXPECT_EQ(default_protocol.port, alternate.port);
64   EXPECT_EQ(default_protocol.protocol, alternate.protocol);
65 
66   // Verify the real protocol overrides the forced protocol.
67   alternate_protocols.SetAlternateProtocolFor(
68       test_host_port_pair, 443, HttpAlternateProtocols::NPN_SPDY_1);
69   ASSERT_TRUE(alternate_protocols.HasAlternateProtocolFor(test_host_port_pair));
70   alternate = alternate_protocols.GetAlternateProtocolFor(test_host_port_pair);
71   EXPECT_EQ(443, alternate.port);
72   EXPECT_EQ(HttpAlternateProtocols::NPN_SPDY_1, alternate.protocol);
73 
74   // Turn off the static, forced alternate protocol so that tests don't
75   // have this state.
76   HttpAlternateProtocols::DisableForcedAlternateProtocol();
77 
78   // Verify the forced protocol is off.
79   HostPortPair test_host_port_pair2("bar", 80);
80   EXPECT_FALSE(
81       alternate_protocols.HasAlternateProtocolFor(test_host_port_pair2));
82 }
83 
84 }  // namespace
85 }  // namespace net
86