| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 // Unit tests for helper functions for the Chrome Extensions Proxy Settings API. | |
| 6 | |
| 7 #include "base/memory/scoped_ptr.h" | |
| 8 #include "base/values.h" | |
| 9 #include "chrome/browser/extensions/extension_proxy_api_constants.h" | |
| 10 #include "chrome/browser/extensions/extension_proxy_api_helpers.h" | |
| 11 #include "chrome/browser/prefs/proxy_config_dictionary.h" | |
| 12 #include "chrome/browser/prefs/proxy_prefs.h" | |
| 13 #include "testing/gtest/include/gtest/gtest.h" | |
| 14 | |
| 15 namespace keys = extension_proxy_api_constants; | |
| 16 | |
| 17 namespace { | |
| 18 | |
| 19 const char kSamplePacScript[] = "test"; | |
| 20 const char kSamplePacScriptAsDataUrl[] = | |
| 21 "data:application/x-ns-proxy-autoconfig;base64,dGVzdA=="; | |
| 22 const char kSamplePacScriptUrl[] = "http://wpad/wpad.dat"; | |
| 23 | |
| 24 // Helper function to create a ProxyServer dictionary as defined in the | |
| 25 // extension API. | |
| 26 DictionaryValue* CreateTestProxyServerDict(const std::string& host) { | |
| 27 DictionaryValue* dict = new DictionaryValue; | |
| 28 dict->SetString(keys::kProxyConfigRuleHost, host); | |
| 29 return dict; | |
| 30 } | |
| 31 | |
| 32 // Helper function to create a ProxyServer dictionary as defined in the | |
| 33 // extension API. | |
| 34 DictionaryValue* CreateTestProxyServerDict(const std::string& schema, | |
| 35 const std::string& host, | |
| 36 int port) { | |
| 37 DictionaryValue* dict = new DictionaryValue; | |
| 38 dict->SetString(keys::kProxyConfigRuleScheme, schema); | |
| 39 dict->SetString(keys::kProxyConfigRuleHost, host); | |
| 40 dict->SetInteger(keys::kProxyConfigRulePort, port); | |
| 41 return dict; | |
| 42 } | |
| 43 | |
| 44 } // namespace | |
| 45 | |
| 46 namespace extension_proxy_api_helpers { | |
| 47 | |
| 48 TEST(ExtensionProxyApiHelpers, CreateDataURLFromPACScript) { | |
| 49 std::string out; | |
| 50 ASSERT_TRUE(CreateDataURLFromPACScript(kSamplePacScript, &out)); | |
| 51 EXPECT_EQ(kSamplePacScriptAsDataUrl, out); | |
| 52 } | |
| 53 | |
| 54 TEST(ExtensionProxyApiHelpers, CreatePACScriptFromDataURL) { | |
| 55 std::string out; | |
| 56 ASSERT_TRUE(CreatePACScriptFromDataURL(kSamplePacScriptAsDataUrl, &out)); | |
| 57 EXPECT_EQ(kSamplePacScript, out); | |
| 58 | |
| 59 EXPECT_FALSE(CreatePACScriptFromDataURL("http://www.google.com", &out)); | |
| 60 } | |
| 61 | |
| 62 TEST(ExtensionProxyApiHelpers, GetProxyModeFromExtensionPref) { | |
| 63 DictionaryValue proxy_config; | |
| 64 ProxyPrefs::ProxyMode mode; | |
| 65 std::string error; | |
| 66 bool bad_message = false; | |
| 67 | |
| 68 // Test positive case. | |
| 69 proxy_config.SetString( | |
| 70 keys::kProxyConfigMode, | |
| 71 ProxyPrefs::ProxyModeToString(ProxyPrefs::MODE_DIRECT)); | |
| 72 ASSERT_TRUE(GetProxyModeFromExtensionPref(&proxy_config, &mode, &error, | |
| 73 &bad_message)); | |
| 74 EXPECT_EQ(ProxyPrefs::MODE_DIRECT, mode); | |
| 75 EXPECT_EQ(std::string(), error); | |
| 76 EXPECT_FALSE(bad_message); | |
| 77 | |
| 78 // Test negative case. | |
| 79 proxy_config.SetString(keys::kProxyConfigMode, "foobar"); | |
| 80 EXPECT_FALSE(GetProxyModeFromExtensionPref(&proxy_config, &mode, &error, | |
| 81 &bad_message)); | |
| 82 EXPECT_TRUE(bad_message); | |
| 83 | |
| 84 // Do not test |error|, as an invalid enumeration value is considered an | |
| 85 // internal error. It should be filtered by the extensions API. | |
| 86 } | |
| 87 | |
| 88 TEST(ExtensionProxyApiHelpers, GetPacUrlFromExtensionPref) { | |
| 89 std::string out; | |
| 90 std::string error; | |
| 91 bool bad_message = false; | |
| 92 | |
| 93 DictionaryValue proxy_config; | |
| 94 proxy_config.SetString( | |
| 95 keys::kProxyConfigMode, | |
| 96 ProxyPrefs::ProxyModeToString(ProxyPrefs::MODE_PAC_SCRIPT)); | |
| 97 | |
| 98 // Currently we are still missing a PAC script entry. | |
| 99 // This is silently ignored. | |
| 100 ASSERT_TRUE(GetPacUrlFromExtensionPref(&proxy_config, &out, &error, | |
| 101 &bad_message)); | |
| 102 EXPECT_EQ(std::string(), out); | |
| 103 EXPECT_EQ(std::string(), error); | |
| 104 EXPECT_FALSE(bad_message); | |
| 105 | |
| 106 // Set up a pac script. | |
| 107 DictionaryValue* pacScriptDict = new DictionaryValue; | |
| 108 pacScriptDict->SetString(keys::kProxyConfigPacScriptUrl, kSamplePacScriptUrl); | |
| 109 proxy_config.Set(keys::kProxyConfigPacScript, pacScriptDict); | |
| 110 | |
| 111 ASSERT_TRUE(GetPacUrlFromExtensionPref(&proxy_config, &out, &error, | |
| 112 &bad_message)); | |
| 113 EXPECT_EQ(kSamplePacScriptUrl, out); | |
| 114 EXPECT_EQ(std::string(), error); | |
| 115 EXPECT_FALSE(bad_message); | |
| 116 } | |
| 117 | |
| 118 TEST(ExtensionProxyApiHelpers, GetPacDataFromExtensionPref) { | |
| 119 std::string out; | |
| 120 std::string error; | |
| 121 bool bad_message = false; | |
| 122 | |
| 123 DictionaryValue proxy_config; | |
| 124 proxy_config.SetString( | |
| 125 keys::kProxyConfigMode, | |
| 126 ProxyPrefs::ProxyModeToString(ProxyPrefs::MODE_PAC_SCRIPT)); | |
| 127 | |
| 128 // Currently we are still missing a PAC data entry. This is silently ignored. | |
| 129 ASSERT_TRUE(GetPacDataFromExtensionPref(&proxy_config, &out, &error, | |
| 130 &bad_message)); | |
| 131 EXPECT_EQ(std::string(), out); | |
| 132 EXPECT_EQ(std::string(), error); | |
| 133 EXPECT_FALSE(bad_message); | |
| 134 | |
| 135 // Set up a PAC script. | |
| 136 DictionaryValue* pacScriptDict = new DictionaryValue; | |
| 137 pacScriptDict->SetString(keys::kProxyConfigPacScriptData, kSamplePacScript); | |
| 138 proxy_config.Set(keys::kProxyConfigPacScript, pacScriptDict); | |
| 139 | |
| 140 ASSERT_TRUE(GetPacDataFromExtensionPref(&proxy_config, &out, &error, | |
| 141 &bad_message)); | |
| 142 EXPECT_EQ(kSamplePacScript, out); | |
| 143 EXPECT_EQ(std::string(), error); | |
| 144 EXPECT_FALSE(bad_message); | |
| 145 } | |
| 146 | |
| 147 TEST(ExtensionProxyApiHelpers, GetProxyRulesStringFromExtensionPref) { | |
| 148 std::string out; | |
| 149 std::string error; | |
| 150 bool bad_message = false; | |
| 151 | |
| 152 DictionaryValue proxy_config; | |
| 153 proxy_config.SetString( | |
| 154 keys::kProxyConfigMode, | |
| 155 ProxyPrefs::ProxyModeToString(ProxyPrefs::MODE_FIXED_SERVERS)); | |
| 156 | |
| 157 // Currently we are still missing a proxy config entry. | |
| 158 // This is silently ignored. | |
| 159 ASSERT_TRUE( | |
| 160 GetProxyRulesStringFromExtensionPref(&proxy_config, &out, &error, | |
| 161 &bad_message)); | |
| 162 EXPECT_EQ(std::string(), out); | |
| 163 EXPECT_EQ(std::string(), error); | |
| 164 | |
| 165 DictionaryValue* proxy_rules = new DictionaryValue; | |
| 166 proxy_rules->Set(keys::field_name[1], CreateTestProxyServerDict("proxy1")); | |
| 167 proxy_rules->Set(keys::field_name[2], CreateTestProxyServerDict("proxy2")); | |
| 168 proxy_config.Set(keys::kProxyConfigRules, proxy_rules); | |
| 169 | |
| 170 ASSERT_TRUE( | |
| 171 GetProxyRulesStringFromExtensionPref(&proxy_config, &out, &error, | |
| 172 &bad_message)); | |
| 173 EXPECT_EQ("http=proxy1:80;https=proxy2:80", out); | |
| 174 EXPECT_EQ(std::string(), error); | |
| 175 EXPECT_FALSE(bad_message); | |
| 176 } | |
| 177 | |
| 178 TEST(ExtensionProxyApiHelpers, GetBypassListFromExtensionPref) { | |
| 179 std::string out; | |
| 180 std::string error; | |
| 181 bool bad_message = false; | |
| 182 | |
| 183 DictionaryValue proxy_config; | |
| 184 proxy_config.SetString( | |
| 185 keys::kProxyConfigMode, | |
| 186 ProxyPrefs::ProxyModeToString(ProxyPrefs::MODE_FIXED_SERVERS)); | |
| 187 | |
| 188 // Currently we are still missing a proxy config entry. | |
| 189 // This is silently ignored. | |
| 190 ASSERT_TRUE( | |
| 191 GetBypassListFromExtensionPref(&proxy_config, &out, &error, | |
| 192 &bad_message)); | |
| 193 EXPECT_EQ(std::string(), out); | |
| 194 EXPECT_EQ(std::string(), error); | |
| 195 EXPECT_FALSE(bad_message); | |
| 196 | |
| 197 ListValue* bypass_list = new ListValue; | |
| 198 bypass_list->Append(Value::CreateStringValue("host1")); | |
| 199 bypass_list->Append(Value::CreateStringValue("host2")); | |
| 200 DictionaryValue* proxy_rules = new DictionaryValue; | |
| 201 proxy_rules->Set(keys::kProxyConfigBypassList, bypass_list); | |
| 202 proxy_config.Set(keys::kProxyConfigRules, proxy_rules); | |
| 203 | |
| 204 ASSERT_TRUE( | |
| 205 GetBypassListFromExtensionPref(&proxy_config, &out, &error, | |
| 206 &bad_message)); | |
| 207 EXPECT_EQ("host1,host2", out); | |
| 208 EXPECT_EQ(std::string(), error); | |
| 209 EXPECT_FALSE(bad_message); | |
| 210 } | |
| 211 | |
| 212 TEST(ExtensionProxyApiHelpers, CreateProxyConfigDict) { | |
| 213 std::string error; | |
| 214 scoped_ptr<DictionaryValue> exp_direct(ProxyConfigDictionary::CreateDirect()); | |
| 215 scoped_ptr<DictionaryValue> out_direct( | |
| 216 CreateProxyConfigDict(ProxyPrefs::MODE_DIRECT, false, "", "", "", "", | |
| 217 &error)); | |
| 218 EXPECT_TRUE(Value::Equals(exp_direct.get(), out_direct.get())); | |
| 219 | |
| 220 scoped_ptr<DictionaryValue> exp_auto( | |
| 221 ProxyConfigDictionary::CreateAutoDetect()); | |
| 222 scoped_ptr<DictionaryValue> out_auto( | |
| 223 CreateProxyConfigDict(ProxyPrefs::MODE_AUTO_DETECT, false, "", "", "", "", | |
| 224 &error)); | |
| 225 EXPECT_TRUE(Value::Equals(exp_auto.get(), out_auto.get())); | |
| 226 | |
| 227 scoped_ptr<DictionaryValue> exp_pac_url( | |
| 228 ProxyConfigDictionary::CreatePacScript(kSamplePacScriptUrl, false)); | |
| 229 scoped_ptr<DictionaryValue> out_pac_url( | |
| 230 CreateProxyConfigDict(ProxyPrefs::MODE_PAC_SCRIPT, false, | |
| 231 kSamplePacScriptUrl, "", "", "", &error)); | |
| 232 EXPECT_TRUE(Value::Equals(exp_pac_url.get(), out_pac_url.get())); | |
| 233 | |
| 234 scoped_ptr<DictionaryValue> exp_pac_data( | |
| 235 ProxyConfigDictionary::CreatePacScript(kSamplePacScriptAsDataUrl, false)); | |
| 236 scoped_ptr<DictionaryValue> out_pac_data( | |
| 237 CreateProxyConfigDict(ProxyPrefs::MODE_PAC_SCRIPT, false, "", | |
| 238 kSamplePacScript, "", "", &error)); | |
| 239 EXPECT_TRUE(Value::Equals(exp_pac_data.get(), out_pac_data.get())); | |
| 240 | |
| 241 scoped_ptr<DictionaryValue> exp_fixed( | |
| 242 ProxyConfigDictionary::CreateFixedServers("foo:80", "localhost")); | |
| 243 scoped_ptr<DictionaryValue> out_fixed( | |
| 244 CreateProxyConfigDict(ProxyPrefs::MODE_FIXED_SERVERS, false, "", "", | |
| 245 "foo:80", "localhost", &error)); | |
| 246 EXPECT_TRUE(Value::Equals(exp_fixed.get(), out_fixed.get())); | |
| 247 | |
| 248 scoped_ptr<DictionaryValue> exp_system(ProxyConfigDictionary::CreateSystem()); | |
| 249 scoped_ptr<DictionaryValue> out_system( | |
| 250 CreateProxyConfigDict(ProxyPrefs::MODE_SYSTEM, false, "", "", "", "", | |
| 251 &error)); | |
| 252 EXPECT_TRUE(Value::Equals(exp_system.get(), out_system.get())); | |
| 253 | |
| 254 // Neither of them should have set an error. | |
| 255 EXPECT_EQ(std::string(), error); | |
| 256 } | |
| 257 | |
| 258 TEST(ExtensionProxyApiHelpers, GetProxyServer) { | |
| 259 DictionaryValue proxy_server_dict; | |
| 260 net::ProxyServer created; | |
| 261 std::string error; | |
| 262 bool bad_message = false; | |
| 263 | |
| 264 // Test simplest case, no schema nor port specified --> defaults are used. | |
| 265 proxy_server_dict.SetString(keys::kProxyConfigRuleHost, "proxy_server"); | |
| 266 ASSERT_TRUE( | |
| 267 GetProxyServer(&proxy_server_dict, net::ProxyServer::SCHEME_HTTP, | |
| 268 &created, &error, &bad_message)); | |
| 269 EXPECT_EQ("PROXY proxy_server:80", created.ToPacString()); | |
| 270 EXPECT_FALSE(bad_message); | |
| 271 | |
| 272 // Test complete case. | |
| 273 proxy_server_dict.SetString(keys::kProxyConfigRuleScheme, "socks4"); | |
| 274 proxy_server_dict.SetInteger(keys::kProxyConfigRulePort, 1234); | |
| 275 ASSERT_TRUE( | |
| 276 GetProxyServer(&proxy_server_dict, net::ProxyServer::SCHEME_HTTP, | |
| 277 &created, &error, &bad_message)); | |
| 278 EXPECT_EQ("SOCKS proxy_server:1234", created.ToPacString()); | |
| 279 EXPECT_FALSE(bad_message); | |
| 280 } | |
| 281 | |
| 282 TEST(ExtensionProxyApiHelpers, JoinUrlList) { | |
| 283 bool bad_message = false; | |
| 284 ListValue list; | |
| 285 list.Append(Value::CreateStringValue("s1")); | |
| 286 list.Append(Value::CreateStringValue("s2")); | |
| 287 list.Append(Value::CreateStringValue("s3")); | |
| 288 | |
| 289 std::string out; | |
| 290 std::string error; | |
| 291 ASSERT_TRUE(JoinUrlList(&list, ";", &out, &error, &bad_message)); | |
| 292 EXPECT_EQ("s1;s2;s3", out); | |
| 293 EXPECT_FALSE(bad_message); | |
| 294 } | |
| 295 | |
| 296 // This tests CreateProxyServerDict as well. | |
| 297 TEST(ExtensionProxyApiHelpers, CreateProxyRulesDict) { | |
| 298 scoped_ptr<DictionaryValue> browser_pref( | |
| 299 ProxyConfigDictionary::CreateFixedServers( | |
| 300 "http=proxy1:80;https=proxy2:80;ftp=proxy3:80;socks=proxy4:80", | |
| 301 "localhost")); | |
| 302 ProxyConfigDictionary config(browser_pref.get()); | |
| 303 scoped_ptr<DictionaryValue> extension_pref(CreateProxyRulesDict(config)); | |
| 304 ASSERT_TRUE(extension_pref.get()); | |
| 305 | |
| 306 scoped_ptr<DictionaryValue> expected(new DictionaryValue); | |
| 307 expected->Set("proxyForHttp", | |
| 308 CreateTestProxyServerDict("http", "proxy1", 80)); | |
| 309 expected->Set("proxyForHttps", | |
| 310 CreateTestProxyServerDict("http", "proxy2", 80)); | |
| 311 expected->Set("proxyForFtp", | |
| 312 CreateTestProxyServerDict("http", "proxy3", 80)); | |
| 313 expected->Set("fallbackProxy", | |
| 314 CreateTestProxyServerDict("socks4", "proxy4", 80)); | |
| 315 ListValue* bypass_list = new ListValue; | |
| 316 bypass_list->Append(Value::CreateStringValue("localhost")); | |
| 317 expected->Set(keys::kProxyConfigBypassList, bypass_list); | |
| 318 | |
| 319 EXPECT_TRUE(Value::Equals(expected.get(), extension_pref.get())); | |
| 320 } | |
| 321 | |
| 322 // Test if a PAC script URL is specified. | |
| 323 TEST(ExtensionProxyApiHelpers, CreatePacScriptDictWithUrl) { | |
| 324 scoped_ptr<DictionaryValue> browser_pref( | |
| 325 ProxyConfigDictionary::CreatePacScript(kSamplePacScriptUrl, false)); | |
| 326 ProxyConfigDictionary config(browser_pref.get()); | |
| 327 scoped_ptr<DictionaryValue> extension_pref(CreatePacScriptDict(config)); | |
| 328 ASSERT_TRUE(extension_pref.get()); | |
| 329 | |
| 330 scoped_ptr<DictionaryValue> expected(new DictionaryValue); | |
| 331 expected->SetString(keys::kProxyConfigPacScriptUrl, kSamplePacScriptUrl); | |
| 332 expected->SetBoolean(keys::kProxyConfigPacScriptMandatory, false); | |
| 333 | |
| 334 EXPECT_TRUE(Value::Equals(expected.get(), extension_pref.get())); | |
| 335 } | |
| 336 | |
| 337 // Test if a PAC script is encoded in a data URL. | |
| 338 TEST(ExtensionProxyApiHelpers, CreatePacScriptDictWidthData) { | |
| 339 scoped_ptr<DictionaryValue> browser_pref( | |
| 340 ProxyConfigDictionary::CreatePacScript(kSamplePacScriptAsDataUrl, false)); | |
| 341 ProxyConfigDictionary config(browser_pref.get()); | |
| 342 scoped_ptr<DictionaryValue> extension_pref(CreatePacScriptDict(config)); | |
| 343 ASSERT_TRUE(extension_pref.get()); | |
| 344 | |
| 345 scoped_ptr<DictionaryValue> expected(new DictionaryValue); | |
| 346 expected->SetString(keys::kProxyConfigPacScriptData, kSamplePacScript); | |
| 347 expected->SetBoolean(keys::kProxyConfigPacScriptMandatory, false); | |
| 348 | |
| 349 EXPECT_TRUE(Value::Equals(expected.get(), extension_pref.get())); | |
| 350 } | |
| 351 | |
| 352 TEST(ExtensionProxyApiHelpers, TokenizeToStringList) { | |
| 353 ListValue expected; | |
| 354 expected.Append(Value::CreateStringValue("s1")); | |
| 355 expected.Append(Value::CreateStringValue("s2")); | |
| 356 expected.Append(Value::CreateStringValue("s3")); | |
| 357 | |
| 358 scoped_ptr<ListValue> out(TokenizeToStringList("s1;s2;s3", ";")); | |
| 359 EXPECT_TRUE(Value::Equals(&expected, out.get())); | |
| 360 } | |
| 361 | |
| 362 } // namespace extension_proxy_api_helpers | |
| OLD | NEW |