Index: mojo/public/cpp/bindings/tests/binding_unittest.cc |
diff --git a/mojo/public/cpp/bindings/tests/binding_unittest.cc b/mojo/public/cpp/bindings/tests/binding_unittest.cc |
index 91002a4503cb21edd7a4be87067596d182fad31e..e3741bb07e96ed495184f858e56109b8f2519b9c 100644 |
--- a/mojo/public/cpp/bindings/tests/binding_unittest.cc |
+++ b/mojo/public/cpp/bindings/tests/binding_unittest.cc |
@@ -11,6 +11,7 @@ |
#include <utility> |
#include "base/message_loop/message_loop.h" |
+#include "base/run_loop.h" |
#include "mojo/message_pump/message_pump_mojo.h" |
#include "mojo/public/cpp/bindings/strong_binding.h" |
#include "mojo/public/cpp/system/macros.h" |
@@ -66,13 +67,17 @@ TEST_F(BindingTest, Close) { |
bool called = false; |
sample::ServicePtr ptr; |
auto request = GetProxy(&ptr); |
- ptr.set_connection_error_handler([&called]() { called = true; }); |
+ base::RunLoop run_loop; |
+ ptr.set_connection_error_handler([&called, &run_loop]() { |
+ called = true; |
+ run_loop.Quit(); |
+ }); |
ServiceImpl impl; |
Binding<sample::Service> binding(&impl, std::move(request)); |
binding.Close(); |
EXPECT_FALSE(called); |
- loop().RunUntilIdle(); |
+ run_loop.Run(); |
EXPECT_TRUE(called); |
} |
@@ -82,21 +87,29 @@ TEST_F(BindingTest, DestroyClosesMessagePipe) { |
ServiceImpl impl; |
sample::ServicePtr ptr; |
auto request = GetProxy(&ptr); |
+ base::RunLoop run_loop; |
ptr.set_connection_error_handler( |
- [&encountered_error]() { encountered_error = true; }); |
+ [&encountered_error, &run_loop]() { |
+ encountered_error = true; |
+ run_loop.Quit(); |
+ }); |
bool called = false; |
- auto called_cb = [&called](int32_t result) { called = true; }; |
+ base::RunLoop run_loop2; |
+ auto called_cb = [&called, &run_loop2](int32_t result) { |
+ called = true; |
+ run_loop2.Quit(); |
+ }; |
{ |
Binding<sample::Service> binding(&impl, std::move(request)); |
ptr->Frobinate(nullptr, sample::Service::BAZ_OPTIONS_REGULAR, nullptr, |
called_cb); |
- loop().RunUntilIdle(); |
+ run_loop2.Run(); |
EXPECT_TRUE(called); |
EXPECT_FALSE(encountered_error); |
} |
// Now that the Binding is out of scope we should detect an error on the other |
// end of the pipe. |
- loop().RunUntilIdle(); |
+ run_loop.Run(); |
EXPECT_TRUE(encountered_error); |
// And calls should fail. |
@@ -115,10 +128,14 @@ TEST_F(BindingTest, ConnectionError) { |
ServiceImpl impl; |
sample::ServicePtr ptr; |
Binding<sample::Service> binding(&impl, GetProxy(&ptr)); |
- binding.set_connection_error_handler([&called]() { called = true; }); |
+ base::RunLoop run_loop; |
+ binding.set_connection_error_handler([&called, &run_loop]() { |
+ called = true; |
+ run_loop.Quit(); |
+ }); |
ptr.reset(); |
EXPECT_FALSE(called); |
- loop().RunUntilIdle(); |
+ run_loop.Run(); |
EXPECT_TRUE(called); |
// We want to make sure that it isn't called again during destruction. |
called = false; |
@@ -148,13 +165,21 @@ TEST_F(BindingTest, CloseDoesntCallConnectionErrorHandler) { |
class ServiceImplWithBinding : public ServiceImpl { |
public: |
ServiceImplWithBinding(bool* was_deleted, |
+ const base::Closure& closure, |
InterfaceRequest<sample::Service> request) |
- : ServiceImpl(was_deleted), binding_(this, std::move(request)) { |
+ : ServiceImpl(was_deleted), |
+ binding_(this, std::move(request)), |
+ closure_(closure) { |
binding_.set_connection_error_handler([this]() { delete this; }); |
} |
private: |
+ ~ServiceImplWithBinding() override{ |
+ closure_.Run(); |
+ } |
+ |
Binding<sample::Service> binding_; |
+ base::Closure closure_; |
MOJO_DISALLOW_COPY_AND_ASSIGN(ServiceImplWithBinding); |
}; |
@@ -164,10 +189,12 @@ TEST_F(BindingTest, SelfDeleteOnConnectionError) { |
bool was_deleted = false; |
sample::ServicePtr ptr; |
// This should delete itself on connection error. |
- new ServiceImplWithBinding(&was_deleted, GetProxy(&ptr)); |
+ base::RunLoop run_loop; |
+ new ServiceImplWithBinding(&was_deleted, run_loop.QuitClosure(), |
+ GetProxy(&ptr)); |
ptr.reset(); |
EXPECT_FALSE(was_deleted); |
- loop().RunUntilIdle(); |
+ run_loop.Run(); |
EXPECT_TRUE(was_deleted); |
} |
@@ -178,10 +205,14 @@ TEST_F(BindingTest, Unbind) { |
Binding<sample::Service> binding(&impl, GetProxy(&ptr)); |
bool called = false; |
- auto called_cb = [&called](int32_t result) { called = true; }; |
+ base::RunLoop run_loop; |
+ auto called_cb = [&called, &run_loop](int32_t result) { |
+ called = true; |
+ run_loop.Quit(); |
+ }; |
ptr->Frobinate(nullptr, sample::Service::BAZ_OPTIONS_REGULAR, nullptr, |
called_cb); |
- loop().RunUntilIdle(); |
+ run_loop.Run(); |
EXPECT_TRUE(called); |
called = false; |
@@ -197,9 +228,14 @@ TEST_F(BindingTest, Unbind) { |
binding.Bind(std::move(request)); |
EXPECT_TRUE(binding.is_bound()); |
// ...and should succeed again when the rebound. |
+ base::RunLoop run_loop2; |
+ auto called_cb2 = [&called, &run_loop2](int32_t result) { |
+ called = true; |
+ run_loop2.Quit(); |
+ }; |
ptr->Frobinate(nullptr, sample::Service::BAZ_OPTIONS_REGULAR, nullptr, |
- called_cb); |
- loop().RunUntilIdle(); |
+ called_cb2); |
+ run_loop2.Run(); |
EXPECT_TRUE(called); |
} |
@@ -227,7 +263,11 @@ TEST_F(BindingTest, SetInterfacePtrVersion) { |
TEST_F(BindingTest, PauseResume) { |
bool called = false; |
- auto called_cb = [&called](int32_t result) { called = true; }; |
+ base::RunLoop run_loop; |
+ auto called_cb = [&called, &run_loop](int32_t result) { |
+ called = true; |
+ run_loop.Quit(); |
+ }; |
sample::ServicePtr ptr; |
auto request = GetProxy(&ptr); |
ServiceImpl impl; |
@@ -242,18 +282,22 @@ TEST_F(BindingTest, PauseResume) { |
// Resume the binding, which should trigger processing. |
binding.ResumeIncomingMethodCallProcessing(); |
- loop().RunUntilIdle(); |
+ run_loop.Run(); |
EXPECT_TRUE(called); |
} |
// Verifies the connection error handler is not run while a binding is paused. |
TEST_F(BindingTest, ErrorHandleNotRunWhilePaused) { |
bool called = false; |
+ base::RunLoop run_loop; |
sample::ServicePtr ptr; |
auto request = GetProxy(&ptr); |
ServiceImpl impl; |
Binding<sample::Service> binding(&impl, std::move(request)); |
- binding.set_connection_error_handler([&called]() { called = true; }); |
+ binding.set_connection_error_handler([&called, &run_loop]() { |
+ called = true; |
+ run_loop.Quit(); |
+ }); |
binding.PauseIncomingMethodCallProcessing(); |
ptr.reset(); |
@@ -263,7 +307,7 @@ TEST_F(BindingTest, ErrorHandleNotRunWhilePaused) { |
// Resume the binding, which should trigger the error handler. |
binding.ResumeIncomingMethodCallProcessing(); |
- loop().RunUntilIdle(); |
+ run_loop.Run(); |
EXPECT_TRUE(called); |
} |
@@ -274,26 +318,34 @@ using StrongBindingTest = BindingTestBase; |
// Tests that destroying a mojo::StrongBinding closes the bound message pipe |
// handle but does *not* destroy the implementation object. |
TEST_F(StrongBindingTest, DestroyClosesMessagePipe) { |
+ base::RunLoop run_loop; |
bool encountered_error = false; |
bool was_deleted = false; |
ServiceImpl impl(&was_deleted); |
sample::ServicePtr ptr; |
auto request = GetProxy(&ptr); |
ptr.set_connection_error_handler( |
- [&encountered_error]() { encountered_error = true; }); |
+ [&encountered_error, &run_loop]() { |
+ encountered_error = true; |
+ run_loop.Quit(); |
+ }); |
bool called = false; |
- auto called_cb = [&called](int32_t result) { called = true; }; |
+ base::RunLoop run_loop2; |
+ auto called_cb = [&called, &run_loop2](int32_t result) { |
+ called = true; |
+ run_loop2.Quit(); |
+ }; |
{ |
StrongBinding<sample::Service> binding(&impl, std::move(request)); |
ptr->Frobinate(nullptr, sample::Service::BAZ_OPTIONS_REGULAR, nullptr, |
called_cb); |
- loop().RunUntilIdle(); |
+ run_loop2.Run(); |
EXPECT_TRUE(called); |
EXPECT_FALSE(encountered_error); |
} |
// Now that the StrongBinding is out of scope we should detect an error on the |
// other end of the pipe. |
- loop().RunUntilIdle(); |
+ run_loop.Run(); |
EXPECT_TRUE(encountered_error); |
// But destroying the StrongBinding doesn't destroy the object. |
ASSERT_FALSE(was_deleted); |
@@ -319,14 +371,16 @@ TEST_F(StrongBindingTest, ConnectionErrorDestroysImpl) { |
sample::ServicePtr ptr; |
bool was_deleted = false; |
// Will delete itself. |
- new ServiceImplWithBinding(&was_deleted, GetProxy(&ptr)); |
+ base::RunLoop run_loop; |
+ new ServiceImplWithBinding(&was_deleted, run_loop.QuitClosure(), |
+ GetProxy(&ptr)); |
loop().RunUntilIdle(); |
EXPECT_FALSE(was_deleted); |
ptr.reset(); |
EXPECT_FALSE(was_deleted); |
- loop().RunUntilIdle(); |
+ run_loop.Run(); |
EXPECT_TRUE(was_deleted); |
} |
@@ -338,8 +392,12 @@ TEST_F(StrongBindingTest, ExplicitDeleteImpl) { |
bool ptr_error_handler_called = false; |
sample::ServicePtr ptr; |
auto request = GetProxy(&ptr); |
+ base::RunLoop run_loop; |
ptr.set_connection_error_handler( |
- [&ptr_error_handler_called]() { ptr_error_handler_called = true; }); |
+ [&ptr_error_handler_called, &run_loop]() { |
+ ptr_error_handler_called = true; |
+ run_loop.Quit(); |
+ }); |
bool was_deleted = false; |
ServiceImplWithStrongBinding* impl = |
new ServiceImplWithStrongBinding(&was_deleted, std::move(request)); |
@@ -357,7 +415,7 @@ TEST_F(StrongBindingTest, ExplicitDeleteImpl) { |
EXPECT_FALSE(ptr_error_handler_called); |
EXPECT_TRUE(was_deleted); |
was_deleted = false; // It shouldn't be double-deleted! |
- loop().RunUntilIdle(); |
+ run_loop.Run(); |
EXPECT_TRUE(ptr_error_handler_called); |
EXPECT_FALSE(was_deleted); |