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.
This commit is contained in:
Peter Hutterer 2024-01-04 12:23:35 +10:00
parent b6931f2f5f
commit e44e9262df

View File

@ -35,27 +35,46 @@
#include "tests-common.h" #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 static void
touch_grow_queue(void) touch_grow_queue(void)
{ {
DeviceIntRec dev; DeviceIntRec dev;
ValuatorClassRec val; SpriteInfoRec sprite;
TouchClassRec touch;
size_t size, new_size; size_t size, new_size;
int i; int i;
ScreenRec screen;
Atom labels[2] = { 0 };
screenInfo.screens[0] = &screen;
memset(&dev, 0, sizeof(dev)); memset(&dev, 0, sizeof(dev));
dev.type = MASTER_POINTER; /* claim it's a master to stop ptracccel */
dev.name = xnfstrdup("test device"); dev.name = xnfstrdup("test device");
dev.id = 2; dev.id = 2;
dev.valuator = &val;
val.numAxes = 5; InitValuatorClassDeviceStruct(&dev, 2, labels, 10, Absolute);
dev.touch = &touch; InitTouchClassDeviceStruct(&dev, 5, XIDirectTouch, 2);
memset(&sprite, 0, sizeof(sprite));
dev.spriteInfo = &sprite;
inputInfo.devices = &dev; inputInfo.devices = &dev;
size = 5; size = 5;
dev.last.num_touches = size;
dev.last.touches = calloc(dev.last.num_touches, sizeof(*dev.last.touches));
assert(dev.last.touches); assert(dev.last.touches);
for (i = 0; i < size; i++) { for (i = 0; i < size; i++) {
dev.last.touches[i].active = TRUE; dev.last.touches[i].active = TRUE;
@ -91,27 +110,33 @@ touch_grow_queue(void)
assert(t->ddx_id == 0); assert(t->ddx_id == 0);
} }
free(dev.name); free_device(&dev);
} }
static void static void
touch_find_ddxid(void) touch_find_ddxid(void)
{ {
DeviceIntRec dev; DeviceIntRec dev;
SpriteInfoRec sprite;
DDXTouchPointInfoPtr ti, ti2; DDXTouchPointInfoPtr ti, ti2;
ValuatorClassRec val;
TouchClassRec touch;
int size = 5; int size = 5;
int i; int i;
Atom labels[2] = { 0 };
ScreenRec screen;
screenInfo.screens[0] = &screen;
memset(&dev, 0, sizeof(dev)); memset(&dev, 0, sizeof(dev));
dev.type = MASTER_POINTER; /* claim it's a master to stop ptracccel */
dev.name = xnfstrdup("test device"); dev.name = xnfstrdup("test device");
dev.id = 2; dev.id = 2;
dev.valuator = &val;
val.numAxes = 5; InitValuatorClassDeviceStruct(&dev, 2, labels, 10, Absolute);
dev.touch = &touch; InitTouchClassDeviceStruct(&dev, 5, XIDirectTouch, 2);
dev.last.num_touches = size;
dev.last.touches = calloc(dev.last.num_touches, sizeof(*dev.last.touches)); memset(&sprite, 0, sizeof(sprite));
dev.spriteInfo = &sprite;
inputInfo.devices = &dev; inputInfo.devices = &dev;
assert(dev.last.touches); assert(dev.last.touches);
@ -159,32 +184,35 @@ touch_find_ddxid(void)
ti = TouchFindByDDXID(&dev, 40, TRUE); ti = TouchFindByDDXID(&dev, 40, TRUE);
assert(ti == &dev.last.touches[size+1]); assert(ti == &dev.last.touches[size+1]);
free(dev.name); free_device(&dev);
} }
static void static void
touch_begin_ddxtouch(void) touch_begin_ddxtouch(void)
{ {
DeviceIntRec dev; DeviceIntRec dev;
SpriteInfoRec sprite;
DDXTouchPointInfoPtr ti; DDXTouchPointInfoPtr ti;
ValuatorClassRec val;
TouchClassRec touch;
int ddx_id = 123; int ddx_id = 123;
unsigned int last_client_id = 0; unsigned int last_client_id = 0;
int size = 5; Atom labels[2] = { 0 };
ScreenRec screen;
screenInfo.screens[0] = &screen;
memset(&dev, 0, sizeof(dev)); memset(&dev, 0, sizeof(dev));
dev.type = MASTER_POINTER; /* claim it's a master to stop ptracccel */
dev.name = xnfstrdup("test device"); dev.name = xnfstrdup("test device");
dev.id = 2; 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; 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); ti = TouchBeginDDXTouch(&dev, ddx_id);
assert(ti); assert(ti);
assert(ti->ddx_id == ddx_id); assert(ti->ddx_id == ddx_id);
@ -206,41 +234,36 @@ touch_begin_ddxtouch(void)
assert(!ti->emulate_pointer); assert(!ti->emulate_pointer);
last_client_id = ti->client_id; last_client_id = ti->client_id;
free(dev.name); free_device(&dev);
} }
static void static void
touch_begin_touch(void) touch_begin_touch(void)
{ {
DeviceIntRec dev; DeviceIntRec dev;
TouchClassRec touch;
ValuatorClassRec val;
TouchPointInfoPtr ti; TouchPointInfoPtr ti;
int touchid = 12434; int touchid = 12434;
int sourceid = 23; int sourceid = 23;
SpriteInfoRec sprite; SpriteInfoRec sprite;
ScreenRec screen; ScreenRec screen;
Atom labels[2] = { 0 };
screenInfo.screens[0] = &screen; screenInfo.screens[0] = &screen;
memset(&dev, 0, sizeof(dev)); memset(&dev, 0, sizeof(dev));
dev.type = MASTER_POINTER; /* claim it's a master to stop ptracccel */
dev.name = xnfstrdup("test device"); dev.name = xnfstrdup("test device");
dev.id = 2; 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); ti = TouchBeginTouch(&dev, sourceid, touchid, TRUE);
assert(!ti); 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); ti = TouchBeginTouch(&dev, sourceid, touchid, TRUE);
assert(ti); assert(ti);
assert(ti->client_id == touchid); assert(ti->client_id == touchid);
@ -248,9 +271,9 @@ touch_begin_touch(void)
assert(ti->sourceid == sourceid); assert(ti->sourceid == sourceid);
assert(ti->emulate_pointer); assert(ti->emulate_pointer);
assert(touch.num_touches == 1); assert(dev.touch->num_touches == 5);
free(dev.name); free_device(&dev);
} }
static void static void
@ -265,6 +288,7 @@ touch_init(void)
screenInfo.screens[0] = &screen; screenInfo.screens[0] = &screen;
memset(&dev, 0, sizeof(dev)); memset(&dev, 0, sizeof(dev));
dev.type = MASTER_POINTER; /* claim it's a master to stop ptracccel */
dev.name = xnfstrdup("test device"); dev.name = xnfstrdup("test device");
memset(&sprite, 0, sizeof(sprite)); memset(&sprite, 0, sizeof(sprite));
@ -279,7 +303,7 @@ touch_init(void)
assert(rc == TRUE); assert(rc == TRUE);
assert(dev.touch); assert(dev.touch);
free(dev.name); free_device(&dev);
} }
int int