Chromium Code Reviews| Index: chrome_proxy_resolver_unittest.cc |
| diff --git a/chrome_proxy_resolver_unittest.cc b/chrome_proxy_resolver_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..d2bf545214c584efb6f1313b8d7373577ca6c457 |
| --- /dev/null |
| +++ b/chrome_proxy_resolver_unittest.cc |
| @@ -0,0 +1,144 @@ |
| +// Copyright (c) 2009 The Chromium OS Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include <string> |
| +#include <vector> |
| + |
| +#include <gtest/gtest.h> |
| + |
| +#include "update_engine/chrome_proxy_resolver.h" |
| +#include "update_engine/mock_dbus_interface.h" |
| + |
| +using std::string; |
| +using std::vector; |
| +using ::testing::_; |
| +using ::testing::Return; |
| +using ::testing::SetArgumentPointee; |
| +using ::testing::StrEq; |
| + |
| +namespace chromeos_update_engine { |
| + |
| +class ChromeProxyResolverTest : public ::testing::Test { }; |
| + |
| +TEST(ChromeProxyResolverTest, GetProxiesForUrlWithSettingsTest) { |
| + const string kSingle = |
| + "{\"mode\":3,\"single\":{\"server\":\"192.168.42.86:80\",\"src\":0}}"; |
| + const string kSocks = |
| + "{\"mode\":4,\"socks\":{\"server\":\"socks5://192.168.42.83:5555\"," |
| + "\"src\":0}}"; |
| + const string kAll = |
| + "{\"http\":{\"server\":\"http_proxy:11\",\"src\":0}," |
| + "\"https\":{\"server\":\"https://https_proxy:22\",\"src\":0}," |
| + "\"mode\":4," |
| + "\"socks\":{\"server\":\"socks5://socks:55\",\"src\":0}}"; |
| + const string kHttpHttps = |
| + "{\"http\":{\"server\":\"http_proxy:11\",\"src\":0}," |
| + "\"https\":{\"server\":\"https://https_proxy:22\",\"src\":0}," |
| + "\"mode\":4}"; |
| + |
| + ChromeProxyResolver resolver(NULL); |
| + vector<string> out; |
| + string urls[] = {"http://foo.com/update", "https://bar.com/foo.gz"}; |
| + string multi_settings[] = {kAll, kHttpHttps}; |
| + for (size_t i = 0; i < arraysize(urls); i++) { |
| + const string& url = urls[i]; |
| + LOG(INFO) << "url: " << url; |
| + EXPECT_TRUE(resolver.GetProxiesForUrlWithSettings(url, kSingle, &out)); |
| + EXPECT_EQ(2, out.size()); |
| + EXPECT_EQ("http://192.168.42.86:80", out[0]); |
| + EXPECT_EQ(kNoProxy, out[1]); |
| + |
| + EXPECT_TRUE(resolver.GetProxiesForUrlWithSettings(url, kSocks, &out)); |
| + EXPECT_EQ(2, out.size()); |
| + EXPECT_EQ("socks5://192.168.42.83:5555", out[0]); |
| + EXPECT_EQ(kNoProxy, out[1]); |
| + |
| + for (size_t j = 0; j < arraysize(multi_settings); j++) { |
| + const string& settings = multi_settings[j]; |
| + EXPECT_TRUE(resolver.GetProxiesForUrlWithSettings(url, settings, &out)); |
| + EXPECT_EQ(j == 0 ? 3 : 2, out.size()); |
| + if (i == 0) |
| + EXPECT_EQ("http://http_proxy:11", out[0]); |
| + else |
| + EXPECT_EQ("https://https_proxy:22", out[0]); |
| + if (j == 0) |
| + EXPECT_EQ("socks5://socks:55", out[1]); |
| + EXPECT_EQ(kNoProxy, out.back()); |
| + } |
| + } |
| + |
| + // Bad JSON |
| + EXPECT_FALSE(resolver.GetProxiesForUrlWithSettings("http://foo.com", "}", &out)); |
|
petkov
2010/11/19 01:09:19
80 chars
adlr
2010/11/19 02:00:52
Done.
|
| + |
| + // Bad proxy scheme |
| + EXPECT_TRUE(resolver.GetProxiesForUrlWithSettings("http://foo.com", |
| + "{\"mode\":1}", |
| + &out)); |
| + EXPECT_EQ(1, out.size()); |
| + EXPECT_EQ(kNoProxy, out[0]); |
| +} |
| + |
| +TEST(ChromeProxyResolverTest, DbusInterfaceTest) { |
| + long number = 1; |
| + DBusGConnection* kMockSystemBus = |
| + reinterpret_cast<DBusGConnection*>(number++); |
| + DBusGProxy* kMockSessionManagerProxy = |
| + reinterpret_cast<DBusGProxy*>(number++); |
| + |
| + const char settings[] = |
| + "{\"mode\":4,\"socks\":{\"server\":\"socks5://192.168.52.83:5555\"," |
| + "\"src\":0}}"; |
| + |
| + MockDbusGlib dbus_iface; |
| + ChromeProxyResolver resolver(&dbus_iface); |
| + |
| + GArray* ret_array = g_array_new(FALSE, FALSE, 1); |
| + |
| + EXPECT_CALL(dbus_iface, BusGet(DBUS_BUS_SYSTEM, _)) |
| + .Times(1) |
| + .WillRepeatedly(Return(kMockSystemBus)); |
| + EXPECT_CALL(dbus_iface, |
| + ProxyNewForNameOwner(kMockSystemBus, |
| + StrEq(kSessionManagerService), |
| + StrEq(kSessionManagerPath), |
| + StrEq(kSessionManagerInterface), |
| + _)) |
| + .WillOnce(Return(kMockSessionManagerProxy)); |
| + EXPECT_CALL(dbus_iface, ProxyCall( |
| + kMockSessionManagerProxy, |
| + StrEq(kSessionManagerRetrievePropertyMethod), |
| + _, |
| + G_TYPE_STRING, StrEq(kSessionManagerProxySettingsKey), |
| + G_TYPE_INVALID, |
| + G_TYPE_STRING, _, |
| + DBUS_TYPE_G_UCHAR_ARRAY, _)) |
| + .WillOnce(DoAll(SetArgumentPointee<7>(strdup(settings)), |
| + SetArgumentPointee<9>(ret_array), |
| + Return(TRUE))); |
| + |
| + vector<string> proxies; |
| + EXPECT_TRUE(resolver.GetProxiesForUrl("http://user:pass@foo.com:22", &proxies)); |
|
petkov
2010/11/19 01:09:19
80 chars
adlr
2010/11/19 02:00:52
Done.
|
| + EXPECT_EQ(2, proxies.size()); |
| + EXPECT_EQ("socks5://192.168.52.83:5555", proxies[0]); |
| + EXPECT_EQ(kNoProxy, proxies[1]); |
| +} |
| + |
| +TEST(ChromeProxyResolverTest, GetTypeForProxyTest) { |
| + curl_proxytype type; |
| + EXPECT_TRUE(ChromeProxyResolver::GetTypeForProxy("socks://f.ru", &type)); |
| + EXPECT_EQ(CURLPROXY_SOCKS5_HOSTNAME, type); |
| + EXPECT_TRUE(ChromeProxyResolver::GetTypeForProxy("socks5://f.ru:9", &type)); |
| + EXPECT_EQ(CURLPROXY_SOCKS5_HOSTNAME, type); |
| + EXPECT_TRUE(ChromeProxyResolver::GetTypeForProxy("socks4://f.ru:9", &type)); |
| + EXPECT_EQ(CURLPROXY_SOCKS4A, type); |
| + EXPECT_TRUE(ChromeProxyResolver::GetTypeForProxy("http://f.no:88", &type)); |
| + EXPECT_EQ(CURLPROXY_HTTP, type); |
| + EXPECT_TRUE(ChromeProxyResolver::GetTypeForProxy("https://f.no:88", &type)); |
| + EXPECT_EQ(CURLPROXY_HTTP, type); |
| + EXPECT_FALSE(ChromeProxyResolver::GetTypeForProxy(kNoProxy, &type)); |
| + EXPECT_FALSE(ChromeProxyResolver::GetTypeForProxy("foo://", &type)); |
| + EXPECT_FALSE(ChromeProxyResolver::GetTypeForProxy("missing.com:8", &type)); |
| +} |
| + |
| +} // namespace chromeos_update_engine |