|  | // Copyright 2021 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "chrome/browser/ash/crosapi/network_settings_translation.h" | 
|  |  | 
|  | #include "chromeos/crosapi/mojom/network_settings_service.mojom.h" | 
|  | #include "components/proxy_config/pref_proxy_config_tracker_impl.h" | 
|  | #include "components/proxy_config/proxy_config_dictionary.h" | 
|  | #include "net/base/proxy_server.h" | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | constexpr char kPacUrl[] = "http://pac.pac/"; | 
|  |  | 
|  | base::Value::Dict GetPacProxyConfig(const std::string& pac_url, | 
|  | bool pac_mandatory) { | 
|  | return ProxyConfigDictionary::CreatePacScript(pac_url, pac_mandatory); | 
|  | } | 
|  |  | 
|  | base::Value::Dict GetManualProxyConfig(const std::string& proxy_servers, | 
|  | const std::string& bypass_list) { | 
|  | return ProxyConfigDictionary::CreateFixedServers(proxy_servers, bypass_list); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | namespace crosapi { | 
|  |  | 
|  | TEST(NetworkSettingsTranslationTest, ProxyConfigToCrosapiProxyDirect) { | 
|  | ProxyConfigDictionary proxy_dict(ProxyConfigDictionary::CreateDirect()); | 
|  | crosapi::mojom::ProxyConfigPtr actual = | 
|  | crosapi::ProxyConfigToCrosapiProxy(&proxy_dict, | 
|  | /*wpad_url=*/GURL("")); | 
|  | EXPECT_TRUE(actual->proxy_settings->is_direct()); | 
|  | } | 
|  |  | 
|  | TEST(NetworkSettingsTranslationTest, ProxyConfigToCrosapiProxyWpadNoUrl) { | 
|  | ProxyConfigDictionary proxy_dict(ProxyConfigDictionary::CreateAutoDetect()); | 
|  | crosapi::mojom::ProxyConfigPtr actual = | 
|  | crosapi::ProxyConfigToCrosapiProxy(&proxy_dict, | 
|  | /*wpad_url=*/GURL("")); | 
|  | GURL default_wpad_url("http://wpad/wpad.dat"); | 
|  | ASSERT_TRUE(actual->proxy_settings->is_wpad()); | 
|  | EXPECT_EQ(actual->proxy_settings->get_wpad()->pac_url, default_wpad_url); | 
|  | } | 
|  |  | 
|  | TEST(NetworkSettingsTranslationTest, ProxyConfigToCrosapiProxyWpadUrl) { | 
|  | GURL wpad_url(kPacUrl); | 
|  | ProxyConfigDictionary proxy_dict(ProxyConfigDictionary::CreateAutoDetect()); | 
|  |  | 
|  | crosapi::mojom::ProxyConfigPtr actual = | 
|  | crosapi::ProxyConfigToCrosapiProxy(&proxy_dict, wpad_url); | 
|  | ASSERT_TRUE(actual->proxy_settings->is_wpad()); | 
|  | EXPECT_EQ(actual->proxy_settings->get_wpad()->pac_url, wpad_url); | 
|  | } | 
|  |  | 
|  | TEST(NetworkSettingsTranslationTest, ProxyConfigToCrosapiProxyPacMandatory) { | 
|  | ProxyConfigDictionary proxy_dict( | 
|  | GetPacProxyConfig(kPacUrl, /*pac_mandatory=*/true)); | 
|  | crosapi::mojom::ProxyConfigPtr actual = | 
|  | crosapi::ProxyConfigToCrosapiProxy(&proxy_dict, | 
|  | /*wpad_url=*/GURL("")); | 
|  |  | 
|  | ASSERT_TRUE(actual->proxy_settings->is_pac()); | 
|  | EXPECT_EQ(actual->proxy_settings->get_pac()->pac_url, GURL(kPacUrl)); | 
|  | EXPECT_EQ(actual->proxy_settings->get_pac()->pac_mandatory, true); | 
|  | } | 
|  |  | 
|  | TEST(NetworkSettingsTranslationTest, ProxyConfigToCrosapiProxyPacNotMandatory) { | 
|  | ProxyConfigDictionary proxy_dict( | 
|  | GetPacProxyConfig(kPacUrl, /*pac_mandatory=*/false)); | 
|  | crosapi::mojom::ProxyConfigPtr actual = | 
|  | crosapi::ProxyConfigToCrosapiProxy(&proxy_dict, | 
|  | /*wpad_url=*/GURL("")); | 
|  |  | 
|  | ASSERT_TRUE(actual->proxy_settings->is_pac()); | 
|  | EXPECT_EQ(actual->proxy_settings->get_pac()->pac_url, GURL(kPacUrl)); | 
|  | EXPECT_EQ(actual->proxy_settings->get_pac()->pac_mandatory, false); | 
|  | } | 
|  |  | 
|  | TEST(NetworkSettingsTranslationTest, ProxyConfigToCrosapiProxyManual) { | 
|  | std::string proxy_servers = | 
|  | "http=proxy:80;http=proxy2:80;https=secure_proxy:81;socks=socks_proxy:" | 
|  | "82;"; | 
|  | std::string bypass_list = "localhost;google.com;"; | 
|  | ProxyConfigDictionary proxy_dict( | 
|  | GetManualProxyConfig(proxy_servers, bypass_list)); | 
|  | crosapi::mojom::ProxyConfigPtr actual = | 
|  | crosapi::ProxyConfigToCrosapiProxy(&proxy_dict, | 
|  | /*wpad_url=*/GURL("")); | 
|  | ASSERT_TRUE(actual->proxy_settings->is_manual()); | 
|  |  | 
|  | std::vector<crosapi::mojom::ProxyLocationPtr> proxy_ptr = | 
|  | std::move(actual->proxy_settings->get_manual()->http_proxies); | 
|  | ASSERT_EQ(proxy_ptr.size(), 2u); | 
|  | EXPECT_EQ(proxy_ptr[0]->host, "proxy"); | 
|  | EXPECT_EQ(proxy_ptr[0]->port, 80); | 
|  | EXPECT_EQ(proxy_ptr[1]->host, "proxy2"); | 
|  | EXPECT_EQ(proxy_ptr[1]->port, 80); | 
|  | proxy_ptr = | 
|  | std::move(actual->proxy_settings->get_manual()->secure_http_proxies); | 
|  | ASSERT_EQ(proxy_ptr.size(), 1u); | 
|  | EXPECT_EQ(proxy_ptr[0]->host, "secure_proxy"); | 
|  | EXPECT_EQ(proxy_ptr[0]->port, 81); | 
|  |  | 
|  | proxy_ptr = std::move(actual->proxy_settings->get_manual()->socks_proxies); | 
|  | ASSERT_EQ(proxy_ptr.size(), 1u); | 
|  | EXPECT_EQ(proxy_ptr[0]->host, "socks_proxy"); | 
|  | EXPECT_EQ(proxy_ptr[0]->port, 82); | 
|  |  | 
|  | const std::vector<std::string> exclude_domains = | 
|  | actual->proxy_settings->get_manual()->exclude_domains; | 
|  | ASSERT_EQ(exclude_domains.size(), 2u); | 
|  | EXPECT_EQ(exclude_domains[0], "localhost"); | 
|  | EXPECT_EQ(exclude_domains[1], "google.com"); | 
|  | } | 
|  |  | 
|  | TEST(NetworkSettingsTranslationTest, CrosapiProxyToProxyConfigDirect) { | 
|  | crosapi::mojom::ProxyConfigPtr ptr = crosapi::mojom::ProxyConfig::New(); | 
|  | ptr->proxy_settings = crosapi::mojom::ProxySettings::NewDirect( | 
|  | crosapi::mojom::ProxySettingsDirect::New()); | 
|  |  | 
|  | EXPECT_EQ(CrosapiProxyToProxyConfig(std::move(ptr)).GetDictionary(), | 
|  | ProxyConfigDictionary::CreateDirect()); | 
|  | } | 
|  |  | 
|  | TEST(NetworkSettingsTranslationTest, CrosapiProxyToProxyConfigWpad) { | 
|  | crosapi::mojom::ProxyConfigPtr ptr = crosapi::mojom::ProxyConfig::New(); | 
|  | crosapi::mojom::ProxySettingsWpadPtr wpad = | 
|  | crosapi::mojom::ProxySettingsWpad::New(); | 
|  | wpad->pac_url = GURL("pac.pac"); | 
|  | ptr->proxy_settings = crosapi::mojom::ProxySettings::NewWpad(std::move(wpad)); | 
|  |  | 
|  | EXPECT_EQ(CrosapiProxyToProxyConfig(std::move(ptr)).GetDictionary(), | 
|  | ProxyConfigDictionary::CreateAutoDetect()); | 
|  | } | 
|  |  | 
|  | TEST(NetworkSettingsTranslationTest, CrosapiProxyToProxyConfigPac) { | 
|  | crosapi::mojom::ProxyConfigPtr ptr = crosapi::mojom::ProxyConfig::New(); | 
|  | crosapi::mojom::ProxySettingsPacPtr pac = | 
|  | crosapi::mojom::ProxySettingsPac::New(); | 
|  | pac->pac_url = GURL(kPacUrl); | 
|  | pac->pac_mandatory = true; | 
|  | ptr->proxy_settings = crosapi::mojom::ProxySettings::NewPac(pac.Clone()); | 
|  | EXPECT_EQ(CrosapiProxyToProxyConfig(ptr.Clone()).GetDictionary(), | 
|  | GetPacProxyConfig(kPacUrl, true)); | 
|  |  | 
|  | pac->pac_mandatory = false; | 
|  | ptr->proxy_settings = crosapi::mojom::ProxySettings::NewPac(pac.Clone()); | 
|  | EXPECT_EQ(CrosapiProxyToProxyConfig(std::move(ptr)).GetDictionary(), | 
|  | GetPacProxyConfig(kPacUrl, false)); | 
|  | } | 
|  |  | 
|  | TEST(NetworkSettingsTranslationTest, CrosapiProxyToProxyConfigManual) { | 
|  | crosapi::mojom::ProxyConfigPtr ptr = crosapi::mojom::ProxyConfig::New(); | 
|  | crosapi::mojom::ProxySettingsManualPtr manual = | 
|  | crosapi::mojom::ProxySettingsManual::New(); | 
|  | crosapi::mojom::ProxyLocationPtr location = | 
|  | crosapi::mojom::ProxyLocation::New(); | 
|  | location->host = "proxy1"; | 
|  | location->port = 80; | 
|  | location->scheme = crosapi::mojom::ProxyLocation::Scheme::kHttp; | 
|  | manual->http_proxies.push_back(location.Clone()); | 
|  | location->host = "proxy2"; | 
|  | location->port = 80; | 
|  | location->scheme = crosapi::mojom::ProxyLocation::Scheme::kHttps; | 
|  | manual->http_proxies.push_back(location.Clone()); | 
|  | location->host = "proxy3"; | 
|  | location->port = 83; | 
|  | location->scheme = crosapi::mojom::ProxyLocation::Scheme::kUnknown; | 
|  | manual->http_proxies.push_back(location.Clone()); | 
|  | location->host = "proxy4"; | 
|  | location->port = 84; | 
|  | location->scheme = crosapi::mojom::ProxyLocation::Scheme::kInvalid; | 
|  | manual->http_proxies.push_back(location.Clone()); | 
|  | location->host = "proxy5"; | 
|  | location->port = 85; | 
|  | location->scheme = crosapi::mojom::ProxyLocation::Scheme::kDirect; | 
|  | manual->http_proxies.push_back(location.Clone()); | 
|  | location->host = "proxy6"; | 
|  | location->port = 86; | 
|  | location->scheme = crosapi::mojom::ProxyLocation::Scheme::kSocks5; | 
|  | manual->http_proxies.push_back(location.Clone()); | 
|  | location->host = "secure_proxy"; | 
|  | location->port = 81; | 
|  | location->scheme = crosapi::mojom::ProxyLocation::Scheme::kHttps; | 
|  | manual->secure_http_proxies.push_back(location.Clone()); | 
|  | location->host = "socks_proxy"; | 
|  | location->port = 82; | 
|  | location->scheme = crosapi::mojom::ProxyLocation::Scheme::kSocks4; | 
|  | manual->socks_proxies.push_back(std::move(location)); | 
|  | manual->exclude_domains = {"localhost", "google.com"}; | 
|  |  | 
|  | ptr->proxy_settings = | 
|  | crosapi::mojom::ProxySettings::NewManual(std::move(manual)); | 
|  | EXPECT_EQ( | 
|  | CrosapiProxyToProxyConfig(std::move(ptr)).GetDictionary(), | 
|  | GetManualProxyConfig("http=http://proxy1:80;http=https://proxy2:80;" | 
|  | "http=http://proxy3:83;http=invalid://proxy4:84;" | 
|  | "http=direct://proxy5:85;http=socks5://proxy6:86;" | 
|  | "https=https://secure_proxy:81;" | 
|  | "socks=socks://socks_proxy:82", | 
|  | /*bypass_list=*/"localhost;google.com")); | 
|  | } | 
|  |  | 
|  | }  // namespace crosapi |