Chromium Code Reviews| Index: chrome/browser/chromeos/dbus/proxy_resolution_service_provider_unittest.cc |
| diff --git a/chrome/browser/chromeos/dbus/proxy_resolution_service_provider_unittest.cc b/chrome/browser/chromeos/dbus/proxy_resolution_service_provider_unittest.cc |
| index 93b2781a2c6cf8db0e7dbdc2016e477cb0aa990a..bbd2a4d685626d69aa85dab195bb3ac80de60e38 100644 |
| --- a/chrome/browser/chromeos/dbus/proxy_resolution_service_provider_unittest.cc |
| +++ b/chrome/browser/chromeos/dbus/proxy_resolution_service_provider_unittest.cc |
| @@ -17,6 +17,7 @@ |
| #include "base/bind.h" |
| #include "base/logging.h" |
| #include "base/memory/ref_counted.h" |
| +#include "base/message_loop.h" |
| #include "dbus/message.h" |
| #include "dbus/mock_bus.h" |
| #include "dbus/mock_exported_object.h" |
| @@ -61,7 +62,8 @@ class ProxyResolutionServiceProviderTest : public testing::Test { |
| public: |
| ProxyResolutionServiceProviderTest() |
| : signal_received_successfully_(false), |
| - mock_resolver_(NULL) { |
| + mock_resolver_(NULL), |
| + response_received_(false) { |
| } |
| virtual void SetUp() { |
| @@ -102,12 +104,12 @@ class ProxyResolutionServiceProviderTest : public testing::Test { |
| kLibCrosServiceName, |
| kLibCrosServicePath); |
| // |mock_object_proxy_|'s CallMethodAndBlock() will use |
| - // CreateResponse() to return responses. |
| + // MockCallMethodAndBlock() to return responses. |
| EXPECT_CALL(*mock_object_proxy_, |
| CallMethodAndBlock(_, _)) |
| .WillOnce(Invoke( |
| this, |
| - &ProxyResolutionServiceProviderTest::CreateResponse)); |
| + &ProxyResolutionServiceProviderTest::MockCallMethodAndBlock)); |
| // |mock_object_proxy_|'s ConnectToSignal will use |
| // MockConnectToSignal(). |
| EXPECT_CALL(*mock_object_proxy_, |
| @@ -185,6 +187,9 @@ class ProxyResolutionServiceProviderTest : public testing::Test { |
| scoped_ptr<ProxyResolutionServiceProvider> proxy_resolution_service_; |
| dbus::ExportedObject::MethodCallCallback resolve_network_proxy_; |
| dbus::ObjectProxy::SignalCallback on_signal_callback_; |
| + MessageLoop message_loop_; |
| + bool response_received_; |
| + scoped_ptr<dbus::Response> response_; |
| private: |
| // Behaves as |mock_exported_object_|'s ExportMethod(). |
| @@ -237,24 +242,40 @@ class ProxyResolutionServiceProviderTest : public testing::Test { |
| LOG(ERROR) << "Unexpected source URL: " << source_url; |
| } |
| - // Creates a response for |mock_object_proxy_|. |
| - dbus::Response* CreateResponse( |
| + // Calls exported method and waits for a response for |mock_object_proxy_|. |
| + dbus::Response* MockCallMethodAndBlock( |
| dbus::MethodCall* method_call, |
| Unused) { |
| - if (method_call->GetInterface() == |
| - kLibCrosServiceInterface && |
| - method_call->GetMember() == kResolveNetworkProxy) { |
| - // Set the serial number to non-zero, so |
| - // dbus_message_new_method_return() won't emit a warning. |
| - method_call->SetSerial(1); |
| - // Run the callback captured in MockExportMethod(). This will send |
| - // a signal, which will be received by |on_signal_callback_|. |
| - dbus::Response* response = resolve_network_proxy_.Run(method_call); |
| - return response; |
| + if (method_call->GetInterface() != kLibCrosServiceInterface || |
| + method_call->GetMember() != kResolveNetworkProxy) { |
| + LOG(ERROR) << "Unexpected method call: " << method_call->ToString(); |
| + return NULL; |
| } |
| + // Set the serial number to non-zero, so |
| + // dbus_message_new_method_return() won't emit a warning. |
| + method_call->SetSerial(1); |
| + // Run the callback captured in MockExportMethod(). In addition to returning |
| + // a response that the caller will ignore, this will send a signal, which |
| + // will be received by |on_signal_callback_|. |
| + resolve_network_proxy_.Run( |
| + method_call, |
| + base::Bind(&ProxyResolutionServiceProviderTest::OnResponse, |
| + base::Unretained(this))); |
| + // Wait for a response. |
| + while (!response_received_) { |
| + message_loop_.Run(); |
|
Paweł Hajdan Jr.
2011/11/30 08:46:11
This is generally an anti-pattern. Could you only
Vince Laviano
2011/11/30 23:47:48
http://codereview.chromium.org/8764006/
|
| + } |
| + // Return response. |
| + return response_.release(); |
| + } |
| - LOG(ERROR) << "Unexpected method call: " << method_call->ToString(); |
| - return NULL; |
| + // Receives a response and makes it available to MockCallMethodAndBlock(). |
| + void OnResponse(dbus::Response* response) { |
| + response_.reset(response); |
| + response_received_ = true; |
| + if (message_loop_.is_running()) { |
| + message_loop_.Quit(); |
| + } |
| } |
| // Behaves as |mock_object_proxy_|'s ConnectToSignal(). |