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"
12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/values.h"
13a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chrome/common/pref_names.h"
14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "testing/gmock/include/gmock/gmock.h"
15a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass DataReductionProxyConfigTest : public testing::Test {
18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public:
19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void SetUp() {
20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    PrefRegistrySimple* registry = pref_service_.registry();
21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    registry->RegisterDictionaryPref(prefs::kProxy);
22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    config_.reset(new DataReductionProxyChromeConfigurator(&pref_service_));
23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void CheckProxyConfig(
26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const std::string& expected_mode,
27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const std::string& expected_server,
28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const std::string& expected_bypass_list) {
29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const base::DictionaryValue* dict =
31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        pref_service_.GetDictionary(prefs::kProxy);
32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    std::string mode;
33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    std::string server;
34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    std::string bypass_list;
35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    dict->GetString("mode", &mode);
36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ASSERT_EQ(expected_mode, mode);
37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    dict->GetString("server", &server);
38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ASSERT_EQ(expected_server, server);
39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    dict->GetString("bypass_list", &bypass_list);
40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ASSERT_EQ(expected_bypass_list, bypass_list);
41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scoped_ptr<DataReductionProxyChromeConfigurator> config_;
44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  TestingPrefServiceSimple pref_service_;
45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch};
46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
47a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(DataReductionProxyConfigTest, TestUnrestricted) {
48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->Enable(false,
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  false,
50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                  "https://www.foo.com:443/",
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "http://www.bar.com:80/",
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "");
53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  CheckProxyConfig(
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "fixed_servers",
55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "http=https://www.foo.com:443,http://www.bar.com:80,direct://;",
56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "");
57a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(DataReductionProxyConfigTest, TestUnrestrictedSSL) {
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  config_->Enable(false,
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  false,
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "https://www.foo.com:443/",
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "http://www.bar.com:80/",
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "http://www.ssl.com:80/");
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CheckProxyConfig(
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      "fixed_servers",
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      "http=https://www.foo.com:443,http://www.bar.com:80,direct://;"
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      "https=http://www.ssl.com:80,direct://;",
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      "");
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
72a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(DataReductionProxyConfigTest, TestUnrestrictedWithBypassRule) {
73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->AddHostPatternToBypass("<local>");
74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->AddHostPatternToBypass("*.goo.com");
75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->Enable(false,
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  false,
77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                  "https://www.foo.com:443/",
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "http://www.bar.com:80/",
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "");
80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  CheckProxyConfig(
81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "fixed_servers",
82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "http=https://www.foo.com:443,http://www.bar.com:80,direct://;",
83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      "<local>, *.goo.com");
84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
86a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(DataReductionProxyConfigTest, TestUnrestrictedWithoutFallback) {
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  config_->Enable(false, false, "https://www.foo.com:443/", "", "");
88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  CheckProxyConfig("fixed_servers",
89a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                   "http=https://www.foo.com:443,direct://;",
90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                   "");
91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
93a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(DataReductionProxyConfigTest, TestRestricted) {
94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->Enable(true,
95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  false,
96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                  "https://www.foo.com:443/",
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "http://www.bar.com:80/",
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "");
99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  CheckProxyConfig("fixed_servers",
100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                   "http=http://www.bar.com:80,direct://;",
101a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                   "");
102a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(DataReductionProxyConfigTest, TestFallbackRestricted) {
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  config_->Enable(false,
106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  true,
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  "https://www.foo.com:443/",
10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "http://www.bar.com:80/",
10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "");
110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CheckProxyConfig("fixed_servers",
111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   "http=https://www.foo.com:443,direct://;",
112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   "");
113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(DataReductionProxyConfigTest, TestBothRestricted) {
116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  config_->Enable(true,
117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  true,
118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  "https://www.foo.com:443/",
11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "http://www.bar.com:80/",
12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  "");
121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CheckProxyConfig("system", "", "");
122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
124a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(DataReductionProxyConfigTest, TestDisable) {
125a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->Disable();
126a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  CheckProxyConfig("system", "", "");
127a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
128a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
129a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
130a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTEST_F(DataReductionProxyConfigTest, TestBypassList) {
131a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->AddHostPatternToBypass("http://www.google.com");
132a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->AddHostPatternToBypass("fefe:13::abc/33");
133a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->AddURLPatternToBypass("foo.org/images/*");
134a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->AddURLPatternToBypass("http://foo.com/*");
135a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->AddURLPatternToBypass("http://baz.com:22/bar/*");
136a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  config_->AddURLPatternToBypass("http://*bat.com/bar/*");
137a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::string expected[] = {
139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    "http://www.google.com",
140a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    "fefe:13::abc/33",
141a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    "foo.org",
142a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    "http://foo.com",
143a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    "http://baz.com:22",
144a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    "http://*bat.com"
145a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  };
146a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
147a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ASSERT_EQ(config_->bypass_rules_.size(), 6u);
148a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  int i = 0;
149a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  for (std::vector<std::string>::iterator it = config_->bypass_rules_.begin();
150a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch       it != config_->bypass_rules_.end(); ++it) {
151a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_EQ(expected[i++], *it);
152a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
153a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
154a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
155