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 | |
| 13 | using std::deque; |
| 14 | using std::string; |
| 15 | using ::testing::_; |
| 16 | using ::testing::Return; |
| 17 | using ::testing::SetArgumentPointee; |
| 18 | using ::testing::StrEq; |
| 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 { |
Gilad Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame^] | 80 | void DBusWrapperTestResolved(const std::deque<std::string>& proxies, |
| 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 | } |
Gilad Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame^] | 87 | void DBusWrapperTestResolvedNoReply(const std::deque<std::string>& proxies, |
| 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) { |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 112 | 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 Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame^] | 124 | MockDBusWrapper dbus_iface; |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 125 | |
| 126 | EXPECT_CALL(dbus_iface, BusGet(_, _)) |
Gilad Arnold | b752fb3 | 2014-03-03 12:23:39 -0800 | [diff] [blame] | 127 | .Times(2) |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 128 | .WillRepeatedly(Return(kMockSystemGBus)); |
| 129 | EXPECT_CALL(dbus_iface, |
| 130 | ConnectionGetConnection(kMockSystemGBus)) |
Gilad Arnold | b752fb3 | 2014-03-03 12:23:39 -0800 | [diff] [blame] | 131 | .Times(2) |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 132 | .WillRepeatedly(Return(kMockSystemBus)); |
Gilad Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame^] | 133 | EXPECT_CALL(dbus_iface, DBusBusAddMatch(kMockSystemBus, _, _)); |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 134 | EXPECT_CALL(dbus_iface, |
Gilad Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame^] | 135 | DBusConnectionAddFilter(kMockSystemBus, _, _, _)) |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 136 | .WillOnce(Return(1)); |
| 137 | EXPECT_CALL(dbus_iface, |
Gilad Arnold | b752fb3 | 2014-03-03 12:23:39 -0800 | [diff] [blame] | 138 | ProxyNewForName(kMockSystemGBus, |
| 139 | StrEq(kLibCrosServiceName), |
| 140 | StrEq(kLibCrosServicePath), |
| 141 | StrEq(kLibCrosServiceInterface))) |
| 142 | .WillOnce(Return(kMockDbusProxy)); |
Andrew de los Reyes | 518502a | 2011-03-14 14:19:39 -0700 | [diff] [blame] | 143 | if (chrome_alive) |
Gilad Arnold | b752fb3 | 2014-03-03 12:23:39 -0800 | [diff] [blame] | 144 | EXPECT_CALL(dbus_iface, ProxyCall_3_0( |
Andrew de los Reyes | 518502a | 2011-03-14 14:19:39 -0700 | [diff] [blame] | 145 | kMockDbusProxy, |
| 146 | StrEq(kLibCrosServiceResolveNetworkProxyMethodName), |
| 147 | _, |
Gilad Arnold | b752fb3 | 2014-03-03 12:23:39 -0800 | [diff] [blame] | 148 | StrEq(kUrl), |
| 149 | StrEq(kLibCrosProxyResolveSignalInterface), |
| 150 | StrEq(kLibCrosProxyResolveName))) |
Andrew de los Reyes | 518502a | 2011-03-14 14:19:39 -0700 | [diff] [blame] | 151 | .WillOnce(Return(chrome_alive ? TRUE : FALSE)); |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 152 | EXPECT_CALL(dbus_iface, |
Gilad Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame^] | 153 | DBusConnectionRemoveFilter(kMockSystemBus, _, _)); |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 154 | if (chrome_replies) { |
| 155 | EXPECT_CALL(dbus_iface, |
Gilad Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame^] | 156 | DBusMessageIsSignal(kMockDbusMessage, |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 157 | kLibCrosProxyResolveSignalInterface, |
| 158 | kLibCrosProxyResolveName)) |
| 159 | .WillOnce(Return(1)); |
| 160 | EXPECT_CALL(dbus_iface, |
Gilad Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame^] | 161 | DBusMessageGetArgs_3(kMockDbusMessage, _, _, _, _)) |
Gilad Arnold | b752fb3 | 2014-03-03 12:23:39 -0800 | [diff] [blame] | 162 | .WillOnce(DoAll(SetArgumentPointee<2>(strdup(kUrl)), |
| 163 | SetArgumentPointee<3>( |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 164 | 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 Arnold | b752fb3 | 2014-03-03 12:23:39 -0800 | [diff] [blame] | 171 | EXPECT_EQ(true, resolver.Init()); |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 172 | 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 Arnold | 1b9d6ae | 2014-03-03 13:46:07 -0800 | [diff] [blame^] | 182 | &DBusWrapperTestResolved : |
| 183 | &DBusWrapperTestResolvedNoReply, |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 184 | loop)); |
| 185 | g_main_loop_run(loop); |
| 186 | g_main_loop_unref(loop); |
| 187 | } |
| 188 | } // namespace {} |
| 189 | |
| 190 | TEST(ChromeBrowserProxyResolverTest, SuccessTest) { |
Andrew de los Reyes | 518502a | 2011-03-14 14:19:39 -0700 | [diff] [blame] | 191 | RunTest(true, true); |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 192 | } |
| 193 | |
| 194 | TEST(ChromeBrowserProxyResolverTest, NoReplyTest) { |
Andrew de los Reyes | 518502a | 2011-03-14 14:19:39 -0700 | [diff] [blame] | 195 | RunTest(false, true); |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 196 | } |
| 197 | |
| 198 | TEST(ChromeBrowserProxyResolverTest, NoChromeTest) { |
Andrew de los Reyes | 518502a | 2011-03-14 14:19:39 -0700 | [diff] [blame] | 199 | RunTest(false, false); |
Andrew de los Reyes | 000d895 | 2011-03-02 15:21:14 -0800 | [diff] [blame] | 200 | } |
| 201 | |
| 202 | } // namespace chromeos_update_engine |