xref: /aosp_15_r20/external/cronet/base/fuchsia/test_interface_natural_impl.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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)21 void 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)26 fidl::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)36 zx_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