| // 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 LIB_SYS_CPP_TESTING_FAKE_COMPONENT_H_ | |
| #define LIB_SYS_CPP_TESTING_FAKE_COMPONENT_H_ | |
| #include <lib/async/dispatcher.h> | |
| #include <lib/sys/cpp/testing/fake_launcher.h> | |
| #include <lib/vfs/cpp/pseudo_dir.h> | |
| #include <lib/vfs/cpp/service.h> | |
| #include <memory> | |
| #include <utility> | |
| namespace sys { | |
| namespace testing { | |
| // A fake component which can be used to intercept component launch using | |
| // |FakeLauncher| and publish fake services for unit testing. | |
| class FakeComponent { | |
| public: | |
| FakeComponent(); | |
| ~FakeComponent(); | |
| // Adds specified interface to the set of public interfaces. | |
| // | |
| // Adds a supported service with the given |service_name|, using the given | |
| // |interface_request_handler|, which should remain valid for the lifetime of | |
| // this object. | |
| // | |
| // A typical usage may be: | |
| // | |
| // AddPublicService(foobar_bindings_.GetHandler(this)); | |
| template <typename Interface> | |
| zx_status_t AddPublicService(fidl::InterfaceRequestHandler<Interface> handler, | |
| const std::string& service_name = Interface::Name_) { | |
| return directory_.AddEntry(service_name.c_str(), | |
| std::make_unique<vfs::Service>(std::move(handler))); | |
| } | |
| // Registers this component with a FakeLauncher. | |
| void Register(std::string url, FakeLauncher& fake_launcher, | |
| async_dispatcher_t* dispatcher = nullptr); | |
| private: | |
| vfs::PseudoDir directory_; | |
| std::vector<fidl::InterfaceRequest<fuchsia::sys::ComponentController>> ctrls_; | |
| }; | |
| } // namespace testing | |
| } // namespace sys | |
| #endif // LIB_SYS_CPP_TESTING_FAKE_COMPONENT_H_ |