blob: 3866358f52e003815da883073e60b980952a672d [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
Alex Deymo60ca1a72015-06-18 18:19:15 -070012#include <base/bind.h>
13#include <chromeos/message_loops/fake_message_loop.h>
14
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -080015#include "update_engine/mock_dbus_wrapper.h"
Andrew de los Reyes000d8952011-03-02 15:21:14 -080016
Andrew de los Reyes000d8952011-03-02 15:21:14 -080017using ::testing::Return;
Alex Deymo3d21b122014-05-29 08:37:05 -070018using ::testing::SetArgPointee;
Andrew de los Reyes000d8952011-03-02 15:21:14 -080019using ::testing::StrEq;
Alex Deymof329b932014-10-30 01:37:48 -070020using ::testing::_;
Alex Deymo60ca1a72015-06-18 18:19:15 -070021using chromeos::MessageLoop;
Alex Deymof329b932014-10-30 01:37:48 -070022using std::deque;
23using std::string;
Andrew de los Reyes000d8952011-03-02 15:21:14 -080024
25namespace chromeos_update_engine {
26
Alex Deymo60ca1a72015-06-18 18:19:15 -070027class ChromeBrowserProxyResolverTest : public ::testing::Test {
28 protected:
29 void SetUp() override {
30 loop_.SetAsCurrent();
31 }
Andrew de los Reyes000d8952011-03-02 15:21:14 -080032
Alex Deymo60ca1a72015-06-18 18:19:15 -070033 void TearDown() override {
34 EXPECT_FALSE(loop_.PendingTasks());
35 }
36
37 private:
38 chromeos::FakeMessageLoop loop_{nullptr};
39};
40
41TEST_F(ChromeBrowserProxyResolverTest, ParseTest) {
Andrew de los Reyes000d8952011-03-02 15:21:14 -080042 // Test ideas from
43 // http://src.chromium.org/svn/trunk/src/net/proxy/proxy_list_unittest.cc
44 const char* inputs[] = {
45 "PROXY foopy:10",
46 " DIRECT", // leading space.
47 "PROXY foopy1 ; proxy foopy2;\t DIRECT",
48 "proxy foopy1 ; SOCKS foopy2",
49 "DIRECT ; proxy foopy1 ; DIRECT ; SOCKS5 foopy2;DIRECT ",
50 "DIRECT ; proxy foopy1:80; DIRECT ; DIRECT",
51 "PROXY-foopy:10",
52 "PROXY",
53 "PROXY foopy1 ; JUNK ; JUNK ; SOCKS5 foopy2 ; ;",
54 "HTTP foopy1; SOCKS5 foopy2"
55 };
56 deque<string> outputs[arraysize(inputs)];
57 outputs[0].push_back("http://foopy:10");
58 outputs[0].push_back(kNoProxy);
59 outputs[1].push_back(kNoProxy);
60 outputs[2].push_back("http://foopy1");
61 outputs[2].push_back("http://foopy2");
62 outputs[2].push_back(kNoProxy);
63 outputs[3].push_back("http://foopy1");
64 outputs[3].push_back("socks4://foopy2");
65 outputs[3].push_back(kNoProxy);
66 outputs[4].push_back(kNoProxy);
67 outputs[4].push_back("http://foopy1");
68 outputs[4].push_back(kNoProxy);
69 outputs[4].push_back("socks5://foopy2");
70 outputs[4].push_back(kNoProxy);
71 outputs[5].push_back(kNoProxy);
72 outputs[5].push_back("http://foopy1:80");
73 outputs[5].push_back(kNoProxy);
74 outputs[5].push_back(kNoProxy);
75 outputs[6].push_back(kNoProxy);
76 outputs[7].push_back(kNoProxy);
77 outputs[8].push_back("http://foopy1");
78 outputs[8].push_back("socks5://foopy2");
79 outputs[8].push_back(kNoProxy);
80 outputs[9].push_back("socks5://foopy2");
81 outputs[9].push_back(kNoProxy);
82
83 for (size_t i = 0; i < arraysize(inputs); i++) {
84 deque<string> results =
85 ChromeBrowserProxyResolver::ParseProxyString(inputs[i]);
86 deque<string>& expected = outputs[i];
87 EXPECT_EQ(results.size(), expected.size()) << "i = " << i;
88 if (expected.size() != results.size())
89 continue;
90 for (size_t j = 0; j < expected.size(); j++) {
91 EXPECT_EQ(expected[j], results[j]) << "i = " << i;
92 }
93 }
94}
95
96namespace {
Alex Deymof329b932014-10-30 01:37:48 -070097void DBusWrapperTestResolved(const deque<string>& proxies,
Alex Deymo60ca1a72015-06-18 18:19:15 -070098 void* /* pirv_data */) {
Andrew de los Reyes000d8952011-03-02 15:21:14 -080099 EXPECT_EQ(2, proxies.size());
100 EXPECT_EQ("socks5://192.168.52.83:5555", proxies[0]);
101 EXPECT_EQ(kNoProxy, proxies[1]);
Alex Deymo60ca1a72015-06-18 18:19:15 -0700102 MessageLoop::current()->BreakLoop();
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800103}
Alex Deymof329b932014-10-30 01:37:48 -0700104void DBusWrapperTestResolvedNoReply(const deque<string>& proxies,
Alex Deymo60ca1a72015-06-18 18:19:15 -0700105 void* /* pirv_data */) {
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800106 EXPECT_EQ(1, proxies.size());
107 EXPECT_EQ(kNoProxy, proxies[0]);
Alex Deymo60ca1a72015-06-18 18:19:15 -0700108 MessageLoop::current()->BreakLoop();
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800109}
Alex Deymo60ca1a72015-06-18 18:19:15 -0700110
111void SendReply(DBusConnection* connection,
112 DBusMessage* message,
113 ChromeBrowserProxyResolver* resolver) {
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800114 LOG(INFO) << "Calling SendReply";
Alex Deymo60ca1a72015-06-18 18:19:15 -0700115 ChromeBrowserProxyResolver::StaticFilterMessage(connection,
116 message,
117 resolver);
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800118}
119
120// chrome_replies should be set to whether or not we fake a reply from
121// chrome. If there's no reply, the resolver should time out.
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700122// If chrome_alive is false, assume that sending to chrome fails.
123void RunTest(bool chrome_replies, bool chrome_alive) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700124 intptr_t number = 1;
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800125 DBusGConnection* kMockSystemGBus =
126 reinterpret_cast<DBusGConnection*>(number++);
127 DBusConnection* kMockSystemBus =
128 reinterpret_cast<DBusConnection*>(number++);
129 DBusGProxy* kMockDbusProxy =
130 reinterpret_cast<DBusGProxy*>(number++);
131 DBusMessage* kMockDbusMessage =
132 reinterpret_cast<DBusMessage*>(number++);
133
Alex Deymo3d21b122014-05-29 08:37:05 -0700134 char kUrl[] = "http://example.com/blah";
135 char kProxyConfig[] = "SOCKS5 192.168.52.83:5555;DIRECT";
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800136
Alex Deymo3d21b122014-05-29 08:37:05 -0700137 testing::StrictMock<MockDBusWrapper> dbus_iface;
138
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800139 EXPECT_CALL(dbus_iface, BusGet(_, _))
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800140 .Times(2)
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800141 .WillRepeatedly(Return(kMockSystemGBus));
142 EXPECT_CALL(dbus_iface,
143 ConnectionGetConnection(kMockSystemGBus))
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800144 .Times(2)
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800145 .WillRepeatedly(Return(kMockSystemBus));
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800146 EXPECT_CALL(dbus_iface, DBusBusAddMatch(kMockSystemBus, _, _));
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800147 EXPECT_CALL(dbus_iface,
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800148 DBusConnectionAddFilter(kMockSystemBus, _, _, _))
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800149 .WillOnce(Return(1));
150 EXPECT_CALL(dbus_iface,
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800151 ProxyNewForName(kMockSystemGBus,
152 StrEq(kLibCrosServiceName),
153 StrEq(kLibCrosServicePath),
154 StrEq(kLibCrosServiceInterface)))
155 .WillOnce(Return(kMockDbusProxy));
Alex Deymo3d21b122014-05-29 08:37:05 -0700156 EXPECT_CALL(dbus_iface, ProxyUnref(kMockDbusProxy));
157
158 EXPECT_CALL(dbus_iface, ProxyCall_3_0(
159 kMockDbusProxy,
160 StrEq(kLibCrosServiceResolveNetworkProxyMethodName),
161 _,
162 StrEq(kUrl),
163 StrEq(kLibCrosProxyResolveSignalInterface),
164 StrEq(kLibCrosProxyResolveName)))
165 .WillOnce(Return(chrome_alive ? TRUE : FALSE));
166
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800167 EXPECT_CALL(dbus_iface,
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800168 DBusConnectionRemoveFilter(kMockSystemBus, _, _));
Alex Deymo3d21b122014-05-29 08:37:05 -0700169
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800170 if (chrome_replies) {
171 EXPECT_CALL(dbus_iface,
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800172 DBusMessageIsSignal(kMockDbusMessage,
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800173 kLibCrosProxyResolveSignalInterface,
174 kLibCrosProxyResolveName))
175 .WillOnce(Return(1));
176 EXPECT_CALL(dbus_iface,
Gilad Arnold1b9d6ae2014-03-03 13:46:07 -0800177 DBusMessageGetArgs_3(kMockDbusMessage, _, _, _, _))
Alex Deymo3d21b122014-05-29 08:37:05 -0700178 .WillOnce(DoAll(SetArgPointee<2>(static_cast<char*>(kUrl)),
179 SetArgPointee<3>(static_cast<char*>(kProxyConfig)),
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800180 Return(TRUE)));
181 }
182
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800183 ChromeBrowserProxyResolver resolver(&dbus_iface);
Gilad Arnoldb752fb32014-03-03 12:23:39 -0800184 EXPECT_EQ(true, resolver.Init());
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800185 resolver.set_timeout(1);
Alex Deymo60ca1a72015-06-18 18:19:15 -0700186 ProxiesResolvedFn get_proxies_response = &DBusWrapperTestResolvedNoReply;
187
188 if (chrome_replies) {
189 get_proxies_response = &DBusWrapperTestResolved;
190 MessageLoop::current()->PostTask(
191 FROM_HERE,
192 base::Bind(&SendReply, kMockSystemBus, kMockDbusMessage, &resolver));
193 }
194
195 EXPECT_TRUE(resolver.GetProxiesForUrl(kUrl, get_proxies_response, nullptr));
196 MessageLoop::current()->Run();
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800197}
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700198} // namespace
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800199
Alex Deymo60ca1a72015-06-18 18:19:15 -0700200TEST_F(ChromeBrowserProxyResolverTest, SuccessTest) {
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700201 RunTest(true, true);
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800202}
203
Alex Deymo60ca1a72015-06-18 18:19:15 -0700204TEST_F(ChromeBrowserProxyResolverTest, NoReplyTest) {
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700205 RunTest(false, true);
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800206}
207
Alex Deymo60ca1a72015-06-18 18:19:15 -0700208TEST_F(ChromeBrowserProxyResolverTest, NoChromeTest) {
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700209 RunTest(false, false);
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800210}
211
212} // namespace chromeos_update_engine