aboutsummaryrefslogtreecommitdiffstats
path: root/brillo/http/http_proxy_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'brillo/http/http_proxy_unittest.cc')
-rw-r--r--brillo/http/http_proxy_unittest.cc180
1 files changed, 180 insertions, 0 deletions
diff --git a/brillo/http/http_proxy_unittest.cc b/brillo/http/http_proxy_unittest.cc
new file mode 100644
index 0000000..4893a87
--- /dev/null
+++ b/brillo/http/http_proxy_unittest.cc
@@ -0,0 +1,180 @@
+// Copyright 2017 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <brillo/http/http_proxy.h>
+
+#include <string>
+#include <vector>
+
+#include <base/bind.h>
+#include <brillo/http/http_transport.h>
+#include <chromeos/dbus/service_constants.h>
+#include <dbus/mock_bus.h>
+#include <dbus/mock_object_proxy.h>
+#include <gtest/gtest.h>
+
+using ::testing::_;
+using ::testing::ElementsAre;
+using ::testing::Invoke;
+using ::testing::Return;
+
+namespace {
+constexpr char kTestUrl[] = "http://www.example.com/test";
+} // namespace
+
+namespace brillo {
+namespace http {
+
+class HttpProxyTest : public testing::Test {
+ public:
+ void ResolveProxyHandlerAsync(dbus::MethodCall* method_call,
+ int timeout_msec,
+ dbus::ObjectProxy::ResponseCallback callback) {
+ if (null_dbus_response_) {
+ callback.Run(nullptr);
+ return;
+ }
+ callback.Run(CreateDBusResponse(method_call).get());
+ }
+
+ dbus::Response* ResolveProxyHandler(dbus::MethodCall* method_call,
+ int timeout_msec) {
+ if (null_dbus_response_) {
+ return nullptr;
+ }
+ // The mock wraps this back into a std::unique_ptr in the function calling
+ // us.
+ return CreateDBusResponse(method_call).release();
+ }
+
+ MOCK_METHOD2(GetProxiesCallback, void(bool, const std::vector<std::string>&));
+
+ protected:
+ HttpProxyTest() {
+ dbus::Bus::Options options;
+ options.bus_type = dbus::Bus::SYSTEM;
+ bus_ = new dbus::MockBus(options);
+ object_proxy_ = new dbus::MockObjectProxy(
+ bus_.get(), chromeos::kNetworkProxyServiceName,
+ dbus::ObjectPath(chromeos::kNetworkProxyServicePath));
+ EXPECT_CALL(*bus_, GetObjectProxy(chromeos::kNetworkProxyServiceName,
+ dbus::ObjectPath(
+ chromeos::kNetworkProxyServicePath)))
+ .WillOnce(Return(object_proxy_.get()));
+ }
+
+ std::unique_ptr<dbus::Response> CreateDBusResponse(
+ dbus::MethodCall* method_call) {
+ EXPECT_EQ(method_call->GetInterface(),
+ chromeos::kNetworkProxyServiceInterface);
+ EXPECT_EQ(method_call->GetMember(),
+ chromeos::kNetworkProxyServiceResolveProxyMethod);
+ method_call->SetSerial(1); // Needs to be non-zero or it fails.
+ std::unique_ptr<dbus::Response> response =
+ dbus::Response::FromMethodCall(method_call);
+ dbus::MessageWriter writer(response.get());
+ writer.AppendString(proxy_info_);
+ if (invalid_dbus_response_) {
+ return response;
+ }
+ writer.AppendString(proxy_err_);
+ return response;
+ }
+
+ scoped_refptr<dbus::MockBus> bus_;
+ scoped_refptr<dbus::MockObjectProxy> object_proxy_;
+
+ std::string proxy_info_;
+ std::string proxy_err_;
+ bool null_dbus_response_ = false;
+ bool invalid_dbus_response_ = false;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(HttpProxyTest);
+};
+
+TEST_F(HttpProxyTest, DBusNullResponseFails) {
+ std::vector<std::string> proxies;
+ null_dbus_response_ = true;
+ EXPECT_CALL(*object_proxy_, MockCallMethodAndBlock(_, _))
+ .WillOnce(Invoke(this, &HttpProxyTest::ResolveProxyHandler));
+ EXPECT_FALSE(GetChromeProxyServers(bus_, kTestUrl, &proxies));
+}
+
+TEST_F(HttpProxyTest, DBusInvalidResponseFails) {
+ std::vector<std::string> proxies;
+ invalid_dbus_response_ = true;
+ EXPECT_CALL(*object_proxy_, MockCallMethodAndBlock(_, _))
+ .WillOnce(Invoke(this, &HttpProxyTest::ResolveProxyHandler));
+ EXPECT_FALSE(GetChromeProxyServers(bus_, kTestUrl, &proxies));
+}
+
+TEST_F(HttpProxyTest, NoProxies) {
+ std::vector<std::string> proxies;
+ EXPECT_CALL(*object_proxy_, MockCallMethodAndBlock(_, _))
+ .WillOnce(Invoke(this, &HttpProxyTest::ResolveProxyHandler));
+ EXPECT_TRUE(GetChromeProxyServers(bus_, kTestUrl, &proxies));
+ EXPECT_THAT(proxies, ElementsAre(kDirectProxy));
+}
+
+TEST_F(HttpProxyTest, MultipleProxiesWithoutDirect) {
+ proxy_info_ = "proxy example.com; socks5 foo.com;";
+ std::vector<std::string> proxies;
+ EXPECT_CALL(*object_proxy_, MockCallMethodAndBlock(_, _))
+ .WillOnce(Invoke(this, &HttpProxyTest::ResolveProxyHandler));
+ EXPECT_TRUE(GetChromeProxyServers(bus_, kTestUrl, &proxies));
+ EXPECT_THAT(proxies, ElementsAre("http://example.com", "socks5://foo.com",
+ kDirectProxy));
+}
+
+TEST_F(HttpProxyTest, MultipleProxiesWithDirect) {
+ proxy_info_ = "socks foo.com; Https example.com ; badproxy example2.com ; "
+ "socks5 test.com ; proxy foobar.com; DIRECT ";
+ std::vector<std::string> proxies;
+ EXPECT_CALL(*object_proxy_, MockCallMethodAndBlock(_, _))
+ .WillOnce(Invoke(this, &HttpProxyTest::ResolveProxyHandler));
+ EXPECT_TRUE(GetChromeProxyServers(bus_, kTestUrl, &proxies));
+ EXPECT_THAT(proxies, ElementsAre("socks4://foo.com", "https://example.com",
+ "socks5://test.com", "http://foobar.com",
+ kDirectProxy));
+}
+
+TEST_F(HttpProxyTest, DBusNullResponseFailsAsync) {
+ null_dbus_response_ = true;
+ EXPECT_CALL(*object_proxy_, CallMethod(_, _, _))
+ .WillOnce(Invoke(this, &HttpProxyTest::ResolveProxyHandlerAsync));
+ EXPECT_CALL(*this, GetProxiesCallback(false, _));
+ GetChromeProxyServersAsync(
+ bus_, kTestUrl,
+ base::Bind(&HttpProxyTest::GetProxiesCallback, base::Unretained(this)));
+}
+
+TEST_F(HttpProxyTest, DBusInvalidResponseFailsAsync) {
+ invalid_dbus_response_ = true;
+ EXPECT_CALL(*object_proxy_, CallMethod(_, _, _))
+ .WillOnce(Invoke(this, &HttpProxyTest::ResolveProxyHandlerAsync));
+ EXPECT_CALL(*this, GetProxiesCallback(false, _));
+ GetChromeProxyServersAsync(
+ bus_, kTestUrl,
+ base::Bind(&HttpProxyTest::GetProxiesCallback, base::Unretained(this)));
+}
+
+// We don't need to test all the proxy cases with async because that will be
+// using the same internal parsing code.
+TEST_F(HttpProxyTest, MultipleProxiesWithDirectAsync) {
+ proxy_info_ = "socks foo.com; Https example.com ; badproxy example2.com ; "
+ "socks5 test.com ; proxy foobar.com; DIRECT ";
+ std::vector<std::string> expected = {
+ "socks4://foo.com", "https://example.com", "socks5://test.com",
+ "http://foobar.com", kDirectProxy};
+ EXPECT_CALL(*object_proxy_, CallMethod(_, _, _))
+ .WillOnce(Invoke(this, &HttpProxyTest::ResolveProxyHandlerAsync));
+ EXPECT_CALL(*this, GetProxiesCallback(true, expected));
+ GetChromeProxyServersAsync(
+ bus_, kTestUrl,
+ base::Bind(&HttpProxyTest::GetProxiesCallback, base::Unretained(this)));
+}
+
+} // namespace http
+} // namespace brillo