1*6777b538SAndroid Build Coastguard Worker // Copyright 2018 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #include "base/fuchsia/test_interface_impl.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker #include <utility> 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h" 10*6777b538SAndroid Build Coastguard Worker #include "base/run_loop.h" 11*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h" 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker namespace base { 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker TestInterfaceImpl::TestInterfaceImpl() = default; 16*6777b538SAndroid Build Coastguard Worker TestInterfaceImpl::~TestInterfaceImpl() = default; 17*6777b538SAndroid Build Coastguard Worker Add(int32_t a,int32_t b,AddCallback callback)18*6777b538SAndroid Build Coastguard Workervoid TestInterfaceImpl::Add(int32_t a, int32_t b, AddCallback callback) { 19*6777b538SAndroid Build Coastguard Worker callback(a + b); 20*6777b538SAndroid Build Coastguard Worker } 21*6777b538SAndroid Build Coastguard Worker VerifyTestInterface(fidl::InterfacePtr<testfidl::TestInterface> & ptr)22*6777b538SAndroid Build Coastguard Workerzx_status_t VerifyTestInterface( 23*6777b538SAndroid Build Coastguard Worker fidl::InterfacePtr<testfidl::TestInterface>& ptr) { 24*6777b538SAndroid Build Coastguard Worker // Call the service and wait for response. 25*6777b538SAndroid Build Coastguard Worker RunLoop run_loop; 26*6777b538SAndroid Build Coastguard Worker zx_status_t result = ZX_ERR_INTERNAL; 27*6777b538SAndroid Build Coastguard Worker base::WeakPtrFactory<zx_status_t> weak_result(&result); 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker ptr.set_error_handler( 30*6777b538SAndroid Build Coastguard Worker [quit = run_loop.QuitClosure(), 31*6777b538SAndroid Build Coastguard Worker weak_result = weak_result.GetWeakPtr()](zx_status_t status) { 32*6777b538SAndroid Build Coastguard Worker if (weak_result) 33*6777b538SAndroid Build Coastguard Worker *weak_result = status; 34*6777b538SAndroid Build Coastguard Worker std::move(quit).Run(); 35*6777b538SAndroid Build Coastguard Worker }); 36*6777b538SAndroid Build Coastguard Worker 37*6777b538SAndroid Build Coastguard Worker ptr->Add(2, 2, 38*6777b538SAndroid Build Coastguard Worker [quit = run_loop.QuitClosure(), 39*6777b538SAndroid Build Coastguard Worker weak_result = weak_result.GetWeakPtr()](int32_t value) { 40*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(value, 4); 41*6777b538SAndroid Build Coastguard Worker if (weak_result) 42*6777b538SAndroid Build Coastguard Worker *weak_result = ZX_OK; 43*6777b538SAndroid Build Coastguard Worker std::move(quit).Run(); 44*6777b538SAndroid Build Coastguard Worker }); 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker run_loop.Run(); 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker // Reset error handler because the current one captures |run_loop| and 49*6777b538SAndroid Build Coastguard Worker // |error| references which are about to be destroyed. 50*6777b538SAndroid Build Coastguard Worker ptr.set_error_handler(nullptr); 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker return result; 53*6777b538SAndroid Build Coastguard Worker } 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker } // namespace base 56