Chromium Code Reviews| 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 a93b57c53e924b2334b190a0e509fb5b709f0056..c2c47beecf3a236afe623d622e0fd72bf3fb9e3b 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/macros.h" |
| +#include "base/memory/weak_ptr.h" |
| #include "base/message_loop/message_loop.h" |
| #include "base/run_loop.h" |
| #include "mojo/public/cpp/bindings/strong_binding.h" |
| @@ -314,8 +315,7 @@ TEST_F(BindingTest, ErrorHandleNotRunWhilePaused) { |
| class PingServiceImpl : public test::PingService { |
| public: |
| - explicit PingServiceImpl(test::PingServiceRequest request) |
| - : binding_(this, std::move(request)) {} |
| + PingServiceImpl() {} |
| ~PingServiceImpl() override {} |
| // test::PingService: |
| @@ -325,14 +325,11 @@ class PingServiceImpl : public test::PingService { |
| callback.Run(); |
| } |
| - mojo::Binding<test::PingService>& binding() { return binding_; } |
| - |
| void set_ping_handler(const base::Closure& handler) { |
| ping_handler_ = handler; |
| } |
| private: |
| - mojo::Binding<test::PingService> binding_; |
| base::Closure ping_handler_; |
| DISALLOW_COPY_AND_ASSIGN(PingServiceImpl); |
| @@ -362,7 +359,8 @@ class CallbackFilter : public MessageReceiver { |
| // are always notified before a message is dispatched. |
| TEST_F(BindingTest, MessageFilter) { |
| test::PingServicePtr ptr; |
| - PingServiceImpl impl(GetProxy(&ptr)); |
| + PingServiceImpl impl; |
| + mojo::Binding<test::PingService> binding_(&impl, GetProxy(&ptr)); |
|
yzshen1
2016/10/09 22:20:01
nit: it seems unusual to have trailing "_" in the
Ken Rockot(use gerrit already)
2016/10/10 05:38:39
Oops, copy-paste :) Fixed
|
| int status = 0; |
| auto handler_helper = [] (int* status, int expected_status, int new_status) { |
| @@ -373,8 +371,8 @@ TEST_F(BindingTest, MessageFilter) { |
| return base::Bind(handler_helper, &status, expected_status, new_status); |
| }; |
| - impl.binding().AddFilter(CallbackFilter::Wrap(create_handler(0, 1))); |
| - impl.binding().AddFilter(CallbackFilter::Wrap(create_handler(1, 2))); |
| + binding_.AddFilter(CallbackFilter::Wrap(create_handler(0, 1))); |
| + binding_.AddFilter(CallbackFilter::Wrap(create_handler(1, 2))); |
| impl.set_ping_handler(create_handler(2, 3)); |
| for (int i = 0; i < 10; ++i) { |
| @@ -445,6 +443,47 @@ TEST_F(BindingTest, ConnectionErrorWithReason) { |
| run_loop.Run(); |
| } |
| +template <typename T> |
| +struct WeakPtrImplRefTraits { |
| + using PointerType = base::WeakPtr<T>; |
| + |
| + static bool IsNull(const base::WeakPtr<T>& ptr) { return !ptr; } |
| + static T* GetRawPointer(base::WeakPtr<T>* ptr) { return ptr->get(); } |
| +}; |
| + |
| +template <typename T> |
| +using WeakBinding = Binding<T, WeakPtrImplRefTraits<T>>; |
| + |
| +TEST_F(BindingTest, CustomImplPointerType) { |
| + PingServiceImpl impl; |
| + base::WeakPtrFactory<test::PingService> weak_factory(&impl); |
| + |
| + test::PingServicePtr proxy; |
| + WeakBinding<test::PingService> binding(weak_factory.GetWeakPtr(), |
| + GetProxy(&proxy)); |
| + |
| + { |
| + // Ensure the binding is functioning. |
| + base::RunLoop run_loop; |
| + proxy->Ping(run_loop.QuitClosure()); |
| + run_loop.Run(); |
| + } |
| + |
| + { |
| + // Attempt to dispatch another message after the WeakPtr is invalidated. |
| + base::Closure assert_not_reached = base::Bind([] { NOTREACHED(); }); |
| + impl.set_ping_handler(assert_not_reached); |
| + proxy->Ping(assert_not_reached); |
| + |
| + // The binding will close its end of the pipe which will trigger a |
| + // connection error on |proxy|. |
| + base::RunLoop run_loop; |
| + proxy.set_connection_error_handler(run_loop.QuitClosure()); |
| + weak_factory.InvalidateWeakPtrs(); |
| + run_loop.Run(); |
| + } |
| +} |
| + |
| // StrongBindingTest ----------------------------------------------------------- |
| using StrongBindingTest = BindingTestBase; |