[PATCH weston 7/8] tests: Add test for keyboard key event timestamps

Alexandros Frantzis alexandros.frantzis at collabora.com
Mon Dec 4 13:34:07 UTC 2017


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.frantzis at 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



More information about the wayland-devel mailing list