blob: 9c29d8565d5f038aa6cee6c5f545ddf8716b6b8d [file] [log] [blame]
Andrew de los Reyes000d8952011-03-02 15:21:14 -08001// Copyright (c) 2011 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
5#include <deque>
6#include <string>
7
8#include <gtest/gtest.h>
9
10#include "update_engine/chrome_browser_proxy_resolver.h"
11#include "update_engine/mock_dbus_interface.h"
12
13using std::deque;
14using std::string;
15using ::testing::_;
16using ::testing::Return;
17using ::testing::SetArgumentPointee;
18using ::testing::StrEq;
19
20namespace chromeos_update_engine {
21
22class ChromeBrowserProxyResolverTest : public ::testing::Test { };
23
24TEST(ChromeBrowserProxyResolverTest, ParseTest) {
25 // Test ideas from
26 // http://src.chromium.org/svn/trunk/src/net/proxy/proxy_list_unittest.cc
27 const char* inputs[] = {
28 "PROXY foopy:10",
29 " DIRECT", // leading space.
30 "PROXY foopy1 ; proxy foopy2;\t DIRECT",
31 "proxy foopy1 ; SOCKS foopy2",
32 "DIRECT ; proxy foopy1 ; DIRECT ; SOCKS5 foopy2;DIRECT ",
33 "DIRECT ; proxy foopy1:80; DIRECT ; DIRECT",
34 "PROXY-foopy:10",
35 "PROXY",
36 "PROXY foopy1 ; JUNK ; JUNK ; SOCKS5 foopy2 ; ;",
37 "HTTP foopy1; SOCKS5 foopy2"
38 };
39 deque<string> outputs[arraysize(inputs)];
40 outputs[0].push_back("http://foopy:10");
41 outputs[0].push_back(kNoProxy);
42 outputs[1].push_back(kNoProxy);
43 outputs[2].push_back("http://foopy1");
44 outputs[2].push_back("http://foopy2");
45 outputs[2].push_back(kNoProxy);
46 outputs[3].push_back("http://foopy1");
47 outputs[3].push_back("socks4://foopy2");
48 outputs[3].push_back(kNoProxy);
49 outputs[4].push_back(kNoProxy);
50 outputs[4].push_back("http://foopy1");
51 outputs[4].push_back(kNoProxy);
52 outputs[4].push_back("socks5://foopy2");
53 outputs[4].push_back(kNoProxy);
54 outputs[5].push_back(kNoProxy);
55 outputs[5].push_back("http://foopy1:80");
56 outputs[5].push_back(kNoProxy);
57 outputs[5].push_back(kNoProxy);
58 outputs[6].push_back(kNoProxy);
59 outputs[7].push_back(kNoProxy);
60 outputs[8].push_back("http://foopy1");
61 outputs[8].push_back("socks5://foopy2");
62 outputs[8].push_back(kNoProxy);
63 outputs[9].push_back("socks5://foopy2");
64 outputs[9].push_back(kNoProxy);
65
66 for (size_t i = 0; i < arraysize(inputs); i++) {
67 deque<string> results =
68 ChromeBrowserProxyResolver::ParseProxyString(inputs[i]);
69 deque<string>& expected = outputs[i];
70 EXPECT_EQ(results.size(), expected.size()) << "i = " << i;
71 if (expected.size() != results.size())
72 continue;
73 for (size_t j = 0; j < expected.size(); j++) {
74 EXPECT_EQ(expected[j], results[j]) << "i = " << i;
75 }
76 }
77}
78
79namespace {
80void DbusInterfaceTestResolved(const std::deque<std::string>& proxies,
81 void* data) {
82 EXPECT_EQ(2, proxies.size());
83 EXPECT_EQ("socks5://192.168.52.83:5555", proxies[0]);
84 EXPECT_EQ(kNoProxy, proxies[1]);
85 g_main_loop_quit(reinterpret_cast<GMainLoop*>(data));
86}
87void DbusInterfaceTestResolvedNoReply(const std::deque<std::string>& proxies,
88 void* data) {
89 EXPECT_EQ(1, proxies.size());
90 EXPECT_EQ(kNoProxy, proxies[0]);
91 g_main_loop_quit(reinterpret_cast<GMainLoop*>(data));
92}
93struct SendReplyArgs {
94 DBusConnection* connection;
95 DBusMessage* message;
96 ChromeBrowserProxyResolver* resolver;
97};
98gboolean SendReply(gpointer data) {
99 LOG(INFO) << "Calling SendReply";
100 SendReplyArgs* args = reinterpret_cast<SendReplyArgs*>(data);
101 ChromeBrowserProxyResolver::StaticFilterMessage(
102 args->connection,
103 args->message,
104 args->resolver);
105 return FALSE; // Don't keep calling this function
106}
107
108// chrome_replies should be set to whether or not we fake a reply from
109// chrome. If there's no reply, the resolver should time out.
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700110// If chrome_alive is false, assume that sending to chrome fails.
111void RunTest(bool chrome_replies, bool chrome_alive) {
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800112 long number = 1;
113 DBusGConnection* kMockSystemGBus =
114 reinterpret_cast<DBusGConnection*>(number++);
115 DBusConnection* kMockSystemBus =
116 reinterpret_cast<DBusConnection*>(number++);
117 DBusGProxy* kMockDbusProxy =
118 reinterpret_cast<DBusGProxy*>(number++);
119 DBusMessage* kMockDbusMessage =
120 reinterpret_cast<DBusMessage*>(number++);
121
122 const char kUrl[] = "http://example.com/blah";
123
124 MockDbusGlib dbus_iface;
125
126 EXPECT_CALL(dbus_iface, BusGet(_, _))
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700127 .Times(chrome_alive ? 3 : 2)
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800128 .WillRepeatedly(Return(kMockSystemGBus));
129 EXPECT_CALL(dbus_iface,
130 ConnectionGetConnection(kMockSystemGBus))
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700131 .Times(chrome_alive ? 2 : 1)
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800132 .WillRepeatedly(Return(kMockSystemBus));
133 EXPECT_CALL(dbus_iface, DbusBusAddMatch(kMockSystemBus, _, _));
134 EXPECT_CALL(dbus_iface,
135 DbusConnectionAddFilter(kMockSystemBus, _, _, _))
136 .WillOnce(Return(1));
137 EXPECT_CALL(dbus_iface,
138 ProxyNewForNameOwner(kMockSystemGBus,
139 StrEq(kLibCrosServiceName),
140 StrEq(kLibCrosServicePath),
141 StrEq(kLibCrosServiceInterface),
142 _))
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700143 .WillOnce(Return(chrome_alive ? kMockDbusProxy : NULL));
144 if (chrome_alive)
145 EXPECT_CALL(dbus_iface, ProxyCall(
146 kMockDbusProxy,
147 StrEq(kLibCrosServiceResolveNetworkProxyMethodName),
148 _,
149 G_TYPE_STRING, StrEq(kUrl),
150 G_TYPE_STRING, StrEq(kLibCrosProxyResolveSignalInterface),
151 G_TYPE_STRING, StrEq(kLibCrosProxyResolveName),
152 G_TYPE_INVALID))
153 .WillOnce(Return(chrome_alive ? TRUE : FALSE));
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800154 EXPECT_CALL(dbus_iface,
155 DbusConnectionRemoveFilter(kMockSystemBus, _, _));
156 if (chrome_replies) {
157 EXPECT_CALL(dbus_iface,
158 DbusMessageIsSignal(kMockDbusMessage,
159 kLibCrosProxyResolveSignalInterface,
160 kLibCrosProxyResolveName))
161 .WillOnce(Return(1));
162 EXPECT_CALL(dbus_iface,
163 DbusMessageGetArgs(kMockDbusMessage, _,
164 DBUS_TYPE_STRING, _,
165 DBUS_TYPE_STRING, _,
166 DBUS_TYPE_STRING, _,
167 DBUS_TYPE_INVALID))
168 .WillOnce(DoAll(SetArgumentPointee<3>(strdup(kUrl)),
169 SetArgumentPointee<5>(
170 strdup("SOCKS5 192.168.52.83:5555;DIRECT")),
171 Return(TRUE)));
172 }
173
174 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
175
176 ChromeBrowserProxyResolver resolver(&dbus_iface);
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700177 EXPECT_EQ(chrome_alive, resolver.Init());
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800178 resolver.set_timeout(1);
179 SendReplyArgs args = {
180 kMockSystemBus,
181 kMockDbusMessage,
182 &resolver
183 };
184 if (chrome_replies)
185 g_idle_add(SendReply, &args);
186 EXPECT_TRUE(resolver.GetProxiesForUrl(kUrl,
187 chrome_replies ?
188 &DbusInterfaceTestResolved :
189 &DbusInterfaceTestResolvedNoReply,
190 loop));
191 g_main_loop_run(loop);
192 g_main_loop_unref(loop);
193}
194} // namespace {}
195
196TEST(ChromeBrowserProxyResolverTest, SuccessTest) {
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700197 RunTest(true, true);
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800198}
199
200TEST(ChromeBrowserProxyResolverTest, NoReplyTest) {
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700201 RunTest(false, true);
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800202}
203
204TEST(ChromeBrowserProxyResolverTest, NoChromeTest) {
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700205 RunTest(false, false);
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800206}
207
208} // namespace chromeos_update_engine