| // Copyright 2020 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef BASE_FUCHSIA_TEST_COMPONENT_CONTEXT_FOR_PROCESS_H_ |
| #define BASE_FUCHSIA_TEST_COMPONENT_CONTEXT_FOR_PROCESS_H_ |
| |
| #include <fidl/fuchsia.io/cpp/fidl.h> |
| |
| #include <memory> |
| |
| #include "base/base_export.h" |
| #include "base/containers/span.h" |
| #include "base/strings/string_piece.h" |
| |
| namespace sys { |
| class ComponentContext; |
| class OutgoingDirectory; |
| class ServiceDirectory; |
| } // namespace sys |
| |
| namespace base { |
| |
| class FilteredServiceDirectory; |
| |
| // Replaces the process-global sys::ComponentContext (as returned by the |
| // base::ComponentContextForProcess() function) with an empty instance which the |
| // calling test can configure, and restores the original when deleted. |
| // |
| // The test ComponentContext runs on the test main thread, which means that: |
| // - Tests using TestComponentContextForProcess must instantiate a |
| // [SingleThread]TaskEnvironment with UI or IO main-thread-type. |
| // - If all services exposed via the test ComponentContext run on the test |
| // main thread, and the code under test does as well, then RunUntilIdle() can |
| // normally be used to "flush" any pending FIDL requests and related work. |
| // Note that this is not true if any services, or code under test, use threads |
| // or processes! |
| // |
| // The test ComponentContext is typically instantiated within a test body or |
| // test base-class: |
| // |
| // TEST(MyFunkyTest, IsFunky) { |
| // TestComponentContextForProcess test_context; |
| // // Configure the |test_context|. |
| // // Run tests of code that uses ComponentContextForProcess(). |
| // } |
| // |
| // By default created context doesn't expose any services. Services from the |
| // original process-global ComponentContext (usually the environment in which |
| // the test process is running), can be exposed through the |test_context| with |
| // AddServices(), during test setup: |
| // |
| // test_context.AddServices({fuchsia::memorypressure::Provider::Name_, ...}); |
| // // ... Execute tests which use fuchsia.memorypressure.Provider ... |
| // |
| // Alternatively InitialState::kCloneAll can be passed to the constructor to |
| // expose all services listed in /svc, e.g.: |
| // |
| // TestComponentContextForProcess test_context( |
| // TestComponentContextForProcess::InitialState::kCloneAll); |
| // |
| // Fake/mock implementations can be exposed via additional_services(): |
| // |
| // ScopedServiceBinding<funky::Service> binding( |
| // test_context.additional_services(), &funky_implementation); |
| // // ... Execute tests which use funky.Service. |
| // |
| // Services published to the process' ComponentContext by code-under-test |
| // can be accessed via published_services(): |
| // |
| // funky::HamsterPtr hamster_service; |
| // test_context.published_services()->Connect(hamster_service.NewRequest()); |
| // // ... Execute tests which exercise the funky.Hamster implementation. |
| // |
| class BASE_EXPORT TestComponentContextForProcess { |
| public: |
| enum class InitialState { |
| kEmpty, |
| kCloneAll, |
| }; |
| |
| explicit TestComponentContextForProcess( |
| InitialState initial_state = InitialState::kEmpty); |
| ~TestComponentContextForProcess(); |
| |
| TestComponentContextForProcess(const TestComponentContextForProcess&) = |
| delete; |
| TestComponentContextForProcess& operator=( |
| const TestComponentContextForProcess&) = delete; |
| |
| // Returns an OutgoingDirectory into which additional services may be |
| // published for use by the code-under test. |
| sys::OutgoingDirectory* additional_services(); |
| |
| // Allows the specified service(s) from the original ComponentContext to be |
| // exposed via the test default ComponentContext. |
| void AddService(const base::StringPiece service); |
| void AddServices(base::span<const base::StringPiece> services); |
| |
| // Returns the directory of services that the code under test has published |
| // to its outgoing service directory. |
| std::shared_ptr<sys::ServiceDirectory> published_services() const { |
| return published_services_; |
| } |
| |
| fidl::UnownedClientEnd<fuchsia_io::Directory> published_services_natural(); |
| |
| private: |
| std::unique_ptr<sys::ComponentContext> old_context_; |
| |
| std::unique_ptr<FilteredServiceDirectory> context_services_; |
| std::shared_ptr<sys::ServiceDirectory> published_services_; |
| fidl::ClientEnd<fuchsia_io::Directory> published_services_natural_; |
| }; |
| |
| } // namespace base |
| |
| #endif // BASE_FUCHSIA_TEST_COMPONENT_CONTEXT_FOR_PROCESS_H_ |