| // 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_test_base.h" |
| |
| #include <lib/fdio/util.h> |
| |
| #include "starboard/types.h" |
| |
| namespace base { |
| namespace fuchsia { |
| |
| TestInterfaceImpl::TestInterfaceImpl() = default; |
| TestInterfaceImpl::~TestInterfaceImpl() = default; |
| |
| // TestInterface implementation. |
| void TestInterfaceImpl::Add(int32_t a, int32_t b, AddCallback callback) { |
| callback(a + b); |
| } |
| |
| ServiceDirectoryTestBase::ServiceDirectoryTestBase() { |
| zx::channel service_directory_channel; |
| EXPECT_EQ(zx::channel::create(0, &service_directory_channel, |
| &service_directory_client_channel_), |
| ZX_OK); |
| |
| // Mount service dir and publish the service. |
| service_directory_ = |
| std::make_unique<ServiceDirectory>(std::move(service_directory_channel)); |
| service_binding_ = |
| std::make_unique<ScopedServiceBinding<testfidl::TestInterface>>( |
| service_directory_.get(), &test_service_); |
| |
| ConnectClientContextToDirectory("public"); |
| } |
| |
| ServiceDirectoryTestBase::~ServiceDirectoryTestBase() = default; |
| |
| void ServiceDirectoryTestBase::ConnectClientContextToDirectory( |
| const char* path) { |
| // Open directory |path| from the service directory. |
| zx::channel public_directory_channel; |
| zx::channel public_directory_client_channel; |
| EXPECT_EQ(zx::channel::create(0, &public_directory_channel, |
| &public_directory_client_channel), |
| ZX_OK); |
| EXPECT_EQ(fdio_open_at(service_directory_client_channel_.get(), path, 0, |
| public_directory_channel.release()), |
| ZX_OK); |
| |
| // Create ComponentContext and connect to the test service. |
| client_context_ = std::make_unique<ComponentContext>( |
| std::move(public_directory_client_channel)); |
| } |
| |
| void ServiceDirectoryTestBase::VerifyTestInterface( |
| fidl::InterfacePtr<testfidl::TestInterface>* stub, |
| bool expect_error) { |
| // Call the service and wait for response. |
| base::RunLoop run_loop; |
| bool error = false; |
| |
| stub->set_error_handler([&run_loop, &error]() { |
| error = true; |
| run_loop.Quit(); |
| }); |
| |
| (*stub)->Add(2, 2, [&run_loop](int32_t result) { |
| EXPECT_EQ(result, 4); |
| run_loop.Quit(); |
| }); |
| |
| run_loop.Run(); |
| |
| EXPECT_EQ(error, expect_error); |
| |
| // Reset error handler because the current one captures |run_loop| and |
| // |error| references which are about to be destroyed. |
| stub->set_error_handler([]() {}); |
| } |
| |
| } // namespace fuchsia |
| } // namespace base |