| // Copyright 2018 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. |
| |
| #include "base/fuchsia/service_directory.h" |
| |
| #include <lib/fdio/util.h> |
| #include <lib/zx/channel.h> |
| #include <utility> |
| |
| #include "base/bind.h" |
| #include "base/fuchsia/service_directory_test_base.h" |
| #include "base/location.h" |
| #include "base/run_loop.h" |
| #include "base/task_runner.h" |
| #include "base/test/test_timeouts.h" |
| #include "base/threading/thread_task_runner_handle.h" |
| #include "starboard/types.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace base { |
| namespace fuchsia { |
| |
| class ServiceDirectoryTest : public ServiceDirectoryTestBase {}; |
| |
| // Verifies that ComponentContext can consume a public service in |
| // ServiceDirectory and that connection is disconnected when the client stub is |
| // destroyed. |
| TEST_F(ServiceDirectoryTest, ConnectDisconnect) { |
| auto stub = client_context_->ConnectToService<testfidl::TestInterface>(); |
| VerifyTestInterface(&stub, false); |
| |
| base::RunLoop run_loop; |
| service_binding_->SetOnLastClientCallback(run_loop.QuitClosure()); |
| |
| base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| FROM_HERE, |
| base::BindOnce( |
| [](base::RunLoop* run_loop) { |
| ADD_FAILURE(); |
| run_loop->Quit(); |
| }, |
| &run_loop), |
| TestTimeouts::action_timeout()); |
| |
| stub.Unbind(); |
| run_loop.Run(); |
| } |
| |
| // Verifies that we can connect to the service service more than once. |
| TEST_F(ServiceDirectoryTest, ConnectMulti) { |
| auto stub = client_context_->ConnectToService<testfidl::TestInterface>(); |
| auto stub2 = client_context_->ConnectToService<testfidl::TestInterface>(); |
| VerifyTestInterface(&stub, false); |
| VerifyTestInterface(&stub2, false); |
| } |
| |
| // Verify that services are also exported to the legacy flat service namespace. |
| TEST_F(ServiceDirectoryTest, ConnectLegacy) { |
| ConnectClientContextToDirectory("."); |
| auto stub = client_context_->ConnectToService<testfidl::TestInterface>(); |
| VerifyTestInterface(&stub, false); |
| } |
| |
| // Verify that ComponentContext can handle the case when the service directory |
| // connection is disconnected. |
| TEST_F(ServiceDirectoryTest, DirectoryGone) { |
| service_binding_.reset(); |
| service_directory_.reset(); |
| |
| fidl::InterfacePtr<testfidl::TestInterface> stub; |
| zx_status_t status = |
| client_context_->ConnectToService(FidlInterfaceRequest(&stub)); |
| EXPECT_EQ(status, ZX_ERR_PEER_CLOSED); |
| |
| VerifyTestInterface(&stub, true); |
| } |
| |
| // Verify that the case when the service doesn't exist is handled properly. |
| TEST_F(ServiceDirectoryTest, NoService) { |
| service_binding_.reset(); |
| auto stub = client_context_->ConnectToService<testfidl::TestInterface>(); |
| VerifyTestInterface(&stub, true); |
| } |
| |
| } // namespace fuchsia |
| } // namespace base |