1 // Copyright 2023 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/fuchsia/test_interface_natural_impl.h" 6 7 #include <lib/async/default.h> 8 9 #include <utility> 10 11 #include "base/fuchsia/fuchsia_component_connect.h" 12 #include "base/memory/weak_ptr.h" 13 #include "base/run_loop.h" 14 #include "testing/gtest/include/gtest/gtest.h" 15 16 namespace base { 17 18 TestInterfaceNaturalImpl::TestInterfaceNaturalImpl() = default; 19 TestInterfaceNaturalImpl::~TestInterfaceNaturalImpl() = default; 20 Add(AddRequest & request,AddCompleter::Sync & completer)21void TestInterfaceNaturalImpl::Add(AddRequest& request, 22 AddCompleter::Sync& completer) { 23 completer.Reply(request.a() + request.b()); 24 } 25 CreateTestInterfaceClient(fidl::UnownedClientEnd<fuchsia_io::Directory> service_directory,const std::string & name)26fidl::Client<base_testfidl::TestInterface> CreateTestInterfaceClient( 27 fidl::UnownedClientEnd<fuchsia_io::Directory> service_directory, 28 const std::string& name) { 29 auto client_end = fuchsia_component::ConnectAt<base_testfidl::TestInterface>( 30 service_directory, name); 31 EXPECT_TRUE(client_end.is_ok()); 32 fidl::Client client(std::move(*client_end), async_get_default_dispatcher()); 33 return client; 34 } 35 VerifyTestInterface(fidl::Client<base_testfidl::TestInterface> & client)36zx_status_t VerifyTestInterface( 37 fidl::Client<base_testfidl::TestInterface>& client) { 38 // Call the service and wait for response. 39 RunLoop run_loop; 40 zx_status_t result = ZX_ERR_INTERNAL; 41 base::WeakPtrFactory<zx_status_t> weak_result(&result); 42 43 client->Add({{2, 2}}).Then( 44 [quit = run_loop.QuitClosure(), weak_result = weak_result.GetWeakPtr()]( 45 fidl::Result<base_testfidl::TestInterface::Add>& result) { 46 if (result.is_ok()) { 47 EXPECT_EQ(result.value(), 4); 48 } 49 if (weak_result) { 50 *weak_result = 51 result.is_error() ? result.error_value().status() : ZX_OK; 52 } 53 std::move(quit).Run(); 54 }); 55 56 run_loop.Run(); 57 return result; 58 } 59 60 } // namespace base 61