Hi,

On 04/01/2014 05:47 AM, Peter Hutterer wrote:
> 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]>

Looks good:

Reviewed-by: Hans de Goede <[email protected]>

Regards,

Hans

> ---
>  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);
> 
_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to