mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2026-06-17 05:38:27 +02:00
test: fix the touch tests to no longer leak
Instead of hardcoded TouchRec/ValuatorRec init the devices with the
matching functions and go from there. This allows us to clean them
up later, removing the various leaks that stop asan from being happy.
(cherry picked from commit e44e9262df)
This commit is contained in:
parent
7e7864db7d
commit
67ef0f0834
1 changed files with 67 additions and 43 deletions
110
test/touch.c
110
test/touch.c
|
|
@ -35,27 +35,46 @@
|
|||
|
||||
#include "tests-common.h"
|
||||
|
||||
static void
|
||||
free_device(DeviceIntPtr dev)
|
||||
{
|
||||
free(dev->name);
|
||||
free(dev->last.scroll); /* sigh, allocated but not freed by the valuator functions */
|
||||
for (int i = 0; i < dev->last.num_touches; i++)
|
||||
valuator_mask_free(&dev->last.touches[i].valuators);
|
||||
|
||||
free(dev->last.touches); /* sigh, allocated but not freed by the valuator functions */
|
||||
FreeDeviceClass(XIValuatorClass, (void**)&dev->valuator);
|
||||
FreeDeviceClass(XITouchClass, (void**)&dev->touch);
|
||||
}
|
||||
|
||||
static void
|
||||
touch_grow_queue(void)
|
||||
{
|
||||
DeviceIntRec dev;
|
||||
ValuatorClassRec val;
|
||||
TouchClassRec touch;
|
||||
SpriteInfoRec sprite;
|
||||
size_t size, new_size;
|
||||
int i;
|
||||
ScreenRec screen;
|
||||
Atom labels[2] = { 0 };
|
||||
|
||||
screenInfo.screens[0] = &screen;
|
||||
|
||||
memset(&dev, 0, sizeof(dev));
|
||||
dev.type = MASTER_POINTER; /* claim it's a master to stop ptracccel */
|
||||
dev.name = xnfstrdup("test device");
|
||||
dev.id = 2;
|
||||
dev.valuator = &val;
|
||||
val.numAxes = 5;
|
||||
dev.touch = &touch;
|
||||
|
||||
InitValuatorClassDeviceStruct(&dev, 2, labels, 10, Absolute);
|
||||
InitTouchClassDeviceStruct(&dev, 5, XIDirectTouch, 2);
|
||||
|
||||
memset(&sprite, 0, sizeof(sprite));
|
||||
dev.spriteInfo = &sprite;
|
||||
|
||||
inputInfo.devices = &dev;
|
||||
|
||||
size = 5;
|
||||
|
||||
dev.last.num_touches = size;
|
||||
dev.last.touches = calloc(dev.last.num_touches, sizeof(*dev.last.touches));
|
||||
assert(dev.last.touches);
|
||||
for (i = 0; i < size; i++) {
|
||||
dev.last.touches[i].active = TRUE;
|
||||
|
|
@ -91,27 +110,33 @@ touch_grow_queue(void)
|
|||
assert(t->ddx_id == 0);
|
||||
}
|
||||
|
||||
free(dev.name);
|
||||
free_device(&dev);
|
||||
}
|
||||
|
||||
static void
|
||||
touch_find_ddxid(void)
|
||||
{
|
||||
DeviceIntRec dev;
|
||||
SpriteInfoRec sprite;
|
||||
DDXTouchPointInfoPtr ti, ti2;
|
||||
ValuatorClassRec val;
|
||||
TouchClassRec touch;
|
||||
int size = 5;
|
||||
int i;
|
||||
Atom labels[2] = { 0 };
|
||||
ScreenRec screen;
|
||||
|
||||
screenInfo.screens[0] = &screen;
|
||||
|
||||
memset(&dev, 0, sizeof(dev));
|
||||
dev.type = MASTER_POINTER; /* claim it's a master to stop ptracccel */
|
||||
dev.name = xnfstrdup("test device");
|
||||
dev.id = 2;
|
||||
dev.valuator = &val;
|
||||
val.numAxes = 5;
|
||||
dev.touch = &touch;
|
||||
dev.last.num_touches = size;
|
||||
dev.last.touches = calloc(dev.last.num_touches, sizeof(*dev.last.touches));
|
||||
|
||||
InitValuatorClassDeviceStruct(&dev, 2, labels, 10, Absolute);
|
||||
InitTouchClassDeviceStruct(&dev, 5, XIDirectTouch, 2);
|
||||
|
||||
memset(&sprite, 0, sizeof(sprite));
|
||||
dev.spriteInfo = &sprite;
|
||||
|
||||
inputInfo.devices = &dev;
|
||||
assert(dev.last.touches);
|
||||
|
||||
|
|
@ -159,32 +184,35 @@ touch_find_ddxid(void)
|
|||
ti = TouchFindByDDXID(&dev, 40, TRUE);
|
||||
assert(ti == &dev.last.touches[size+1]);
|
||||
|
||||
free(dev.name);
|
||||
free_device(&dev);
|
||||
}
|
||||
|
||||
static void
|
||||
touch_begin_ddxtouch(void)
|
||||
{
|
||||
DeviceIntRec dev;
|
||||
SpriteInfoRec sprite;
|
||||
DDXTouchPointInfoPtr ti;
|
||||
ValuatorClassRec val;
|
||||
TouchClassRec touch;
|
||||
int ddx_id = 123;
|
||||
unsigned int last_client_id = 0;
|
||||
int size = 5;
|
||||
Atom labels[2] = { 0 };
|
||||
ScreenRec screen;
|
||||
|
||||
screenInfo.screens[0] = &screen;
|
||||
|
||||
memset(&dev, 0, sizeof(dev));
|
||||
dev.type = MASTER_POINTER; /* claim it's a master to stop ptracccel */
|
||||
dev.name = xnfstrdup("test device");
|
||||
dev.id = 2;
|
||||
dev.valuator = &val;
|
||||
val.numAxes = 5;
|
||||
touch.mode = XIDirectTouch;
|
||||
dev.touch = &touch;
|
||||
dev.last.num_touches = size;
|
||||
dev.last.touches = calloc(dev.last.num_touches, sizeof(*dev.last.touches));
|
||||
inputInfo.devices = &dev;
|
||||
assert(dev.last.touches);
|
||||
|
||||
InitValuatorClassDeviceStruct(&dev, 2, labels, 10, Absolute);
|
||||
InitTouchClassDeviceStruct(&dev, 5, XIDirectTouch, 2);
|
||||
|
||||
memset(&sprite, 0, sizeof(sprite));
|
||||
dev.spriteInfo = &sprite;
|
||||
|
||||
assert(dev.last.touches);
|
||||
ti = TouchBeginDDXTouch(&dev, ddx_id);
|
||||
assert(ti);
|
||||
assert(ti->ddx_id == ddx_id);
|
||||
|
|
@ -206,41 +234,36 @@ touch_begin_ddxtouch(void)
|
|||
assert(!ti->emulate_pointer);
|
||||
last_client_id = ti->client_id;
|
||||
|
||||
free(dev.name);
|
||||
free_device(&dev);
|
||||
}
|
||||
|
||||
static void
|
||||
touch_begin_touch(void)
|
||||
{
|
||||
DeviceIntRec dev;
|
||||
TouchClassRec touch;
|
||||
ValuatorClassRec val;
|
||||
TouchPointInfoPtr ti;
|
||||
int touchid = 12434;
|
||||
int sourceid = 23;
|
||||
SpriteInfoRec sprite;
|
||||
ScreenRec screen;
|
||||
Atom labels[2] = { 0 };
|
||||
|
||||
screenInfo.screens[0] = &screen;
|
||||
|
||||
memset(&dev, 0, sizeof(dev));
|
||||
dev.type = MASTER_POINTER; /* claim it's a master to stop ptracccel */
|
||||
dev.name = xnfstrdup("test device");
|
||||
dev.id = 2;
|
||||
|
||||
memset(&sprite, 0, sizeof(sprite));
|
||||
dev.spriteInfo = &sprite;
|
||||
|
||||
memset(&touch, 0, sizeof(touch));
|
||||
touch.num_touches = 0;
|
||||
|
||||
memset(&val, 0, sizeof(val));
|
||||
dev.valuator = &val;
|
||||
val.numAxes = 2;
|
||||
|
||||
ti = TouchBeginTouch(&dev, sourceid, touchid, TRUE);
|
||||
assert(!ti);
|
||||
|
||||
dev.touch = &touch;
|
||||
InitValuatorClassDeviceStruct(&dev, 2, labels, 10, Absolute);
|
||||
InitTouchClassDeviceStruct(&dev, 5, XIDirectTouch, 2);
|
||||
|
||||
memset(&sprite, 0, sizeof(sprite));
|
||||
dev.spriteInfo = &sprite;
|
||||
|
||||
ti = TouchBeginTouch(&dev, sourceid, touchid, TRUE);
|
||||
assert(ti);
|
||||
assert(ti->client_id == touchid);
|
||||
|
|
@ -248,9 +271,9 @@ touch_begin_touch(void)
|
|||
assert(ti->sourceid == sourceid);
|
||||
assert(ti->emulate_pointer);
|
||||
|
||||
assert(touch.num_touches == 1);
|
||||
assert(dev.touch->num_touches == 5);
|
||||
|
||||
free(dev.name);
|
||||
free_device(&dev);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -265,6 +288,7 @@ touch_init(void)
|
|||
screenInfo.screens[0] = &screen;
|
||||
|
||||
memset(&dev, 0, sizeof(dev));
|
||||
dev.type = MASTER_POINTER; /* claim it's a master to stop ptracccel */
|
||||
dev.name = xnfstrdup("test device");
|
||||
|
||||
memset(&sprite, 0, sizeof(sprite));
|
||||
|
|
@ -279,7 +303,7 @@ touch_init(void)
|
|||
assert(rc == TRUE);
|
||||
assert(dev.touch);
|
||||
|
||||
free(dev.name);
|
||||
free_device(&dev);
|
||||
}
|
||||
|
||||
int
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue