Add test to verify that the server correctly sets the timestamps of keyboard key events. This requires updating the weston-test protocol to support passing key event timestamps.
Signed-off-by: Alexandros Frantzis <alexandros.frant...@collabora.com> --- protocol/weston-test.xml | 3 ++ tests/keyboard-test.c | 58 +++++++++++++++++++++++++++++++-------- tests/weston-test-client-helper.c | 1 + tests/weston-test-client-helper.h | 1 + tests/weston-test.c | 3 +- 5 files changed, 53 insertions(+), 13 deletions(-) diff --git a/protocol/weston-test.xml b/protocol/weston-test.xml index a4a7ad4e..37fa221f 100644 --- a/protocol/weston-test.xml +++ b/protocol/weston-test.xml @@ -64,6 +64,9 @@ <arg name="surface" type="object" interface="wl_surface" allow-null="true"/> </request> <request name="send_key"> + <arg name="tv_sec_hi" type="uint"/> + <arg name="tv_sec_lo" type="uint"/> + <arg name="tv_nsec" type="uint"/> <arg name="key" type="uint"/> <arg name="state" type="uint"/> </request> diff --git a/tests/keyboard-test.c b/tests/keyboard-test.c index 6b4ba19d..df1940f8 100644 --- a/tests/keyboard-test.c +++ b/tests/keyboard-test.c @@ -27,21 +27,45 @@ #include <stdint.h> +#include "shared/timespec-util.h" #include "weston-test-client-helper.h" +static const struct timespec t1 = { .tv_sec = 1, .tv_nsec = 1000001 }; +static const struct timespec t2 = { .tv_sec = 2, .tv_nsec = 2000001 }; + +static struct client * +create_client_with_keyboard_focus(void) +{ + struct client *cl = create_client_and_test_surface(10, 10, 1, 1); + assert(cl); + + weston_test_activate_surface(cl->test->weston_test, + cl->surface->wl_surface); + client_roundtrip(cl); + + return cl; +} + +static void +send_key(struct client *client, const struct timespec *time, + uint32_t key, uint32_t state) +{ + uint32_t tv_sec_hi, tv_sec_lo, tv_nsec; + + timespec_to_proto(time, &tv_sec_hi, &tv_sec_lo, &tv_nsec); + weston_test_send_key(client->test->weston_test, tv_sec_hi, tv_sec_lo, + tv_nsec, key, state); + client_roundtrip(client); +} + TEST(simple_keyboard_test) { - struct client *client; - struct surface *expect_focus = NULL; - struct keyboard *keyboard; + struct client *client = create_client_with_keyboard_focus(); + struct keyboard *keyboard = client->input->keyboard; + struct surface *expect_focus = client->surface; uint32_t expect_key = 0; uint32_t expect_state = 0; - client = create_client_and_test_surface(10, 10, 1, 1); - assert(client); - - keyboard = client->input->keyboard; - while (1) { assert(keyboard->key == expect_key); assert(keyboard->state == expect_state); @@ -49,8 +73,7 @@ TEST(simple_keyboard_test) if (keyboard->state == WL_KEYBOARD_KEY_STATE_PRESSED) { expect_state = WL_KEYBOARD_KEY_STATE_RELEASED; - weston_test_send_key(client->test->weston_test, - expect_key, expect_state); + send_key(client, &t1, expect_key, expect_state); } else if (keyboard->focus) { expect_focus = NULL; weston_test_activate_surface( @@ -62,8 +85,7 @@ TEST(simple_keyboard_test) weston_test_activate_surface( client->test->weston_test, expect_focus->wl_surface); - weston_test_send_key(client->test->weston_test, - expect_key, expect_state); + send_key(client, &t1, expect_key, expect_state); } else { break; } @@ -71,3 +93,15 @@ TEST(simple_keyboard_test) client_roundtrip(client); } } + +TEST(keyboard_key_event_time) +{ + struct client *client = create_client_with_keyboard_focus(); + struct keyboard *keyboard = client->input->keyboard; + + send_key(client, &t1, 0, WL_KEYBOARD_KEY_STATE_PRESSED); + assert(keyboard->key_time == timespec_to_msec(&t1)); + + send_key(client, &t2, 0, WL_KEYBOARD_KEY_STATE_RELEASED); + assert(keyboard->key_time == timespec_to_msec(&t2)); +} diff --git a/tests/weston-test-client-helper.c b/tests/weston-test-client-helper.c index 92def14d..ef58d77a 100644 --- a/tests/weston-test-client-helper.c +++ b/tests/weston-test-client-helper.c @@ -280,6 +280,7 @@ keyboard_handle_key(void *data, struct wl_keyboard *wl_keyboard, keyboard->key = key; keyboard->state = state; + keyboard->key_time = time; fprintf(stderr, "test-client: got keyboard key %u %u\n", key, state); } diff --git a/tests/weston-test-client-helper.h b/tests/weston-test-client-helper.h index 1b4d83c7..1be727c1 100644 --- a/tests/weston-test-client-helper.h +++ b/tests/weston-test-client-helper.h @@ -111,6 +111,7 @@ struct keyboard { int rate; int delay; } repeat_info; + uint32_t key_time; }; struct touch { diff --git a/tests/weston-test.c b/tests/weston-test.c index bb1a4cd4..d07d84c4 100644 --- a/tests/weston-test.c +++ b/tests/weston-test.c @@ -227,13 +227,14 @@ activate_surface(struct wl_client *client, struct wl_resource *resource, static void send_key(struct wl_client *client, struct wl_resource *resource, + uint32_t tv_sec_hi, uint32_t tv_sec_lo, uint32_t tv_nsec, uint32_t key, enum wl_keyboard_key_state state) { struct weston_test *test = wl_resource_get_user_data(resource); struct weston_seat *seat = get_seat(test); struct timespec time; - timespec_from_msec(&time, 100); + timespec_from_proto(&time, tv_sec_hi, tv_sec_lo, tv_nsec); notify_key(seat, &time, key, state, STATE_UPDATE_AUTOMATIC); } -- 2.14.1 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel