blob: d3cf99eed3406bd80f714bc621238367e6a8533a [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
Alex Deymoaab50e32014-11-10 19:55:35 -08005#include "update_engine/chrome_browser_proxy_resolver.h"
6
Andrew de los Reyes000d8952011-03-02 15:21:14 -08007#include <deque>
8#include <string>
9
10#include <gtest/gtest.h>
11
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -080012#include "update_engine/mock_dbus_wrapper.h"
Andrew de los Reyes000d8952011-03-02 15:21:14 -080013
Andrew de los Reyes000d8952011-03-02 15:21:14 -080014using ::testing::Return;
Alex Deymo3d21b122014-05-29 08:37:05 -070015using ::testing::SetArgPointee;
Andrew de los Reyes000d8952011-03-02 15:21:14 -080016using ::testing::StrEq;
Alex Deymof329b932014-10-30 01:37:48 -070017using ::testing::_;
18using std::deque;
19using std::string;
Andrew de los Reyes000d8952011-03-02 15:21:14 -080020
21namespace chromeos_update_engine {
22
23class ChromeBrowserProxyResolverTest : public ::testing::Test { };
24
25TEST(ChromeBrowserProxyResolverTest, ParseTest) {
26 // Test ideas from
27 // http://src.chromium.org/svn/trunk/src/net/proxy/proxy_list_unittest.cc
28 const char* inputs[] = {
29 "PROXY foopy:10",
30 " DIRECT", // leading space.
31 "PROXY foopy1 ; proxy foopy2;\t DIRECT",
32 "proxy foopy1 ; SOCKS foopy2",
33 "DIRECT ; proxy foopy1 ; DIRECT ; SOCKS5 foopy2;DIRECT ",
34 "DIRECT ; proxy foopy1:80; DIRECT ; DIRECT",
35 "PROXY-foopy:10",
36 "PROXY",
37 "PROXY foopy1 ; JUNK ; JUNK ; SOCKS5 foopy2 ; ;",
38 "HTTP foopy1; SOCKS5 foopy2"
39 };
40 deque<string> outputs[arraysize(inputs)];
41 outputs[0].push_back("http://foopy:10");
42 outputs[0].push_back(kNoProxy);
43 outputs[1].push_back(kNoProxy);
44 outputs[2].push_back("http://foopy1");
45 outputs[2].push_back("http://foopy2");
46 outputs[2].push_back(kNoProxy);
47 outputs[3].push_back("http://foopy1");
48 outputs[3].push_back("socks4://foopy2");
49 outputs[3].push_back(kNoProxy);
50 outputs[4].push_back(kNoProxy);
51 outputs[4].push_back("http://foopy1");
52 outputs[4].push_back(kNoProxy);
53 outputs[4].push_back("socks5://foopy2");
54 outputs[4].push_back(kNoProxy);
55 outputs[5].push_back(kNoProxy);
56 outputs[5].push_back("http://foopy1:80");
57 outputs[5].push_back(kNoProxy);
58 outputs[5].push_back(kNoProxy);
59 outputs[6].push_back(kNoProxy);
60 outputs[7].push_back(kNoProxy);
61 outputs[8].push_back("http://foopy1");
62 outputs[8].push_back("socks5://foopy2");
63 outputs[8].push_back(kNoProxy);
64 outputs[9].push_back("socks5://foopy2");
65 outputs[9].push_back(kNoProxy);
66
67 for (size_t i = 0; i < arraysize(inputs); i++) {
68 deque<string> results =
69 ChromeBrowserProxyResolver::ParseProxyString(inputs[i]);
70 deque<string>& expected = outputs[i];
71 EXPECT_EQ(results.size(), expected.size()) << "i = " << i;
72 if (expected.size() != results.size())
73 continue;
74 for (size_t j = 0; j < expected.size(); j++) {
75 EXPECT_EQ(expected[j], results[j]) << "i = " << i;
76 }
77 }
78}
79
80namespace {
Alex Deymof329b932014-10-30 01:37:48 -070081void DBusWrapperTestResolved(const deque<string>& proxies,
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -080082 void* data) {
Andrew de los Reyes000d8952011-03-02 15:21:14 -080083 EXPECT_EQ(2, proxies.size());
84 EXPECT_EQ("socks5://192.168.52.83:5555", proxies[0]);
85 EXPECT_EQ(kNoProxy, proxies[1]);
86 g_main_loop_quit(reinterpret_cast<GMainLoop*>(data));
87}
Alex Deymof329b932014-10-30 01:37:48 -070088void DBusWrapperTestResolvedNoReply(const deque<string>& proxies,
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -080089 void* data) {
Andrew de los Reyes000d8952011-03-02 15:21:14 -080090 EXPECT_EQ(1, proxies.size());
91 EXPECT_EQ(kNoProxy, proxies[0]);
92 g_main_loop_quit(reinterpret_cast<GMainLoop*>(data));
93}
94struct SendReplyArgs {
95 DBusConnection* connection;
96 DBusMessage* message;
97 ChromeBrowserProxyResolver* resolver;
98};
99gboolean SendReply(gpointer data) {
100 LOG(INFO) << "Calling SendReply";
101 SendReplyArgs* args = reinterpret_cast<SendReplyArgs*>(data);
102 ChromeBrowserProxyResolver::StaticFilterMessage(
103 args->connection,
104 args->message,
105 args->resolver);
106 return FALSE; // Don't keep calling this function
107}
108
109// chrome_replies should be set to whether or not we fake a reply from
110// chrome. If there's no reply, the resolver should time out.
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700111// If chrome_alive is false, assume that sending to chrome fails.
112void RunTest(bool chrome_replies, bool chrome_alive) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700113 intptr_t number = 1;
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800114 DBusGConnection* kMockSystemGBus =
115 reinterpret_cast<DBusGConnection*>(number++);
116 DBusConnection* kMockSystemBus =
117 reinterpret_cast<DBusConnection*>(number++);
118 DBusGProxy* kMockDbusProxy =
119 reinterpret_cast<DBusGProxy*>(number++);
120 DBusMessage* kMockDbusMessage =
121 reinterpret_cast<DBusMessage*>(number++);
122
Alex Deymo3d21b122014-05-29 08:37:05 -0700123 char kUrl[] = "http://example.com/blah";
124 char kProxyConfig[] = "SOCKS5 192.168.52.83:5555;DIRECT";
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800125
Alex Deymo3d21b122014-05-29 08:37:05 -0700126 testing::StrictMock<MockDBusWrapper> dbus_iface;
127
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800128 EXPECT_CALL(dbus_iface, BusGet(_, _))
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800129 .Times(2)
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800130 .WillRepeatedly(Return(kMockSystemGBus));
131 EXPECT_CALL(dbus_iface,
132 ConnectionGetConnection(kMockSystemGBus))
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800133 .Times(2)
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800134 .WillRepeatedly(Return(kMockSystemBus));
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800135 EXPECT_CALL(dbus_iface, DBusBusAddMatch(kMockSystemBus, _, _));
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800136 EXPECT_CALL(dbus_iface,
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800137 DBusConnectionAddFilter(kMockSystemBus, _, _, _))
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800138 .WillOnce(Return(1));
139 EXPECT_CALL(dbus_iface,
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800140 ProxyNewForName(kMockSystemGBus,
141 StrEq(kLibCrosServiceName),
142 StrEq(kLibCrosServicePath),
143 StrEq(kLibCrosServiceInterface)))
144 .WillOnce(Return(kMockDbusProxy));
Alex Deymo3d21b122014-05-29 08:37:05 -0700145 EXPECT_CALL(dbus_iface, ProxyUnref(kMockDbusProxy));
146
147 EXPECT_CALL(dbus_iface, ProxyCall_3_0(
148 kMockDbusProxy,
149 StrEq(kLibCrosServiceResolveNetworkProxyMethodName),
150 _,
151 StrEq(kUrl),
152 StrEq(kLibCrosProxyResolveSignalInterface),
153 StrEq(kLibCrosProxyResolveName)))
154 .WillOnce(Return(chrome_alive ? TRUE : FALSE));
155
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800156 EXPECT_CALL(dbus_iface,
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800157 DBusConnectionRemoveFilter(kMockSystemBus, _, _));
Alex Deymo3d21b122014-05-29 08:37:05 -0700158
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800159 if (chrome_replies) {
160 EXPECT_CALL(dbus_iface,
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800161 DBusMessageIsSignal(kMockDbusMessage,
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800162 kLibCrosProxyResolveSignalInterface,
163 kLibCrosProxyResolveName))
164 .WillOnce(Return(1));
165 EXPECT_CALL(dbus_iface,
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800166 DBusMessageGetArgs_3(kMockDbusMessage, _, _, _, _))
Alex Deymo3d21b122014-05-29 08:37:05 -0700167 .WillOnce(DoAll(SetArgPointee<2>(static_cast<char*>(kUrl)),
168 SetArgPointee<3>(static_cast<char*>(kProxyConfig)),
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800169 Return(TRUE)));
170 }
171
172 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
173
174 ChromeBrowserProxyResolver resolver(&dbus_iface);
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800175 EXPECT_EQ(true, resolver.Init());
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800176 resolver.set_timeout(1);
177 SendReplyArgs args = {
178 kMockSystemBus,
179 kMockDbusMessage,
180 &resolver
181 };
182 if (chrome_replies)
183 g_idle_add(SendReply, &args);
184 EXPECT_TRUE(resolver.GetProxiesForUrl(kUrl,
185 chrome_replies ?
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800186 &DBusWrapperTestResolved :
187 &DBusWrapperTestResolvedNoReply,
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800188 loop));
189 g_main_loop_run(loop);
190 g_main_loop_unref(loop);
191}
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700192} // namespace
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800193
194TEST(ChromeBrowserProxyResolverTest, SuccessTest) {
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700195 RunTest(true, true);
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800196}
197
198TEST(ChromeBrowserProxyResolverTest, NoReplyTest) {
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700199 RunTest(false, true);
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800200}
201
202TEST(ChromeBrowserProxyResolverTest, NoChromeTest) {
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700203 RunTest(false, false);
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800204}
205
206} // namespace chromeos_update_engine