For specific tests we need something that e.g. looks like a touchpad, but has
a different name, a different number of slots, etc. In this case, the
following code will do exactly that:

struct input_absinfo overrides[] = {
 { .value = ABS_MT_SLOT, .minimum = 0, .maximum = 100 },
 { .value = -1 },
};

litest_create_device_with_overrides(LITEST_SYNAPTICS_CLICKPAD,
                                    NULL, NULL, &overrides, NULL);

For general event codes, overrides can only add to the set of events, they
can't remove.

Signed-off-by: Peter Hutterer <[email protected]>
---
 test/litest.c | 158 ++++++++++++++++++++++++++++++++++++++++++++++++++--------
 test/litest.h |   7 +++
 2 files changed, 144 insertions(+), 21 deletions(-)

diff --git a/test/litest.c b/test/litest.c
index 23ba76b..3a69a09 100644
--- a/test/litest.c
+++ b/test/litest.c
@@ -334,39 +334,149 @@ const struct libinput_interface interface = {
        .close_restricted = close_restricted,
 };
 
-struct litest_device *
-litest_create_device(enum litest_device_type which)
+
+static struct input_absinfo *
+merge_absinfo(const struct input_absinfo *orig,
+             const struct input_absinfo *override)
 {
-       struct litest_device *d = zalloc(sizeof(*d));
-       int fd;
-       int rc;
-       const char *path;
+       struct input_absinfo *abs;
+       int nelem, i;
+       size_t sz = ABS_MAX + 1;
+
+       if (!orig)
+               return NULL;
+
+       abs = calloc(sz, sizeof(*abs));
+       ck_assert(abs != NULL);
+
+       nelem = 0;
+       while(orig[nelem].value != -1) {
+               abs[nelem] = orig[nelem];
+               nelem++;
+               ck_assert_int_lt(nelem, sz);
+       }
+
+       /* just append, if the same axis is present twice, libevdev will
+          only use the last value anyway */
+       i = 0;
+       while(override && override[i].value != -1) {
+               abs[nelem++] = override[i++];
+               ck_assert_int_lt(nelem, sz);
+       }
+
+       ck_assert_int_lt(nelem, sz);
+       abs[nelem].value = -1;
+
+       return abs;
+}
+
+static int*
+merge_events(const int *orig, const int *override)
+{
+       int *events;
+       int nelem, i;
+       size_t sz = KEY_MAX * 3;
+
+       if (!orig)
+               return NULL;
+
+       events = calloc(sz, sizeof(int));
+       ck_assert(events != NULL);
+
+       nelem = 0;
+       while(orig[nelem] != -1) {
+               events[nelem] = orig[nelem];
+               nelem++;
+               ck_assert_int_lt(nelem, sz);
+       }
+
+       /* just append, if the same axis is present twice, libevdev will
+        * ignore the double definition anyway */
+       i = 0;
+       while(override && override[i] != -1) {
+               events[nelem++] = override[i++];
+               ck_assert_int_le(nelem, sz);
+       }
+
+       ck_assert_int_lt(nelem, sz);
+       events[nelem] = -1;
+
+       return events;
+}
+
+
+static struct litest_device *
+litest_create(enum litest_device_type which,
+             const char *name_override,
+             struct input_id *id_override,
+             const struct input_absinfo *abs_override,
+             const int *events_override)
+{
+       struct litest_device *d = NULL;
        struct litest_test_device **dev;
-
-       ck_assert(d != NULL);
+       const char *name;
+       const struct input_id *id;
+       struct input_absinfo *abs;
+       int *events;
 
        dev = devices;
        while (*dev) {
-               if ((*dev)->type == which) {
-                       if ((*dev)->create)
-                               (*dev)->create(d);
-                       else {
-                               d->uinput = 
litest_create_uinput_device_from_description((*dev)->name,
-                                                                               
         (*dev)->id,
-                                                                               
         (*dev)->absinfo,
-                                                                               
         (*dev)->events);
-                               d->interface = (*dev)->interface;
-                       }
+               if ((*dev)->type == which)
                        break;
-               }
                dev++;
        }
 
-       if (!dev) {
+       if (!dev)
                ck_abort_msg("Invalid device type %d\n", which);
-               return NULL;
+
+       d = zalloc(sizeof(*d));
+       ck_assert(d != NULL);
+
+       /* device has custom create method */
+       if ((*dev)->create) {
+               (*dev)->create(d);
+               if (abs_override || events_override)
+                       ck_abort_msg("Custom create cannot"
+                                    "be overridden");
+
+               return d;
        }
 
+       abs = merge_absinfo((*dev)->absinfo, abs_override);
+       events = merge_events((*dev)->events, events_override);
+       name = name_override ? name_override : (*dev)->name;
+       id = id_override ? id_override : (*dev)->id;
+
+       d->uinput = litest_create_uinput_device_from_description(name,
+                                                                id,
+                                                                abs,
+                                                                events);
+       d->interface = (*dev)->interface;
+       free(abs);
+       free(events);
+
+       return d;
+
+}
+
+struct litest_device *
+litest_create_device_with_overrides(enum litest_device_type which,
+                                   const char *name_override,
+                                   struct input_id *id_override,
+                                   const struct input_absinfo *abs_override,
+                                   const int *events_override)
+{
+       struct litest_device *d;
+       int fd;
+       int rc;
+       const char *path;
+
+       d = litest_create(which,
+                         name_override,
+                         id_override,
+                         abs_override,
+                         events_override);
+
        path = libevdev_uinput_get_devnode(d->uinput);
        ck_assert(path != NULL);
        fd = open(path, O_RDWR|O_NONBLOCK);
@@ -391,6 +501,12 @@ litest_create_device(enum litest_device_type which)
        return d;
 }
 
+struct litest_device *
+litest_create_device(enum litest_device_type which)
+{
+       return litest_create_device_with_overrides(which, NULL, NULL, NULL, 
NULL);
+}
+
 int
 litest_handle_events(struct litest_device *d)
 {
diff --git a/test/litest.h b/test/litest.h
index 75c517c..2e96fd3 100644
--- a/test/litest.h
+++ b/test/litest.h
@@ -73,6 +73,13 @@ void litest_add_no_device(const char *name, void *func);
 
 int litest_run(int argc, char **argv);
 struct litest_device * litest_create_device(enum litest_device_type which);
+struct litest_device *
+litest_create_device_with_overrides(enum litest_device_type which,
+                                   const char *name_override,
+                                   struct input_id *id_override,
+                                   const struct input_absinfo *abs_override,
+                                   const int *events_override);
+
 struct litest_device *litest_current_device(void);
 void litest_delete_device(struct litest_device *d);
 int litest_handle_events(struct litest_device *d);
-- 
1.9.0

_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to