diff options
author | Hidehiko Abe <hidehiko@google.com> | 2018-04-24 02:15:00 +0900 |
---|---|---|
committer | Hidehiko Abe <hidehiko@google.com> | 2018-04-24 10:13:47 +0900 |
commit | 920588a1acdc4721abb713d8162010e4b85ae53e (patch) | |
tree | 5d0b02a305d2ce5e91eb915695a338dabff2ed6b /mojo/public/cpp/bindings/tests/binding_unittest.cc | |
parent | ca6c42abc66e142da1036f0061976d671862c457 (diff) | |
download | libmojo-oreo-mr1-1.2-iot-release.tar.gz |
Migrate libmojo repository into libchrome, part 2.HEADandroid-o-mr1-iot-release-smart-display-r9android-o-mr1-iot-release-smart-display-r8android-o-mr1-iot-release-smart-display-r5android-o-mr1-iot-release-smart-display-r40.1Jandroid-o-mr1-iot-release-smart-display-r4android-o-mr1-iot-release-smart-display-r39android-o-mr1-iot-release-smart-display-r30android-o-mr1-iot-release-smart-display-r3android-o-mr1-iot-release-smart-display-r22android-o-mr1-iot-release-smart-display-r14android-o-mr1-iot-release-smart-clock-r6android-o-mr1-iot-release-smart-clock-r2android-o-mr1-iot-release-smart-clock-fsiandroid-o-mr1-iot-release-smart-clock-fcsandroid-o-mr1-iot-release-cube_r2android-o-mr1-iot-release-cube-fsiandroid-o-mr1-iot-release-cube-fcsandroid-o-mr1-iot-release-1.0.8android-o-mr1-iot-release-1.0.7android-o-mr1-iot-release-1.0.5android-o-mr1-iot-release-1.0.4android-o-mr1-iot-release-1.0.3android-o-mr1-iot-release-1.0.2android-o-mr1-iot-release-1.0.14android-o-mr1-iot-release-1.0.13android-o-mr1-iot-release-1.0.12android-o-mr1-iot-release-1.0.10android-o-mr1-iot-release-1.0.1android-o-mr1-iot-release-1.0.0oreo-mr1-iot-releaseoreo-mr1-1.2-iot-releasemastermain
This CL moves following files.
- .gitignore
- Android.bp is merged into libchrome's Android.bp.
- base/android/*
- build/* except build_config.h which is exactly same with libchrome's.
- ipc/*
- mojo/*
- soong/* into libchrome_tools/
- third_party/{catapult,jinja2,markupsafe,ply}/*
- ui/gfx/{geometry,range}/mojo/*
Then removed following files:
- Android.bp
- CleanSpec.mk
- build/build_config.h
And added README.md to notify the migration.
Bug: 73606903
Test: Built locally. Ran on DUT.
Change-Id: I94aa1b43ff0854f48f30fdf03025bd1c8a346038
Diffstat (limited to 'mojo/public/cpp/bindings/tests/binding_unittest.cc')
-rw-r--r-- | mojo/public/cpp/bindings/tests/binding_unittest.cc | 611 |
1 files changed, 0 insertions, 611 deletions
diff --git a/mojo/public/cpp/bindings/tests/binding_unittest.cc b/mojo/public/cpp/bindings/tests/binding_unittest.cc deleted file mode 100644 index e76993b..0000000 --- a/mojo/public/cpp/bindings/tests/binding_unittest.cc +++ /dev/null @@ -1,611 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Note: This file tests both binding.h (mojo::Binding) and strong_binding.h -// (mojo::StrongBinding). - -#include "mojo/public/cpp/bindings/binding.h" - -#include <stdint.h> -#include <utility> - -#include "base/macros.h" -#include "base/memory/ptr_util.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" -#include "mojo/public/interfaces/bindings/tests/ping_service.mojom.h" -#include "mojo/public/interfaces/bindings/tests/sample_interfaces.mojom.h" -#include "mojo/public/interfaces/bindings/tests/sample_service.mojom.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace mojo { -namespace { - -class BindingTestBase : public testing::Test { - public: - BindingTestBase() {} - ~BindingTestBase() override {} - - base::MessageLoop& loop() { return loop_; } - - private: - base::MessageLoop loop_; - - DISALLOW_COPY_AND_ASSIGN(BindingTestBase); -}; - -class ServiceImpl : public sample::Service { - public: - explicit ServiceImpl(bool* was_deleted = nullptr) - : was_deleted_(was_deleted) {} - ~ServiceImpl() override { - if (was_deleted_) - *was_deleted_ = true; - } - - private: - // sample::Service implementation - void Frobinate(sample::FooPtr foo, - BazOptions options, - sample::PortPtr port, - const FrobinateCallback& callback) override { - callback.Run(1); - } - void GetPort(InterfaceRequest<sample::Port> port) override {} - - bool* const was_deleted_; - - DISALLOW_COPY_AND_ASSIGN(ServiceImpl); -}; - -template <typename... Args> -void DoSetFlagAndRunClosure(bool* flag, - const base::Closure& closure, - Args... args) { - *flag = true; - if (!closure.is_null()) - closure.Run(); -} - -template <typename... Args> -base::Callback<void(Args...)> SetFlagAndRunClosure( - bool* flag, - const base::Closure& callback = base::Closure()) { - return base::Bind(&DoSetFlagAndRunClosure<Args...>, flag, callback); -} - -// BindingTest ----------------------------------------------------------------- - -using BindingTest = BindingTestBase; - -TEST_F(BindingTest, Close) { - bool called = false; - sample::ServicePtr ptr; - auto request = MakeRequest(&ptr); - base::RunLoop run_loop; - ptr.set_connection_error_handler( - SetFlagAndRunClosure(&called, run_loop.QuitClosure())); - ServiceImpl impl; - Binding<sample::Service> binding(&impl, std::move(request)); - - binding.Close(); - EXPECT_FALSE(called); - run_loop.Run(); - EXPECT_TRUE(called); -} - -// Tests that destroying a mojo::Binding closes the bound message pipe handle. -TEST_F(BindingTest, DestroyClosesMessagePipe) { - bool encountered_error = false; - ServiceImpl impl; - sample::ServicePtr ptr; - auto request = MakeRequest(&ptr); - base::RunLoop run_loop; - ptr.set_connection_error_handler( - SetFlagAndRunClosure(&encountered_error, run_loop.QuitClosure())); - bool called = false; - base::RunLoop run_loop2; - { - Binding<sample::Service> binding(&impl, std::move(request)); - ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr, - SetFlagAndRunClosure<int32_t>(&called, - run_loop2.QuitClosure())); - 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. - run_loop.Run(); - EXPECT_TRUE(encountered_error); - - // And calls should fail. - called = false; - ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr, - SetFlagAndRunClosure<int32_t>(&called, - run_loop2.QuitClosure())); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(called); -} - -// Tests that the binding's connection error handler gets called when the other -// end is closed. -TEST_F(BindingTest, ConnectionError) { - bool called = false; - { - ServiceImpl impl; - sample::ServicePtr ptr; - Binding<sample::Service> binding(&impl, MakeRequest(&ptr)); - base::RunLoop run_loop; - binding.set_connection_error_handler( - SetFlagAndRunClosure(&called, run_loop.QuitClosure())); - ptr.reset(); - EXPECT_FALSE(called); - run_loop.Run(); - EXPECT_TRUE(called); - // We want to make sure that it isn't called again during destruction. - called = false; - } - EXPECT_FALSE(called); -} - -// Tests that calling Close doesn't result in the connection error handler being -// called. -TEST_F(BindingTest, CloseDoesntCallConnectionErrorHandler) { - ServiceImpl impl; - sample::ServicePtr ptr; - Binding<sample::Service> binding(&impl, MakeRequest(&ptr)); - bool called = false; - binding.set_connection_error_handler(SetFlagAndRunClosure(&called)); - binding.Close(); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(called); - - // We can also close the other end, and the error handler still won't be - // called. - ptr.reset(); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(called); -} - -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)), - closure_(closure) { - binding_.set_connection_error_handler( - base::Bind(&ServiceImplWithBinding::OnConnectionError, - base::Unretained(this))); - } - - private: - ~ServiceImplWithBinding() override{ - closure_.Run(); - } - - void OnConnectionError() { delete this; } - - Binding<sample::Service> binding_; - base::Closure closure_; - - DISALLOW_COPY_AND_ASSIGN(ServiceImplWithBinding); -}; - -// Tests that the binding may be deleted in the connection error handler. -TEST_F(BindingTest, SelfDeleteOnConnectionError) { - bool was_deleted = false; - sample::ServicePtr ptr; - // This should delete itself on connection error. - base::RunLoop run_loop; - new ServiceImplWithBinding(&was_deleted, run_loop.QuitClosure(), - MakeRequest(&ptr)); - ptr.reset(); - EXPECT_FALSE(was_deleted); - run_loop.Run(); - EXPECT_TRUE(was_deleted); -} - -// Tests that explicitly calling Unbind followed by rebinding works. -TEST_F(BindingTest, Unbind) { - ServiceImpl impl; - sample::ServicePtr ptr; - Binding<sample::Service> binding(&impl, MakeRequest(&ptr)); - - bool called = false; - base::RunLoop run_loop; - ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr, - SetFlagAndRunClosure<int32_t>(&called, - run_loop.QuitClosure())); - run_loop.Run(); - EXPECT_TRUE(called); - - called = false; - auto request = binding.Unbind(); - EXPECT_FALSE(binding.is_bound()); - // All calls should fail when not bound... - ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr, - SetFlagAndRunClosure<int32_t>(&called, - run_loop.QuitClosure())); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(called); - - called = false; - binding.Bind(std::move(request)); - EXPECT_TRUE(binding.is_bound()); - // ...and should succeed again when the rebound. - base::RunLoop run_loop2; - ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr, - SetFlagAndRunClosure<int32_t>(&called, - run_loop2.QuitClosure())); - run_loop2.Run(); - EXPECT_TRUE(called); -} - -class IntegerAccessorImpl : public sample::IntegerAccessor { - public: - IntegerAccessorImpl() {} - ~IntegerAccessorImpl() override {} - - private: - // sample::IntegerAccessor implementation. - void GetInteger(const GetIntegerCallback& callback) override { - callback.Run(1, sample::Enum::VALUE); - } - void SetInteger(int64_t data, sample::Enum type) override {} - - DISALLOW_COPY_AND_ASSIGN(IntegerAccessorImpl); -}; - -TEST_F(BindingTest, SetInterfacePtrVersion) { - IntegerAccessorImpl impl; - sample::IntegerAccessorPtr ptr; - Binding<sample::IntegerAccessor> binding(&impl, &ptr); - EXPECT_EQ(3u, ptr.version()); -} - -TEST_F(BindingTest, PauseResume) { - bool called = false; - base::RunLoop run_loop; - sample::ServicePtr ptr; - auto request = MakeRequest(&ptr); - ServiceImpl impl; - Binding<sample::Service> binding(&impl, std::move(request)); - binding.PauseIncomingMethodCallProcessing(); - ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr, - SetFlagAndRunClosure<int32_t>(&called, - run_loop.QuitClosure())); - EXPECT_FALSE(called); - base::RunLoop().RunUntilIdle(); - // Frobinate() should not be called as the binding is paused. - EXPECT_FALSE(called); - - // Resume the binding, which should trigger processing. - binding.ResumeIncomingMethodCallProcessing(); - 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 = MakeRequest(&ptr); - ServiceImpl impl; - Binding<sample::Service> binding(&impl, std::move(request)); - binding.set_connection_error_handler( - SetFlagAndRunClosure(&called, run_loop.QuitClosure())); - binding.PauseIncomingMethodCallProcessing(); - - ptr.reset(); - base::RunLoop().RunUntilIdle(); - // The connection error handle should not be called as the binding is paused. - EXPECT_FALSE(called); - - // Resume the binding, which should trigger the error handler. - binding.ResumeIncomingMethodCallProcessing(); - run_loop.Run(); - EXPECT_TRUE(called); -} - -class PingServiceImpl : public test::PingService { - public: - PingServiceImpl() {} - ~PingServiceImpl() override {} - - // test::PingService: - void Ping(const PingCallback& callback) override { - if (!ping_handler_.is_null()) - ping_handler_.Run(); - callback.Run(); - } - - void set_ping_handler(const base::Closure& handler) { - ping_handler_ = handler; - } - - private: - base::Closure ping_handler_; - - DISALLOW_COPY_AND_ASSIGN(PingServiceImpl); -}; - -class CallbackFilter : public MessageReceiver { - public: - explicit CallbackFilter(const base::Closure& callback) - : callback_(callback) {} - ~CallbackFilter() override {} - - static std::unique_ptr<CallbackFilter> Wrap(const base::Closure& callback) { - return base::MakeUnique<CallbackFilter>(callback); - } - - // MessageReceiver: - bool Accept(Message* message) override { - callback_.Run(); - return true; - } - - private: - const base::Closure callback_; -}; - -// Verifies that message filters are notified in the order they were added and -// are always notified before a message is dispatched. -TEST_F(BindingTest, MessageFilter) { - test::PingServicePtr ptr; - PingServiceImpl impl; - mojo::Binding<test::PingService> binding(&impl, MakeRequest(&ptr)); - - int status = 0; - auto handler_helper = [] (int* status, int expected_status, int new_status) { - EXPECT_EQ(expected_status, *status); - *status = new_status; - }; - auto create_handler = [&] (int expected_status, int new_status) { - return base::Bind(handler_helper, &status, expected_status, new_status); - }; - - 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) { - status = 0; - base::RunLoop loop; - ptr->Ping(loop.QuitClosure()); - loop.Run(); - EXPECT_EQ(3, status); - } -} - -void Fail() { - FAIL() << "Unexpected connection error"; -} - -TEST_F(BindingTest, FlushForTesting) { - bool called = false; - sample::ServicePtr ptr; - auto request = MakeRequest(&ptr); - ServiceImpl impl; - Binding<sample::Service> binding(&impl, std::move(request)); - binding.set_connection_error_handler(base::Bind(&Fail)); - - ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr, - SetFlagAndRunClosure<int32_t>(&called)); - EXPECT_FALSE(called); - // Because the flush is sent from the binding, it only guarantees that the - // request has been received, not the response. The second flush waits for the - // response to be received. - binding.FlushForTesting(); - binding.FlushForTesting(); - EXPECT_TRUE(called); -} - -TEST_F(BindingTest, FlushForTestingWithClosedPeer) { - bool called = false; - sample::ServicePtr ptr; - auto request = MakeRequest(&ptr); - ServiceImpl impl; - Binding<sample::Service> binding(&impl, std::move(request)); - binding.set_connection_error_handler(SetFlagAndRunClosure(&called)); - ptr.reset(); - - EXPECT_FALSE(called); - binding.FlushForTesting(); - EXPECT_TRUE(called); - binding.FlushForTesting(); -} - -TEST_F(BindingTest, ConnectionErrorWithReason) { - sample::ServicePtr ptr; - auto request = MakeRequest(&ptr); - ServiceImpl impl; - Binding<sample::Service> binding(&impl, std::move(request)); - - base::RunLoop run_loop; - binding.set_connection_error_with_reason_handler(base::Bind( - [](const base::Closure& quit_closure, uint32_t custom_reason, - const std::string& description) { - EXPECT_EQ(1234u, custom_reason); - EXPECT_EQ("hello", description); - quit_closure.Run(); - }, - run_loop.QuitClosure())); - - ptr.ResetWithReason(1234u, "hello"); - - 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(), - MakeRequest(&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; - -// 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; - sample::ServicePtr ptr; - auto request = MakeRequest(&ptr); - ptr.set_connection_error_handler( - SetFlagAndRunClosure(&encountered_error, run_loop.QuitClosure())); - bool called = false; - base::RunLoop run_loop2; - - auto binding = MakeStrongBinding(base::MakeUnique<ServiceImpl>(&was_deleted), - std::move(request)); - ptr->Frobinate( - nullptr, sample::Service::BazOptions::REGULAR, nullptr, - SetFlagAndRunClosure<int32_t>(&called, run_loop2.QuitClosure())); - run_loop2.Run(); - EXPECT_TRUE(called); - EXPECT_FALSE(encountered_error); - binding->Close(); - - // Now that the StrongBinding is closed we should detect an error on the other - // end of the pipe. - run_loop.Run(); - EXPECT_TRUE(encountered_error); - - // Destroying the StrongBinding also destroys the impl. - ASSERT_TRUE(was_deleted); -} - -// Tests the typical case, where the implementation object owns the -// StrongBinding (and should be destroyed on connection error). -TEST_F(StrongBindingTest, ConnectionErrorDestroysImpl) { - sample::ServicePtr ptr; - bool was_deleted = false; - // Will delete itself. - base::RunLoop run_loop; - new ServiceImplWithBinding(&was_deleted, run_loop.QuitClosure(), - MakeRequest(&ptr)); - - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(was_deleted); - - ptr.reset(); - EXPECT_FALSE(was_deleted); - run_loop.Run(); - EXPECT_TRUE(was_deleted); -} - -TEST_F(StrongBindingTest, FlushForTesting) { - bool called = false; - bool was_deleted = false; - sample::ServicePtr ptr; - auto request = MakeRequest(&ptr); - auto binding = MakeStrongBinding(base::MakeUnique<ServiceImpl>(&was_deleted), - std::move(request)); - binding->set_connection_error_handler(base::Bind(&Fail)); - - ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr, - SetFlagAndRunClosure<int32_t>(&called)); - EXPECT_FALSE(called); - // Because the flush is sent from the binding, it only guarantees that the - // request has been received, not the response. The second flush waits for the - // response to be received. - ASSERT_TRUE(binding); - binding->FlushForTesting(); - ASSERT_TRUE(binding); - binding->FlushForTesting(); - EXPECT_TRUE(called); - EXPECT_FALSE(was_deleted); - ptr.reset(); - ASSERT_TRUE(binding); - binding->set_connection_error_handler(base::Closure()); - binding->FlushForTesting(); - EXPECT_TRUE(was_deleted); -} - -TEST_F(StrongBindingTest, FlushForTestingWithClosedPeer) { - bool called = false; - bool was_deleted = false; - sample::ServicePtr ptr; - auto request = MakeRequest(&ptr); - auto binding = MakeStrongBinding(base::MakeUnique<ServiceImpl>(&was_deleted), - std::move(request)); - binding->set_connection_error_handler(SetFlagAndRunClosure(&called)); - ptr.reset(); - - EXPECT_FALSE(called); - EXPECT_FALSE(was_deleted); - ASSERT_TRUE(binding); - binding->FlushForTesting(); - EXPECT_TRUE(called); - EXPECT_TRUE(was_deleted); - ASSERT_FALSE(binding); -} - -TEST_F(StrongBindingTest, ConnectionErrorWithReason) { - sample::ServicePtr ptr; - auto request = MakeRequest(&ptr); - auto binding = - MakeStrongBinding(base::MakeUnique<ServiceImpl>(), std::move(request)); - base::RunLoop run_loop; - binding->set_connection_error_with_reason_handler(base::Bind( - [](const base::Closure& quit_closure, uint32_t custom_reason, - const std::string& description) { - EXPECT_EQ(5678u, custom_reason); - EXPECT_EQ("hello", description); - quit_closure.Run(); - }, - run_loop.QuitClosure())); - - ptr.ResetWithReason(5678u, "hello"); - - run_loop.Run(); -} - -} // namespace -} // mojo |