blob: 62ee2e078cf7625f4f57c8fee3f6f19d3921bae6 [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>
Alex Deymo30534502015-07-20 15:06:33 -07009#include <vector>
Andrew de los Reyes000d8952011-03-02 15:21:14 -080010
11#include <gtest/gtest.h>
12
Alex Deymo60ca1a72015-06-18 18:19:15 -070013#include <base/bind.h>
Alex Deymo30534502015-07-20 15:06:33 -070014#include <chromeos/make_unique_ptr.h>
Alex Deymo60ca1a72015-06-18 18:19:15 -070015#include <chromeos/message_loops/fake_message_loop.h>
16
Alex Deymo30534502015-07-20 15:06:33 -070017#include "update_engine/dbus_mocks.h"
18#include "update_engine/dbus_test_utils.h"
Andrew de los Reyes000d8952011-03-02 15:21:14 -080019
Andrew de los Reyes000d8952011-03-02 15:21:14 -080020using ::testing::Return;
Andrew de los Reyes000d8952011-03-02 15:21:14 -080021using ::testing::StrEq;
Alex Deymof329b932014-10-30 01:37:48 -070022using ::testing::_;
Alex Deymo60ca1a72015-06-18 18:19:15 -070023using chromeos::MessageLoop;
Alex Deymo30534502015-07-20 15:06:33 -070024using org::chromium::LibCrosServiceInterfaceProxyMock;
25using org::chromium::UpdateEngineLibcrosProxyResolvedInterfaceProxyMock;
Alex Deymof329b932014-10-30 01:37:48 -070026using std::deque;
27using std::string;
Alex Deymo30534502015-07-20 15:06:33 -070028using std::vector;
Andrew de los Reyes000d8952011-03-02 15:21:14 -080029
30namespace chromeos_update_engine {
31
Alex Deymo60ca1a72015-06-18 18:19:15 -070032class ChromeBrowserProxyResolverTest : public ::testing::Test {
33 protected:
Alex Deymo30534502015-07-20 15:06:33 -070034 ChromeBrowserProxyResolverTest()
35 : service_interface_mock_(new LibCrosServiceInterfaceProxyMock()),
36 ue_proxy_resolved_interface_mock_(
37 new UpdateEngineLibcrosProxyResolvedInterfaceProxyMock()),
38 libcros_proxy_(
39 chromeos::make_unique_ptr(service_interface_mock_),
40 chromeos::make_unique_ptr(ue_proxy_resolved_interface_mock_)) {}
41
Alex Deymo60ca1a72015-06-18 18:19:15 -070042 void SetUp() override {
43 loop_.SetAsCurrent();
Alex Deymo30534502015-07-20 15:06:33 -070044 // The ProxyResolved signal should be subscribed to.
45 MOCK_SIGNAL_HANDLER_EXPECT_SIGNAL_HANDLER(
46 ue_proxy_resolved_signal_,
47 *ue_proxy_resolved_interface_mock_,
48 ProxyResolved);
49
50 EXPECT_TRUE(resolver_.Init());
51 // Run the loop once to dispatch the successfully registered signal handler.
52 EXPECT_TRUE(loop_.RunOnce(false));
Alex Deymo60ca1a72015-06-18 18:19:15 -070053 }
Andrew de los Reyes000d8952011-03-02 15:21:14 -080054
Alex Deymo60ca1a72015-06-18 18:19:15 -070055 void TearDown() override {
56 EXPECT_FALSE(loop_.PendingTasks());
57 }
58
Alex Deymo30534502015-07-20 15:06:33 -070059 // Send the signal to the callback passed during registration of the
60 // ProxyResolved.
61 void SendReplySignal(const string& source_url,
62 const string& proxy_info,
63 const string& error_message);
64
65 void RunTest(bool chrome_replies, bool chrome_alive);
66
Alex Deymo60ca1a72015-06-18 18:19:15 -070067 private:
68 chromeos::FakeMessageLoop loop_{nullptr};
Alex Deymo30534502015-07-20 15:06:33 -070069
70 // Local pointers to the mocks. The instances are owned by the
71 // |libcros_proxy_|.
72 LibCrosServiceInterfaceProxyMock* service_interface_mock_;
73 UpdateEngineLibcrosProxyResolvedInterfaceProxyMock*
74 ue_proxy_resolved_interface_mock_;
75
76 // The registered signal handler for the signal
77 // UpdateEngineLibcrosProxyResolvedInterface.ProxyResolved.
78 chromeos_update_engine::dbus_test_utils::MockSignalHandler<
79 void(const string&, const string&, const string&)>
80 ue_proxy_resolved_signal_;
81
82 LibCrosProxy libcros_proxy_;
83 ChromeBrowserProxyResolver resolver_{&libcros_proxy_};
Alex Deymo60ca1a72015-06-18 18:19:15 -070084};
85
Alex Deymo30534502015-07-20 15:06:33 -070086
87void ChromeBrowserProxyResolverTest::SendReplySignal(
88 const string& source_url,
89 const string& proxy_info,
90 const string& error_message) {
91 ASSERT_TRUE(ue_proxy_resolved_signal_.IsHandlerRegistered());
92 ue_proxy_resolved_signal_.signal_callback().Run(
93 source_url, proxy_info, error_message);
94}
95
96namespace {
97void CheckResponseResolved(const deque<string>& proxies,
98 void* /* pirv_data */) {
99 EXPECT_EQ(2, proxies.size());
100 EXPECT_EQ("socks5://192.168.52.83:5555", proxies[0]);
101 EXPECT_EQ(kNoProxy, proxies[1]);
102 MessageLoop::current()->BreakLoop();
103}
104
105void CheckResponseNoReply(const deque<string>& proxies, void* /* pirv_data */) {
106 EXPECT_EQ(1, proxies.size());
107 EXPECT_EQ(kNoProxy, proxies[0]);
108 MessageLoop::current()->BreakLoop();
109}
110} // namespace
111
112// chrome_replies should be set to whether or not we fake a reply from
113// chrome. If there's no reply, the resolver should time out.
114// If chrome_alive is false, assume that sending to chrome fails.
115void ChromeBrowserProxyResolverTest::RunTest(bool chrome_replies,
116 bool chrome_alive) {
117 char kUrl[] = "http://example.com/blah";
118 char kProxyConfig[] = "SOCKS5 192.168.52.83:5555;DIRECT";
119
120 EXPECT_CALL(*service_interface_mock_,
121 ResolveNetworkProxy(StrEq(kUrl),
122 StrEq(kLibCrosProxyResolveSignalInterface),
123 StrEq(kLibCrosProxyResolveName),
124 _,
125 _))
126 .WillOnce(Return(chrome_alive));
127
128 ProxiesResolvedFn get_proxies_response = &CheckResponseNoReply;
129 if (chrome_replies) {
130 get_proxies_response = &CheckResponseResolved;
131 MessageLoop::current()->PostDelayedTask(
132 FROM_HERE,
133 base::Bind(&ChromeBrowserProxyResolverTest::SendReplySignal,
134 base::Unretained(this),
135 kUrl,
136 kProxyConfig,
137 ""),
138 base::TimeDelta::FromSeconds(1));
139 }
140
141 EXPECT_TRUE(resolver_.GetProxiesForUrl(kUrl, get_proxies_response, nullptr));
142 MessageLoop::current()->Run();
143}
144
145
Alex Deymo60ca1a72015-06-18 18:19:15 -0700146TEST_F(ChromeBrowserProxyResolverTest, ParseTest) {
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800147 // Test ideas from
148 // http://src.chromium.org/svn/trunk/src/net/proxy/proxy_list_unittest.cc
Alex Deymo30534502015-07-20 15:06:33 -0700149 vector<string> inputs = {
150 "PROXY foopy:10",
151 " DIRECT", // leading space.
152 "PROXY foopy1 ; proxy foopy2;\t DIRECT",
153 "proxy foopy1 ; SOCKS foopy2",
154 "DIRECT ; proxy foopy1 ; DIRECT ; SOCKS5 foopy2;DIRECT ",
155 "DIRECT ; proxy foopy1:80; DIRECT ; DIRECT",
156 "PROXY-foopy:10",
157 "PROXY",
158 "PROXY foopy1 ; JUNK ; JUNK ; SOCKS5 foopy2 ; ;",
159 "HTTP foopy1; SOCKS5 foopy2"};
160 vector<deque<string>> outputs = {
161 {"http://foopy:10", kNoProxy},
162 {kNoProxy},
163 {"http://foopy1", "http://foopy2", kNoProxy},
164 {"http://foopy1", "socks4://foopy2", kNoProxy},
165 {kNoProxy, "http://foopy1", kNoProxy, "socks5://foopy2", kNoProxy},
166 {kNoProxy, "http://foopy1:80", kNoProxy, kNoProxy},
167 {kNoProxy},
168 {kNoProxy},
169 {"http://foopy1", "socks5://foopy2", kNoProxy},
170 {"socks5://foopy2", kNoProxy}};
171 ASSERT_EQ(inputs.size(), outputs.size());
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800172
Alex Deymo30534502015-07-20 15:06:33 -0700173 for (size_t i = 0; i < inputs.size(); i++) {
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800174 deque<string> results =
175 ChromeBrowserProxyResolver::ParseProxyString(inputs[i]);
176 deque<string>& expected = outputs[i];
177 EXPECT_EQ(results.size(), expected.size()) << "i = " << i;
178 if (expected.size() != results.size())
179 continue;
180 for (size_t j = 0; j < expected.size(); j++) {
181 EXPECT_EQ(expected[j], results[j]) << "i = " << i;
182 }
183 }
184}
185
Alex Deymo60ca1a72015-06-18 18:19:15 -0700186TEST_F(ChromeBrowserProxyResolverTest, SuccessTest) {
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700187 RunTest(true, true);
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800188}
189
Alex Deymo60ca1a72015-06-18 18:19:15 -0700190TEST_F(ChromeBrowserProxyResolverTest, NoReplyTest) {
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700191 RunTest(false, true);
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800192}
193
Alex Deymo60ca1a72015-06-18 18:19:15 -0700194TEST_F(ChromeBrowserProxyResolverTest, NoChromeTest) {
Andrew de los Reyes518502a2011-03-14 14:19:39 -0700195 RunTest(false, false);
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800196}
197
198} // namespace chromeos_update_engine