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:
Peter Hutterer 2024-01-04 12:23:35 +10:00
parent 7e7864db7d
commit 67ef0f0834

View file

@ -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