[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