| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Unit tests for helper functions for the Chrome Extensions Proxy Settings API. | 5 // Unit tests for helper functions for the Chrome Extensions Proxy Settings API. |
| 6 | 6 |
| 7 #include "chrome/browser/extensions/api/proxy/proxy_api_helpers.h" | 7 #include "chrome/browser/extensions/api/proxy/proxy_api_helpers.h" |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <utility> | 10 #include <utility> |
| 11 | 11 |
| 12 #include "base/memory/ptr_util.h" | |
| 13 #include "base/values.h" | 12 #include "base/values.h" |
| 14 #include "chrome/browser/extensions/api/proxy/proxy_api_constants.h" | 13 #include "chrome/browser/extensions/api/proxy/proxy_api_constants.h" |
| 15 #include "components/proxy_config/proxy_config_dictionary.h" | 14 #include "components/proxy_config/proxy_config_dictionary.h" |
| 16 #include "components/proxy_config/proxy_prefs.h" | 15 #include "components/proxy_config/proxy_prefs.h" |
| 17 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 18 | 17 |
| 19 namespace extensions { | 18 namespace extensions { |
| 20 | 19 |
| 21 namespace keys = proxy_api_constants; | 20 namespace keys = proxy_api_constants; |
| 22 | 21 |
| 23 namespace { | 22 namespace { |
| 24 | 23 |
| 25 const char kSamplePacScript[] = "test"; | 24 const char kSamplePacScript[] = "test"; |
| 26 const char kSamplePacScriptAsDataUrl[] = | 25 const char kSamplePacScriptAsDataUrl[] = |
| 27 "data:application/x-ns-proxy-autoconfig;base64,dGVzdA=="; | 26 "data:application/x-ns-proxy-autoconfig;base64,dGVzdA=="; |
| 28 const char kSamplePacScriptAsDataUrl2[] = | 27 const char kSamplePacScriptAsDataUrl2[] = |
| 29 "data:;base64,dGVzdA=="; | 28 "data:;base64,dGVzdA=="; |
| 30 const char kSamplePacScriptUrl[] = "http://wpad/wpad.dat"; | 29 const char kSamplePacScriptUrl[] = "http://wpad/wpad.dat"; |
| 31 | 30 |
| 32 // Helper function to create a ProxyServer dictionary as defined in the | 31 // Helper function to create a ProxyServer dictionary as defined in the |
| 33 // extension API. | 32 // extension API. |
| 34 std::unique_ptr<base::DictionaryValue> CreateTestProxyServerDict( | 33 base::DictionaryValue* CreateTestProxyServerDict(const std::string& host) { |
| 35 const std::string& host) { | 34 base::DictionaryValue* dict = new base::DictionaryValue; |
| 36 auto dict = base::MakeUnique<base::DictionaryValue>(); | |
| 37 dict->SetString(keys::kProxyConfigRuleHost, host); | 35 dict->SetString(keys::kProxyConfigRuleHost, host); |
| 38 return dict; | 36 return dict; |
| 39 } | 37 } |
| 40 | 38 |
| 41 // Helper function to create a ProxyServer dictionary as defined in the | 39 // Helper function to create a ProxyServer dictionary as defined in the |
| 42 // extension API. | 40 // extension API. |
| 43 std::unique_ptr<base::DictionaryValue> CreateTestProxyServerDict( | 41 base::DictionaryValue* CreateTestProxyServerDict(const std::string& schema, |
| 44 const std::string& schema, | 42 const std::string& host, |
| 45 const std::string& host, | 43 int port) { |
| 46 int port) { | 44 base::DictionaryValue* dict = new base::DictionaryValue; |
| 47 auto dict = base::MakeUnique<base::DictionaryValue>(); | |
| 48 dict->SetString(keys::kProxyConfigRuleScheme, schema); | 45 dict->SetString(keys::kProxyConfigRuleScheme, schema); |
| 49 dict->SetString(keys::kProxyConfigRuleHost, host); | 46 dict->SetString(keys::kProxyConfigRuleHost, host); |
| 50 dict->SetInteger(keys::kProxyConfigRulePort, port); | 47 dict->SetInteger(keys::kProxyConfigRulePort, port); |
| 51 return dict; | 48 return dict; |
| 52 } | 49 } |
| 53 | 50 |
| 54 } // namespace | 51 } // namespace |
| 55 | 52 |
| 56 namespace proxy_api_helpers { | 53 namespace proxy_api_helpers { |
| 57 | 54 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 | 109 |
| 113 // Currently we are still missing a PAC script entry. | 110 // Currently we are still missing a PAC script entry. |
| 114 // This is silently ignored. | 111 // This is silently ignored. |
| 115 ASSERT_TRUE(GetPacUrlFromExtensionPref(&proxy_config, &out, &error, | 112 ASSERT_TRUE(GetPacUrlFromExtensionPref(&proxy_config, &out, &error, |
| 116 &bad_message)); | 113 &bad_message)); |
| 117 EXPECT_EQ(std::string(), out); | 114 EXPECT_EQ(std::string(), out); |
| 118 EXPECT_EQ(std::string(), error); | 115 EXPECT_EQ(std::string(), error); |
| 119 EXPECT_FALSE(bad_message); | 116 EXPECT_FALSE(bad_message); |
| 120 | 117 |
| 121 // Set up a pac script. | 118 // Set up a pac script. |
| 122 auto pacScriptDict = base::MakeUnique<base::DictionaryValue>(); | 119 base::DictionaryValue* pacScriptDict = new base::DictionaryValue; |
| 123 pacScriptDict->SetString(keys::kProxyConfigPacScriptUrl, kSamplePacScriptUrl); | 120 pacScriptDict->SetString(keys::kProxyConfigPacScriptUrl, kSamplePacScriptUrl); |
| 124 proxy_config.Set(keys::kProxyConfigPacScript, std::move(pacScriptDict)); | 121 proxy_config.Set(keys::kProxyConfigPacScript, pacScriptDict); |
| 125 | 122 |
| 126 ASSERT_TRUE(GetPacUrlFromExtensionPref(&proxy_config, &out, &error, | 123 ASSERT_TRUE(GetPacUrlFromExtensionPref(&proxy_config, &out, &error, |
| 127 &bad_message)); | 124 &bad_message)); |
| 128 EXPECT_EQ(kSamplePacScriptUrl, out); | 125 EXPECT_EQ(kSamplePacScriptUrl, out); |
| 129 EXPECT_EQ(std::string(), error); | 126 EXPECT_EQ(std::string(), error); |
| 130 EXPECT_FALSE(bad_message); | 127 EXPECT_FALSE(bad_message); |
| 131 } | 128 } |
| 132 | 129 |
| 133 TEST(ExtensionProxyApiHelpers, GetPacDataFromExtensionPref) { | 130 TEST(ExtensionProxyApiHelpers, GetPacDataFromExtensionPref) { |
| 134 std::string out; | 131 std::string out; |
| 135 std::string error; | 132 std::string error; |
| 136 bool bad_message = false; | 133 bool bad_message = false; |
| 137 | 134 |
| 138 base::DictionaryValue proxy_config; | 135 base::DictionaryValue proxy_config; |
| 139 proxy_config.SetString( | 136 proxy_config.SetString( |
| 140 keys::kProxyConfigMode, | 137 keys::kProxyConfigMode, |
| 141 ProxyPrefs::ProxyModeToString(ProxyPrefs::MODE_PAC_SCRIPT)); | 138 ProxyPrefs::ProxyModeToString(ProxyPrefs::MODE_PAC_SCRIPT)); |
| 142 | 139 |
| 143 // Currently we are still missing a PAC data entry. This is silently ignored. | 140 // Currently we are still missing a PAC data entry. This is silently ignored. |
| 144 ASSERT_TRUE(GetPacDataFromExtensionPref(&proxy_config, &out, &error, | 141 ASSERT_TRUE(GetPacDataFromExtensionPref(&proxy_config, &out, &error, |
| 145 &bad_message)); | 142 &bad_message)); |
| 146 EXPECT_EQ(std::string(), out); | 143 EXPECT_EQ(std::string(), out); |
| 147 EXPECT_EQ(std::string(), error); | 144 EXPECT_EQ(std::string(), error); |
| 148 EXPECT_FALSE(bad_message); | 145 EXPECT_FALSE(bad_message); |
| 149 | 146 |
| 150 // Set up a PAC script. | 147 // Set up a PAC script. |
| 151 auto pacScriptDict = base::MakeUnique<base::DictionaryValue>(); | 148 base::DictionaryValue* pacScriptDict = new base::DictionaryValue; |
| 152 pacScriptDict->SetString(keys::kProxyConfigPacScriptData, kSamplePacScript); | 149 pacScriptDict->SetString(keys::kProxyConfigPacScriptData, kSamplePacScript); |
| 153 proxy_config.Set(keys::kProxyConfigPacScript, std::move(pacScriptDict)); | 150 proxy_config.Set(keys::kProxyConfigPacScript, pacScriptDict); |
| 154 | 151 |
| 155 ASSERT_TRUE(GetPacDataFromExtensionPref(&proxy_config, &out, &error, | 152 ASSERT_TRUE(GetPacDataFromExtensionPref(&proxy_config, &out, &error, |
| 156 &bad_message)); | 153 &bad_message)); |
| 157 EXPECT_EQ(kSamplePacScript, out); | 154 EXPECT_EQ(kSamplePacScript, out); |
| 158 EXPECT_EQ(std::string(), error); | 155 EXPECT_EQ(std::string(), error); |
| 159 EXPECT_FALSE(bad_message); | 156 EXPECT_FALSE(bad_message); |
| 160 } | 157 } |
| 161 | 158 |
| 162 TEST(ExtensionProxyApiHelpers, GetProxyRulesStringFromExtensionPref) { | 159 TEST(ExtensionProxyApiHelpers, GetProxyRulesStringFromExtensionPref) { |
| 163 std::string out; | 160 std::string out; |
| 164 std::string error; | 161 std::string error; |
| 165 bool bad_message = false; | 162 bool bad_message = false; |
| 166 | 163 |
| 167 base::DictionaryValue proxy_config; | 164 base::DictionaryValue proxy_config; |
| 168 proxy_config.SetString( | 165 proxy_config.SetString( |
| 169 keys::kProxyConfigMode, | 166 keys::kProxyConfigMode, |
| 170 ProxyPrefs::ProxyModeToString(ProxyPrefs::MODE_FIXED_SERVERS)); | 167 ProxyPrefs::ProxyModeToString(ProxyPrefs::MODE_FIXED_SERVERS)); |
| 171 | 168 |
| 172 // Currently we are still missing a proxy config entry. | 169 // Currently we are still missing a proxy config entry. |
| 173 // This is silently ignored. | 170 // This is silently ignored. |
| 174 ASSERT_TRUE( | 171 ASSERT_TRUE( |
| 175 GetProxyRulesStringFromExtensionPref(&proxy_config, &out, &error, | 172 GetProxyRulesStringFromExtensionPref(&proxy_config, &out, &error, |
| 176 &bad_message)); | 173 &bad_message)); |
| 177 EXPECT_EQ(std::string(), out); | 174 EXPECT_EQ(std::string(), out); |
| 178 EXPECT_EQ(std::string(), error); | 175 EXPECT_EQ(std::string(), error); |
| 179 | 176 |
| 180 auto proxy_rules = base::MakeUnique<base::DictionaryValue>(); | 177 base::DictionaryValue* proxy_rules = new base::DictionaryValue; |
| 181 proxy_rules->Set(keys::field_name[1], CreateTestProxyServerDict("proxy1")); | 178 proxy_rules->Set(keys::field_name[1], CreateTestProxyServerDict("proxy1")); |
| 182 proxy_rules->Set(keys::field_name[2], CreateTestProxyServerDict("proxy2")); | 179 proxy_rules->Set(keys::field_name[2], CreateTestProxyServerDict("proxy2")); |
| 183 proxy_config.Set(keys::kProxyConfigRules, std::move(proxy_rules)); | 180 proxy_config.Set(keys::kProxyConfigRules, proxy_rules); |
| 184 | 181 |
| 185 ASSERT_TRUE( | 182 ASSERT_TRUE( |
| 186 GetProxyRulesStringFromExtensionPref(&proxy_config, &out, &error, | 183 GetProxyRulesStringFromExtensionPref(&proxy_config, &out, &error, |
| 187 &bad_message)); | 184 &bad_message)); |
| 188 EXPECT_EQ("http=proxy1:80;https=proxy2:80", out); | 185 EXPECT_EQ("http=proxy1:80;https=proxy2:80", out); |
| 189 EXPECT_EQ(std::string(), error); | 186 EXPECT_EQ(std::string(), error); |
| 190 EXPECT_FALSE(bad_message); | 187 EXPECT_FALSE(bad_message); |
| 191 } | 188 } |
| 192 | 189 |
| 193 TEST(ExtensionProxyApiHelpers, GetBypassListFromExtensionPref) { | 190 TEST(ExtensionProxyApiHelpers, GetBypassListFromExtensionPref) { |
| 194 std::string out; | 191 std::string out; |
| 195 std::string error; | 192 std::string error; |
| 196 bool bad_message = false; | 193 bool bad_message = false; |
| 197 | 194 |
| 198 base::DictionaryValue proxy_config; | 195 base::DictionaryValue proxy_config; |
| 199 proxy_config.SetString( | 196 proxy_config.SetString( |
| 200 keys::kProxyConfigMode, | 197 keys::kProxyConfigMode, |
| 201 ProxyPrefs::ProxyModeToString(ProxyPrefs::MODE_FIXED_SERVERS)); | 198 ProxyPrefs::ProxyModeToString(ProxyPrefs::MODE_FIXED_SERVERS)); |
| 202 | 199 |
| 203 // Currently we are still missing a proxy config entry. | 200 // Currently we are still missing a proxy config entry. |
| 204 // This is silently ignored. | 201 // This is silently ignored. |
| 205 ASSERT_TRUE( | 202 ASSERT_TRUE( |
| 206 GetBypassListFromExtensionPref(&proxy_config, &out, &error, | 203 GetBypassListFromExtensionPref(&proxy_config, &out, &error, |
| 207 &bad_message)); | 204 &bad_message)); |
| 208 EXPECT_EQ(std::string(), out); | 205 EXPECT_EQ(std::string(), out); |
| 209 EXPECT_EQ(std::string(), error); | 206 EXPECT_EQ(std::string(), error); |
| 210 EXPECT_FALSE(bad_message); | 207 EXPECT_FALSE(bad_message); |
| 211 | 208 |
| 212 auto bypass_list = base::MakeUnique<base::ListValue>(); | 209 base::ListValue* bypass_list = new base::ListValue; |
| 213 bypass_list->AppendString("host1"); | 210 bypass_list->AppendString("host1"); |
| 214 bypass_list->AppendString("host2"); | 211 bypass_list->AppendString("host2"); |
| 215 auto proxy_rules = base::MakeUnique<base::DictionaryValue>(); | 212 base::DictionaryValue* proxy_rules = new base::DictionaryValue; |
| 216 proxy_rules->Set(keys::kProxyConfigBypassList, std::move(bypass_list)); | 213 proxy_rules->Set(keys::kProxyConfigBypassList, bypass_list); |
| 217 proxy_config.Set(keys::kProxyConfigRules, std::move(proxy_rules)); | 214 proxy_config.Set(keys::kProxyConfigRules, proxy_rules); |
| 218 | 215 |
| 219 ASSERT_TRUE( | 216 ASSERT_TRUE( |
| 220 GetBypassListFromExtensionPref(&proxy_config, &out, &error, | 217 GetBypassListFromExtensionPref(&proxy_config, &out, &error, |
| 221 &bad_message)); | 218 &bad_message)); |
| 222 EXPECT_EQ("host1,host2", out); | 219 EXPECT_EQ("host1,host2", out); |
| 223 EXPECT_EQ(std::string(), error); | 220 EXPECT_EQ(std::string(), error); |
| 224 EXPECT_FALSE(bad_message); | 221 EXPECT_FALSE(bad_message); |
| 225 } | 222 } |
| 226 | 223 |
| 227 TEST(ExtensionProxyApiHelpers, CreateProxyConfigDict) { | 224 TEST(ExtensionProxyApiHelpers, CreateProxyConfigDict) { |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 | 320 |
| 324 std::unique_ptr<base::DictionaryValue> expected(new base::DictionaryValue); | 321 std::unique_ptr<base::DictionaryValue> expected(new base::DictionaryValue); |
| 325 expected->Set("proxyForHttp", | 322 expected->Set("proxyForHttp", |
| 326 CreateTestProxyServerDict("http", "proxy1", 80)); | 323 CreateTestProxyServerDict("http", "proxy1", 80)); |
| 327 expected->Set("proxyForHttps", | 324 expected->Set("proxyForHttps", |
| 328 CreateTestProxyServerDict("http", "proxy2", 80)); | 325 CreateTestProxyServerDict("http", "proxy2", 80)); |
| 329 expected->Set("proxyForFtp", | 326 expected->Set("proxyForFtp", |
| 330 CreateTestProxyServerDict("http", "proxy3", 80)); | 327 CreateTestProxyServerDict("http", "proxy3", 80)); |
| 331 expected->Set("fallbackProxy", | 328 expected->Set("fallbackProxy", |
| 332 CreateTestProxyServerDict("socks4", "proxy4", 80)); | 329 CreateTestProxyServerDict("socks4", "proxy4", 80)); |
| 333 auto bypass_list = base::MakeUnique<base::ListValue>(); | 330 base::ListValue* bypass_list = new base::ListValue; |
| 334 bypass_list->AppendString("localhost"); | 331 bypass_list->AppendString("localhost"); |
| 335 expected->Set(keys::kProxyConfigBypassList, std::move(bypass_list)); | 332 expected->Set(keys::kProxyConfigBypassList, bypass_list); |
| 336 | 333 |
| 337 EXPECT_TRUE(base::Value::Equals(expected.get(), extension_pref.get())); | 334 EXPECT_TRUE(base::Value::Equals(expected.get(), extension_pref.get())); |
| 338 } | 335 } |
| 339 | 336 |
| 340 // Test multiple proxies per scheme -- expect that only the first is returned. | 337 // Test multiple proxies per scheme -- expect that only the first is returned. |
| 341 TEST(ExtensionProxyApiHelpers, CreateProxyRulesDictMultipleProxies) { | 338 TEST(ExtensionProxyApiHelpers, CreateProxyRulesDictMultipleProxies) { |
| 342 std::unique_ptr<base::DictionaryValue> browser_pref( | 339 std::unique_ptr<base::DictionaryValue> browser_pref( |
| 343 ProxyConfigDictionary::CreateFixedServers( | 340 ProxyConfigDictionary::CreateFixedServers( |
| 344 "http=proxy1:80,default://;https=proxy2:80,proxy1:80;ftp=proxy3:80," | 341 "http=proxy1:80,default://;https=proxy2:80,proxy1:80;ftp=proxy3:80," |
| 345 "https://proxy5:443;socks=proxy4:80,proxy1:80", | 342 "https://proxy5:443;socks=proxy4:80,proxy1:80", |
| 346 "localhost")); | 343 "localhost")); |
| 347 ProxyConfigDictionary config(std::move(browser_pref)); | 344 ProxyConfigDictionary config(std::move(browser_pref)); |
| 348 std::unique_ptr<base::DictionaryValue> extension_pref( | 345 std::unique_ptr<base::DictionaryValue> extension_pref( |
| 349 CreateProxyRulesDict(config)); | 346 CreateProxyRulesDict(config)); |
| 350 ASSERT_TRUE(extension_pref.get()); | 347 ASSERT_TRUE(extension_pref.get()); |
| 351 | 348 |
| 352 std::unique_ptr<base::DictionaryValue> expected(new base::DictionaryValue); | 349 std::unique_ptr<base::DictionaryValue> expected(new base::DictionaryValue); |
| 353 expected->Set("proxyForHttp", | 350 expected->Set("proxyForHttp", |
| 354 CreateTestProxyServerDict("http", "proxy1", 80)); | 351 CreateTestProxyServerDict("http", "proxy1", 80)); |
| 355 expected->Set("proxyForHttps", | 352 expected->Set("proxyForHttps", |
| 356 CreateTestProxyServerDict("http", "proxy2", 80)); | 353 CreateTestProxyServerDict("http", "proxy2", 80)); |
| 357 expected->Set("proxyForFtp", | 354 expected->Set("proxyForFtp", |
| 358 CreateTestProxyServerDict("http", "proxy3", 80)); | 355 CreateTestProxyServerDict("http", "proxy3", 80)); |
| 359 expected->Set("fallbackProxy", | 356 expected->Set("fallbackProxy", |
| 360 CreateTestProxyServerDict("socks4", "proxy4", 80)); | 357 CreateTestProxyServerDict("socks4", "proxy4", 80)); |
| 361 auto bypass_list = base::MakeUnique<base::ListValue>(); | 358 base::ListValue* bypass_list = new base::ListValue; |
| 362 bypass_list->AppendString("localhost"); | 359 bypass_list->AppendString("localhost"); |
| 363 expected->Set(keys::kProxyConfigBypassList, std::move(bypass_list)); | 360 expected->Set(keys::kProxyConfigBypassList, bypass_list); |
| 364 | 361 |
| 365 EXPECT_TRUE(base::Value::Equals(expected.get(), extension_pref.get())); | 362 EXPECT_TRUE(base::Value::Equals(expected.get(), extension_pref.get())); |
| 366 } | 363 } |
| 367 | 364 |
| 368 // Test if a PAC script URL is specified. | 365 // Test if a PAC script URL is specified. |
| 369 TEST(ExtensionProxyApiHelpers, CreatePacScriptDictWithUrl) { | 366 TEST(ExtensionProxyApiHelpers, CreatePacScriptDictWithUrl) { |
| 370 std::unique_ptr<base::DictionaryValue> browser_pref( | 367 std::unique_ptr<base::DictionaryValue> browser_pref( |
| 371 ProxyConfigDictionary::CreatePacScript(kSamplePacScriptUrl, false)); | 368 ProxyConfigDictionary::CreatePacScript(kSamplePacScriptUrl, false)); |
| 372 ProxyConfigDictionary config(std::move(browser_pref)); | 369 ProxyConfigDictionary config(std::move(browser_pref)); |
| 373 std::unique_ptr<base::DictionaryValue> extension_pref( | 370 std::unique_ptr<base::DictionaryValue> extension_pref( |
| (...skipping 28 matching lines...) Expand all Loading... |
| 402 expected.AppendString("s1"); | 399 expected.AppendString("s1"); |
| 403 expected.AppendString("s2"); | 400 expected.AppendString("s2"); |
| 404 expected.AppendString("s3"); | 401 expected.AppendString("s3"); |
| 405 | 402 |
| 406 std::unique_ptr<base::ListValue> out(TokenizeToStringList("s1;s2;s3", ";")); | 403 std::unique_ptr<base::ListValue> out(TokenizeToStringList("s1;s2;s3", ";")); |
| 407 EXPECT_TRUE(base::Value::Equals(&expected, out.get())); | 404 EXPECT_TRUE(base::Value::Equals(&expected, out.get())); |
| 408 } | 405 } |
| 409 | 406 |
| 410 } // namespace proxy_api_helpers | 407 } // namespace proxy_api_helpers |
| 411 } // namespace extensions | 408 } // namespace extensions |
| OLD | NEW |