1// Copyright 2014 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#include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_configurator.h"
6
7#include <string>
8
9#include "base/memory/scoped_ptr.h"
10#include "base/prefs/pref_registry_simple.h"
11#include "base/prefs/testing_pref_service.h"
12#include "base/test/test_simple_task_runner.h"
13#include "base/values.h"
14#include "chrome/common/pref_names.h"
15#include "testing/gmock/include/gmock/gmock.h"
16#include "testing/gtest/include/gtest/gtest.h"
17
18class DataReductionProxyConfigTest : public testing::Test {
19 public:
20  virtual void SetUp() {
21    PrefRegistrySimple* registry = pref_service_.registry();
22    registry->RegisterDictionaryPref(prefs::kProxy);
23    config_.reset(new DataReductionProxyChromeConfigurator(
24        &pref_service_,
25        new base::TestSimpleTaskRunner()));
26  }
27
28  void CheckProxyConfig(
29      const std::string& expected_mode,
30      const std::string& expected_server,
31      const std::string& expected_bypass_list) {
32
33    const base::DictionaryValue* dict =
34        pref_service_.GetDictionary(prefs::kProxy);
35    std::string mode;
36    std::string server;
37    std::string bypass_list;
38    dict->GetString("mode", &mode);
39    ASSERT_EQ(expected_mode, mode);
40    dict->GetString("server", &server);
41    ASSERT_EQ(expected_server, server);
42    dict->GetString("bypass_list", &bypass_list);
43    ASSERT_EQ(expected_bypass_list, bypass_list);
44  }
45
46  scoped_ptr<DataReductionProxyChromeConfigurator> config_;
47  TestingPrefServiceSimple pref_service_;
48};
49
50TEST_F(DataReductionProxyConfigTest, TestUnrestricted) {
51  config_->Enable(false,
52                  false,
53                  "https://www.foo.com:443/",
54                  "http://www.bar.com:80/",
55                  "");
56  CheckProxyConfig(
57      "fixed_servers",
58      "http=https://www.foo.com:443,http://www.bar.com:80,direct://;",
59      "");
60}
61
62TEST_F(DataReductionProxyConfigTest, TestUnrestrictedSSL) {
63  config_->Enable(false,
64                  false,
65                  "https://www.foo.com:443/",
66                  "http://www.bar.com:80/",
67                  "http://www.ssl.com:80/");
68  CheckProxyConfig(
69      "fixed_servers",
70      "http=https://www.foo.com:443,http://www.bar.com:80,direct://;"
71      "https=http://www.ssl.com:80,direct://;",
72      "");
73}
74
75TEST_F(DataReductionProxyConfigTest, TestUnrestrictedWithBypassRule) {
76  config_->AddHostPatternToBypass("<local>");
77  config_->AddHostPatternToBypass("*.goo.com");
78  config_->Enable(false,
79                  false,
80                  "https://www.foo.com:443/",
81                  "http://www.bar.com:80/",
82                  "");
83  CheckProxyConfig(
84      "fixed_servers",
85      "http=https://www.foo.com:443,http://www.bar.com:80,direct://;",
86      "<local>, *.goo.com");
87}
88
89TEST_F(DataReductionProxyConfigTest, TestUnrestrictedWithoutFallback) {
90  config_->Enable(false, false, "https://www.foo.com:443/", "", "");
91  CheckProxyConfig("fixed_servers",
92                   "http=https://www.foo.com:443,direct://;",
93                   "");
94}
95
96TEST_F(DataReductionProxyConfigTest, TestRestricted) {
97  config_->Enable(true,
98                  false,
99                  "https://www.foo.com:443/",
100                  "http://www.bar.com:80/",
101                  "");
102  CheckProxyConfig("fixed_servers",
103                   "http=http://www.bar.com:80,direct://;",
104                   "");
105}
106
107TEST_F(DataReductionProxyConfigTest, TestFallbackRestricted) {
108  config_->Enable(false,
109                  true,
110                  "https://www.foo.com:443/",
111                  "http://www.bar.com:80/",
112                  "");
113  CheckProxyConfig("fixed_servers",
114                   "http=https://www.foo.com:443,direct://;",
115                   "");
116}
117
118TEST_F(DataReductionProxyConfigTest, TestBothRestricted) {
119  config_->Enable(true,
120                  true,
121                  "https://www.foo.com:443/",
122                  "http://www.bar.com:80/",
123                  "");
124  CheckProxyConfig("system", "", "");
125}
126
127TEST_F(DataReductionProxyConfigTest, TestDisable) {
128  config_->Disable();
129  CheckProxyConfig("system", "", "");
130}
131
132
133TEST_F(DataReductionProxyConfigTest, TestBypassList) {
134  config_->AddHostPatternToBypass("http://www.google.com");
135  config_->AddHostPatternToBypass("fefe:13::abc/33");
136  config_->AddURLPatternToBypass("foo.org/images/*");
137  config_->AddURLPatternToBypass("http://foo.com/*");
138  config_->AddURLPatternToBypass("http://baz.com:22/bar/*");
139  config_->AddURLPatternToBypass("http://*bat.com/bar/*");
140
141  std::string expected[] = {
142    "http://www.google.com",
143    "fefe:13::abc/33",
144    "foo.org",
145    "http://foo.com",
146    "http://baz.com:22",
147    "http://*bat.com"
148  };
149
150  ASSERT_EQ(config_->bypass_rules_.size(), 6u);
151  int i = 0;
152  for (std::vector<std::string>::iterator it = config_->bypass_rules_.begin();
153       it != config_->bypass_rules_.end(); ++it) {
154    EXPECT_EQ(expected[i++], *it);
155  }
156}
157
158