mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2026-05-03 02:37:58 +02:00
test: wrap the litest user data into a struct
litest itself requires the libinput user_data to be set to its own context struct (see close_restricted). A test that needs its own user_data must not override this struct - if the context is accessed during libinput_dispatch() we'll get memory corruption. See #574 Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
parent
db0a2be1a0
commit
aed15dd791
4 changed files with 23 additions and 18 deletions
|
|
@ -149,6 +149,7 @@ struct path {
|
|||
};
|
||||
|
||||
struct litest_context {
|
||||
struct litest_user_data *user_data;
|
||||
struct list paths;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -78,6 +78,16 @@ struct test_collection {
|
|||
}; \
|
||||
static void (name##_setup)(void)
|
||||
|
||||
|
||||
/**
|
||||
* litest itself needs the user_data to store some test-suite-specific
|
||||
* information. Tests must not override this pointer, any data they need
|
||||
* they can hang off the private pointer in this struct.
|
||||
*/
|
||||
struct litest_user_data {
|
||||
void *private;
|
||||
};
|
||||
|
||||
void
|
||||
litest_fail_condition(const char *file,
|
||||
int line,
|
||||
|
|
|
|||
|
|
@ -657,7 +657,8 @@ static void timer_offset_warning(struct libinput *libinput,
|
|||
const char *format,
|
||||
va_list args)
|
||||
{
|
||||
int *warning_triggered = (int*)libinput_get_user_data(libinput);
|
||||
struct litest_user_data *user_data = libinput_get_user_data(libinput);
|
||||
int *warning_triggered = user_data->private;
|
||||
|
||||
if (priority == LIBINPUT_LOG_PRIORITY_ERROR &&
|
||||
strstr(format, "scheduled expiry is in the past"))
|
||||
|
|
@ -669,7 +670,7 @@ START_TEST(timer_offset_bug_warning)
|
|||
struct litest_device *dev = litest_current_device();
|
||||
struct libinput *li = dev->libinput;
|
||||
int warning_triggered = 0;
|
||||
void *old_user_data;
|
||||
struct litest_user_data *user_data = libinput_get_user_data(li);
|
||||
|
||||
litest_enable_tap(dev->libinput_device);
|
||||
litest_drain_events(li);
|
||||
|
|
@ -679,16 +680,13 @@ START_TEST(timer_offset_bug_warning)
|
|||
|
||||
litest_timeout_tap();
|
||||
|
||||
old_user_data = libinput_get_user_data(li);
|
||||
libinput_set_user_data(li, &warning_triggered);
|
||||
user_data->private = &warning_triggered;
|
||||
libinput_log_set_handler(li, timer_offset_warning);
|
||||
libinput_dispatch(li);
|
||||
|
||||
/* triggered for touch down and touch up */
|
||||
ck_assert_int_eq(warning_triggered, 2);
|
||||
litest_restore_log_handler(li);
|
||||
|
||||
libinput_set_user_data(li, old_user_data);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
|
|
@ -697,25 +695,24 @@ static void timer_delay_warning(struct libinput *libinput,
|
|||
const char *format,
|
||||
va_list args)
|
||||
{
|
||||
int *warning_triggered = (int*)libinput_get_user_data(libinput);
|
||||
struct litest_user_data *user_data = libinput_get_user_data(libinput);
|
||||
int *warning_triggered = user_data->private;
|
||||
|
||||
if (priority == LIBINPUT_LOG_PRIORITY_ERROR &&
|
||||
strstr(format, "event processing lagging behind by"))
|
||||
(*warning_triggered)++;
|
||||
}
|
||||
|
||||
|
||||
START_TEST(timer_delay_bug_warning)
|
||||
{
|
||||
struct litest_device *dev = litest_current_device();
|
||||
struct libinput *li = dev->libinput;
|
||||
int warning_triggered = 0;
|
||||
void *old_user_data;
|
||||
struct litest_user_data *user_data = libinput_get_user_data(li);
|
||||
|
||||
old_user_data = libinput_get_user_data(li);
|
||||
litest_drain_events(li);
|
||||
|
||||
libinput_set_user_data(li, &warning_triggered);
|
||||
user_data->private = &warning_triggered;
|
||||
libinput_log_set_handler(li, timer_delay_warning);
|
||||
|
||||
for (int i = 0; i < 10; i++) {
|
||||
|
|
@ -728,7 +725,6 @@ START_TEST(timer_delay_bug_warning)
|
|||
|
||||
ck_assert_int_ge(warning_triggered, 1);
|
||||
litest_restore_log_handler(li);
|
||||
libinput_set_user_data(li, old_user_data);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
|
|
|
|||
|
|
@ -4101,7 +4101,8 @@ pressure_threshold_warning(struct libinput *libinput,
|
|||
const char *format,
|
||||
va_list args)
|
||||
{
|
||||
int *warning_triggered = (int*)libinput_get_user_data(libinput);
|
||||
struct litest_user_data *user_data = libinput_get_user_data(libinput);
|
||||
int *warning_triggered = user_data->private;
|
||||
|
||||
if (priority == LIBINPUT_LOG_PRIORITY_ERROR &&
|
||||
strstr(format, "pressure offset greater"))
|
||||
|
|
@ -4121,12 +4122,11 @@ START_TEST(tablet_pressure_offset_exceed_threshold)
|
|||
};
|
||||
double pressure;
|
||||
int warning_triggered = 0;
|
||||
void *old_user_data;
|
||||
struct litest_user_data *user_data = libinput_get_user_data(li);
|
||||
|
||||
litest_drain_events(li);
|
||||
|
||||
old_user_data = libinput_get_user_data(li);
|
||||
libinput_set_user_data(li, &warning_triggered);
|
||||
user_data->private = &warning_triggered;
|
||||
|
||||
libinput_log_set_handler(li, pressure_threshold_warning);
|
||||
litest_tablet_proximity_in(dev, 5, 100, axes);
|
||||
|
|
@ -4140,8 +4140,6 @@ START_TEST(tablet_pressure_offset_exceed_threshold)
|
|||
|
||||
ck_assert_int_eq(warning_triggered, 1);
|
||||
litest_restore_log_handler(li);
|
||||
|
||||
libinput_set_user_data(li, old_user_data);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue