15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_config.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_config_service_android.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_info.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestObserver : public ProxyConfigService::Observer {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver() : availability_(ProxyConfigService::CONFIG_UNSET) {}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ProxyConfigService::Observer:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnProxyConfigChanged(
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ProxyConfig& config,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProxyConfigService::ConfigAvailability availability) OVERRIDE {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    config_ = config;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    availability_ = availability;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyConfigService::ConfigAvailability availability() const {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return availability_;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ProxyConfig& config() const {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return config_;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyConfig config_;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyConfigService::ConfigAvailability availability_;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::map<std::string, std::string> StringMap;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProxyConfigServiceAndroidTestBase : public testing::Test {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that the current thread's message loop is initialized by the test
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // suite (see net/test/net_test_suite.cc).
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyConfigServiceAndroidTestBase(const StringMap& initial_configuration)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : configuration_(initial_configuration),
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        message_loop_(base::MessageLoop::current()),
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        service_(message_loop_->message_loop_proxy(),
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 message_loop_->message_loop_proxy(),
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 base::Bind(&ProxyConfigServiceAndroidTestBase::GetProperty,
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                            base::Unretained(this))) {}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ProxyConfigServiceAndroidTestBase() {}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // testing::Test:
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    message_loop_->RunUntilIdle();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_.AddObserver(&observer_);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_.RemoveObserver(&observer_);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearConfiguration() {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    configuration_.clear();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddProperty(const std::string& key, const std::string& value) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    configuration_[key] = value;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string GetProperty(const std::string& key) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StringMap::const_iterator it = configuration_.find(key);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (it == configuration_.end())
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return std::string();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return it->second;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ProxySettingsChanged() {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_.ProxySettingsChanged();
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    message_loop_->RunUntilIdle();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestMapping(const std::string& url, const std::string& expected) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProxyConfigService::ConfigAvailability availability;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProxyConfig proxy_config;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    availability = service_.GetLatestProxyConfig(&proxy_config);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ProxyConfigService::CONFIG_VALID, availability);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProxyInfo proxy_info;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proxy_config.proxy_rules().Apply(GURL(url), &proxy_info);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected, proxy_info.ToPacString());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StringMap configuration_;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer_;
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop* const message_loop_;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyConfigServiceAndroid service_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProxyConfigServiceAndroidTest : public ProxyConfigServiceAndroidTestBase {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyConfigServiceAndroidTest()
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ProxyConfigServiceAndroidTestBase(StringMap()) {}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProxyConfigServiceAndroidWithInitialConfigTest
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public ProxyConfigServiceAndroidTestBase {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyConfigServiceAndroidWithInitialConfigTest()
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ProxyConfigServiceAndroidTestBase(MakeInitialConfiguration()) {}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StringMap MakeInitialConfiguration() {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StringMap initial_configuration;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    initial_configuration["http.proxyHost"] = "httpproxy.com";
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    initial_configuration["http.proxyPort"] = "8080";
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return initial_configuration;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceAndroidTest, TestChangePropertiesNotification) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up a non-empty configuration
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("http.proxyHost", "localhost");
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ProxyConfigService::CONFIG_VALID, observer_.availability());
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(observer_.config().proxy_rules().empty());
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up an empty configuration
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearConfiguration();
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ProxyConfigService::CONFIG_VALID, observer_.availability());
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer_.config().proxy_rules().empty());
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceAndroidWithInitialConfigTest, TestInitialConfig) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure that the initial config is set.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("ftp://example.com/", "DIRECT");
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://example.com/", "PROXY httpproxy.com:8080");
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Override the initial configuration.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearConfiguration();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("http.proxyHost", "httpproxy.com");
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://example.com/", "PROXY httpproxy.com:80");
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// !! The following test cases are automatically generated from
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// !! net/android/tools/proxy_test_cases.py.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// !! Please edit that file instead of editing the test cases below and
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// !! update also the corresponding Java unit tests in
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// !! AndroidProxySelectorTest.java
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceAndroidTest, NoProxy) {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test direct mapping when no proxy defined.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("ftp://example.com/", "DIRECT");
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://example.com/", "DIRECT");
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("https://example.com/", "DIRECT");
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceAndroidTest, HttpProxyHostAndPort) {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test http.proxyHost and http.proxyPort works.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("http.proxyHost", "httpproxy.com");
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("http.proxyPort", "8080");
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("ftp://example.com/", "DIRECT");
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://example.com/", "PROXY httpproxy.com:8080");
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("https://example.com/", "DIRECT");
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceAndroidTest, HttpProxyHostOnly) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should get the default port (80) for proxied hosts.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("http.proxyHost", "httpproxy.com");
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("ftp://example.com/", "DIRECT");
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://example.com/", "PROXY httpproxy.com:80");
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("https://example.com/", "DIRECT");
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceAndroidTest, HttpProxyPortOnly) {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http.proxyPort only should not result in any hosts being proxied.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("http.proxyPort", "8080");
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("ftp://example.com/", "DIRECT");
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://example.com/", "DIRECT");
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("https://example.com/", "DIRECT");
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceAndroidTest, HttpNonProxyHosts1) {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that HTTP non proxy hosts are mapped correctly
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("http.nonProxyHosts", "slashdot.org");
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("http.proxyHost", "httpproxy.com");
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("http.proxyPort", "8080");
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://example.com/", "PROXY httpproxy.com:8080");
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://slashdot.org/", "DIRECT");
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceAndroidTest, HttpNonProxyHosts2) {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that | pattern works.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("http.nonProxyHosts", "slashdot.org|freecode.net");
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("http.proxyHost", "httpproxy.com");
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("http.proxyPort", "8080");
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://example.com/", "PROXY httpproxy.com:8080");
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://freecode.net/", "DIRECT");
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://slashdot.org/", "DIRECT");
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceAndroidTest, HttpNonProxyHosts3) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that * pattern works.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("http.nonProxyHosts", "*example.com");
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("http.proxyHost", "httpproxy.com");
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("http.proxyPort", "8080");
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://example.com/", "DIRECT");
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://slashdot.org/", "PROXY httpproxy.com:8080");
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://www.example.com/", "DIRECT");
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceAndroidTest, FtpNonProxyHosts) {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that FTP non proxy hosts are mapped correctly
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("ftp.nonProxyHosts", "slashdot.org");
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("ftp.proxyHost", "httpproxy.com");
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("ftp.proxyPort", "8080");
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("ftp://example.com/", "PROXY httpproxy.com:8080");
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://example.com/", "DIRECT");
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceAndroidTest, FtpProxyHostAndPort) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test ftp.proxyHost and ftp.proxyPort works.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("ftp.proxyHost", "httpproxy.com");
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("ftp.proxyPort", "8080");
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("ftp://example.com/", "PROXY httpproxy.com:8080");
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://example.com/", "DIRECT");
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("https://example.com/", "DIRECT");
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceAndroidTest, FtpProxyHostOnly) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test ftp.proxyHost and default port.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("ftp.proxyHost", "httpproxy.com");
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("ftp://example.com/", "PROXY httpproxy.com:80");
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://example.com/", "DIRECT");
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("https://example.com/", "DIRECT");
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceAndroidTest, HttpsProxyHostAndPort) {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test https.proxyHost and https.proxyPort works.
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("https.proxyHost", "httpproxy.com");
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("https.proxyPort", "8080");
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("ftp://example.com/", "DIRECT");
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://example.com/", "DIRECT");
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestMapping("https://example.com/", "PROXY httpproxy.com:8080");
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceAndroidTest, HttpsProxyHostOnly) {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test https.proxyHost and default port.
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("https.proxyHost", "httpproxy.com");
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("ftp://example.com/", "DIRECT");
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://example.com/", "DIRECT");
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestMapping("https://example.com/", "PROXY httpproxy.com:80");
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceAndroidTest, HttpProxyHostIPv6) {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test IPv6 https.proxyHost and default port.
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("http.proxyHost", "a:b:c::d:1");
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("ftp://example.com/", "DIRECT");
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://example.com/", "PROXY [a:b:c::d:1]:80");
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceAndroidTest, HttpProxyHostAndPortIPv6) {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test IPv6 http.proxyHost and http.proxyPort works.
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("http.proxyHost", "a:b:c::d:1");
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("http.proxyPort", "8080");
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("ftp://example.com/", "DIRECT");
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://example.com/", "PROXY [a:b:c::d:1]:8080");
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceAndroidTest, HttpProxyHostAndInvalidPort) {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test invalid http.proxyPort does not crash.
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("http.proxyHost", "a:b:c::d:1");
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("http.proxyPort", "65536");
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("ftp://example.com/", "DIRECT");
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://example.com/", "DIRECT");
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceAndroidTest, DefaultProxyExplictPort) {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Default http proxy is used if a scheme-specific one is not found.
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("ftp.proxyHost", "httpproxy.com");
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("ftp.proxyPort", "8080");
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("proxyHost", "defaultproxy.com");
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("proxyPort", "8080");
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("ftp://example.com/", "PROXY httpproxy.com:8080");
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://example.com/", "PROXY defaultproxy.com:8080");
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestMapping("https://example.com/", "PROXY defaultproxy.com:8080");
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceAndroidTest, DefaultProxyDefaultPort) {
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the default proxy port is as expected.
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("proxyHost", "defaultproxy.com");
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://example.com/", "PROXY defaultproxy.com:80");
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestMapping("https://example.com/", "PROXY defaultproxy.com:80");
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceAndroidTest, FallbackToSocks) {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SOCKS proxy is used if scheme-specific one is not found.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("http.proxyHost", "defaultproxy.com");
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("socksProxyHost", "socksproxy.com");
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("ftp://example.com", "SOCKS5 socksproxy.com:1080");
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://example.com/", "PROXY defaultproxy.com:80");
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("https://example.com/", "SOCKS5 socksproxy.com:1080");
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceAndroidTest, SocksExplicitPort) {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SOCKS proxy port is used if specified
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("socksProxyHost", "socksproxy.com");
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("socksProxyPort", "9000");
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://example.com/", "SOCKS5 socksproxy.com:9000");
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceAndroidTest, HttpProxySupercedesSocks) {
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SOCKS proxy is ignored if default HTTP proxy defined.
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("proxyHost", "defaultproxy.com");
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("socksProxyHost", "socksproxy.com");
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddProperty("socksProxyPort", "9000");
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsChanged();
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestMapping("http://example.com/", "PROXY defaultproxy.com:80");
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
353