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)// Unit tests for helper functions for the Chrome Extensions Proxy Settings API.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/proxy/proxy_api_constants.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/proxy/proxy_api_helpers.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/proxy_config_dictionary.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/proxy_prefs.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace keys = proxy_api_constants;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSamplePacScript[] = "test";
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSamplePacScriptAsDataUrl[] =
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "data:application/x-ns-proxy-autoconfig;base64,dGVzdA==";
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSamplePacScriptAsDataUrl2[] =
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "data:;base64,dGVzdA==";
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSamplePacScriptUrl[] = "http://wpad/wpad.dat";
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper function to create a ProxyServer dictionary as defined in the
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extension API.
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::DictionaryValue* CreateTestProxyServerDict(const std::string& host) {
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue* dict = new base::DictionaryValue;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString(keys::kProxyConfigRuleHost, host);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dict;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper function to create a ProxyServer dictionary as defined in the
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extension API.
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::DictionaryValue* CreateTestProxyServerDict(const std::string& schema,
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                 const std::string& host,
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                 int port) {
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue* dict = new base::DictionaryValue;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString(keys::kProxyConfigRuleScheme, schema);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString(keys::kProxyConfigRuleHost, host);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetInteger(keys::kProxyConfigRulePort, port);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dict;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy_api_helpers {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionProxyApiHelpers, CreateDataURLFromPACScript) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string out;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreateDataURLFromPACScript(kSamplePacScript, &out));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSamplePacScriptAsDataUrl, out);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionProxyApiHelpers, CreatePACScriptFromDataURL) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string out;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify deserialization of a PAC data:// URL that we created ourselves.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreatePACScriptFromDataURL(kSamplePacScriptAsDataUrl, &out));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSamplePacScript, out);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that we don't require a mime-type.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CreatePACScriptFromDataURL(kSamplePacScriptAsDataUrl2, &out));
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSamplePacScript, out);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(CreatePACScriptFromDataURL("http://www.google.com", &out));
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionProxyApiHelpers, GetProxyModeFromExtensionPref) {
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue proxy_config;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyPrefs::ProxyMode mode;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool bad_message = false;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test positive case.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_config.SetString(
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keys::kProxyConfigMode,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProxyPrefs::ProxyModeToString(ProxyPrefs::MODE_DIRECT));
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetProxyModeFromExtensionPref(&proxy_config, &mode, &error,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            &bad_message));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ProxyPrefs::MODE_DIRECT, mode);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string(), error);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bad_message);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test negative case.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_config.SetString(keys::kProxyConfigMode, "foobar");
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetProxyModeFromExtensionPref(&proxy_config, &mode, &error,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             &bad_message));
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(bad_message);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do not test |error|, as an invalid enumeration value is considered an
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // internal error. It should be filtered by the extensions API.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionProxyApiHelpers, GetPacUrlFromExtensionPref) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string out;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool bad_message = false;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue proxy_config;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_config.SetString(
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keys::kProxyConfigMode,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProxyPrefs::ProxyModeToString(ProxyPrefs::MODE_PAC_SCRIPT));
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Currently we are still missing a PAC script entry.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is silently ignored.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetPacUrlFromExtensionPref(&proxy_config, &out, &error,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         &bad_message));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string(), out);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string(), error);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bad_message);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up a pac script.
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue* pacScriptDict = new base::DictionaryValue;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pacScriptDict->SetString(keys::kProxyConfigPacScriptUrl, kSamplePacScriptUrl);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_config.Set(keys::kProxyConfigPacScript, pacScriptDict);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetPacUrlFromExtensionPref(&proxy_config, &out, &error,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         &bad_message));
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSamplePacScriptUrl, out);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string(), error);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bad_message);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionProxyApiHelpers, GetPacDataFromExtensionPref) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string out;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool bad_message = false;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue proxy_config;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_config.SetString(
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keys::kProxyConfigMode,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProxyPrefs::ProxyModeToString(ProxyPrefs::MODE_PAC_SCRIPT));
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Currently we are still missing a PAC data entry. This is silently ignored.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetPacDataFromExtensionPref(&proxy_config, &out, &error,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          &bad_message));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string(), out);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string(), error);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bad_message);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up a PAC script.
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue* pacScriptDict = new base::DictionaryValue;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pacScriptDict->SetString(keys::kProxyConfigPacScriptData, kSamplePacScript);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_config.Set(keys::kProxyConfigPacScript, pacScriptDict);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetPacDataFromExtensionPref(&proxy_config, &out, &error,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          &bad_message));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSamplePacScript, out);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string(), error);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bad_message);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionProxyApiHelpers, GetProxyRulesStringFromExtensionPref) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string out;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool bad_message = false;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue proxy_config;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_config.SetString(
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keys::kProxyConfigMode,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProxyPrefs::ProxyModeToString(ProxyPrefs::MODE_FIXED_SERVERS));
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Currently we are still missing a proxy config entry.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is silently ignored.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetProxyRulesStringFromExtensionPref(&proxy_config, &out, &error,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &bad_message));
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string(), out);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string(), error);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue* proxy_rules = new base::DictionaryValue;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_rules->Set(keys::field_name[1], CreateTestProxyServerDict("proxy1"));
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_rules->Set(keys::field_name[2], CreateTestProxyServerDict("proxy2"));
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_config.Set(keys::kProxyConfigRules, proxy_rules);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetProxyRulesStringFromExtensionPref(&proxy_config, &out, &error,
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &bad_message));
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("http=proxy1:80;https=proxy2:80", out);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string(), error);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bad_message);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionProxyApiHelpers, GetBypassListFromExtensionPref) {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string out;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool bad_message = false;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue proxy_config;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_config.SetString(
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keys::kProxyConfigMode,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProxyPrefs::ProxyModeToString(ProxyPrefs::MODE_FIXED_SERVERS));
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Currently we are still missing a proxy config entry.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is silently ignored.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetBypassListFromExtensionPref(&proxy_config, &out, &error,
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &bad_message));
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string(), out);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string(), error);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bad_message);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::ListValue* bypass_list = new base::ListValue;
2073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bypass_list->Append(new base::StringValue("host1"));
2083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bypass_list->Append(new base::StringValue("host2"));
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue* proxy_rules = new base::DictionaryValue;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_rules->Set(keys::kProxyConfigBypassList, bypass_list);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_config.Set(keys::kProxyConfigRules, proxy_rules);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetBypassListFromExtensionPref(&proxy_config, &out, &error,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &bad_message));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("host1,host2", out);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string(), error);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bad_message);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionProxyApiHelpers, CreateProxyConfigDict) {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> exp_direct(
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ProxyConfigDictionary::CreateDirect());
225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> out_direct(
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateProxyConfigDict(ProxyPrefs::MODE_DIRECT,
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            false,
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            std::string(),
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            std::string(),
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            std::string(),
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            std::string(),
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &error));
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(base::Value::Equals(exp_direct.get(), out_direct.get()));
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> exp_auto(
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProxyConfigDictionary::CreateAutoDetect());
237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> out_auto(
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateProxyConfigDict(ProxyPrefs::MODE_AUTO_DETECT,
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            false,
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            std::string(),
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            std::string(),
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            std::string(),
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            std::string(),
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &error));
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(base::Value::Equals(exp_auto.get(), out_auto.get()));
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> exp_pac_url(
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProxyConfigDictionary::CreatePacScript(kSamplePacScriptUrl, false));
249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> out_pac_url(
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateProxyConfigDict(ProxyPrefs::MODE_PAC_SCRIPT,
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            false,
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            kSamplePacScriptUrl,
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            std::string(),
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            std::string(),
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            std::string(),
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            &error));
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(base::Value::Equals(exp_pac_url.get(), out_pac_url.get()));
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> exp_pac_data(
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProxyConfigDictionary::CreatePacScript(kSamplePacScriptAsDataUrl, false));
261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> out_pac_data(
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateProxyConfigDict(ProxyPrefs::MODE_PAC_SCRIPT,
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            false,
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            std::string(),
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            kSamplePacScript,
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            std::string(),
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            std::string(),
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            &error));
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(base::Value::Equals(exp_pac_data.get(), out_pac_data.get()));
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> exp_fixed(
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProxyConfigDictionary::CreateFixedServers("foo:80", "localhost"));
273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> out_fixed(
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateProxyConfigDict(ProxyPrefs::MODE_FIXED_SERVERS,
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            false,
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            std::string(),
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            std::string(),
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            "foo:80",
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            "localhost",
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            &error));
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(base::Value::Equals(exp_fixed.get(), out_fixed.get()));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> exp_system(
284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ProxyConfigDictionary::CreateSystem());
285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> out_system(
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateProxyConfigDict(ProxyPrefs::MODE_SYSTEM,
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            false,
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            std::string(),
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            std::string(),
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            std::string(),
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            std::string(),
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &error));
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(base::Value::Equals(exp_system.get(), out_system.get()));
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Neither of them should have set an error.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string(), error);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionProxyApiHelpers, GetProxyServer) {
300eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue proxy_server_dict;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::ProxyServer created;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool bad_message = false;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test simplest case, no schema nor port specified --> defaults are used.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_server_dict.SetString(keys::kProxyConfigRuleHost, "proxy_server");
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetProxyServer(&proxy_server_dict, net::ProxyServer::SCHEME_HTTP,
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     &created, &error, &bad_message));
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("PROXY proxy_server:80", created.ToPacString());
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bad_message);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test complete case.
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_server_dict.SetString(keys::kProxyConfigRuleScheme, "socks4");
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_server_dict.SetInteger(keys::kProxyConfigRulePort, 1234);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetProxyServer(&proxy_server_dict, net::ProxyServer::SCHEME_HTTP,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       &created, &error, &bad_message));
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("SOCKS proxy_server:1234", created.ToPacString());
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bad_message);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionProxyApiHelpers, JoinUrlList) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool bad_message = false;
325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::ListValue list;
3263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  list.Append(new base::StringValue("s1"));
3273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  list.Append(new base::StringValue("s2"));
3283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  list.Append(new base::StringValue("s3"));
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string out;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(JoinUrlList(&list, ";", &out, &error, &bad_message));
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("s1;s2;s3", out);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bad_message);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests CreateProxyServerDict as well.
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionProxyApiHelpers, CreateProxyRulesDict) {
339eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> browser_pref(
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProxyConfigDictionary::CreateFixedServers(
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "http=proxy1:80;https=proxy2:80;ftp=proxy3:80;socks=proxy4:80",
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "localhost"));
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyConfigDictionary config(browser_pref.get());
344eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> extension_pref(
345eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CreateProxyRulesDict(config));
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension_pref.get());
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
348eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> expected(new base::DictionaryValue);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected->Set("proxyForHttp",
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                CreateTestProxyServerDict("http", "proxy1", 80));
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected->Set("proxyForHttps",
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                CreateTestProxyServerDict("http", "proxy2", 80));
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected->Set("proxyForFtp",
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                CreateTestProxyServerDict("http", "proxy3", 80));
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected->Set("fallbackProxy",
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                CreateTestProxyServerDict("socks4", "proxy4", 80));
357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::ListValue* bypass_list = new base::ListValue;
3583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bypass_list->Append(new base::StringValue("localhost"));
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected->Set(keys::kProxyConfigBypassList, bypass_list);
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(base::Value::Equals(expected.get(), extension_pref.get()));
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test multiple proxies per scheme -- expect that only the first is returned.
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(ExtensionProxyApiHelpers, CreateProxyRulesDictMultipleProxies) {
366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> browser_pref(
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ProxyConfigDictionary::CreateFixedServers(
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "http=proxy1:80,default://;https=proxy2:80,proxy1:80;ftp=proxy3:80,"
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "https://proxy5:443;socks=proxy4:80,proxy1:80",
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "localhost"));
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyConfigDictionary config(browser_pref.get());
372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> extension_pref(
373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CreateProxyRulesDict(config));
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(extension_pref.get());
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> expected(new base::DictionaryValue);
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected->Set("proxyForHttp",
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                CreateTestProxyServerDict("http", "proxy1", 80));
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected->Set("proxyForHttps",
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                CreateTestProxyServerDict("http", "proxy2", 80));
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected->Set("proxyForFtp",
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                CreateTestProxyServerDict("http", "proxy3", 80));
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected->Set("fallbackProxy",
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                CreateTestProxyServerDict("socks4", "proxy4", 80));
385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::ListValue* bypass_list = new base::ListValue;
3863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bypass_list->Append(new base::StringValue("localhost"));
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected->Set(keys::kProxyConfigBypassList, bypass_list);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(base::Value::Equals(expected.get(), extension_pref.get()));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test if a PAC script URL is specified.
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionProxyApiHelpers, CreatePacScriptDictWithUrl) {
394eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> browser_pref(
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProxyConfigDictionary::CreatePacScript(kSamplePacScriptUrl, false));
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyConfigDictionary config(browser_pref.get());
397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> extension_pref(CreatePacScriptDict(config));
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension_pref.get());
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> expected(new base::DictionaryValue);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected->SetString(keys::kProxyConfigPacScriptUrl, kSamplePacScriptUrl);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected->SetBoolean(keys::kProxyConfigPacScriptMandatory, false);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(base::Value::Equals(expected.get(), extension_pref.get()));
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test if a PAC script is encoded in a data URL.
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionProxyApiHelpers, CreatePacScriptDictWidthData) {
409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> browser_pref(
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProxyConfigDictionary::CreatePacScript(kSamplePacScriptAsDataUrl, false));
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyConfigDictionary config(browser_pref.get());
412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> extension_pref(CreatePacScriptDict(config));
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension_pref.get());
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> expected(new base::DictionaryValue);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected->SetString(keys::kProxyConfigPacScriptData, kSamplePacScript);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected->SetBoolean(keys::kProxyConfigPacScriptMandatory, false);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(base::Value::Equals(expected.get(), extension_pref.get()));
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionProxyApiHelpers, TokenizeToStringList) {
423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::ListValue expected;
4243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  expected.Append(new base::StringValue("s1"));
4253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  expected.Append(new base::StringValue("s2"));
4263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  expected.Append(new base::StringValue("s3"));
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::ListValue> out(TokenizeToStringList("s1;s2;s3", ";"));
4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(base::Value::Equals(&expected, out.get()));
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace proxy_api_helpers
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
434