| // Copyright 2018 The Fuchsia Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef SRC_MODULAR_LIB_TESTING_WAIT_UNTIL_IDLE_H_ | |
| #define SRC_MODULAR_LIB_TESTING_WAIT_UNTIL_IDLE_H_ | |
| #include <lib/async-loop/cpp/loop.h> | |
| #include <lib/async-loop/default.h> | |
| #include <lib/async/cpp/task.h> | |
| #include <lib/fidl/cpp/interface_ptr.h> | |
| #include <gtest/gtest.h> | |
| namespace util { | |
| // Convenience invocation of a debug FIDL interface's |WaitUntilIdle() => ()| | |
| // function. This wrapper includes the necessary logic to run the message loop | |
| // while waiting and drain any coincident messages afterwards. It also adds an | |
| // error handler on the debug interface pointer provided, and clears it | |
| // afterwards. | |
| template <class Interface> | |
| void WaitUntilIdle(fidl::InterfacePtr<Interface>* debug_interface_ptr, async::Loop* loop) { | |
| debug_interface_ptr->set_error_handler([loop](zx_status_t status) { | |
| loop->Quit(); | |
| ADD_FAILURE() << Interface::Name_ << " disconnected (check app logs for crash)"; | |
| }); | |
| // We can't just use a synchronous ptr or | |
| // |fidl::InterfacePtr::WaitForResponse| because those don't run the message | |
| // loop while they wait. | |
| (*debug_interface_ptr)->WaitUntilIdle([loop] { loop->Quit(); }); | |
| loop->Run(); | |
| loop->ResetQuit(); | |
| // Finish processing any remaining messages. | |
| loop->RunUntilIdle(); | |
| loop->ResetQuit(); | |
| debug_interface_ptr->set_error_handler(nullptr); | |
| } | |
| } // namespace util | |
| #endif // SRC_MODULAR_LIB_TESTING_WAIT_UNTIL_IDLE_H_ |