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 | |
| 5 | #include <deque> |
| 6 | #include <string> |
| 7 | |
| 8 | #include <gtest/gtest.h> |
| 9 | |
| 10 | #include "update_engine/chrome_browser_proxy_resolver.h" |
Gilad Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame] | 11 | #include "update_engine/mock_dbus_wrapper.h" |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 12 | |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 13 | using ::testing::Return; |
Alex Deymo | 3d21b12 | 2014-05-29 08:37:05 -0700 | [diff] [blame] | 14 | using ::testing::SetArgPointee; |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 15 | using ::testing::StrEq; |
Alex Deymo | f329b93 | 2014-10-30 01:37:48 -0700 | [diff] [blame] | 16 | using ::testing::_; |
| 17 | using std::deque; |
| 18 | using std::string; |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 19 | |
| 20 | namespace chromeos_update_engine { |
| 21 | |
| 22 | class ChromeBrowserProxyResolverTest : public ::testing::Test { }; |
| 23 | |
| 24 | TEST(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 | |
| 79 | namespace { |
Alex Deymo | f329b93 | 2014-10-30 01:37:48 -0700 | [diff] [blame] | 80 | void DBusWrapperTestResolved(const deque<string>& proxies, |
Gilad Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame] | 81 | void* data) { |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 82 | 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 Deymo | f329b93 | 2014-10-30 01:37:48 -0700 | [diff] [blame] | 87 | void DBusWrapperTestResolvedNoReply(const deque<string>& proxies, |
Gilad Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame] | 88 | void* data) { |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 89 | EXPECT_EQ(1, proxies.size()); |
| 90 | EXPECT_EQ(kNoProxy, proxies[0]); |
| 91 | g_main_loop_quit(reinterpret_cast<GMainLoop*>(data)); |
| 92 | } |
| 93 | struct SendReplyArgs { |
| 94 | DBusConnection* connection; |
| 95 | DBusMessage* message; |
| 96 | ChromeBrowserProxyResolver* resolver; |
| 97 | }; |
| 98 | gboolean 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 Reyes | 518502a | 2011-03-14 14:19:39 -0700 | [diff] [blame] | 110 | // If chrome_alive is false, assume that sending to chrome fails. |
| 111 | void RunTest(bool chrome_replies, bool chrome_alive) { |
Alex Vakulenko | d2779df | 2014-06-16 13:19:00 -0700 | [diff] [blame] | 112 | intptr_t number = 1; |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 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 | |
Alex Deymo | 3d21b12 | 2014-05-29 08:37:05 -0700 | [diff] [blame] | 122 | char kUrl[] = "http://example.com/blah"; |
| 123 | char kProxyConfig[] = "SOCKS5 192.168.52.83:5555;DIRECT"; |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 124 | |
Alex Deymo | 3d21b12 | 2014-05-29 08:37:05 -0700 | [diff] [blame] | 125 | testing::StrictMock<MockDBusWrapper> dbus_iface; |
| 126 | |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 127 | EXPECT_CALL(dbus_iface, BusGet(_, _)) |
Gilad Arnold | b752fb3 | 2014-03-03 12:23:39 -0800 | [diff] [blame] | 128 | .Times(2) |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 129 | .WillRepeatedly(Return(kMockSystemGBus)); |
| 130 | EXPECT_CALL(dbus_iface, |
| 131 | ConnectionGetConnection(kMockSystemGBus)) |
Gilad Arnold | b752fb3 | 2014-03-03 12:23:39 -0800 | [diff] [blame] | 132 | .Times(2) |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 133 | .WillRepeatedly(Return(kMockSystemBus)); |
Gilad Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame] | 134 | EXPECT_CALL(dbus_iface, DBusBusAddMatch(kMockSystemBus, _, _)); |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 135 | EXPECT_CALL(dbus_iface, |
Gilad Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame] | 136 | DBusConnectionAddFilter(kMockSystemBus, _, _, _)) |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 137 | .WillOnce(Return(1)); |
| 138 | EXPECT_CALL(dbus_iface, |
Gilad Arnold | b752fb3 | 2014-03-03 12:23:39 -0800 | [diff] [blame] | 139 | ProxyNewForName(kMockSystemGBus, |
| 140 | StrEq(kLibCrosServiceName), |
| 141 | StrEq(kLibCrosServicePath), |
| 142 | StrEq(kLibCrosServiceInterface))) |
| 143 | .WillOnce(Return(kMockDbusProxy)); |
Alex Deymo | 3d21b12 | 2014-05-29 08:37:05 -0700 | [diff] [blame] | 144 | 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 Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 155 | EXPECT_CALL(dbus_iface, |
Gilad Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame] | 156 | DBusConnectionRemoveFilter(kMockSystemBus, _, _)); |
Alex Deymo | 3d21b12 | 2014-05-29 08:37:05 -0700 | [diff] [blame] | 157 | |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 158 | if (chrome_replies) { |
| 159 | EXPECT_CALL(dbus_iface, |
Gilad Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame] | 160 | DBusMessageIsSignal(kMockDbusMessage, |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 161 | kLibCrosProxyResolveSignalInterface, |
| 162 | kLibCrosProxyResolveName)) |
| 163 | .WillOnce(Return(1)); |
| 164 | EXPECT_CALL(dbus_iface, |
Gilad Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame] | 165 | DBusMessageGetArgs_3(kMockDbusMessage, _, _, _, _)) |
Alex Deymo | 3d21b12 | 2014-05-29 08:37:05 -0700 | [diff] [blame] | 166 | .WillOnce(DoAll(SetArgPointee<2>(static_cast<char*>(kUrl)), |
| 167 | SetArgPointee<3>(static_cast<char*>(kProxyConfig)), |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 168 | Return(TRUE))); |
| 169 | } |
| 170 | |
| 171 | GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE); |
| 172 | |
| 173 | ChromeBrowserProxyResolver resolver(&dbus_iface); |
Gilad Arnold | b752fb3 | 2014-03-03 12:23:39 -0800 | [diff] [blame] | 174 | EXPECT_EQ(true, resolver.Init()); |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 175 | 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 Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame] | 185 | &DBusWrapperTestResolved : |
| 186 | &DBusWrapperTestResolvedNoReply, |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 187 | loop)); |
| 188 | g_main_loop_run(loop); |
| 189 | g_main_loop_unref(loop); |
| 190 | } |
Alex Vakulenko | d2779df | 2014-06-16 13:19:00 -0700 | [diff] [blame] | 191 | } // namespace |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 192 | |
| 193 | TEST(ChromeBrowserProxyResolverTest, SuccessTest) { |
Andrew de los Reyes | 518502a | 2011-03-14 14:19:39 -0700 | [diff] [blame] | 194 | RunTest(true, true); |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 195 | } |
| 196 | |
| 197 | TEST(ChromeBrowserProxyResolverTest, NoReplyTest) { |
Andrew de los Reyes | 518502a | 2011-03-14 14:19:39 -0700 | [diff] [blame] | 198 | RunTest(false, true); |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 199 | } |
| 200 | |
| 201 | TEST(ChromeBrowserProxyResolverTest, NoChromeTest) { |
Andrew de los Reyes | 518502a | 2011-03-14 14:19:39 -0700 | [diff] [blame] | 202 | RunTest(false, false); |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 203 | } |
| 204 | |
| 205 | } // namespace chromeos_update_engine |