mirror of
https://github.com/X11Libre/xserver.git
synced 2026-03-24 08:04:30 +00: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.
This commit is contained in:
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
|
||||
|
||||
Reference in New Issue
Block a user