blob: 628524bed2dc7562243aca1074f8f7d25050390c [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"
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -080011#include "update_engine/mock_dbus_wrapper.h"
Andrew de los Reyes000d8952011-03-02 15:21:14 -080012
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 {
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -080080void DBusWrapperTestResolved(const std::deque<std::string>& proxies,
81 void* data) {
Andrew de los Reyes000d8952011-03-02 15:21:14 -080082 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}
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -080087void DBusWrapperTestResolvedNoReply(const std::deque<std::string>& proxies,
88 void* data) {
Andrew de los Reyes000d8952011-03-02 15:21:14 -080089 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
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800124 MockDBusWrapper dbus_iface;
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800125
126 EXPECT_CALL(dbus_iface, BusGet(_, _))
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800127 .Times(2)
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800128 .WillRepeatedly(Return(kMockSystemGBus));
129 EXPECT_CALL(dbus_iface,
130 ConnectionGetConnection(kMockSystemGBus))
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800131 .Times(2)
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800132 .WillRepeatedly(Return(kMockSystemBus));
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800133 EXPECT_CALL(dbus_iface, DBusBusAddMatch(kMockSystemBus, _, _));
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800134 EXPECT_CALL(dbus_iface,
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800135 DBusConnectionAddFilter(kMockSystemBus, _, _, _))
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800136 .WillOnce(Return(1));
137 EXPECT_CALL(dbus_iface,
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800138 ProxyNewForName(kMockSystemGBus,
139 StrEq(kLibCrosServiceName),
140 StrEq(kLibCrosServicePath),
141 StrEq(kLibCrosServiceInterface)))
142 .WillOnce(Return(kMockDbusProxy));
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700143 if (chrome_alive)
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800144 EXPECT_CALL(dbus_iface, ProxyCall_3_0(
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700145 kMockDbusProxy,
146 StrEq(kLibCrosServiceResolveNetworkProxyMethodName),
147 _,
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800148 StrEq(kUrl),
149 StrEq(kLibCrosProxyResolveSignalInterface),
150 StrEq(kLibCrosProxyResolveName)))
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700151 .WillOnce(Return(chrome_alive ? TRUE : FALSE));
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800152 EXPECT_CALL(dbus_iface,
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800153 DBusConnectionRemoveFilter(kMockSystemBus, _, _));
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800154 if (chrome_replies) {
155 EXPECT_CALL(dbus_iface,
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800156 DBusMessageIsSignal(kMockDbusMessage,
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800157 kLibCrosProxyResolveSignalInterface,
158 kLibCrosProxyResolveName))
159 .WillOnce(Return(1));
160 EXPECT_CALL(dbus_iface,
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800161 DBusMessageGetArgs_3(kMockDbusMessage, _, _, _, _))
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800162 .WillOnce(DoAll(SetArgumentPointee<2>(strdup(kUrl)),
163 SetArgumentPointee<3>(
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800164 strdup("SOCKS5 192.168.52.83:5555;DIRECT")),
165 Return(TRUE)));
166 }
167
168 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
169
170 ChromeBrowserProxyResolver resolver(&dbus_iface);
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800171 EXPECT_EQ(true, resolver.Init());
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800172 resolver.set_timeout(1);
173 SendReplyArgs args = {
174 kMockSystemBus,
175 kMockDbusMessage,
176 &resolver
177 };
178 if (chrome_replies)
179 g_idle_add(SendReply, &args);
180 EXPECT_TRUE(resolver.GetProxiesForUrl(kUrl,
181 chrome_replies ?
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800182 &DBusWrapperTestResolved :
183 &DBusWrapperTestResolvedNoReply,
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800184 loop));
185 g_main_loop_run(loop);
186 g_main_loop_unref(loop);
187}
188} // namespace {}
189
190TEST(ChromeBrowserProxyResolverTest, SuccessTest) {
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700191 RunTest(true, true);
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800192}
193
194TEST(ChromeBrowserProxyResolverTest, NoReplyTest) {
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700195 RunTest(false, true);
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800196}
197
198TEST(ChromeBrowserProxyResolverTest, NoChromeTest) {
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700199 RunTest(false, false);
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800200}
201
202} // namespace chromeos_update_engine