1 // Copyright (c) 2012 The Chromium 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.
5 // This test is relatively complicated. Here's the summary of what it does:
7 // - Set up mock D-Bus related objects to mock out D-Bus calls.
8 // - Set up a mock proxy resolver to mock out the proxy resolution.
9 // - Create ProxyResolutionServiceProvider by injecting the mocks
10 // - Start the service provider.
11 // - Request ProxyResolutionServiceProvider to resolve proxy for kSourceURL.
12 // - ProxyResolutionServiceProvider will return the result as a signal.
13 // - Confirm that we receive the signal and check the contents of the signal.
15 #include "chrome/browser/chromeos/dbus/proxy_resolution_service_provider.h"
17 #include "base/bind.h"
18 #include "chrome/browser/chromeos/dbus/service_provider_test_helper.h"
19 #include "dbus/message.h"
20 #include "dbus/mock_exported_object.h"
21 #include "third_party/cros_system_api/dbus/service_constants.h"
27 // We want to know about the proxy info for the URL.
28 const char kSourceURL[] = "http://www.gmail.com/";
30 // ProxyResolutionServiceProvider will return the proxy info as a D-Bus
31 // signal, to the following signal interface and the signal name.
32 const char kReturnSignalInterface[] = "org.chromium.TestInterface";
33 const char kReturnSignalName[] = "TestSignal";
35 // The returned proxy info.
36 const char kReturnProxyInfo[] = "PROXY cache.example.com:12345";
38 // The error message is empty if proxy resolution is successful.
39 const char kReturnEmptyErrorMessage[] = "";
41 // Mock for ProxyResolverInterface. We'll inject this to
42 // ProxyResolutionServiceProvider to mock out the proxy resolution.
43 class MockProxyResolver : public ProxyResolverInterface {
45 MOCK_METHOD4(ResolveProxy,
46 void(const std::string& source_url,
47 const std::string& signal_interface,
48 const std::string& signal_name,
49 scoped_refptr<dbus::ExportedObject> exported_object));
52 class ProxyResolutionServiceProviderTest : public testing::Test {
54 ProxyResolutionServiceProviderTest()
55 : signal_received_successfully_(false) {
58 virtual void SetUp() OVERRIDE {
59 // Create a mock proxy resolver. Will be owned by
60 // |proxy_resolution_service|.
61 MockProxyResolver* mock_resolver = new MockProxyResolver;
62 // |mock_resolver_|'s ResolveProxy() will use MockResolveProxy().
63 EXPECT_CALL(*mock_resolver,
64 ResolveProxy(kSourceURL, kReturnSignalInterface,
65 kReturnSignalName, _))
68 &ProxyResolutionServiceProviderTest::MockResolveProxy));
70 // Create the proxy resolution service with the mock bus and the mock
72 service_provider_.reset(
73 ProxyResolutionServiceProvider::CreateForTesting(mock_resolver));
75 test_helper_.SetUp(kResolveNetworkProxy, service_provider_.get());
77 // Connect to the signal that will be sent to kReturnSignalInterface and
78 // kReturnSignalName. ResolveNetworkProxy() will send the result as a
79 // signal. OnSignalReceived() will be called upon the delivery.
80 test_helper_.SetUpReturnSignal(
81 kReturnSignalInterface,
83 base::Bind(&ProxyResolutionServiceProviderTest::OnSignalReceived,
84 base::Unretained(this)),
85 base::Bind(&ProxyResolutionServiceProviderTest::OnConnectedToSignal,
86 base::Unretained(this)));
89 virtual void TearDown() OVERRIDE {
90 test_helper_.TearDown();
91 service_provider_.reset();
95 // Called when a signal is received.
96 void OnSignalReceived(dbus::Signal* signal) {
97 ASSERT_EQ(kReturnSignalInterface, signal->GetInterface());
98 ASSERT_EQ(kReturnSignalName, signal->GetMember());
100 std::string source_url;
101 std::string proxy_info;
102 std::string error_message;
104 // The signal should contain three strings.
105 dbus::MessageReader reader(signal);
106 ASSERT_TRUE(reader.PopString(&source_url));
107 ASSERT_TRUE(reader.PopString(&proxy_info));
108 ASSERT_TRUE(reader.PopString(&error_message));
110 // Check the signal contents.
111 EXPECT_EQ(kSourceURL, source_url);
112 EXPECT_EQ(kReturnProxyInfo, proxy_info);
113 EXPECT_EQ(kReturnEmptyErrorMessage, error_message);
115 // Mark that the signal is received successfully.
116 signal_received_successfully_ = true;
119 // Called when connected to a signal.
120 void OnConnectedToSignal(const std::string& signal_interface,
121 const std::string& signal_name,
123 ASSERT_EQ(kReturnSignalInterface, signal_interface);
124 ASSERT_EQ(kReturnSignalName, signal_name);
126 ASSERT_TRUE(success);
129 // Behaves as |mock_resolver_|'s ResolveProxy().
130 void MockResolveProxy(const std::string& source_url,
131 const std::string& signal_interface,
132 const std::string& signal_name,
133 scoped_refptr<dbus::ExportedObject> exported_object) {
134 if (source_url == kSourceURL) {
135 dbus::Signal signal(signal_interface,
137 dbus::MessageWriter writer(&signal);
138 writer.AppendString(kSourceURL);
139 writer.AppendString(kReturnProxyInfo);
140 writer.AppendString(kReturnEmptyErrorMessage);
141 // Send the signal back to the requested signal interface and the
143 exported_object->SendSignal(&signal);
147 LOG(ERROR) << "Unexpected source URL: " << source_url;
150 bool signal_received_successfully_;
151 ServiceProviderTestHelper test_helper_;
152 scoped_ptr<CrosDBusService::ServiceProviderInterface> service_provider_;
155 TEST_F(ProxyResolutionServiceProviderTest, ResolveProxy) {
156 // The signal is not yet received.
157 ASSERT_FALSE(signal_received_successfully_);
159 // Create a method call to resolve proxy config for kSourceURL.
160 dbus::MethodCall method_call(kLibCrosServiceInterface, kResolveNetworkProxy);
161 dbus::MessageWriter writer(&method_call);
162 writer.AppendString(kSourceURL);
163 writer.AppendString(kReturnSignalInterface);
164 writer.AppendString(kReturnSignalName);
166 // Call the ResolveNetworkProxy method.
167 scoped_ptr<dbus::Response> response(test_helper_.CallMethod(&method_call));
169 // An empty response should be returned.
170 ASSERT_TRUE(response.get());
171 dbus::MessageReader reader(response.get());
172 ASSERT_FALSE(reader.HasMoreData());
174 // Confirm that the signal is received successfully.
175 // The contents of the signal are checked in OnSignalReceived().
176 ASSERT_TRUE(signal_received_successfully_);
179 } // namespace chromeos