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
12namespace net {
13namespace {
14
15TEST(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
29TEST(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
47TEST(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