| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 // | 4 // |
| 5 // This test is relatively complicated. Here's the summary of what it does: | 5 // This test is relatively complicated. Here's the summary of what it does: |
| 6 // | 6 // |
| 7 // - Set up mock D-Bus related objects to mock out D-Bus calls. | 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. | 8 // - Set up a mock proxy resolver to mock out the proxy resolution. |
| 9 // - Create ProxyResolutionServiceProvider by injecting the mocks | 9 // - Create ProxyResolutionServiceProvider by injecting the mocks |
| 10 // - Start the service provider. | 10 // - Start the service provider. |
| 11 // - Request ProxyResolutionServiceProvider to resolve proxy for kSourceURL. | 11 // - Request ProxyResolutionServiceProvider to resolve proxy for kSourceURL. |
| 12 // - ProxyResolutionServiceProvider will return the result as a signal. | 12 // - ProxyResolutionServiceProvider will return the result as a signal. |
| 13 // - Confirm that we receive the signal and check the contents of the signal. | 13 // - Confirm that we receive the signal and check the contents of the signal. |
| 14 | 14 |
| 15 #include "chrome/browser/chromeos/dbus/proxy_resolution_service_provider.h" | 15 #include "chrome/browser/chromeos/dbus/proxy_resolution_service_provider.h" |
| 16 | 16 |
| 17 #include "base/bind.h" | 17 #include "base/bind.h" |
| 18 #include "base/logging.h" | 18 #include "base/logging.h" |
| 19 #include "base/memory/ref_counted.h" | 19 #include "base/memory/ref_counted.h" |
| 20 #include "base/message_loop.h" |
| 20 #include "dbus/message.h" | 21 #include "dbus/message.h" |
| 21 #include "dbus/mock_bus.h" | 22 #include "dbus/mock_bus.h" |
| 22 #include "dbus/mock_exported_object.h" | 23 #include "dbus/mock_exported_object.h" |
| 23 #include "dbus/mock_object_proxy.h" | 24 #include "dbus/mock_object_proxy.h" |
| 24 #include "testing/gmock/include/gmock/gmock.h" | 25 #include "testing/gmock/include/gmock/gmock.h" |
| 25 #include "testing/gtest/include/gtest/gtest.h" | 26 #include "testing/gtest/include/gtest/gtest.h" |
| 26 #include "third_party/cros_system_api/dbus/service_constants.h" | 27 #include "third_party/cros_system_api/dbus/service_constants.h" |
| 27 | 28 |
| 28 using ::testing::_; | 29 using ::testing::_; |
| 29 using ::testing::Invoke; | 30 using ::testing::Invoke; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 54 void(const std::string& source_url, | 55 void(const std::string& source_url, |
| 55 const std::string& signal_interface, | 56 const std::string& signal_interface, |
| 56 const std::string& signal_name, | 57 const std::string& signal_name, |
| 57 scoped_refptr<dbus::ExportedObject> exported_object)); | 58 scoped_refptr<dbus::ExportedObject> exported_object)); |
| 58 }; | 59 }; |
| 59 | 60 |
| 60 class ProxyResolutionServiceProviderTest : public testing::Test { | 61 class ProxyResolutionServiceProviderTest : public testing::Test { |
| 61 public: | 62 public: |
| 62 ProxyResolutionServiceProviderTest() | 63 ProxyResolutionServiceProviderTest() |
| 63 : signal_received_successfully_(false), | 64 : signal_received_successfully_(false), |
| 64 mock_resolver_(NULL) { | 65 mock_resolver_(NULL), |
| 66 response_received_(false) { |
| 65 } | 67 } |
| 66 | 68 |
| 67 virtual void SetUp() { | 69 virtual void SetUp() { |
| 68 // Create a mock bus. | 70 // Create a mock bus. |
| 69 dbus::Bus::Options options; | 71 dbus::Bus::Options options; |
| 70 options.bus_type = dbus::Bus::SYSTEM; | 72 options.bus_type = dbus::Bus::SYSTEM; |
| 71 mock_bus_ = new dbus::MockBus(options); | 73 mock_bus_ = new dbus::MockBus(options); |
| 72 | 74 |
| 73 // ShutdownAndBlock() will be called in TearDown(). | 75 // ShutdownAndBlock() will be called in TearDown(). |
| 74 EXPECT_CALL(*mock_bus_, ShutdownAndBlock()).WillOnce(Return()); | 76 EXPECT_CALL(*mock_bus_, ShutdownAndBlock()).WillOnce(Return()); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 95 Invoke(this, | 97 Invoke(this, |
| 96 &ProxyResolutionServiceProviderTest::MockSendSignal)); | 98 &ProxyResolutionServiceProviderTest::MockSendSignal)); |
| 97 | 99 |
| 98 // Create a mock object proxy, with which we call a method of | 100 // Create a mock object proxy, with which we call a method of |
| 99 // |mock_exported_object_|. | 101 // |mock_exported_object_|. |
| 100 mock_object_proxy_ = | 102 mock_object_proxy_ = |
| 101 new dbus::MockObjectProxy(mock_bus_.get(), | 103 new dbus::MockObjectProxy(mock_bus_.get(), |
| 102 kLibCrosServiceName, | 104 kLibCrosServiceName, |
| 103 kLibCrosServicePath); | 105 kLibCrosServicePath); |
| 104 // |mock_object_proxy_|'s CallMethodAndBlock() will use | 106 // |mock_object_proxy_|'s CallMethodAndBlock() will use |
| 105 // CreateResponse() to return responses. | 107 // MockCallMethodAndBlock() to return responses. |
| 106 EXPECT_CALL(*mock_object_proxy_, | 108 EXPECT_CALL(*mock_object_proxy_, |
| 107 CallMethodAndBlock(_, _)) | 109 CallMethodAndBlock(_, _)) |
| 108 .WillOnce(Invoke( | 110 .WillOnce(Invoke( |
| 109 this, | 111 this, |
| 110 &ProxyResolutionServiceProviderTest::CreateResponse)); | 112 &ProxyResolutionServiceProviderTest::MockCallMethodAndBlock)); |
| 111 // |mock_object_proxy_|'s ConnectToSignal will use | 113 // |mock_object_proxy_|'s ConnectToSignal will use |
| 112 // MockConnectToSignal(). | 114 // MockConnectToSignal(). |
| 113 EXPECT_CALL(*mock_object_proxy_, | 115 EXPECT_CALL(*mock_object_proxy_, |
| 114 ConnectToSignal(kReturnSignalInterface, | 116 ConnectToSignal(kReturnSignalInterface, |
| 115 kReturnSignalName, | 117 kReturnSignalName, |
| 116 _, _)) | 118 _, _)) |
| 117 .WillOnce(Invoke( | 119 .WillOnce(Invoke( |
| 118 this, | 120 this, |
| 119 &ProxyResolutionServiceProviderTest::MockConnectToSignal)); | 121 &ProxyResolutionServiceProviderTest::MockConnectToSignal)); |
| 120 | 122 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 | 180 |
| 179 protected: | 181 protected: |
| 180 bool signal_received_successfully_; | 182 bool signal_received_successfully_; |
| 181 MockProxyResolver* mock_resolver_; | 183 MockProxyResolver* mock_resolver_; |
| 182 scoped_refptr<dbus::MockBus> mock_bus_; | 184 scoped_refptr<dbus::MockBus> mock_bus_; |
| 183 scoped_refptr<dbus::MockExportedObject> mock_exported_object_; | 185 scoped_refptr<dbus::MockExportedObject> mock_exported_object_; |
| 184 scoped_refptr<dbus::MockObjectProxy> mock_object_proxy_; | 186 scoped_refptr<dbus::MockObjectProxy> mock_object_proxy_; |
| 185 scoped_ptr<ProxyResolutionServiceProvider> proxy_resolution_service_; | 187 scoped_ptr<ProxyResolutionServiceProvider> proxy_resolution_service_; |
| 186 dbus::ExportedObject::MethodCallCallback resolve_network_proxy_; | 188 dbus::ExportedObject::MethodCallCallback resolve_network_proxy_; |
| 187 dbus::ObjectProxy::SignalCallback on_signal_callback_; | 189 dbus::ObjectProxy::SignalCallback on_signal_callback_; |
| 190 MessageLoop message_loop_; |
| 191 bool response_received_; |
| 192 scoped_ptr<dbus::Response> response_; |
| 188 | 193 |
| 189 private: | 194 private: |
| 190 // Behaves as |mock_exported_object_|'s ExportMethod(). | 195 // Behaves as |mock_exported_object_|'s ExportMethod(). |
| 191 void MockExportMethod( | 196 void MockExportMethod( |
| 192 const std::string& interface_name, | 197 const std::string& interface_name, |
| 193 const std::string& method_name, | 198 const std::string& method_name, |
| 194 dbus::ExportedObject::MethodCallCallback method_callback, | 199 dbus::ExportedObject::MethodCallCallback method_callback, |
| 195 dbus::ExportedObject::OnExportedCallback on_exported_callback) { | 200 dbus::ExportedObject::OnExportedCallback on_exported_callback) { |
| 196 if (interface_name == kLibCrosServiceInterface && | 201 if (interface_name == kLibCrosServiceInterface && |
| 197 method_name == kResolveNetworkProxy) { | 202 method_name == kResolveNetworkProxy) { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 writer.AppendString(kReturnEmptyErrorMessage); | 235 writer.AppendString(kReturnEmptyErrorMessage); |
| 231 // Send the signal back to the requested signal interface and the | 236 // Send the signal back to the requested signal interface and the |
| 232 // signal name. | 237 // signal name. |
| 233 exported_object->SendSignal(&signal); | 238 exported_object->SendSignal(&signal); |
| 234 return; | 239 return; |
| 235 } | 240 } |
| 236 | 241 |
| 237 LOG(ERROR) << "Unexpected source URL: " << source_url; | 242 LOG(ERROR) << "Unexpected source URL: " << source_url; |
| 238 } | 243 } |
| 239 | 244 |
| 240 // Creates a response for |mock_object_proxy_|. | 245 // Calls exported method and waits for a response for |mock_object_proxy_|. |
| 241 dbus::Response* CreateResponse( | 246 dbus::Response* MockCallMethodAndBlock( |
| 242 dbus::MethodCall* method_call, | 247 dbus::MethodCall* method_call, |
| 243 Unused) { | 248 Unused) { |
| 244 if (method_call->GetInterface() == | 249 if (method_call->GetInterface() != kLibCrosServiceInterface || |
| 245 kLibCrosServiceInterface && | 250 method_call->GetMember() != kResolveNetworkProxy) { |
| 246 method_call->GetMember() == kResolveNetworkProxy) { | 251 LOG(ERROR) << "Unexpected method call: " << method_call->ToString(); |
| 247 // Set the serial number to non-zero, so | 252 return NULL; |
| 248 // dbus_message_new_method_return() won't emit a warning. | |
| 249 method_call->SetSerial(1); | |
| 250 // Run the callback captured in MockExportMethod(). This will send | |
| 251 // a signal, which will be received by |on_signal_callback_|. | |
| 252 dbus::Response* response = resolve_network_proxy_.Run(method_call); | |
| 253 return response; | |
| 254 } | 253 } |
| 254 // Set the serial number to non-zero, so |
| 255 // dbus_message_new_method_return() won't emit a warning. |
| 256 method_call->SetSerial(1); |
| 257 // Run the callback captured in MockExportMethod(). In addition to returning |
| 258 // a response that the caller will ignore, this will send a signal, which |
| 259 // will be received by |on_signal_callback_|. |
| 260 resolve_network_proxy_.Run( |
| 261 method_call, |
| 262 base::Bind(&ProxyResolutionServiceProviderTest::OnResponse, |
| 263 base::Unretained(this))); |
| 264 // Wait for a response. |
| 265 while (!response_received_) { |
| 266 message_loop_.Run(); |
| 267 } |
| 268 // Return response. |
| 269 return response_.release(); |
| 270 } |
| 255 | 271 |
| 256 LOG(ERROR) << "Unexpected method call: " << method_call->ToString(); | 272 // Receives a response and makes it available to MockCallMethodAndBlock(). |
| 257 return NULL; | 273 void OnResponse(dbus::Response* response) { |
| 274 response_.reset(response); |
| 275 response_received_ = true; |
| 276 if (message_loop_.is_running()) { |
| 277 message_loop_.Quit(); |
| 278 } |
| 258 } | 279 } |
| 259 | 280 |
| 260 // Behaves as |mock_object_proxy_|'s ConnectToSignal(). | 281 // Behaves as |mock_object_proxy_|'s ConnectToSignal(). |
| 261 void MockConnectToSignal( | 282 void MockConnectToSignal( |
| 262 const std::string& interface_name, | 283 const std::string& interface_name, |
| 263 const std::string& signal_name, | 284 const std::string& signal_name, |
| 264 dbus::ObjectProxy::SignalCallback signal_callback, | 285 dbus::ObjectProxy::SignalCallback signal_callback, |
| 265 dbus::ObjectProxy::OnConnectedCallback connected_callback) { | 286 dbus::ObjectProxy::OnConnectedCallback connected_callback) { |
| 266 // Tell the callback that the object proxy is connected to the signal. | 287 // Tell the callback that the object proxy is connected to the signal. |
| 267 connected_callback.Run(interface_name, signal_name, true); | 288 connected_callback.Run(interface_name, signal_name, true); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 302 ASSERT_TRUE(response.get()); | 323 ASSERT_TRUE(response.get()); |
| 303 dbus::MessageReader reader(response.get()); | 324 dbus::MessageReader reader(response.get()); |
| 304 ASSERT_FALSE(reader.HasMoreData()); | 325 ASSERT_FALSE(reader.HasMoreData()); |
| 305 | 326 |
| 306 // Confirm that the signal is received successfully. | 327 // Confirm that the signal is received successfully. |
| 307 // The contents of the signal are checked in OnSignalReceived(). | 328 // The contents of the signal are checked in OnSignalReceived(). |
| 308 ASSERT_TRUE(signal_received_successfully_); | 329 ASSERT_TRUE(signal_received_successfully_); |
| 309 } | 330 } |
| 310 | 331 |
| 311 } // namespace chromeos | 332 } // namespace chromeos |
| OLD | NEW |