Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 1 | // 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 Deymo | aab50e3 | 2014-11-10 19:55:35 -0800 | [diff] [blame] | 5 | #include "update_engine/chrome_browser_proxy_resolver.h" |
| 6 | |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 7 | #include <deque> |
| 8 | #include <string> |
| 9 | |
| 10 | #include <gtest/gtest.h> |
| 11 | |
Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 12 | #include <base/bind.h> |
| 13 | #include <chromeos/message_loops/fake_message_loop.h> |
| 14 | |
Gilad Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame] | 15 | #include "update_engine/mock_dbus_wrapper.h" |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 16 | |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 17 | using ::testing::Return; |
Alex Deymo | 3d21b12 | 2014-05-29 08:37:05 -0700 | [diff] [blame] | 18 | using ::testing::SetArgPointee; |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 19 | using ::testing::StrEq; |
Alex Deymo | f329b93 | 2014-10-30 01:37:48 -0700 | [diff] [blame] | 20 | using ::testing::_; |
Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 21 | using chromeos::MessageLoop; |
Alex Deymo | f329b93 | 2014-10-30 01:37:48 -0700 | [diff] [blame] | 22 | using std::deque; |
| 23 | using std::string; |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 24 | |
| 25 | namespace chromeos_update_engine { |
| 26 | |
Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 27 | class ChromeBrowserProxyResolverTest : public ::testing::Test { |
| 28 | protected: |
| 29 | void SetUp() override { |
| 30 | loop_.SetAsCurrent(); |
| 31 | } |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 32 | |
Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 33 | void TearDown() override { |
| 34 | EXPECT_FALSE(loop_.PendingTasks()); |
| 35 | } |
| 36 | |
| 37 | private: |
| 38 | chromeos::FakeMessageLoop loop_{nullptr}; |
| 39 | }; |
| 40 | |
| 41 | TEST_F(ChromeBrowserProxyResolverTest, ParseTest) { |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 42 | // 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 | |
| 96 | namespace { |
Alex Deymo | f329b93 | 2014-10-30 01:37:48 -0700 | [diff] [blame] | 97 | void DBusWrapperTestResolved(const deque<string>& proxies, |
Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 98 | void* /* pirv_data */) { |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 99 | EXPECT_EQ(2, proxies.size()); |
| 100 | EXPECT_EQ("socks5://192.168.52.83:5555", proxies[0]); |
| 101 | EXPECT_EQ(kNoProxy, proxies[1]); |
Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 102 | MessageLoop::current()->BreakLoop(); |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 103 | } |
Alex Deymo | f329b93 | 2014-10-30 01:37:48 -0700 | [diff] [blame] | 104 | void DBusWrapperTestResolvedNoReply(const deque<string>& proxies, |
Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 105 | void* /* pirv_data */) { |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 106 | EXPECT_EQ(1, proxies.size()); |
| 107 | EXPECT_EQ(kNoProxy, proxies[0]); |
Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 108 | MessageLoop::current()->BreakLoop(); |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 109 | } |
Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 110 | |
| 111 | void SendReply(DBusConnection* connection, |
| 112 | DBusMessage* message, |
| 113 | ChromeBrowserProxyResolver* resolver) { |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 114 | LOG(INFO) << "Calling SendReply"; |
Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 115 | ChromeBrowserProxyResolver::StaticFilterMessage(connection, |
| 116 | message, |
| 117 | resolver); |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 118 | } |
| 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 Reyes | 518502a | 2011-03-14 14:19:39 -0700 | [diff] [blame] | 122 | // If chrome_alive is false, assume that sending to chrome fails. |
| 123 | void RunTest(bool chrome_replies, bool chrome_alive) { |
Alex Vakulenko | d2779df | 2014-06-16 13:19:00 -0700 | [diff] [blame] | 124 | intptr_t number = 1; |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 125 | 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 Deymo | 3d21b12 | 2014-05-29 08:37:05 -0700 | [diff] [blame] | 134 | char kUrl[] = "http://example.com/blah"; |
| 135 | char kProxyConfig[] = "SOCKS5 192.168.52.83:5555;DIRECT"; |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 136 | |
Alex Deymo | 3d21b12 | 2014-05-29 08:37:05 -0700 | [diff] [blame] | 137 | testing::StrictMock<MockDBusWrapper> dbus_iface; |
| 138 | |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 139 | EXPECT_CALL(dbus_iface, BusGet(_, _)) |
Gilad Arnold | b752fb3 | 2014-03-03 12:23:39 -0800 | [diff] [blame] | 140 | .Times(2) |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 141 | .WillRepeatedly(Return(kMockSystemGBus)); |
| 142 | EXPECT_CALL(dbus_iface, |
| 143 | ConnectionGetConnection(kMockSystemGBus)) |
Gilad Arnold | b752fb3 | 2014-03-03 12:23:39 -0800 | [diff] [blame] | 144 | .Times(2) |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 145 | .WillRepeatedly(Return(kMockSystemBus)); |
Gilad Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame] | 146 | EXPECT_CALL(dbus_iface, DBusBusAddMatch(kMockSystemBus, _, _)); |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 147 | EXPECT_CALL(dbus_iface, |
Gilad Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame] | 148 | DBusConnectionAddFilter(kMockSystemBus, _, _, _)) |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 149 | .WillOnce(Return(1)); |
| 150 | EXPECT_CALL(dbus_iface, |
Gilad Arnold | b752fb3 | 2014-03-03 12:23:39 -0800 | [diff] [blame] | 151 | ProxyNewForName(kMockSystemGBus, |
| 152 | StrEq(kLibCrosServiceName), |
| 153 | StrEq(kLibCrosServicePath), |
| 154 | StrEq(kLibCrosServiceInterface))) |
| 155 | .WillOnce(Return(kMockDbusProxy)); |
Alex Deymo | 3d21b12 | 2014-05-29 08:37:05 -0700 | [diff] [blame] | 156 | 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 Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 167 | EXPECT_CALL(dbus_iface, |
Gilad Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame] | 168 | DBusConnectionRemoveFilter(kMockSystemBus, _, _)); |
Alex Deymo | 3d21b12 | 2014-05-29 08:37:05 -0700 | [diff] [blame] | 169 | |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 170 | if (chrome_replies) { |
| 171 | EXPECT_CALL(dbus_iface, |
Gilad Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame] | 172 | DBusMessageIsSignal(kMockDbusMessage, |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 173 | kLibCrosProxyResolveSignalInterface, |
| 174 | kLibCrosProxyResolveName)) |
| 175 | .WillOnce(Return(1)); |
| 176 | EXPECT_CALL(dbus_iface, |
Gilad Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame] | 177 | DBusMessageGetArgs_3(kMockDbusMessage, _, _, _, _)) |
Alex Deymo | 3d21b12 | 2014-05-29 08:37:05 -0700 | [diff] [blame] | 178 | .WillOnce(DoAll(SetArgPointee<2>(static_cast<char*>(kUrl)), |
| 179 | SetArgPointee<3>(static_cast<char*>(kProxyConfig)), |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 180 | Return(TRUE))); |
| 181 | } |
| 182 | |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 183 | ChromeBrowserProxyResolver resolver(&dbus_iface); |
Gilad Arnold | b752fb3 | 2014-03-03 12:23:39 -0800 | [diff] [blame] | 184 | EXPECT_EQ(true, resolver.Init()); |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 185 | resolver.set_timeout(1); |
Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 186 | 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 Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 197 | } |
Alex Vakulenko | d2779df | 2014-06-16 13:19:00 -0700 | [diff] [blame] | 198 | } // namespace |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 199 | |
Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 200 | TEST_F(ChromeBrowserProxyResolverTest, SuccessTest) { |
Andrew de los Reyes | 518502a | 2011-03-14 14:19:39 -0700 | [diff] [blame] | 201 | RunTest(true, true); |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 202 | } |
| 203 | |
Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 204 | TEST_F(ChromeBrowserProxyResolverTest, NoReplyTest) { |
Andrew de los Reyes | 518502a | 2011-03-14 14:19:39 -0700 | [diff] [blame] | 205 | RunTest(false, true); |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 206 | } |
| 207 | |
Alex Deymo | 60ca1a7 | 2015-06-18 18:19:15 -0700 | [diff] [blame] | 208 | TEST_F(ChromeBrowserProxyResolverTest, NoChromeTest) { |
Andrew de los Reyes | 518502a | 2011-03-14 14:19:39 -0700 | [diff] [blame] | 209 | RunTest(false, false); |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 210 | } |
| 211 | |
| 212 | } // namespace chromeos_update_engine |