blob: 26337652f40056ec76d01395aa4793bb1f39a583 [file] [log] [blame]
// Copyright (c) 2012 The Chromium 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 "chromeos/dbus/services/proxy_resolution_service_provider.h"
#include "base/bind.h"
#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "chromeos/dbus/services/service_provider_test_helper.h"
#include "dbus/message.h"
#include "net/url_request/url_request_test_util.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
namespace chromeos {
namespace {
// ProxyResolutionServiceProvider will return the proxy info as a D-Bus
// signal, to the following signal interface and the signal name.
const char kReturnSignalInterface[] = "org.chromium.TestInterface";
const char kReturnSignalName[] = "TestSignal";
// Test ProxyResolverDelegate implementation.
class TestProxyResolverDelegate : public ProxyResolverDelegate {
public:
explicit TestProxyResolverDelegate(
const scoped_refptr<base::SingleThreadTaskRunner>& network_task_runner)
: request_context_getter_(
new net::TestURLRequestContextGetter(network_task_runner)) {}
~TestProxyResolverDelegate() override {}
// ProxyResolverDelegate override.
scoped_refptr<net::URLRequestContextGetter> GetRequestContext() override {
return request_context_getter_;
}
private:
scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_;
DISALLOW_COPY_AND_ASSIGN(TestProxyResolverDelegate);
};
} // namespace
class ProxyResolutionServiceProviderTest : public testing::Test {
public:
void SetUp() override {
// Create the proxy resolution service with the mock bus and the mock
// resolver injected.
service_provider_.reset(ProxyResolutionServiceProvider::Create(
base::MakeUnique<TestProxyResolverDelegate>(
base::ThreadTaskRunnerHandle::Get())));
test_helper_.SetUp(kResolveNetworkProxy, service_provider_.get());
// Connect to the signal that will be sent to kReturnSignalInterface and
// kReturnSignalName. ResolveNetworkProxy() will send the result as a
// signal. OnSignalReceived() will be called upon the delivery.
test_helper_.SetUpReturnSignal(
kReturnSignalInterface,
kReturnSignalName,
base::Bind(&ProxyResolutionServiceProviderTest::OnSignalReceived,
base::Unretained(this)),
base::Bind(&ProxyResolutionServiceProviderTest::OnConnectedToSignal,
base::Unretained(this)));
}
void TearDown() override {
test_helper_.TearDown();
service_provider_.reset();
}
protected:
// Called when a signal is received.
void OnSignalReceived(dbus::Signal* signal) {
EXPECT_EQ(kReturnSignalInterface, signal->GetInterface());
EXPECT_EQ(kReturnSignalName, signal->GetMember());
// The signal should contain three strings.
dbus::MessageReader reader(signal);
EXPECT_TRUE(reader.PopString(&source_url_));
EXPECT_TRUE(reader.PopString(&proxy_info_));
EXPECT_TRUE(reader.PopString(&error_message_));
}
// Called when connected to a signal.
void OnConnectedToSignal(const std::string& signal_interface,
const std::string& signal_name,
bool success){
EXPECT_EQ(kReturnSignalInterface, signal_interface);
EXPECT_EQ(kReturnSignalName, signal_name);
EXPECT_TRUE(success);
}
std::string source_url_;
std::string proxy_info_;
std::string error_message_;
ServiceProviderTestHelper test_helper_;
std::unique_ptr<CrosDBusService::ServiceProviderInterface> service_provider_;
};
TEST_F(ProxyResolutionServiceProviderTest, ResolveProxy) {
const char kSourceURL[] = "http://www.gmail.com/";
// Create a method call to resolve proxy config for kSourceURL.
dbus::MethodCall method_call(kLibCrosServiceInterface, kResolveNetworkProxy);
dbus::MessageWriter writer(&method_call);
writer.AppendString(kSourceURL);
writer.AppendString(kReturnSignalInterface);
writer.AppendString(kReturnSignalName);
// Call the ResolveNetworkProxy method.
std::unique_ptr<dbus::Response> response(
test_helper_.CallMethod(&method_call));
base::RunLoop().RunUntilIdle();
// An empty response should be returned.
ASSERT_TRUE(response.get());
dbus::MessageReader reader(response.get());
EXPECT_FALSE(reader.HasMoreData());
// Confirm that the signal is received successfully.
EXPECT_EQ(kSourceURL, source_url_);
EXPECT_EQ("DIRECT", proxy_info_);
EXPECT_EQ("", error_message_);
}
} // namespace chromeos