tests: Support setting the test client input dynamically
authorAlexandros Frantzis <alexandros.frantzis@collabora.com>
Thu, 8 Feb 2018 13:37:56 +0000 (15:37 +0200)
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>
Thu, 15 Feb 2018 11:14:48 +0000 (13:14 +0200)
The current test client code waits for all wl_seat globals to arrive
before checking them and deciding which one is the test seat global to
use for the input object. Test code that needs to add/remove test seats
would have to call the client_set_input() function for any seat changes
to take effect. Although we could allow this by making
client_set_input() public, we would be exposing unecessary
implementation details.

This commit applies any seat changes immediately upon arrival of the
seat name, freeing test code from needing to call extra functions like
client_set_input(). To achieve this the call to input_data_devices() is
moved from client_set_input() to the seat name event handler.

This commit also moves the check that all seats have names to an
explicit test. To support this test, inputs corresponding to non-test
seats are not destroyed (unless their seat global is removed), as
was previously the case.

Signed-off-by: Alexandros Frantzis <alexandros.frantzis@collabora.com>
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
tests/devices-test.c
tests/weston-test-client-helper.c
tests/weston-test-client-helper.h

index 450713e..ce1cea3 100644 (file)
@@ -310,3 +310,13 @@ TEST(get_device_after_destroy_multiple)
                get_device_after_destroy();
        }
 }
+
+TEST(seats_have_names)
+{
+       struct client *cl = create_client_and_test_surface(100, 100, 100, 100);
+       struct input *input;
+
+       wl_list_for_each(input, &cl->inputs, link) {
+               assert(input->seat_name);
+       }
+}
index 5ee032c..dc69e15 100644 (file)
@@ -635,6 +635,15 @@ seat_handle_name(void *data, struct wl_seat *seat, const char *name)
        input->seat_name = strdup(name);
        assert(input->seat_name && "No memory");
 
+       /* We only update the devices and set client input for the test seat */
+       if (strcmp(name, "test-seat") == 0) {
+               assert(!input->client->input &&
+                      "Multiple test seats detected!");
+
+               input_update_devices(input);
+               input->client->input = input;
+       }
+
        fprintf(stderr, "test-client: got seat %p name: \'%s\'\n",
                input, name);
 }
@@ -726,6 +735,7 @@ handle_global(void *data, struct wl_registry *registry,
                                         &wl_compositor_interface, version);
        } else if (strcmp(interface, "wl_seat") == 0) {
                input = xzalloc(sizeof *input);
+               input->client = client;
                input->global_name = global->name;
                input->wl_seat =
                        wl_registry_bind(registry, id,
@@ -882,26 +892,6 @@ log_handler(const char *fmt, va_list args)
        vfprintf(stderr, fmt, args);
 }
 
-/* find the test-seat and set it in client.
- * Destroy other inputs */
-static void
-client_set_input(struct client *cl)
-{
-       struct input *inp, *inptmp;
-       wl_list_for_each_safe(inp, inptmp, &cl->inputs, link) {
-               assert(inp->seat_name && "BUG: input with no name");
-               if (strcmp(inp->seat_name, "test-seat") == 0) {
-                       cl->input = inp;
-                       input_update_devices(inp);
-               } else {
-                       input_destroy(inp);
-               }
-       }
-
-       /* we keep only one input */
-       assert(wl_list_length(&cl->inputs) == 1);
-}
-
 struct client *
 create_client(void)
 {
@@ -927,9 +917,6 @@ create_client(void)
         * events */
        client_roundtrip(client);
 
-       /* find the right input for us */
-       client_set_input(client);
-
        /* must have WL_SHM_FORMAT_ARGB32 */
        assert(client->has_argb);
 
index fb31125..255bbf6 100644 (file)
@@ -74,6 +74,7 @@ struct test {
 };
 
 struct input {
+       struct client *client;
        uint32_t global_name;
        struct wl_seat *wl_seat;
        struct pointer *pointer;