blob: cab2d333dc71c13e973aa7126e7412896aad76e0 [file] [log] [blame]
Andrew de los Reyes9cd120d2010-11-18 17:50:03 -08001// Copyright (c) 2009 The Chromium OS 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
Andrew de los Reyes45168102010-11-22 11:13:50 -08005#include <deque>
Andrew de los Reyes9cd120d2010-11-18 17:50:03 -08006#include <string>
Andrew de los Reyes9cd120d2010-11-18 17:50:03 -08007
8#include <gtest/gtest.h>
9
10#include "update_engine/chrome_proxy_resolver.h"
11#include "update_engine/mock_dbus_interface.h"
12
Andrew de los Reyes45168102010-11-22 11:13:50 -080013using std::deque;
Andrew de los Reyes9cd120d2010-11-18 17:50:03 -080014using std::string;
Andrew de los Reyes9cd120d2010-11-18 17:50:03 -080015using ::testing::_;
16using ::testing::Return;
17using ::testing::SetArgumentPointee;
18using ::testing::StrEq;
19
20namespace chromeos_update_engine {
21
22class ChromeProxyResolverTest : public ::testing::Test { };
23
24TEST(ChromeProxyResolverTest, GetProxiesForUrlWithSettingsTest) {
25 const string kSingle =
26 "{\"mode\":3,\"single\":{\"server\":\"192.168.42.86:80\",\"src\":0}}";
27 const string kSocks =
28 "{\"mode\":4,\"socks\":{\"server\":\"socks5://192.168.42.83:5555\","
29 "\"src\":0}}";
30 const string kAll =
31 "{\"http\":{\"server\":\"http_proxy:11\",\"src\":0},"
32 "\"https\":{\"server\":\"https://https_proxy:22\",\"src\":0},"
33 "\"mode\":4,"
34 "\"socks\":{\"server\":\"socks5://socks:55\",\"src\":0}}";
35 const string kHttpHttps =
36 "{\"http\":{\"server\":\"http_proxy:11\",\"src\":0},"
37 "\"https\":{\"server\":\"https://https_proxy:22\",\"src\":0},"
38 "\"mode\":4}";
39
40 ChromeProxyResolver resolver(NULL);
Andrew de los Reyes45168102010-11-22 11:13:50 -080041 deque<string> out;
Andrew de los Reyes9cd120d2010-11-18 17:50:03 -080042 string urls[] = {"http://foo.com/update", "https://bar.com/foo.gz"};
43 string multi_settings[] = {kAll, kHttpHttps};
44 for (size_t i = 0; i < arraysize(urls); i++) {
45 const string& url = urls[i];
46 LOG(INFO) << "url: " << url;
47 EXPECT_TRUE(resolver.GetProxiesForUrlWithSettings(url, kSingle, &out));
48 EXPECT_EQ(2, out.size());
49 EXPECT_EQ("http://192.168.42.86:80", out[0]);
50 EXPECT_EQ(kNoProxy, out[1]);
51
52 EXPECT_TRUE(resolver.GetProxiesForUrlWithSettings(url, kSocks, &out));
53 EXPECT_EQ(2, out.size());
54 EXPECT_EQ("socks5://192.168.42.83:5555", out[0]);
55 EXPECT_EQ(kNoProxy, out[1]);
56
57 for (size_t j = 0; j < arraysize(multi_settings); j++) {
58 const string& settings = multi_settings[j];
59 EXPECT_TRUE(resolver.GetProxiesForUrlWithSettings(url, settings, &out));
60 EXPECT_EQ(j == 0 ? 3 : 2, out.size());
61 if (i == 0)
62 EXPECT_EQ("http://http_proxy:11", out[0]);
63 else
64 EXPECT_EQ("https://https_proxy:22", out[0]);
65 if (j == 0)
66 EXPECT_EQ("socks5://socks:55", out[1]);
67 EXPECT_EQ(kNoProxy, out.back());
68 }
69 }
70
71 // Bad JSON
72 EXPECT_FALSE(resolver.GetProxiesForUrlWithSettings("http://foo.com",
73 "}",
74 &out));
75
76 // Bad proxy scheme
77 EXPECT_TRUE(resolver.GetProxiesForUrlWithSettings("http://foo.com",
78 "{\"mode\":1}",
79 &out));
80 EXPECT_EQ(1, out.size());
81 EXPECT_EQ(kNoProxy, out[0]);
82}
83
Andrew de los Reyesf3ed8e72011-02-16 10:35:46 -080084namespace {
85void DbusInterfaceTestResolved(const std::deque<std::string>& proxies,
86 void* data) {
87 EXPECT_EQ(2, proxies.size());
88 EXPECT_EQ("socks5://192.168.52.83:5555", proxies[0]);
89 EXPECT_EQ(kNoProxy, proxies[1]);
90 g_main_loop_quit(reinterpret_cast<GMainLoop*>(data));
91}
92}
93
Andrew de los Reyes9cd120d2010-11-18 17:50:03 -080094TEST(ChromeProxyResolverTest, DbusInterfaceTest) {
95 long number = 1;
96 DBusGConnection* kMockSystemBus =
97 reinterpret_cast<DBusGConnection*>(number++);
98 DBusGProxy* kMockSessionManagerProxy =
99 reinterpret_cast<DBusGProxy*>(number++);
100
101 const char settings[] =
102 "{\"mode\":4,\"socks\":{\"server\":\"socks5://192.168.52.83:5555\","
103 "\"src\":0}}";
104
105 MockDbusGlib dbus_iface;
106 ChromeProxyResolver resolver(&dbus_iface);
107
108 GArray* ret_array = g_array_new(FALSE, FALSE, 1);
109
110 EXPECT_CALL(dbus_iface, BusGet(DBUS_BUS_SYSTEM, _))
111 .Times(1)
112 .WillRepeatedly(Return(kMockSystemBus));
113 EXPECT_CALL(dbus_iface,
114 ProxyNewForNameOwner(kMockSystemBus,
115 StrEq(kSessionManagerService),
116 StrEq(kSessionManagerPath),
117 StrEq(kSessionManagerInterface),
118 _))
119 .WillOnce(Return(kMockSessionManagerProxy));
120 EXPECT_CALL(dbus_iface, ProxyCall(
121 kMockSessionManagerProxy,
122 StrEq(kSessionManagerRetrievePropertyMethod),
123 _,
124 G_TYPE_STRING, StrEq(kSessionManagerProxySettingsKey),
125 G_TYPE_INVALID,
126 G_TYPE_STRING, _,
127 DBUS_TYPE_G_UCHAR_ARRAY, _))
128 .WillOnce(DoAll(SetArgumentPointee<7>(strdup(settings)),
129 SetArgumentPointee<9>(ret_array),
130 Return(TRUE)));
131
Andrew de los Reyesf3ed8e72011-02-16 10:35:46 -0800132 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
133
Andrew de los Reyes9cd120d2010-11-18 17:50:03 -0800134 EXPECT_TRUE(resolver.GetProxiesForUrl("http://user:pass@foo.com:22",
Andrew de los Reyesf3ed8e72011-02-16 10:35:46 -0800135 &DbusInterfaceTestResolved,
136 loop));
137 g_main_loop_run(loop);
138 g_main_loop_unref(loop);
Andrew de los Reyes9cd120d2010-11-18 17:50:03 -0800139}
140
141TEST(ChromeProxyResolverTest, GetProxyTypeTest) {
142 curl_proxytype type;
143 EXPECT_TRUE(ChromeProxyResolver::GetProxyType("socks://f.ru", &type));
144 EXPECT_EQ(CURLPROXY_SOCKS5_HOSTNAME, type);
145 EXPECT_TRUE(ChromeProxyResolver::GetProxyType("socks5://f.ru:9", &type));
146 EXPECT_EQ(CURLPROXY_SOCKS5_HOSTNAME, type);
147 EXPECT_TRUE(ChromeProxyResolver::GetProxyType("socks4://f.ru:9", &type));
148 EXPECT_EQ(CURLPROXY_SOCKS4A, type);
149 EXPECT_TRUE(ChromeProxyResolver::GetProxyType("http://f.no:88", &type));
150 EXPECT_EQ(CURLPROXY_HTTP, type);
151 EXPECT_TRUE(ChromeProxyResolver::GetProxyType("https://f.no:88", &type));
152 EXPECT_EQ(CURLPROXY_HTTP, type);
153 EXPECT_FALSE(ChromeProxyResolver::GetProxyType(kNoProxy, &type));
154 EXPECT_FALSE(ChromeProxyResolver::GetProxyType("foo://", &type));
155 EXPECT_FALSE(ChromeProxyResolver::GetProxyType("missing.com:8", &type));
156}
157
158} // namespace chromeos_update_engine