[PATCH xserver 17/17] Test: Input: Add touch tests

Peter Hutterer peter.hutterer at who-t.net
Wed Jan 5 16:29:12 PST 2011


On Tue, Dec 28, 2010 at 05:58:08PM +0000, Daniel Stone wrote:
> Add tests for:
>     * checking basic functionality of TouchCreate, FindTouchPoint, and
>       FinishTouchPoint
>     * ensuring all touch event types match each other in
>       GrabMatchesSecond
>     * ensuring all touch events are selected together, or not at all, in
>       XISelectEvents (this test authored by Chase Douglas)
>     * ensuring EventToXI2 is predictable between runs
>     * validating TouchBegin, TouchMotion and TouchEnd protocol
>       conversion
> 
> Signed-off-by: Daniel Stone <daniel at fooishbar.org>
> ---
>  test/input.c                       |  117 +++++++++++++++++++++++++++++++++++-
>  test/xi2/protocol-eventconvert.c   |   54 ++++++++++++++++
>  test/xi2/protocol-xiselectevents.c |   44 +++++++++++++
>  3 files changed, 214 insertions(+), 1 deletions(-)
> 
> diff --git a/test/input.c b/test/input.c
> index e443f75..b59391f 100644
> --- a/test/input.c
> +++ b/test/input.c
> @@ -277,6 +277,9 @@ static void dix_event_to_core_conversion(void)
>      dix_event_to_core_fail(ET_DeviceChanged, BadImplementation);
>      dix_event_to_core_fail(ET_ProximityIn, BadMatch);
>      dix_event_to_core_fail(ET_ProximityOut, BadMatch);
> +    dix_event_to_core_fail(ET_TouchBegin, BadMatch);
> +    dix_event_to_core_fail(ET_TouchMotion, BadMatch);
> +    dix_event_to_core_fail(ET_TouchEnd, BadMatch);
>  
>      dix_event_to_core(ET_KeyPress);
>      dix_event_to_core(ET_KeyRelease);
> @@ -285,6 +288,34 @@ static void dix_event_to_core_conversion(void)
>      dix_event_to_core(ET_Motion);
>  }
>  
> +static void dix_event_to_xi2_conversion(void)
> +{
> +    DeviceEvent ev;
> +    xXIDeviceEvent *xi2, *xi2_flags;
> +    int rc;
> +
> +    memset(&ev, 0, sizeof(ev));
> +
> +    ev.header   = 0xFF;
> +    ev.length   = sizeof(DeviceEvent);
> +    ev.type     = ET_TouchBegin;
> +
> +    rc          = EventToXI2((InternalEvent*)&ev, (xEvent**)&xi2);
> +    g_assert(rc == Success);
> +    g_assert(xi2->type == GenericEvent);
> +    g_assert(xi2->evtype == XI_TouchBegin);
> +    g_assert(xi2->flags == 0);
> +
> +    ev.flags    = XITouchOwner;
> +    rc          = EventToXI2((InternalEvent*)&ev, (xEvent**)&xi2_flags);
> +    g_assert(rc == Success);
> +    g_assert(xi2_flags->type == GenericEvent);
> +    g_assert(xi2_flags->evtype == XI_TouchBegin);
> +    g_assert(xi2_flags->flags == XITouchOwner);
> +    xi2_flags->flags = 0;
> +    g_assert(memcmp(xi2, xi2_flags, sizeof(*xi2)) == 0);
> +}
> +
>  static void xi2_struct_sizes(void)
>  {
>  #define compare(req) \
> @@ -674,6 +705,20 @@ static void dix_grab_matching(void)
>      g_assert(rc == TRUE);
>      rc = GrabMatchesSecond(&b, &a, FALSE);
>      g_assert(rc == TRUE);
> +
> +    /* A TouchMotion/TouchEnd grab must match a TouchBegin grab. */

add the case for XI_TouchEnd then, please.

> +    a.grabtype = GRABTYPE_XI2;
> +    b.grabtype = GRABTYPE_XI2;
> +    a.type = XI_TouchBegin;
> +    b.type = XI_TouchMotion;
> +    a.detail.exact = 0;
> +    b.detail.exact = 0;
> +    a.modifiersDetail.exact = 0;
> +    b.modifiersDetail.exact = 0;
> +    rc = GrabMatchesSecond(&a, &b, FALSE);
> +    g_assert(rc == TRUE);
> +    rc = GrabMatchesSecond(&b, &a, FALSE);
> +    g_assert(rc == TRUE);


>  }
>  
>  static void test_bits_to_byte(int i)
> @@ -1060,6 +1105,73 @@ static void include_bit_test_macros(void)
>      }
>  }
>  
> +static void touch_create(void)
> +{
> +    DeviceIntRec dev;
> +    TouchClassRec touch;
> +    TouchPointInfoRec touches[2];
> +    int touchid;
> +
> +    memset(&dev, 0, sizeof(dev));
> +    memset(&touch, 0, sizeof(touch));
> +    memset(touches, 0, sizeof(*touches) * 2);
> +    touch.num_touches = 2;
> +    touch.touches = touches;
> +    dev.touch = &touch;
> +    touchid = CreateTouchPoint(&dev, 0xdeadbeef);
> +    g_assert(touchid >= 0);
> +    g_assert(touch.touches[touchid].active == TRUE);
> +    g_assert(touch.touches[touchid].id == 0xdeadbeef);
> +    g_assert(touch.touches[touchid].pending_finish == 0);
> +    g_assert(touch.touches[touchid].num_listeners == 0);
> +    g_assert(touch.touches[touchid].num_grabs == 0);
> +    g_assert(touch.touches[touchid].sprite.spriteTraceGood == 0);
> +}
> +
> +static void touch_find_point(void)
> +{
> +    DeviceIntRec dev;
> +    TouchClassRec touch;
> +    TouchPointInfoRec touches[2];
> +    int create_id, find_id;
> +
> +    memset(&dev, 0, sizeof(dev));
> +    memset(&touch, 0, sizeof(touch));
> +    memset(touches, 0, sizeof(*touches) * 2);
> +    touch.num_touches = 2;
> +    touch.touches = touches;
> +    dev.touch = &touch;
> +    create_id = CreateTouchPoint(&dev, 0xdeadbeef);
> +    g_assert(create_id >= 0);
> +    find_id = FindTouchPoint(&dev, 0xdeadbeef);
> +    g_assert(create_id == find_id);
> +    g_assert(touch.touches[find_id].active == TRUE);
> +    g_assert(touch.touches[find_id].id == 0xdeadbeef);
> +}
> +
> +static void touch_finish(void)
> +{
> +    DeviceIntRec dev;
> +    TouchClassRec touch;
> +    TouchPointInfoRec touches[2];
> +    int touchid;
> +
> +    memset(&dev, 0, sizeof(dev));
> +    memset(&touch, 0, sizeof(touch));
> +    memset(touches, 0, sizeof(*touches) * 2);
> +    touch.num_touches = 2;
> +    touch.touches = touches;
> +    dev.touch = &touch;
> +    touchid = CreateTouchPoint(&dev, 0xdeadbeef);
> +    g_assert(touchid >= 0);
> +    FinishTouchPoint(&dev, 0xdeadbeef);
> +    g_assert(touch.touches[touchid].active == FALSE);
> +    g_assert(touch.touches[touchid].pending_finish == 0);
> +    g_assert(touch.touches[touchid].num_listeners == 0);
> +    g_assert(touch.touches[touchid].num_grabs == 0);
> +    g_assert(touch.touches[touchid].sprite.spriteTraceGood == 0);

maybe make sure that FindTouchPoint won't find the deleted touch point
anymore here.

either way, Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net> though
this one I guess will see changes as the server code moves.

Cheers,
  Peter

> +}
> +
>  int main(int argc, char** argv)
>  {
>      g_test_init(&argc, &argv,NULL);
> @@ -1069,6 +1181,7 @@ int main(int argc, char** argv)
>      g_test_add_func("/dix/input/attributes", dix_input_attributes);
>      g_test_add_func("/dix/input/init-valuators", dix_init_valuators);
>      g_test_add_func("/dix/input/event-core-conversion", dix_event_to_core_conversion);
> +    g_test_add_func("/dix/input/event-xi2-conversion", dix_event_to_xi2_conversion);
>      g_test_add_func("/dix/input/check-grab-values", dix_check_grab_values);
>      g_test_add_func("/dix/input/xi2-struct-sizes", xi2_struct_sizes);
>      g_test_add_func("/dix/input/grab_matching", dix_grab_matching);
> @@ -1076,7 +1189,9 @@ int main(int argc, char** argv)
>      g_test_add_func("/include/byte_padding_macros", include_byte_padding_macros);
>      g_test_add_func("/include/bit_test_macros", include_bit_test_macros);
>      g_test_add_func("/Xi/xiproperty/register-unregister", xi_unregister_handlers);
> -
> +    g_test_add_func("/dix/input/touch-create", touch_create);
> +    g_test_add_func("/dix/input/touch-find-point", touch_find_point);
> +    g_test_add_func("/dix/input/touch-finish", touch_finish);
>  
>      return g_test_run();
>  }
> diff --git a/test/xi2/protocol-eventconvert.c b/test/xi2/protocol-eventconvert.c
> index 0478c33..6c9595a 100644
> --- a/test/xi2/protocol-eventconvert.c
> +++ b/test/xi2/protocol-eventconvert.c
> @@ -311,6 +311,18 @@ static void test_values_XIDeviceEvent(DeviceEvent *in, xXIDeviceEvent *out,
>      g_assert(out->sourceid == in->sourceid);
>  
>      switch (in->type) {
> +        case ET_TouchMotion:
> +            flagmask = (XITouchOwnerAccepted | XITouchPendingFinish);
> +            /* fallthrough */
> +        case ET_TouchBegin:
> +        case ET_TouchEnd:
> +            flagmask |= XITouchOwner;
> +            break;
> +        case ET_ButtonPress:
> +        case ET_ButtonRelease:
> +        case ET_Motion:
> +            flagmask = XITouchPointer;
> +            break;
>          case ET_KeyPress:
>              flagmask = XIKeyRepeat;
>              break;
> @@ -636,6 +648,47 @@ static void test_convert_XIDeviceEvent(void)
>      }
>  }
>  
> +static void test_convert_XITouch(void)
> +{
> +    DeviceEvent in;
> +
> +    memset(&in, 0, sizeof(in));
> +
> +    g_test_message("Testing TouchBegin");
> +    in.header = ET_Internal;
> +    in.type = ET_TouchBegin;
> +    in.length = sizeof(DeviceEvent);
> +    in.time             = 0;
> +    in.deviceid         = 1;
> +    in.sourceid         = 2;
> +    in.root             = 3;
> +    in.root_x           = 4;
> +    in.root_x_frac      = 5;
> +    in.root_y           = 6;
> +    in.root_y_frac      = 7;
> +    in.detail.button    = 8;
> +    in.mods.base        = 9;
> +    in.mods.latched     = 10;
> +    in.mods.locked      = 11;
> +    in.mods.effective   = 11;
> +    in.group.base       = 12;
> +    in.group.latched    = 13;
> +    in.group.locked     = 14;
> +    in.group.effective  = 15;
> +    in.flags            = XITouchOwner;
> +    test_XIDeviceEvent(&in);
> +
> +    g_test_message("Testing TouchMotion");
> +    in.type = ET_TouchMotion;
> +    in.flags = XITouchOwnerAccepted;
> +    test_XIDeviceEvent(&in);
> +
> +    g_test_message("Testing TouchEnd");
> +    in.type = ET_TouchEnd;
> +    in.flags = 0;
> +    test_XIDeviceEvent(&in);
> +}
> +
>  static void test_values_XIDeviceChangedEvent(DeviceChangedEvent *in,
>                                               xXIDeviceChangedEvent *out,
>                                               BOOL swap)
> @@ -912,6 +965,7 @@ int main(int argc, char** argv)
>      g_test_add_func("/xi2/eventconvert/XIFocusEvent", test_convert_XIFocusEvent);
>      g_test_add_func("/xi2/eventconvert/XIDeviceEvent", test_convert_XIDeviceEvent);
>      g_test_add_func("/xi2/eventconvert/XIDeviceChangedEvent", test_convert_XIDeviceChangedEvent);
> +    g_test_add_func("/xi2/eventconvert/XITouch", test_convert_XITouch);
>  
>      return g_test_run();
>  }
> diff --git a/test/xi2/protocol-xiselectevents.c b/test/xi2/protocol-xiselectevents.c
> index f951a14..6fa97a0 100644
> --- a/test/xi2/protocol-xiselectevents.c
> +++ b/test/xi2/protocol-xiselectevents.c
> @@ -159,7 +159,18 @@ static void request_XISelectEvents_masks(xXISelectEventsReq *req)
>          memset(bits, 0, mask->mask_len * 4);
>          for (j = 0; j <= XI2LASTEVENT; j++)
>          {
> +            /* Can't select for these events alone */
> +            if (j == XI_TouchMotion || j == XI_TouchEnd)
> +                continue;
> +
>              SetBit(bits, j);
> +
> +            /* Must select for all touch events at once */
> +            if (j == XI_TouchBegin) {
> +                SetBit(bits, XI_TouchMotion);
> +                SetBit(bits, XI_TouchEnd);
> +            }
> +
>              request_XISelectEvent(req, Success);
>              ClearBit(bits, j);
>          }
> @@ -175,7 +186,18 @@ static void request_XISelectEvents_masks(xXISelectEventsReq *req)
>  
>          for (j = 0; j <= XI2LASTEVENT; j++)
>          {
> +            /* Can't select for these events alone */
> +            if (j == XI_TouchMotion || j == XI_TouchEnd)
> +                continue;
> +
>              SetBit(bits, j);
> +
> +            /* Must select for all touch events at once */
> +            if (j == XI_TouchBegin) {
> +                SetBit(bits, XI_TouchMotion);
> +                SetBit(bits, XI_TouchEnd);
> +            }
> +
>              request_XISelectEvent(req, Success);
>          }
>  
> @@ -189,7 +211,18 @@ static void request_XISelectEvents_masks(xXISelectEventsReq *req)
>  
>          for (j = XI2LASTEVENT + 1; j < mask->mask_len * 4; j++)
>          {
> +            /* Can't select for these events alone */
> +            if (j == XI_TouchMotion || j == XI_TouchEnd)
> +                continue;
> +
>              SetBit(bits, j);
> +
> +            /* Must select for all touch events at once */
> +            if (j == XI_TouchBegin) {
> +                SetBit(bits, XI_TouchMotion);
> +                SetBit(bits, XI_TouchEnd);
> +            }
> +
>              request_XISelectEvent(req, BadValue);
>              ClearBit(bits, j);
>          }
> @@ -202,7 +235,18 @@ static void request_XISelectEvents_masks(xXISelectEventsReq *req)
>          memset(bits, 0, mask->mask_len * 4);
>          for (j = 0; j <= XI2LASTEVENT; j++)
>          {
> +            /* Can't select for these events alone */
> +            if (j == XI_TouchMotion || j == XI_TouchEnd)
> +                continue;
> +
>              SetBit(bits, j);
> +
> +            /* Must select for all touch events at once */
> +            if (j == XI_TouchBegin) {
> +                SetBit(bits, XI_TouchMotion);
> +                SetBit(bits, XI_TouchEnd);
> +            }
> +
>              request_XISelectEvent(req, Success);
>          }
>  
> -- 
> 1.7.2.3
 


More information about the xorg-devel mailing list