1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// found in the LICENSE file.
4a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
5a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_configurator.h"
6a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
7a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <string>
8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/memory/scoped_ptr.h"
10a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/prefs/pref_registry_simple.h"
11a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/prefs/testing_pref_service.h"
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/test/test_simple_task_runner.h"
13a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/values.h"
14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chrome/common/pref_names.h"
15a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "testing/gmock/include/gmock/gmock.h"
16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass DataReductionProxyConfigTest : public testing::Test {
19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public:
20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void SetUp() {
21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    PrefRegistrySimple* registry = pref_service_.registry();
22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    registry->RegisterDictionaryPref(prefs::kProxy);
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    config_.reset(new DataReductionProxyChromeConfigurator(
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        &pref_service_,
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        new base::TestSimpleTaskRunner()));
26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void CheckProxyConfig(
29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const std::string& expected_mode,
30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const std::string& expected_server,
31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const std::string& expected_bypass_list) {
32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const base::DictionaryValue* dict =
34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        pref_service_.GetDictionary(prefs::kProxy);
35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    std::string mode;
36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    std::string server;
37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    std::string bypass_list;
38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    dict->GetString("mode", &mode);
39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ASSERT_EQ(expected_mode, mode);
40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    dict->GetString("server", &server);
41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ASSERT_EQ(expected_server, server);
42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    dict->GetString("bypass_list", &bypass_list);
43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ASSERT_EQ(expected_bypass_list, bypass_list);
44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scoped_ptr<DataReductionProxyChromeConfigurator> config_;
47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  TestingPrefServiceSimple pref_service_;
48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch};
49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
50a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(DataReductionProxyConfigTest, TestUnrestricted) {
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->Enable(false,
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  false,
53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                  "https://www.foo.com:443/",
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "http://www.bar.com:80/",
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "");
56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  CheckProxyConfig(
57a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "fixed_servers",
58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "http=https://www.foo.com:443,http://www.bar.com:80,direct://;",
59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "");
60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(DataReductionProxyConfigTest, TestUnrestrictedSSL) {
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  config_->Enable(false,
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  false,
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "https://www.foo.com:443/",
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "http://www.bar.com:80/",
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "http://www.ssl.com:80/");
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CheckProxyConfig(
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      "fixed_servers",
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      "http=https://www.foo.com:443,http://www.bar.com:80,direct://;"
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      "https=http://www.ssl.com:80,direct://;",
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      "");
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
75a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(DataReductionProxyConfigTest, TestUnrestrictedWithBypassRule) {
76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->AddHostPatternToBypass("<local>");
77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->AddHostPatternToBypass("*.goo.com");
78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->Enable(false,
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  false,
80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                  "https://www.foo.com:443/",
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "http://www.bar.com:80/",
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "");
83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  CheckProxyConfig(
84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "fixed_servers",
85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "http=https://www.foo.com:443,http://www.bar.com:80,direct://;",
86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "<local>, *.goo.com");
87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
89a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(DataReductionProxyConfigTest, TestUnrestrictedWithoutFallback) {
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  config_->Enable(false, false, "https://www.foo.com:443/", "", "");
91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  CheckProxyConfig("fixed_servers",
92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                   "http=https://www.foo.com:443,direct://;",
93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                   "");
94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
96a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(DataReductionProxyConfigTest, TestRestricted) {
97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->Enable(true,
98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  false,
99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                  "https://www.foo.com:443/",
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "http://www.bar.com:80/",
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "");
102a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  CheckProxyConfig("fixed_servers",
103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                   "http=http://www.bar.com:80,direct://;",
104a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                   "");
105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(DataReductionProxyConfigTest, TestFallbackRestricted) {
108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  config_->Enable(false,
109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  true,
110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  "https://www.foo.com:443/",
11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "http://www.bar.com:80/",
11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "");
113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CheckProxyConfig("fixed_servers",
114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   "http=https://www.foo.com:443,direct://;",
115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   "");
116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(DataReductionProxyConfigTest, TestBothRestricted) {
119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  config_->Enable(true,
120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  true,
121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  "https://www.foo.com:443/",
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "http://www.bar.com:80/",
12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "");
124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CheckProxyConfig("system", "", "");
125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
127a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(DataReductionProxyConfigTest, TestDisable) {
128a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->Disable();
129a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  CheckProxyConfig("system", "", "");
130a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
131a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
132a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
133a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(DataReductionProxyConfigTest, TestBypassList) {
134a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->AddHostPatternToBypass("http://www.google.com");
135a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->AddHostPatternToBypass("fefe:13::abc/33");
136a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->AddURLPatternToBypass("foo.org/images/*");
137a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->AddURLPatternToBypass("http://foo.com/*");
138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->AddURLPatternToBypass("http://baz.com:22/bar/*");
139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->AddURLPatternToBypass("http://*bat.com/bar/*");
140a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
141a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::string expected[] = {
142a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    "http://www.google.com",
143a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    "fefe:13::abc/33",
144a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    "foo.org",
145a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    "http://foo.com",
146a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    "http://baz.com:22",
147a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    "http://*bat.com"
148a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  };
149a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
150a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ASSERT_EQ(config_->bypass_rules_.size(), 6u);
151a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  int i = 0;
152a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  for (std::vector<std::string>::iterator it = config_->bypass_rules_.begin();
153a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch       it != config_->bypass_rules_.end(); ++it) {
154a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(expected[i++], *it);
155a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
156a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
157a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
158