blob: 3974f3bcc78589ff50f9a26977162af1f2bd979b [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
Andrew de los Reyes000d8952011-03-02 15:21:14 -080013using ::testing::Return;
Alex Deymo3d21b122014-05-29 08:37:05 -070014using ::testing::SetArgPointee;
Andrew de los Reyes000d8952011-03-02 15:21:14 -080015using ::testing::StrEq;
Alex Deymof329b932014-10-30 01:37:48 -070016using ::testing::_;
17using std::deque;
18using std::string;
Andrew de los Reyes000d8952011-03-02 15:21:14 -080019
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 {
Alex Deymof329b932014-10-30 01:37:48 -070080void DBusWrapperTestResolved(const deque<string>& proxies,
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -080081 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}
Alex Deymof329b932014-10-30 01:37:48 -070087void DBusWrapperTestResolvedNoReply(const deque<string>& proxies,
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -080088 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) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700112 intptr_t number = 1;
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800113 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
Alex Deymo3d21b122014-05-29 08:37:05 -0700122 char kUrl[] = "http://example.com/blah";
123 char kProxyConfig[] = "SOCKS5 192.168.52.83:5555;DIRECT";
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800124
Alex Deymo3d21b122014-05-29 08:37:05 -0700125 testing::StrictMock<MockDBusWrapper> dbus_iface;
126
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800127 EXPECT_CALL(dbus_iface, BusGet(_, _))
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800128 .Times(2)
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800129 .WillRepeatedly(Return(kMockSystemGBus));
130 EXPECT_CALL(dbus_iface,
131 ConnectionGetConnection(kMockSystemGBus))
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800132 .Times(2)
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800133 .WillRepeatedly(Return(kMockSystemBus));
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800134 EXPECT_CALL(dbus_iface, DBusBusAddMatch(kMockSystemBus, _, _));
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800135 EXPECT_CALL(dbus_iface,
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800136 DBusConnectionAddFilter(kMockSystemBus, _, _, _))
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800137 .WillOnce(Return(1));
138 EXPECT_CALL(dbus_iface,
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800139 ProxyNewForName(kMockSystemGBus,
140 StrEq(kLibCrosServiceName),
141 StrEq(kLibCrosServicePath),
142 StrEq(kLibCrosServiceInterface)))
143 .WillOnce(Return(kMockDbusProxy));
Alex Deymo3d21b122014-05-29 08:37:05 -0700144 EXPECT_CALL(dbus_iface, ProxyUnref(kMockDbusProxy));
145
146 EXPECT_CALL(dbus_iface, ProxyCall_3_0(
147 kMockDbusProxy,
148 StrEq(kLibCrosServiceResolveNetworkProxyMethodName),
149 _,
150 StrEq(kUrl),
151 StrEq(kLibCrosProxyResolveSignalInterface),
152 StrEq(kLibCrosProxyResolveName)))
153 .WillOnce(Return(chrome_alive ? TRUE : FALSE));
154
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800155 EXPECT_CALL(dbus_iface,
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800156 DBusConnectionRemoveFilter(kMockSystemBus, _, _));
Alex Deymo3d21b122014-05-29 08:37:05 -0700157
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800158 if (chrome_replies) {
159 EXPECT_CALL(dbus_iface,
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800160 DBusMessageIsSignal(kMockDbusMessage,
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800161 kLibCrosProxyResolveSignalInterface,
162 kLibCrosProxyResolveName))
163 .WillOnce(Return(1));
164 EXPECT_CALL(dbus_iface,
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800165 DBusMessageGetArgs_3(kMockDbusMessage, _, _, _, _))
Alex Deymo3d21b122014-05-29 08:37:05 -0700166 .WillOnce(DoAll(SetArgPointee<2>(static_cast<char*>(kUrl)),
167 SetArgPointee<3>(static_cast<char*>(kProxyConfig)),
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800168 Return(TRUE)));
169 }
170
171 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
172
173 ChromeBrowserProxyResolver resolver(&dbus_iface);
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800174 EXPECT_EQ(true, resolver.Init());
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800175 resolver.set_timeout(1);
176 SendReplyArgs args = {
177 kMockSystemBus,
178 kMockDbusMessage,
179 &resolver
180 };
181 if (chrome_replies)
182 g_idle_add(SendReply, &args);
183 EXPECT_TRUE(resolver.GetProxiesForUrl(kUrl,
184 chrome_replies ?
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800185 &DBusWrapperTestResolved :
186 &DBusWrapperTestResolvedNoReply,
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800187 loop));
188 g_main_loop_run(loop);
189 g_main_loop_unref(loop);
190}
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700191} // namespace
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800192
193TEST(ChromeBrowserProxyResolverTest, SuccessTest) {
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700194 RunTest(true, true);
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800195}
196
197TEST(ChromeBrowserProxyResolverTest, NoReplyTest) {
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700198 RunTest(false, true);
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800199}
200
201TEST(ChromeBrowserProxyResolverTest, NoChromeTest) {
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700202 RunTest(false, false);
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800203}
204
205} // namespace chromeos_update_engine