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 "chrome/browser/chromeos/proxy_config_service_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/format_macros.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/json/json_writer.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/testing_pref_service.h"
145e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/ui_proxy_config.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/dbus/shill_profile_client.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/dbus/shill_service_client.h"
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/network/network_handler.h"
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/network/network_state.h"
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/network/network_state_handler.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_config_service_common_unittest.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)struct Input {
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  UIProxyConfig::Mode mode;
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string pac_url;
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string server;
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string bypass_rules;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Builds an identifier for each test in an array.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TEST_DESC(desc) base::StringPrintf("at line %d <%s>", __LINE__, desc)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Shortcuts to declare enums within chromeos's ProxyConfig.
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MK_MODE(mode) UIProxyConfig::MODE_##mode
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Inspired from net/proxy/proxy_config_service_linux_unittest.cc.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const struct TestParams {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Short description to identify the test
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string description;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Input input;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expected outputs from fields of net::ProxyConfig (via IO).
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool auto_detect;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL pac_url;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::ProxyRulesExpectation proxy_rules;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} tests[] = {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  // 0
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TEST_DESC("No proxying"),
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Input.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MK_MODE(DIRECT),  // mode
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Expected result.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    false,                                   // auto_detect
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL(),                                  // pac_url
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::ProxyRulesExpectation::Empty(),     // proxy_rules
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  // 1
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TEST_DESC("Auto detect"),
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Input.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MK_MODE(AUTO_DETECT),  // mode
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Expected result.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    true,                                    // auto_detect
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL(),                                  // pac_url
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::ProxyRulesExpectation::Empty(),     // proxy_rules
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  // 2
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TEST_DESC("Valid PAC URL"),
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Input.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MK_MODE(PAC_SCRIPT),     // mode
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://wpad/wpad.dat",  // pac_url
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Expected result.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    false,                                   // auto_detect
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL("http://wpad/wpad.dat"),            // pac_url
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::ProxyRulesExpectation::Empty(),     // proxy_rules
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  // 3
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TEST_DESC("Invalid PAC URL"),
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Input.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MK_MODE(PAC_SCRIPT),  // mode
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "wpad.dat",           // pac_url
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Expected result.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    false,                                   // auto_detect
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL(),                                  // pac_url
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::ProxyRulesExpectation::Empty(),     // proxy_rules
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  // 4
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TEST_DESC("Single-host in proxy list"),
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Input.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MK_MODE(SINGLE_PROXY),  // mode
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "",                     // pac_url
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "www.google.com",       // server
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Expected result.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    false,                                   // auto_detect
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL(),                                  // pac_url
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::ProxyRulesExpectation::Single(      // proxy_rules
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "www.google.com:80",                 // single proxy
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "<local>"),                          // bypass rules
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  // 5
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TEST_DESC("Single-host, different port"),
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Input.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MK_MODE(SINGLE_PROXY),  // mode
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "",                     // pac_url
138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "www.google.com:99",    // server
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Expected result.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    false,                                   // auto_detect
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL(),                                  // pac_url
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::ProxyRulesExpectation::Single(      // proxy_rules
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "www.google.com:99",                 // single
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "<local>"),                          // bypass rules
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  // 6
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TEST_DESC("Tolerate a scheme"),
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Input.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MK_MODE(SINGLE_PROXY),       // mode
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "",                          // pac_url
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "http://www.google.com:99",  // server
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Expected result.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    false,                                   // auto_detect
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL(),                                  // pac_url
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::ProxyRulesExpectation::Single(      // proxy_rules
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "www.google.com:99",                 // single proxy
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "<local>"),                          // bypass rules
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  // 7
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TEST_DESC("Per-scheme proxy rules"),
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Input.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MK_MODE(PROXY_PER_SCHEME),  // mode
171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "",                         // pac_url
172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "http=www.google.com:80;https=https://www.foo.com:110;"
173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "ftp=ftp.foo.com:121;socks=socks5://socks.com:888",  // server
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Expected result.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    false,                          // auto_detect
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL(),                         // pac_url
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::ProxyRulesExpectation::PerSchemeWithSocks(  // proxy_rules
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "www.google.com:80",        // http
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "https://www.foo.com:110",  // https
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "ftp.foo.com:121",          // ftp
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "socks5://socks.com:888",   // fallback proxy
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "<local>"),                 // bypass rules
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  // 8
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TEST_DESC("Bypass rules"),
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Input.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MK_MODE(SINGLE_PROXY),      // mode
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "",                         // pac_url
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "www.google.com",           // server
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "*.google.com, *foo.com:99, 1.2.3.4:22, 127.0.0.1/8",  // bypass_rules
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Expected result.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    false,                          // auto_detect
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL(),                         // pac_url
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::ProxyRulesExpectation::Single(  // proxy_rules
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "www.google.com:80",             // single proxy
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // bypass_rules
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "*.google.com,*foo.com:99,1.2.3.4:22,127.0.0.1/8,<local>"),
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};  // tests
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char* kUserProfilePath = "user_profile";
208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class ProxyConfigServiceImplTest : public testing::Test {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProxyConfigServiceImplTest()
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ui_thread_(BrowserThread::UI, &loop_),
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        io_thread_(BrowserThread::IO, &loop_) {}
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void SetUp() {
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DBusThreadManager::Initialize();
219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    NetworkHandler::Initialize();
220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SetUpNetwork();
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    PrefProxyConfigTrackerImpl::RegisterPrefs(pref_service_.registry());
224ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Create a ProxyConfigServiceImpl like for the system request context.
2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    config_service_impl_.reset(
2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        new ProxyConfigServiceImpl(NULL,  // no profile prefs
2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                   &pref_service_));
229ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    proxy_config_service_ =
230ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        config_service_impl_->CreateTrackingProxyConfigService(
231ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            scoped_ptr<net::ProxyConfigService>());
232ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
233ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // CreateTrackingProxyConfigService triggers update of initial prefs proxy
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // config by tracker to chrome proxy config service, so flush all pending
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // tasks so that tests start fresh.
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_.RunUntilIdle();
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void SetUpNetwork() {
240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ShillProfileClient::TestInterface* profile_test =
241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        DBusThreadManager::Get()->GetShillProfileClient()->GetTestInterface();
242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ShillServiceClient::TestInterface* service_test =
243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface();
244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Process any pending notifications before clearing services.
246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    loop_.RunUntilIdle();
247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    service_test->ClearServices();
248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Sends a notification about the added profile.
250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    profile_test->AddProfile(kUserProfilePath, "user_hash");
251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    service_test->AddService("/service/stub_wifi2",
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             "stub_wifi2" /* guid */,
254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             "wifi2_PSK",
25568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                             shill::kTypeWifi, shill::kStateOnline,
25646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                             true /* visible */);
257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    profile_test->AddService(kUserProfilePath, "/service/stub_wifi2");
258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    loop_.RunUntilIdle();
260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    config_service_impl_->DetachFromPrefService();
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_.RunUntilIdle();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    config_service_impl_.reset();
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proxy_config_service_.reset();
267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    NetworkHandler::Shutdown();
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DBusThreadManager::Shutdown();
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void InitConfigWithTestInput(const Input& input,
272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                               base::DictionaryValue* result) {
273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::DictionaryValue* new_config = NULL;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (input.mode) {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case MK_MODE(DIRECT):
276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        new_config = ProxyConfigDictionary::CreateDirect();
277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case MK_MODE(AUTO_DETECT):
279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        new_config = ProxyConfigDictionary::CreateAutoDetect();
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case MK_MODE(PAC_SCRIPT):
282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        new_config =
283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            ProxyConfigDictionary::CreatePacScript(input.pac_url, false);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case MK_MODE(SINGLE_PROXY):
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case MK_MODE(PROXY_PER_SCHEME):
287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        new_config =
288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          ProxyConfigDictionary::CreateFixedServers(input.server,
289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                    input.bypass_rules);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    result->Swap(new_config);
293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    delete new_config;
294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void SetConfig(base::DictionaryValue* pref_proxy_config_dict) {
297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    std::string proxy_config;
298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (pref_proxy_config_dict)
299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::JSONWriter::Write(pref_proxy_config_dict, &proxy_config);
300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    NetworkStateHandler* network_state_handler =
302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        NetworkHandler::Get()->network_state_handler();
303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const NetworkState* network = network_state_handler->DefaultNetwork();
304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ASSERT_TRUE(network);
305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface()->
306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        SetServiceProperty(network->path(),
30768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                           shill::kProxyConfigProperty,
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           base::StringValue(proxy_config));
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Synchronously gets the latest proxy config.
312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void SyncGetLatestProxyConfig(net::ProxyConfig* config) {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *config = net::ProxyConfig();
314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Let message loop process all messages. This will run
315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // ChromeProxyConfigService::UpdateProxyConfig, which is posted on IO from
316868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // PrefProxyConfigTrackerImpl::OnProxyConfigChanged.
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_.RunUntilIdle();
318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    net::ProxyConfigService::ConfigAvailability availability =
319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        proxy_config_service_->GetLatestProxyConfig(config);
320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
321868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(net::ProxyConfigService::CONFIG_VALID, availability);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop loop_;
325ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_ptr<net::ProxyConfigService> proxy_config_service_;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ProxyConfigServiceImpl> config_service_impl_;
327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TestingPrefServiceSimple pref_service_;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedTestDeviceSettingsService test_device_settings_service_;
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedTestCrosSettings test_cros_settings_;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread_;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread io_thread_;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceImplTest, NetworkProxy) {
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "] %s", i,
339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    tests[i].description.c_str()));
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::DictionaryValue test_config;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InitConfigWithTestInput(tests[i].input, &test_config);
343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SetConfig(&test_config);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::ProxyConfig config;
346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SyncGetLatestProxyConfig(&config);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(tests[i].auto_detect, config.auto_detect());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(tests[i].pac_url, config.pac_url());
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(tests[i].proxy_rules.Matches(config.proxy_rules()));
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyConfigServiceImplTest, DynamicPrefsOverride) {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Groupings of 3 test inputs to use for managed, recommended and network
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // proxies respectively.  Only valid and non-direct test inputs are used.
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t proxies[][3] = {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 1, 2, 4, },
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 1, 4, 2, },
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 4, 2, 1, },
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 2, 1, 4, },
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 2, 4, 5, },
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 2, 5, 4, },
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 5, 4, 2, },
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 4, 2, 5, },
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 4, 5, 6, },
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 4, 6, 5, },
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 6, 5, 4, },
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 5, 4, 6, },
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 5, 6, 7, },
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 5, 7, 6, },
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 7, 6, 5, },
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 6, 5, 7, },
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 6, 7, 8, },
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 6, 8, 7, },
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 8, 7, 6, },
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 7, 6, 8, },
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(proxies); ++i) {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const TestParams& managed_params = tests[proxies[i][0]];
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const TestParams& recommended_params = tests[proxies[i][1]];
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const TestParams& network_params = tests[proxies[i][2]];
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SCOPED_TRACE(base::StringPrintf(
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Test[%" PRIuS "] managed=[%s], recommended=[%s], network=[%s]", i,
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        managed_params.description.c_str(),
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        recommended_params.description.c_str(),
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        network_params.description.c_str()));
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
390868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::DictionaryValue managed_config;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InitConfigWithTestInput(managed_params.input, &managed_config);
392868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::DictionaryValue recommended_config;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InitConfigWithTestInput(recommended_params.input, &recommended_config);
394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::DictionaryValue network_config;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InitConfigWithTestInput(network_params.input, &network_config);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Managed proxy pref should take effect over recommended proxy and
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // non-existent network proxy.
399868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SetConfig(NULL);
400868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    pref_service_.SetManagedPref(prefs::kProxy, managed_config.DeepCopy());
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pref_service_.SetRecommendedPref(prefs::kProxy,
402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                     recommended_config.DeepCopy());
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::ProxyConfig actual_config;
404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SyncGetLatestProxyConfig(&actual_config);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(managed_params.auto_detect, actual_config.auto_detect());
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(managed_params.pac_url, actual_config.pac_url());
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(managed_params.proxy_rules.Matches(
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        actual_config.proxy_rules()));
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Recommended proxy pref should take effect when managed proxy pref is
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // removed.
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pref_service_.RemoveManagedPref(prefs::kProxy);
413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SyncGetLatestProxyConfig(&actual_config);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(recommended_params.auto_detect, actual_config.auto_detect());
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(recommended_params.pac_url, actual_config.pac_url());
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(recommended_params.proxy_rules.Matches(
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        actual_config.proxy_rules()));
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Network proxy should take take effect over recommended proxy pref.
420868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SetConfig(&network_config);
421868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SyncGetLatestProxyConfig(&actual_config);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(network_params.auto_detect, actual_config.auto_detect());
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(network_params.pac_url, actual_config.pac_url());
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(network_params.proxy_rules.Matches(
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        actual_config.proxy_rules()));
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Managed proxy pref should take effect over network proxy.
428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    pref_service_.SetManagedPref(prefs::kProxy, managed_config.DeepCopy());
429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SyncGetLatestProxyConfig(&actual_config);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(managed_params.auto_detect, actual_config.auto_detect());
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(managed_params.pac_url, actual_config.pac_url());
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(managed_params.proxy_rules.Matches(
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        actual_config.proxy_rules()));
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Network proxy should take effect over recommended proxy pref when managed
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // proxy pref is removed.
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pref_service_.RemoveManagedPref(prefs::kProxy);
438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SyncGetLatestProxyConfig(&actual_config);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(network_params.auto_detect, actual_config.auto_detect());
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(network_params.pac_url, actual_config.pac_url());
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(network_params.proxy_rules.Matches(
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        actual_config.proxy_rules()));
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Removing recommended proxy pref should have no effect on network proxy.
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pref_service_.RemoveRecommendedPref(prefs::kProxy);
446868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SyncGetLatestProxyConfig(&actual_config);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(network_params.auto_detect, actual_config.auto_detect());
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(network_params.pac_url, actual_config.pac_url());
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(network_params.proxy_rules.Matches(
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        actual_config.proxy_rules()));
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
455