blob: ca429d8a7a27a9b2e841fc382bbc448815a3c3dc [file] [log] [blame] [edit]
// Copyright 2022 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.
#include <fidl/fuchsia.accessibility.semantics/cpp/fidl.h>
#include <fidl/fuchsia.element/cpp/fidl.h>
#include <fidl/fuchsia.input.interaction/cpp/fidl.h>
#include <fidl/fuchsia.input.virtualkeyboard/cpp/fidl.h>
#include <fidl/fuchsia.ui.composition/cpp/fidl.h>
#include <fidl/fuchsia.ui.display.singleton/cpp/fidl.h>
#include <fidl/fuchsia.ui.focus/cpp/fidl.h>
#include <fidl/fuchsia.ui.input/cpp/fidl.h>
#include <fidl/fuchsia.ui.input3/cpp/fidl.h>
#include <fidl/fuchsia.ui.pointerinjector/cpp/fidl.h>
#include <fidl/fuchsia.ui.policy/cpp/fidl.h>
#include <fidl/fuchsia.ui.test.input/cpp/fidl.h>
#include <fidl/fuchsia.ui.test.scene/cpp/fidl.h>
#include <fidl/test.accessibility/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/syslog/cpp/macros.h>
#include <cstring>
#include <src/ui/testing/test_ui_stack/test_ui_stack_config_lib.h>
#include "fidl/fuchsia.input.virtualkeyboard/cpp/markers.h"
#include "src/ui/testing/ui_test_realm/ui_test_realm.h"
namespace {
template <typename T>
void AddPublicService(sys::ComponentContext* context,
sys::ServiceDirectory* realm_exposed_services) {
FX_CHECK(realm_exposed_services);
context->outgoing()->AddPublicService(
fidl::InterfaceRequestHandler<T>([realm_exposed_services](fidl::InterfaceRequest<T> request) {
realm_exposed_services->Connect(std::move(request), fidl::DiscoverableProtocolName<T>);
}),
fidl::DiscoverableProtocolName<T>);
}
int run_test_ui_stack(int argc, const char** argv) {
async::Loop loop(&kAsyncLoopConfigAttachToCurrentThread);
FX_LOGS(INFO) << "Test UI stack starting";
auto context = sys::ComponentContext::Create();
// Read component configuration, and convert to UITestRealm::Config.
auto test_ui_stack_config = test_ui_stack_config_lib::Config::TakeFromStartupHandle();
ui_testing::UITestRealm::Config config;
config.use_scene_owner = true;
config.accessibility_owner = ui_testing::UITestRealm::AccessibilityOwnerType::FAKE;
config.display_rotation = test_ui_stack_config.display_rotation();
config.device_pixel_ratio = std::stof(test_ui_stack_config.device_pixel_ratio());
config.suspend_enabled = test_ui_stack_config.suspend_enabled();
config.display_config = {
.active_width_px = test_ui_stack_config.display_width_px(),
.active_height_px = test_ui_stack_config.display_height_px(),
.refresh_rate_millihertz = test_ui_stack_config.display_refresh_rate_millihertz(),
.max_layer_count = test_ui_stack_config.display_max_layer_count(),
};
// Build test realm.
ui_testing::UITestRealm realm(config);
realm.Build();
auto realm_exposed_services = realm.CloneExposedServicesDirectory();
// Bind incoming service requests to realm's exposed services directory.
// Base UI services.
AddPublicService<fuchsia_accessibility_semantics::SemanticsManager>(context.get(),
realm_exposed_services.get());
AddPublicService<fuchsia_element::GraphicalPresenter>(context.get(),
realm_exposed_services.get());
AddPublicService<fuchsia_input_interaction::Notifier>(context.get(),
realm_exposed_services.get());
AddPublicService<fuchsia_ui_composition::Allocator>(context.get(), realm_exposed_services.get());
AddPublicService<fuchsia_ui_composition::Flatland>(context.get(), realm_exposed_services.get());
AddPublicService<fuchsia_ui_composition::TrustedFlatlandFactory>(context.get(),
realm_exposed_services.get());
AddPublicService<fuchsia_ui_focus::FocusChainListenerRegistry>(context.get(),
realm_exposed_services.get());
AddPublicService<fuchsia_ui_input::ImeService>(context.get(), realm_exposed_services.get());
AddPublicService<fuchsia_ui_input3::Keyboard>(context.get(), realm_exposed_services.get());
AddPublicService<fuchsia_ui_input3::KeyEventInjector>(context.get(),
realm_exposed_services.get());
AddPublicService<fuchsia_ui_pointerinjector::Registry>(context.get(),
realm_exposed_services.get());
AddPublicService<fuchsia_ui_policy::DeviceListenerRegistry>(context.get(),
realm_exposed_services.get());
AddPublicService<fuchsia_ui_composition::ScreenCapture>(context.get(),
realm_exposed_services.get());
AddPublicService<fuchsia_ui_composition::Screenshot>(context.get(), realm_exposed_services.get());
AddPublicService<fuchsia_ui_display_singleton::DisplayPower>(context.get(),
realm_exposed_services.get());
AddPublicService<fuchsia_ui_display_singleton::Info>(context.get(), realm_exposed_services.get());
AddPublicService<fuchsia_ui_display_singleton::VsyncSource>(context.get(),
realm_exposed_services.get());
// Helper services.
AddPublicService<fuchsia_ui_test_input::Registry>(context.get(), realm_exposed_services.get());
AddPublicService<fuchsia_ui_test_scene::Controller>(context.get(), realm_exposed_services.get());
AddPublicService<fuchsia_input_virtualkeyboard::Manager>(context.get(),
realm_exposed_services.get());
AddPublicService<fuchsia_input_virtualkeyboard::ControllerCreator>(context.get(),
realm_exposed_services.get());
if (config.accessibility_owner == ui_testing::UITestRealm::AccessibilityOwnerType::FAKE) {
AddPublicService<test_accessibility::Magnifier>(context.get(), realm_exposed_services.get());
}
context->outgoing()->ServeFromStartupInfo();
loop.Run();
return 0;
FX_LOGS(INFO) << "Test UI stack exiting";
}
} // namespace
int main(int argc, const char** argv) { return run_test_ui_stack(argc, argv); }