[PATCH libinput 04/13] test: only init the device rules once
Peter Hutterer
peter.hutterer at who-t.net
Tue Aug 2 02:40:49 UTC 2016
The udev hwdb takes about 200ms and we still trigger it on each device. The
udev rules don't actually change after compiling, so simply create them
once and remove them after the test run.
For multiple test binaries this needed to be synchronized (which is hard),
hence the previous merge into a single binary for all tests.
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
test/litest.c | 88 ++++++++++++++++-------------------------------------------
test/litest.h | 2 --
2 files changed, 23 insertions(+), 67 deletions(-)
diff --git a/test/litest.c b/test/litest.c
index 2187901..7c18568 100644
--- a/test/litest.c
+++ b/test/litest.c
@@ -482,49 +482,6 @@ litest_reload_udev_rules(void)
litest_system("udevadm hwdb --update");
}
-static int
-litest_udev_rule_filter(const struct dirent *entry)
-{
- return strneq(entry->d_name,
- UDEV_RULE_PREFIX,
- strlen(UDEV_RULE_PREFIX));
-}
-
-static void
-litest_drop_udev_rules(void)
-{
- int n;
- int rc;
- struct dirent **entries;
- char path[PATH_MAX];
-
- n = scandir(UDEV_RULES_D,
- &entries,
- litest_udev_rule_filter,
- alphasort);
- if (n <= 0)
- return;
-
- while (n--) {
- rc = snprintf(path, sizeof(path),
- "%s/%s",
- UDEV_RULES_D,
- entries[n]->d_name);
- if (rc > 0 &&
- (size_t)rc == strlen(UDEV_RULES_D) +
- strlen(entries[n]->d_name) + 1)
- unlink(path);
- else
- fprintf(stderr,
- "Failed to delete %s. Remaining tests are unreliable\n",
- entries[n]->d_name);
- free(entries[n]);
- }
- free(entries);
-
- litest_reload_udev_rules();
-}
-
static void
litest_add_tcase_for_device(struct suite *suite,
const char *funcname,
@@ -554,13 +511,6 @@ litest_add_tcase_for_device(struct suite *suite,
t->name = strdup(test_name);
t->tc = tcase_create(test_name);
list_insert(&suite->tests, &t->node);
- /* we can't guarantee that we clean up properly if a test fails, the
- udev rules used for a previous test may still be in place. Add an
- unchecked fixture to always clean up all rules before/after a
- test case completes */
- tcase_add_unchecked_fixture(t->tc,
- litest_drop_udev_rules,
- litest_drop_udev_rules);
tcase_add_checked_fixture(t->tc, dev->setup,
dev->teardown ? dev->teardown : litest_generic_device_teardown);
if (range)
@@ -847,6 +797,28 @@ litest_log_handler(struct libinput *libinput,
litest_abort_msg("libinput bug triggered, aborting.\n");
}
+static char *
+litest_init_device_udev_rules(struct litest_test_device *dev);
+
+static void
+litest_init_all_device_udev_rules(struct list *created_files)
+{
+ struct litest_test_device **dev = devices;
+
+ while (*dev) {
+ char *udev_file;
+
+ udev_file = litest_init_device_udev_rules(*dev);
+ if (udev_file) {
+ struct created_file *file = zalloc(sizeof(*file));
+ litest_assert(file);
+ file->path = udev_file;
+ list_insert(created_files, &file->link);
+ }
+ dev++;
+ }
+}
+
static int
open_restricted(const char *path, int flags, void *userdata)
{
@@ -1065,6 +1037,7 @@ litest_init_udev_rules(struct list *created_files)
strerror(errno));
litest_install_model_quirks(created_files);
+ litest_init_all_device_udev_rules(created_files);
litest_reload_udev_rules();
}
@@ -1108,8 +1081,6 @@ litest_init_device_udev_rules(struct litest_test_device *dev)
litest_assert_int_ge(fputs(dev->udev_rule, f), 0);
fclose(f);
- litest_reload_udev_rules();
-
return path;
}
@@ -1126,7 +1097,6 @@ litest_create(enum litest_device_type which,
const struct input_id *id;
struct input_absinfo *abs;
int *events;
- char *udev_file;
dev = devices;
while (*dev) {
@@ -1141,17 +1111,13 @@ litest_create(enum litest_device_type which,
d = zalloc(sizeof(*d));
litest_assert(d != NULL);
- udev_file = litest_init_device_udev_rules(*dev);
/* device has custom create method */
if ((*dev)->create) {
(*dev)->create(d);
if (abs_override || events_override) {
- if (udev_file)
- unlink(udev_file);
litest_abort_msg("Custom create cannot be overridden");
}
- d->udev_rule_file = udev_file;
return d;
}
@@ -1165,7 +1131,6 @@ litest_create(enum litest_device_type which,
abs,
events);
d->interface = (*dev)->interface;
- d->udev_rule_file = udev_file;
free(abs);
free(events);
@@ -1357,13 +1322,6 @@ litest_delete_device(struct litest_device *d)
lfd = create_udev_lock_file();
- if (d->udev_rule_file) {
- unlink(d->udev_rule_file);
- free(d->udev_rule_file);
- d->udev_rule_file = NULL;
- litest_reload_udev_rules();
- }
-
libinput_device_unref(d->libinput_device);
libinput_path_remove_device(d->libinput_device);
if (d->owns_context)
diff --git a/test/litest.h b/test/litest.h
index 2ada8f6..4db6cf5 100644
--- a/test/litest.h
+++ b/test/litest.h
@@ -267,8 +267,6 @@ struct litest_device {
bool skip_ev_syn;
void *private; /* device-specific data */
-
- char *udev_rule_file;
};
struct axis_replacement {
--
2.7.4
More information about the wayland-devel
mailing list