blob: 1193fb97ebe8889b38d3c6e140d44ed7336e589c [file] [log] [blame]
// 2019 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.
#![cfg(test)]
use anyhow::{Context as _, Error};
use fidl::endpoints::create_request_stream;
use fidl_fuchsia_ui_input2 as ui_input;
use fidl_fuchsia_ui_views as ui_views;
use fuchsia_async;
use fuchsia_component::client::connect_to_service;
use fuchsia_zircon as zx;
use futures::StreamExt;
use input_synthesis;
use std::time::Duration;
use ui_test_tools;
static HID_KEY_A: u32 = 0x04;
#[fuchsia_async::run_singlethreaded(test)]
async fn keyboard_events() -> Result<(), Error> {
fuchsia_syslog::init_with_tags(&["keyboard"])
.expect("keyboard e2e syslog init should not fail");
// When service goes out of scope, dependent services will be disconnected.
let _service = ui_test_tools::setup(ui_test_tools::EnvironmentType::ScenicWithRootPresenter)
.await
.context("ui_test_tools::setup")?;
let keyboard = connect_to_service::<ui_input::KeyboardMarker>()
.context("Failed to connect to Keyboard service")?;
let (listener_client_end, mut listener_stream) =
create_request_stream::<ui_input::KeyListenerMarker>()?;
let (raw_event_pair, _) = zx::EventPair::create()?;
let view_ref = &mut ui_views::ViewRef { reference: raw_event_pair };
// Set listener and view ref.
keyboard.set_listener(view_ref, listener_client_end).await.expect("set_listener");
input_synthesis::keyboard_event_command(HID_KEY_A, Duration::from_millis(0))
.await
.expect("key_event_command injects input");
// Wait for key listener callback to be activated.
match listener_stream.next().await {
Some(Ok(ui_input::KeyListenerRequest::OnKeyEvent { event, responder, .. })) => {
assert_eq!(event.key, Some(ui_input::Key::A));
responder.send(ui_input::Status::Handled).expect("responding from key listener")
}
Some(Err(e)) => {
panic!("Error from listener_stream.next(): {:}", e);
}
None => {
panic!("Error from listener_stream.next(): empty stream");
}
}
Ok(())
}