xref: /aosp_15_r20/external/igt-gpu-tools/runner/runner_tests.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker #include <dirent.h>
2*d83cc019SAndroid Build Coastguard Worker #include <fcntl.h>
3*d83cc019SAndroid Build Coastguard Worker #include <sys/stat.h>
4*d83cc019SAndroid Build Coastguard Worker #include <sys/types.h>
5*d83cc019SAndroid Build Coastguard Worker #include <unistd.h>
6*d83cc019SAndroid Build Coastguard Worker 
7*d83cc019SAndroid Build Coastguard Worker #include "igt.h"
8*d83cc019SAndroid Build Coastguard Worker 
9*d83cc019SAndroid Build Coastguard Worker #include "settings.h"
10*d83cc019SAndroid Build Coastguard Worker #include "job_list.h"
11*d83cc019SAndroid Build Coastguard Worker #include "executor.h"
12*d83cc019SAndroid Build Coastguard Worker 
13*d83cc019SAndroid Build Coastguard Worker /*
14*d83cc019SAndroid Build Coastguard Worker  * NOTE: this test is using a lot of variables that are changed in igt_fixture,
15*d83cc019SAndroid Build Coastguard Worker  * igt_subtest_group and igt_subtests blocks but defined outside of them.
16*d83cc019SAndroid Build Coastguard Worker  *
17*d83cc019SAndroid Build Coastguard Worker  * Such variables have to be either non-local or volatile, otherwise their
18*d83cc019SAndroid Build Coastguard Worker  * contents is undefined due to longjmps the framework performs.
19*d83cc019SAndroid Build Coastguard Worker  */
20*d83cc019SAndroid Build Coastguard Worker 
21*d83cc019SAndroid Build Coastguard Worker static const char testdatadir[] = TESTDATA_DIRECTORY;
22*d83cc019SAndroid Build Coastguard Worker 
igt_assert_eqstr(const char * one,const char * two)23*d83cc019SAndroid Build Coastguard Worker static void igt_assert_eqstr(const char *one, const char *two)
24*d83cc019SAndroid Build Coastguard Worker {
25*d83cc019SAndroid Build Coastguard Worker 	if (one == NULL && two == NULL)
26*d83cc019SAndroid Build Coastguard Worker 		return;
27*d83cc019SAndroid Build Coastguard Worker 
28*d83cc019SAndroid Build Coastguard Worker 	igt_assert_f(one != NULL && two != NULL, "Strings differ (one is NULL): %s vs %s\n", one, two);
29*d83cc019SAndroid Build Coastguard Worker 
30*d83cc019SAndroid Build Coastguard Worker 	igt_assert_f(!strcmp(one, two), "Strings differ: '%s' vs '%s'\n", one, two);
31*d83cc019SAndroid Build Coastguard Worker }
32*d83cc019SAndroid Build Coastguard Worker 
debug_print_executions(struct job_list * list)33*d83cc019SAndroid Build Coastguard Worker static void debug_print_executions(struct job_list *list)
34*d83cc019SAndroid Build Coastguard Worker {
35*d83cc019SAndroid Build Coastguard Worker 	size_t i;
36*d83cc019SAndroid Build Coastguard Worker 	int k;
37*d83cc019SAndroid Build Coastguard Worker 
38*d83cc019SAndroid Build Coastguard Worker 	igt_debug("Executions:\n");
39*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < list->size; i++) {
40*d83cc019SAndroid Build Coastguard Worker 		struct job_list_entry *entry = &list->entries[i];
41*d83cc019SAndroid Build Coastguard Worker 		igt_debug(" %s\n", entry->binary);
42*d83cc019SAndroid Build Coastguard Worker 		for (k = 0; k < entry->subtest_count; ++k) {
43*d83cc019SAndroid Build Coastguard Worker 			igt_debug("  %s\n", entry->subtests[k]);
44*d83cc019SAndroid Build Coastguard Worker 		}
45*d83cc019SAndroid Build Coastguard Worker 	}
46*d83cc019SAndroid Build Coastguard Worker 
47*d83cc019SAndroid Build Coastguard Worker }
48*d83cc019SAndroid Build Coastguard Worker 
dump_file(int dirfd,const char * name)49*d83cc019SAndroid Build Coastguard Worker static char *dump_file(int dirfd, const char *name)
50*d83cc019SAndroid Build Coastguard Worker {
51*d83cc019SAndroid Build Coastguard Worker 	int fd = openat(dirfd, name, O_RDONLY);
52*d83cc019SAndroid Build Coastguard Worker 	ssize_t s;
53*d83cc019SAndroid Build Coastguard Worker 	char *buf = malloc(256);
54*d83cc019SAndroid Build Coastguard Worker 
55*d83cc019SAndroid Build Coastguard Worker 	if (fd < 0) {
56*d83cc019SAndroid Build Coastguard Worker 		free(buf);
57*d83cc019SAndroid Build Coastguard Worker 		return NULL;
58*d83cc019SAndroid Build Coastguard Worker 	}
59*d83cc019SAndroid Build Coastguard Worker 
60*d83cc019SAndroid Build Coastguard Worker 	s = read(fd, buf, 255);
61*d83cc019SAndroid Build Coastguard Worker 	close(fd);
62*d83cc019SAndroid Build Coastguard Worker 
63*d83cc019SAndroid Build Coastguard Worker 	if (s < 0) {
64*d83cc019SAndroid Build Coastguard Worker 		free(buf);
65*d83cc019SAndroid Build Coastguard Worker 		return NULL;
66*d83cc019SAndroid Build Coastguard Worker 	}
67*d83cc019SAndroid Build Coastguard Worker 
68*d83cc019SAndroid Build Coastguard Worker 	buf[s] = '\0';
69*d83cc019SAndroid Build Coastguard Worker 	return buf;
70*d83cc019SAndroid Build Coastguard Worker }
71*d83cc019SAndroid Build Coastguard Worker 
job_list_filter_test(const char * name,const char * filterarg1,const char * filterarg2,size_t expected_normal,size_t expected_multiple)72*d83cc019SAndroid Build Coastguard Worker static void job_list_filter_test(const char *name, const char *filterarg1, const char *filterarg2,
73*d83cc019SAndroid Build Coastguard Worker 				 size_t expected_normal, size_t expected_multiple)
74*d83cc019SAndroid Build Coastguard Worker {
75*d83cc019SAndroid Build Coastguard Worker 	int multiple;
76*d83cc019SAndroid Build Coastguard Worker 	struct settings *settings = malloc(sizeof(*settings));
77*d83cc019SAndroid Build Coastguard Worker 
78*d83cc019SAndroid Build Coastguard Worker 	igt_fixture
79*d83cc019SAndroid Build Coastguard Worker 		init_settings(settings);
80*d83cc019SAndroid Build Coastguard Worker 
81*d83cc019SAndroid Build Coastguard Worker 	for (multiple = 0; multiple < 2; multiple++) {
82*d83cc019SAndroid Build Coastguard Worker 		igt_subtest_f("job-list-filters-%s-%s", name, multiple ? "multiple" : "normal") {
83*d83cc019SAndroid Build Coastguard Worker 			struct job_list list;
84*d83cc019SAndroid Build Coastguard Worker 			const char *argv[] = { "runner",
85*d83cc019SAndroid Build Coastguard Worker 					       /* Ugly but does the trick */
86*d83cc019SAndroid Build Coastguard Worker 					       multiple ? "--multiple-mode" : "--sync",
87*d83cc019SAndroid Build Coastguard Worker 					       filterarg1, filterarg2,
88*d83cc019SAndroid Build Coastguard Worker 					       testdatadir,
89*d83cc019SAndroid Build Coastguard Worker 					       "path-to-results",
90*d83cc019SAndroid Build Coastguard Worker 			};
91*d83cc019SAndroid Build Coastguard Worker 			bool success = false;
92*d83cc019SAndroid Build Coastguard Worker 			size_t size;
93*d83cc019SAndroid Build Coastguard Worker 
94*d83cc019SAndroid Build Coastguard Worker 			init_job_list(&list);
95*d83cc019SAndroid Build Coastguard Worker 			igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
96*d83cc019SAndroid Build Coastguard Worker 
97*d83cc019SAndroid Build Coastguard Worker 			success = create_job_list(&list, settings);
98*d83cc019SAndroid Build Coastguard Worker 			size = list.size;
99*d83cc019SAndroid Build Coastguard Worker 
100*d83cc019SAndroid Build Coastguard Worker 			if (success)
101*d83cc019SAndroid Build Coastguard Worker 				debug_print_executions(&list);
102*d83cc019SAndroid Build Coastguard Worker 
103*d83cc019SAndroid Build Coastguard Worker 			free_job_list(&list);
104*d83cc019SAndroid Build Coastguard Worker 
105*d83cc019SAndroid Build Coastguard Worker 			igt_assert_f(success, "Job list creation failed\n");
106*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(size, multiple ? expected_multiple : expected_normal);
107*d83cc019SAndroid Build Coastguard Worker 		}
108*d83cc019SAndroid Build Coastguard Worker 	}
109*d83cc019SAndroid Build Coastguard Worker 
110*d83cc019SAndroid Build Coastguard Worker 	igt_fixture {
111*d83cc019SAndroid Build Coastguard Worker 		free_settings(settings);
112*d83cc019SAndroid Build Coastguard Worker 		free(settings);
113*d83cc019SAndroid Build Coastguard Worker 	}
114*d83cc019SAndroid Build Coastguard Worker }
115*d83cc019SAndroid Build Coastguard Worker 
clear_directory_fd(int dirfd)116*d83cc019SAndroid Build Coastguard Worker static void clear_directory_fd(int dirfd)
117*d83cc019SAndroid Build Coastguard Worker {
118*d83cc019SAndroid Build Coastguard Worker 	DIR* d;
119*d83cc019SAndroid Build Coastguard Worker 	struct dirent *dirent;
120*d83cc019SAndroid Build Coastguard Worker 
121*d83cc019SAndroid Build Coastguard Worker 	d = fdopendir(dirfd);
122*d83cc019SAndroid Build Coastguard Worker 
123*d83cc019SAndroid Build Coastguard Worker 	if (dirfd < 0 || d == NULL) {
124*d83cc019SAndroid Build Coastguard Worker 		return;
125*d83cc019SAndroid Build Coastguard Worker 	}
126*d83cc019SAndroid Build Coastguard Worker 
127*d83cc019SAndroid Build Coastguard Worker 	while ((dirent = readdir(d)) != NULL) {
128*d83cc019SAndroid Build Coastguard Worker 		if (strcmp(dirent->d_name, ".") &&
129*d83cc019SAndroid Build Coastguard Worker 		    strcmp(dirent->d_name, "..")) {
130*d83cc019SAndroid Build Coastguard Worker 			if (dirent->d_type == DT_REG) {
131*d83cc019SAndroid Build Coastguard Worker 				unlinkat(dirfd, dirent->d_name, 0);
132*d83cc019SAndroid Build Coastguard Worker 			} else if (dirent->d_type == DT_DIR) {
133*d83cc019SAndroid Build Coastguard Worker 				clear_directory_fd(openat(dirfd, dirent->d_name, O_DIRECTORY | O_RDONLY));
134*d83cc019SAndroid Build Coastguard Worker 				unlinkat(dirfd, dirent->d_name, AT_REMOVEDIR);
135*d83cc019SAndroid Build Coastguard Worker 			}
136*d83cc019SAndroid Build Coastguard Worker 		}
137*d83cc019SAndroid Build Coastguard Worker 	}
138*d83cc019SAndroid Build Coastguard Worker 
139*d83cc019SAndroid Build Coastguard Worker 	closedir(d);
140*d83cc019SAndroid Build Coastguard Worker }
141*d83cc019SAndroid Build Coastguard Worker 
clear_directory(char * name)142*d83cc019SAndroid Build Coastguard Worker static void clear_directory(char *name)
143*d83cc019SAndroid Build Coastguard Worker {
144*d83cc019SAndroid Build Coastguard Worker 	int dirfd = open(name, O_DIRECTORY | O_RDONLY);
145*d83cc019SAndroid Build Coastguard Worker 	clear_directory_fd(dirfd);
146*d83cc019SAndroid Build Coastguard Worker 	rmdir(name);
147*d83cc019SAndroid Build Coastguard Worker }
148*d83cc019SAndroid Build Coastguard Worker 
assert_settings_equal(struct settings * one,struct settings * two)149*d83cc019SAndroid Build Coastguard Worker static void assert_settings_equal(struct settings *one, struct settings *two)
150*d83cc019SAndroid Build Coastguard Worker {
151*d83cc019SAndroid Build Coastguard Worker 	/*
152*d83cc019SAndroid Build Coastguard Worker 	 * Regex lists are not serialized, and thus won't be compared
153*d83cc019SAndroid Build Coastguard Worker 	 * here.
154*d83cc019SAndroid Build Coastguard Worker 	 */
155*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(one->abort_mask, two->abort_mask);
156*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eqstr(one->test_list, two->test_list);
157*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eqstr(one->name, two->name);
158*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(one->dry_run, two->dry_run);
159*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(one->sync, two->sync);
160*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(one->log_level, two->log_level);
161*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(one->overwrite, two->overwrite);
162*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(one->multiple_mode, two->multiple_mode);
163*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(one->inactivity_timeout, two->inactivity_timeout);
164*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(one->use_watchdog, two->use_watchdog);
165*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eqstr(one->test_root, two->test_root);
166*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eqstr(one->results_path, two->results_path);
167*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(one->piglit_style_dmesg, two->piglit_style_dmesg);
168*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(one->dmesg_warn_level, two->dmesg_warn_level);
169*d83cc019SAndroid Build Coastguard Worker }
170*d83cc019SAndroid Build Coastguard Worker 
assert_job_list_equal(struct job_list * one,struct job_list * two)171*d83cc019SAndroid Build Coastguard Worker static void assert_job_list_equal(struct job_list *one, struct job_list *two)
172*d83cc019SAndroid Build Coastguard Worker {
173*d83cc019SAndroid Build Coastguard Worker 	size_t i, k;
174*d83cc019SAndroid Build Coastguard Worker 
175*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(one->size, two->size);
176*d83cc019SAndroid Build Coastguard Worker 
177*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < one->size; i++) {
178*d83cc019SAndroid Build Coastguard Worker 		struct job_list_entry *eone = &one->entries[i];
179*d83cc019SAndroid Build Coastguard Worker 		struct job_list_entry *etwo = &two->entries[i];
180*d83cc019SAndroid Build Coastguard Worker 
181*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eqstr(eone->binary, etwo->binary);
182*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(eone->subtest_count, etwo->subtest_count);
183*d83cc019SAndroid Build Coastguard Worker 
184*d83cc019SAndroid Build Coastguard Worker 		for (k = 0; k < eone->subtest_count; k++) {
185*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eqstr(eone->subtests[k], etwo->subtests[k]);
186*d83cc019SAndroid Build Coastguard Worker 		}
187*d83cc019SAndroid Build Coastguard Worker 	}
188*d83cc019SAndroid Build Coastguard Worker }
189*d83cc019SAndroid Build Coastguard Worker 
assert_execution_created(int dirfd,const char * name)190*d83cc019SAndroid Build Coastguard Worker static void assert_execution_created(int dirfd, const char *name)
191*d83cc019SAndroid Build Coastguard Worker {
192*d83cc019SAndroid Build Coastguard Worker 	int fd;
193*d83cc019SAndroid Build Coastguard Worker 
194*d83cc019SAndroid Build Coastguard Worker 	igt_assert_f((fd = openat(dirfd, name, O_RDONLY)) >= 0,
195*d83cc019SAndroid Build Coastguard Worker 		     "Execute didn't create %s\n", name);
196*d83cc019SAndroid Build Coastguard Worker 	close(fd);
197*d83cc019SAndroid Build Coastguard Worker }
198*d83cc019SAndroid Build Coastguard Worker 
assert_execution_results_exist(int dirfd)199*d83cc019SAndroid Build Coastguard Worker static void assert_execution_results_exist(int dirfd)
200*d83cc019SAndroid Build Coastguard Worker {
201*d83cc019SAndroid Build Coastguard Worker 	assert_execution_created(dirfd, "journal.txt");
202*d83cc019SAndroid Build Coastguard Worker 	assert_execution_created(dirfd, "out.txt");
203*d83cc019SAndroid Build Coastguard Worker 	assert_execution_created(dirfd, "err.txt");
204*d83cc019SAndroid Build Coastguard Worker 	assert_execution_created(dirfd, "dmesg.txt");
205*d83cc019SAndroid Build Coastguard Worker }
206*d83cc019SAndroid Build Coastguard Worker 
207*d83cc019SAndroid Build Coastguard Worker igt_main
208*d83cc019SAndroid Build Coastguard Worker {
209*d83cc019SAndroid Build Coastguard Worker 	struct settings *settings = malloc(sizeof(*settings));
210*d83cc019SAndroid Build Coastguard Worker 
211*d83cc019SAndroid Build Coastguard Worker 	igt_fixture {
212*d83cc019SAndroid Build Coastguard Worker 		int i;
213*d83cc019SAndroid Build Coastguard Worker 
214*d83cc019SAndroid Build Coastguard Worker 		/*
215*d83cc019SAndroid Build Coastguard Worker 		 * Let's close all the non-standard fds ahead of executing
216*d83cc019SAndroid Build Coastguard Worker 		 * anything, so we can test for descriptor leakage caused by
217*d83cc019SAndroid Build Coastguard Worker 		 * any of the igt_runner code-paths exercised here.
218*d83cc019SAndroid Build Coastguard Worker 		 *
219*d83cc019SAndroid Build Coastguard Worker 		 * See file-descriptor-leakage subtest at the end.
220*d83cc019SAndroid Build Coastguard Worker 		 *
221*d83cc019SAndroid Build Coastguard Worker 		 * Some libraries (looking at you, GnuTLS) may leave fds opened
222*d83cc019SAndroid Build Coastguard Worker 		 * after the implicitly called library constructor. We don't
223*d83cc019SAndroid Build Coastguard Worker 		 * have full control over them as they may be dependencies of
224*d83cc019SAndroid Build Coastguard Worker 		 * our dependencies and may get pulled in if the user's and
225*d83cc019SAndroid Build Coastguard Worker 		 * distribution's compile/configure/USE are just right.
226*d83cc019SAndroid Build Coastguard Worker 		 */
227*d83cc019SAndroid Build Coastguard Worker 		for (i = 3; i < 400; i++)
228*d83cc019SAndroid Build Coastguard Worker 			close(i);
229*d83cc019SAndroid Build Coastguard Worker 
230*d83cc019SAndroid Build Coastguard Worker 		init_settings(settings);
231*d83cc019SAndroid Build Coastguard Worker 	}
232*d83cc019SAndroid Build Coastguard Worker 
233*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("default-settings") {
234*d83cc019SAndroid Build Coastguard Worker 		const char *argv[] = { "runner",
235*d83cc019SAndroid Build Coastguard Worker 				       "test-root-dir",
236*d83cc019SAndroid Build Coastguard Worker 				       "path-to-results",
237*d83cc019SAndroid Build Coastguard Worker 		};
238*d83cc019SAndroid Build Coastguard Worker 
239*d83cc019SAndroid Build Coastguard Worker 		igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
240*d83cc019SAndroid Build Coastguard Worker 
241*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->abort_mask, 0);
242*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!settings->test_list);
243*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eqstr(settings->name, "path-to-results");
244*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!settings->dry_run);
245*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->include_regexes.size, 0);
246*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->exclude_regexes.size, 0);
247*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!settings->sync);
248*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->log_level, LOG_LEVEL_NORMAL);
249*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!settings->overwrite);
250*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!settings->multiple_mode);
251*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->inactivity_timeout, 0);
252*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->overall_timeout, 0);
253*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!settings->use_watchdog);
254*d83cc019SAndroid Build Coastguard Worker 		igt_assert(strstr(settings->test_root, "test-root-dir") != NULL);
255*d83cc019SAndroid Build Coastguard Worker 		igt_assert(strstr(settings->results_path, "path-to-results") != NULL);
256*d83cc019SAndroid Build Coastguard Worker 
257*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!settings->piglit_style_dmesg);
258*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->dmesg_warn_level, 4);
259*d83cc019SAndroid Build Coastguard Worker 	}
260*d83cc019SAndroid Build Coastguard Worker 
261*d83cc019SAndroid Build Coastguard Worker 	igt_subtest_group {
262*d83cc019SAndroid Build Coastguard Worker 		char *cwd;
263*d83cc019SAndroid Build Coastguard Worker 		char *path;
264*d83cc019SAndroid Build Coastguard Worker 
265*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
266*d83cc019SAndroid Build Coastguard Worker 			igt_require((cwd = realpath(".", NULL)) != NULL);
267*d83cc019SAndroid Build Coastguard Worker 			path = NULL;
268*d83cc019SAndroid Build Coastguard Worker 		}
269*d83cc019SAndroid Build Coastguard Worker 
270*d83cc019SAndroid Build Coastguard Worker 		igt_subtest("absolute-path-converter") {
271*d83cc019SAndroid Build Coastguard Worker 			char paths[][15] = { "simple-name", "foo/bar", "." };
272*d83cc019SAndroid Build Coastguard Worker 			size_t i;
273*d83cc019SAndroid Build Coastguard Worker 
274*d83cc019SAndroid Build Coastguard Worker 			for (i = 0; i < ARRAY_SIZE(paths); i++) {
275*d83cc019SAndroid Build Coastguard Worker 				free(path);
276*d83cc019SAndroid Build Coastguard Worker 				path = absolute_path(paths[i]);
277*d83cc019SAndroid Build Coastguard Worker 
278*d83cc019SAndroid Build Coastguard Worker 				igt_assert(path[0] == '/');
279*d83cc019SAndroid Build Coastguard Worker 				igt_debug("Got path %s for %s\n", path, paths[i]);
280*d83cc019SAndroid Build Coastguard Worker 				igt_assert(strstr(path, cwd) == path);
281*d83cc019SAndroid Build Coastguard Worker 				if (strcmp(paths[i], ".")) {
282*d83cc019SAndroid Build Coastguard Worker 					igt_assert(strstr(path, paths[i]) != NULL);
283*d83cc019SAndroid Build Coastguard Worker 				}
284*d83cc019SAndroid Build Coastguard Worker 			}
285*d83cc019SAndroid Build Coastguard Worker 		}
286*d83cc019SAndroid Build Coastguard Worker 
287*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
288*d83cc019SAndroid Build Coastguard Worker 			free(cwd);
289*d83cc019SAndroid Build Coastguard Worker 			free(path);
290*d83cc019SAndroid Build Coastguard Worker 		}
291*d83cc019SAndroid Build Coastguard Worker 	}
292*d83cc019SAndroid Build Coastguard Worker 
293*d83cc019SAndroid Build Coastguard Worker 	igt_subtest_group {
294*d83cc019SAndroid Build Coastguard Worker 		const char tmptestlist[] = "tmp.testlist";
295*d83cc019SAndroid Build Coastguard Worker 		char dirname[] = "tmpdirXXXXXX";
296*d83cc019SAndroid Build Coastguard Worker 		char pathtotestlist[64];
297*d83cc019SAndroid Build Coastguard Worker 		volatile char *path;
298*d83cc019SAndroid Build Coastguard Worker 
299*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
300*d83cc019SAndroid Build Coastguard Worker 			int dirfd, fd;
301*d83cc019SAndroid Build Coastguard Worker 
302*d83cc019SAndroid Build Coastguard Worker 			path = NULL;
303*d83cc019SAndroid Build Coastguard Worker 
304*d83cc019SAndroid Build Coastguard Worker 			igt_require(mkdtemp(dirname) != NULL);
305*d83cc019SAndroid Build Coastguard Worker 			igt_require((dirfd = open(dirname, O_DIRECTORY | O_RDONLY)) >= 0);
306*d83cc019SAndroid Build Coastguard Worker 			igt_require((fd = openat(dirfd, tmptestlist, O_CREAT | O_EXCL | O_WRONLY, 0660)) >= 0);
307*d83cc019SAndroid Build Coastguard Worker 			close(fd);
308*d83cc019SAndroid Build Coastguard Worker 			close(dirfd);
309*d83cc019SAndroid Build Coastguard Worker 
310*d83cc019SAndroid Build Coastguard Worker 			strcpy(pathtotestlist, dirname);
311*d83cc019SAndroid Build Coastguard Worker 			strcat(pathtotestlist, "/");
312*d83cc019SAndroid Build Coastguard Worker 			strcat(pathtotestlist, tmptestlist);
313*d83cc019SAndroid Build Coastguard Worker 		}
314*d83cc019SAndroid Build Coastguard Worker 
315*d83cc019SAndroid Build Coastguard Worker 		igt_subtest("absolute-path-usage") {
316*d83cc019SAndroid Build Coastguard Worker 			const char *argv[] = { "runner",
317*d83cc019SAndroid Build Coastguard Worker 					       "--test-list", pathtotestlist,
318*d83cc019SAndroid Build Coastguard Worker 					       testdatadir,
319*d83cc019SAndroid Build Coastguard Worker 					       dirname,
320*d83cc019SAndroid Build Coastguard Worker 			};
321*d83cc019SAndroid Build Coastguard Worker 
322*d83cc019SAndroid Build Coastguard Worker 			igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
323*d83cc019SAndroid Build Coastguard Worker 
324*d83cc019SAndroid Build Coastguard Worker 			path = realpath(testdatadir, NULL);
325*d83cc019SAndroid Build Coastguard Worker 			igt_assert(path != NULL);
326*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eqstr(settings->test_root, (char*)path);
327*d83cc019SAndroid Build Coastguard Worker 			free((void*)path);
328*d83cc019SAndroid Build Coastguard Worker 			path = realpath(dirname, NULL);
329*d83cc019SAndroid Build Coastguard Worker 			igt_assert(path != NULL);
330*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eqstr(settings->results_path, (char*)path);
331*d83cc019SAndroid Build Coastguard Worker 			free((void*)path);
332*d83cc019SAndroid Build Coastguard Worker 			path = realpath(pathtotestlist, NULL);
333*d83cc019SAndroid Build Coastguard Worker 			igt_assert(path != NULL);
334*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eqstr(settings->test_list, (char*)path);
335*d83cc019SAndroid Build Coastguard Worker 		}
336*d83cc019SAndroid Build Coastguard Worker 
337*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
338*d83cc019SAndroid Build Coastguard Worker 			int dirfd;
339*d83cc019SAndroid Build Coastguard Worker 
340*d83cc019SAndroid Build Coastguard Worker 			igt_require((dirfd = open(dirname, O_DIRECTORY | O_RDONLY)) >= 0);
341*d83cc019SAndroid Build Coastguard Worker 			unlinkat(dirfd, tmptestlist, 0);
342*d83cc019SAndroid Build Coastguard Worker 			close(dirfd);
343*d83cc019SAndroid Build Coastguard Worker 			rmdir(dirname);
344*d83cc019SAndroid Build Coastguard Worker 
345*d83cc019SAndroid Build Coastguard Worker 			free((void*)path);
346*d83cc019SAndroid Build Coastguard Worker 		}
347*d83cc019SAndroid Build Coastguard Worker 	}
348*d83cc019SAndroid Build Coastguard Worker 
349*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("environment-overrides-test-root-flag") {
350*d83cc019SAndroid Build Coastguard Worker 		const char *argv[] = { "runner",
351*d83cc019SAndroid Build Coastguard Worker 				       "test-root-dir",
352*d83cc019SAndroid Build Coastguard Worker 				       "path-to-results",
353*d83cc019SAndroid Build Coastguard Worker 		};
354*d83cc019SAndroid Build Coastguard Worker 
355*d83cc019SAndroid Build Coastguard Worker 		setenv("IGT_TEST_ROOT", testdatadir, 1);
356*d83cc019SAndroid Build Coastguard Worker 		igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
357*d83cc019SAndroid Build Coastguard Worker 
358*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->abort_mask, 0);
359*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!settings->test_list);
360*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eqstr(settings->name, "path-to-results");
361*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!settings->dry_run);
362*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->include_regexes.size, 0);
363*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->exclude_regexes.size, 0);
364*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!settings->sync);
365*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->log_level, LOG_LEVEL_NORMAL);
366*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!settings->overwrite);
367*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!settings->multiple_mode);
368*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->inactivity_timeout, 0);
369*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->overall_timeout, 0);
370*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!settings->use_watchdog);
371*d83cc019SAndroid Build Coastguard Worker 		igt_assert(strstr(settings->test_root, testdatadir) != NULL);
372*d83cc019SAndroid Build Coastguard Worker 		igt_assert(strstr(settings->results_path, "path-to-results") != NULL);
373*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!settings->piglit_style_dmesg);
374*d83cc019SAndroid Build Coastguard Worker 	}
375*d83cc019SAndroid Build Coastguard Worker 
376*d83cc019SAndroid Build Coastguard Worker 	igt_fixture {
377*d83cc019SAndroid Build Coastguard Worker 		unsetenv("IGT_TEST_ROOT");
378*d83cc019SAndroid Build Coastguard Worker 	}
379*d83cc019SAndroid Build Coastguard Worker 
380*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("parse-all-settings") {
381*d83cc019SAndroid Build Coastguard Worker 		char blacklist_name[PATH_MAX], blacklist2_name[PATH_MAX];
382*d83cc019SAndroid Build Coastguard Worker 		const char *argv[] = { "runner",
383*d83cc019SAndroid Build Coastguard Worker 				       "-n", "foo",
384*d83cc019SAndroid Build Coastguard Worker 				       "--abort-on-monitored-error=taint,lockdep",
385*d83cc019SAndroid Build Coastguard Worker 				       "--test-list", "path-to-test-list",
386*d83cc019SAndroid Build Coastguard Worker 				       "--ignore-missing",
387*d83cc019SAndroid Build Coastguard Worker 				       "--dry-run",
388*d83cc019SAndroid Build Coastguard Worker 				       "-t", "pattern1",
389*d83cc019SAndroid Build Coastguard Worker 				       "-t", "pattern2",
390*d83cc019SAndroid Build Coastguard Worker 				       "-x", "xpattern1",
391*d83cc019SAndroid Build Coastguard Worker 				       "-x", "xpattern2",
392*d83cc019SAndroid Build Coastguard Worker 				       "-b", blacklist_name,
393*d83cc019SAndroid Build Coastguard Worker 				       "--blacklist", blacklist2_name,
394*d83cc019SAndroid Build Coastguard Worker 				       "-s",
395*d83cc019SAndroid Build Coastguard Worker 				       "-l", "verbose",
396*d83cc019SAndroid Build Coastguard Worker 				       "--overwrite",
397*d83cc019SAndroid Build Coastguard Worker 				       "--multiple-mode",
398*d83cc019SAndroid Build Coastguard Worker 				       "--inactivity-timeout", "27",
399*d83cc019SAndroid Build Coastguard Worker 				       "--overall-timeout", "360",
400*d83cc019SAndroid Build Coastguard Worker 				       "--use-watchdog",
401*d83cc019SAndroid Build Coastguard Worker 				       "--piglit-style-dmesg",
402*d83cc019SAndroid Build Coastguard Worker 				       "--dmesg-warn-level=3",
403*d83cc019SAndroid Build Coastguard Worker 				       "test-root-dir",
404*d83cc019SAndroid Build Coastguard Worker 				       "path-to-results",
405*d83cc019SAndroid Build Coastguard Worker 		};
406*d83cc019SAndroid Build Coastguard Worker 
407*d83cc019SAndroid Build Coastguard Worker 		sprintf(blacklist_name, "%s/test-blacklist.txt", testdatadir);
408*d83cc019SAndroid Build Coastguard Worker 		sprintf(blacklist2_name, "%s/test-blacklist2.txt", testdatadir);
409*d83cc019SAndroid Build Coastguard Worker 
410*d83cc019SAndroid Build Coastguard Worker 		igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
411*d83cc019SAndroid Build Coastguard Worker 
412*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->abort_mask, ABORT_TAINT | ABORT_LOCKDEP);
413*d83cc019SAndroid Build Coastguard Worker 		igt_assert(strstr(settings->test_list, "path-to-test-list") != NULL);
414*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eqstr(settings->name, "foo");
415*d83cc019SAndroid Build Coastguard Worker 		igt_assert(settings->dry_run);
416*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->include_regexes.size, 2);
417*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eqstr(settings->include_regexes.regex_strings[0], "pattern1");
418*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eqstr(settings->include_regexes.regex_strings[1], "pattern2");
419*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->exclude_regexes.size, 4);
420*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eqstr(settings->exclude_regexes.regex_strings[0], "xpattern1");
421*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eqstr(settings->exclude_regexes.regex_strings[1], "xpattern2");
422*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eqstr(settings->exclude_regexes.regex_strings[2], "xpattern3"); /* From blacklist */
423*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eqstr(settings->exclude_regexes.regex_strings[3], "xpattern4"); /* From blacklist2 */
424*d83cc019SAndroid Build Coastguard Worker 		igt_assert(settings->sync);
425*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->log_level, LOG_LEVEL_VERBOSE);
426*d83cc019SAndroid Build Coastguard Worker 		igt_assert(settings->overwrite);
427*d83cc019SAndroid Build Coastguard Worker 		igt_assert(settings->multiple_mode);
428*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->inactivity_timeout, 27);
429*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->overall_timeout, 360);
430*d83cc019SAndroid Build Coastguard Worker 		igt_assert(settings->use_watchdog);
431*d83cc019SAndroid Build Coastguard Worker 		igt_assert(strstr(settings->test_root, "test-root-dir") != NULL);
432*d83cc019SAndroid Build Coastguard Worker 		igt_assert(strstr(settings->results_path, "path-to-results") != NULL);
433*d83cc019SAndroid Build Coastguard Worker 
434*d83cc019SAndroid Build Coastguard Worker 		igt_assert(settings->piglit_style_dmesg);
435*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->dmesg_warn_level, 3);
436*d83cc019SAndroid Build Coastguard Worker 	}
437*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("parse-list-all") {
438*d83cc019SAndroid Build Coastguard Worker 		const char *argv[] = { "runner",
439*d83cc019SAndroid Build Coastguard Worker 				       "--list-all",
440*d83cc019SAndroid Build Coastguard Worker 				       "test-root-dir"};
441*d83cc019SAndroid Build Coastguard Worker 
442*d83cc019SAndroid Build Coastguard Worker 		igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
443*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->list_all, 1);
444*d83cc019SAndroid Build Coastguard Worker 	}
445*d83cc019SAndroid Build Coastguard Worker 
446*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("dmesg-warn-level-inferred") {
447*d83cc019SAndroid Build Coastguard Worker 		const char *argv[] = { "runner",
448*d83cc019SAndroid Build Coastguard Worker 				       "test-root-dir",
449*d83cc019SAndroid Build Coastguard Worker 				       "path-to-results",
450*d83cc019SAndroid Build Coastguard Worker 		};
451*d83cc019SAndroid Build Coastguard Worker 
452*d83cc019SAndroid Build Coastguard Worker 		igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
453*d83cc019SAndroid Build Coastguard Worker 
454*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!settings->piglit_style_dmesg);
455*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->dmesg_warn_level, 4);
456*d83cc019SAndroid Build Coastguard Worker 	}
457*d83cc019SAndroid Build Coastguard Worker 
458*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("dmesg-warn-level-inferred-with-piglit-style") {
459*d83cc019SAndroid Build Coastguard Worker 		const char *argv[] = { "runner",
460*d83cc019SAndroid Build Coastguard Worker 				       "--piglit-style-dmesg",
461*d83cc019SAndroid Build Coastguard Worker 				       "test-root-dir",
462*d83cc019SAndroid Build Coastguard Worker 				       "path-to-results",
463*d83cc019SAndroid Build Coastguard Worker 		};
464*d83cc019SAndroid Build Coastguard Worker 
465*d83cc019SAndroid Build Coastguard Worker 		igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
466*d83cc019SAndroid Build Coastguard Worker 
467*d83cc019SAndroid Build Coastguard Worker 		igt_assert(settings->piglit_style_dmesg);
468*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->dmesg_warn_level, 5);
469*d83cc019SAndroid Build Coastguard Worker 	}
470*d83cc019SAndroid Build Coastguard Worker 
471*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("dmesg-warn-level-overridable-with-piglit-style") {
472*d83cc019SAndroid Build Coastguard Worker 		const char *argv[] = { "runner",
473*d83cc019SAndroid Build Coastguard Worker 				       "--piglit-style-dmesg",
474*d83cc019SAndroid Build Coastguard Worker 				       "--dmesg-warn-level=3",
475*d83cc019SAndroid Build Coastguard Worker 				       "test-root-dir",
476*d83cc019SAndroid Build Coastguard Worker 				       "path-to-results",
477*d83cc019SAndroid Build Coastguard Worker 		};
478*d83cc019SAndroid Build Coastguard Worker 
479*d83cc019SAndroid Build Coastguard Worker 		igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
480*d83cc019SAndroid Build Coastguard Worker 
481*d83cc019SAndroid Build Coastguard Worker 		igt_assert(settings->piglit_style_dmesg);
482*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->dmesg_warn_level, 3);
483*d83cc019SAndroid Build Coastguard Worker 	}
484*d83cc019SAndroid Build Coastguard Worker 
485*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("invalid-option") {
486*d83cc019SAndroid Build Coastguard Worker 		const char *argv[] = { "runner",
487*d83cc019SAndroid Build Coastguard Worker 				       "--no-such-option",
488*d83cc019SAndroid Build Coastguard Worker 				       "test-root-dir",
489*d83cc019SAndroid Build Coastguard Worker 				       "results-path",
490*d83cc019SAndroid Build Coastguard Worker 		};
491*d83cc019SAndroid Build Coastguard Worker 
492*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
493*d83cc019SAndroid Build Coastguard Worker 	}
494*d83cc019SAndroid Build Coastguard Worker 
495*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("paths-missing") {
496*d83cc019SAndroid Build Coastguard Worker 		const char *argv[] = { "runner",
497*d83cc019SAndroid Build Coastguard Worker 				       "-o",
498*d83cc019SAndroid Build Coastguard Worker 		};
499*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
500*d83cc019SAndroid Build Coastguard Worker 	}
501*d83cc019SAndroid Build Coastguard Worker 
502*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("log-levels") {
503*d83cc019SAndroid Build Coastguard Worker 		const char *argv[] = { "runner",
504*d83cc019SAndroid Build Coastguard Worker 				       "-l", "normal",
505*d83cc019SAndroid Build Coastguard Worker 				       "test-root-dir",
506*d83cc019SAndroid Build Coastguard Worker 				       "results-path",
507*d83cc019SAndroid Build Coastguard Worker 		};
508*d83cc019SAndroid Build Coastguard Worker 
509*d83cc019SAndroid Build Coastguard Worker 		igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
510*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->log_level, LOG_LEVEL_NORMAL);
511*d83cc019SAndroid Build Coastguard Worker 
512*d83cc019SAndroid Build Coastguard Worker 		argv[2] = "quiet";
513*d83cc019SAndroid Build Coastguard Worker 		igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
514*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->log_level, LOG_LEVEL_QUIET);
515*d83cc019SAndroid Build Coastguard Worker 
516*d83cc019SAndroid Build Coastguard Worker 		argv[2] = "verbose";
517*d83cc019SAndroid Build Coastguard Worker 		igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
518*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->log_level, LOG_LEVEL_VERBOSE);
519*d83cc019SAndroid Build Coastguard Worker 	}
520*d83cc019SAndroid Build Coastguard Worker 
521*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("abort-conditions") {
522*d83cc019SAndroid Build Coastguard Worker 		const char *argv[] = { "runner",
523*d83cc019SAndroid Build Coastguard Worker 				       "--abort-on-monitored-error=taint",
524*d83cc019SAndroid Build Coastguard Worker 				       "test-root-dir",
525*d83cc019SAndroid Build Coastguard Worker 				       "results-path",
526*d83cc019SAndroid Build Coastguard Worker 		};
527*d83cc019SAndroid Build Coastguard Worker 
528*d83cc019SAndroid Build Coastguard Worker 		igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
529*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->abort_mask, ABORT_TAINT);
530*d83cc019SAndroid Build Coastguard Worker 
531*d83cc019SAndroid Build Coastguard Worker 		argv[1] = "--abort-on-monitored-error=lockdep";
532*d83cc019SAndroid Build Coastguard Worker 		igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
533*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->abort_mask, ABORT_LOCKDEP);
534*d83cc019SAndroid Build Coastguard Worker 
535*d83cc019SAndroid Build Coastguard Worker 		argv[1] = "--abort-on-monitored-error=taint";
536*d83cc019SAndroid Build Coastguard Worker 		igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
537*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->abort_mask, ABORT_TAINT);
538*d83cc019SAndroid Build Coastguard Worker 
539*d83cc019SAndroid Build Coastguard Worker 		argv[1] = "--abort-on-monitored-error=lockdep,taint";
540*d83cc019SAndroid Build Coastguard Worker 		igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
541*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->abort_mask, ABORT_TAINT | ABORT_LOCKDEP);
542*d83cc019SAndroid Build Coastguard Worker 
543*d83cc019SAndroid Build Coastguard Worker 		argv[1] = "--abort-on-monitored-error=taint,lockdep";
544*d83cc019SAndroid Build Coastguard Worker 		igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
545*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->abort_mask, ABORT_TAINT | ABORT_LOCKDEP);
546*d83cc019SAndroid Build Coastguard Worker 
547*d83cc019SAndroid Build Coastguard Worker 		argv[1] = "--abort-on-monitored-error=all";
548*d83cc019SAndroid Build Coastguard Worker 		igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
549*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->abort_mask, ABORT_ALL);
550*d83cc019SAndroid Build Coastguard Worker 
551*d83cc019SAndroid Build Coastguard Worker 		argv[1] = "--abort-on-monitored-error=";
552*d83cc019SAndroid Build Coastguard Worker 		igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
553*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(settings->abort_mask, 0);
554*d83cc019SAndroid Build Coastguard Worker 
555*d83cc019SAndroid Build Coastguard Worker 		argv[1] = "--abort-on-monitored-error=doesnotexist";
556*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
557*d83cc019SAndroid Build Coastguard Worker 
558*d83cc019SAndroid Build Coastguard Worker 	}
559*d83cc019SAndroid Build Coastguard Worker 
560*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("parse-clears-old-data") {
561*d83cc019SAndroid Build Coastguard Worker 		const char *argv[] = { "runner",
562*d83cc019SAndroid Build Coastguard Worker 				       "-n", "foo",
563*d83cc019SAndroid Build Coastguard Worker 				       "--dry-run",
564*d83cc019SAndroid Build Coastguard Worker 				       "test-root-dir",
565*d83cc019SAndroid Build Coastguard Worker 				       "results-path",
566*d83cc019SAndroid Build Coastguard Worker 		};
567*d83cc019SAndroid Build Coastguard Worker 
568*d83cc019SAndroid Build Coastguard Worker 		igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
569*d83cc019SAndroid Build Coastguard Worker 
570*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eqstr(settings->name, "foo");
571*d83cc019SAndroid Build Coastguard Worker 		igt_assert(settings->dry_run);
572*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!settings->test_list);
573*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!settings->sync);
574*d83cc019SAndroid Build Coastguard Worker 
575*d83cc019SAndroid Build Coastguard Worker 		argv[1] = "--test-list";
576*d83cc019SAndroid Build Coastguard Worker 		argv[3] = "--sync";
577*d83cc019SAndroid Build Coastguard Worker 
578*d83cc019SAndroid Build Coastguard Worker 		igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
579*d83cc019SAndroid Build Coastguard Worker 
580*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eqstr(settings->name, "results-path");
581*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!settings->dry_run);
582*d83cc019SAndroid Build Coastguard Worker 		igt_assert(strstr(settings->test_list, "foo") != NULL);
583*d83cc019SAndroid Build Coastguard Worker 		igt_assert(settings->sync);
584*d83cc019SAndroid Build Coastguard Worker 	}
585*d83cc019SAndroid Build Coastguard Worker 
586*d83cc019SAndroid Build Coastguard Worker 	igt_subtest_group {
587*d83cc019SAndroid Build Coastguard Worker 		char filename[] = "tmplistXXXXXX";
588*d83cc019SAndroid Build Coastguard Worker 
589*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
590*d83cc019SAndroid Build Coastguard Worker 			int fd;
591*d83cc019SAndroid Build Coastguard Worker 			igt_require((fd = mkstemp(filename)) >= 0);
592*d83cc019SAndroid Build Coastguard Worker 			close(fd);
593*d83cc019SAndroid Build Coastguard Worker 		}
594*d83cc019SAndroid Build Coastguard Worker 
595*d83cc019SAndroid Build Coastguard Worker 		igt_subtest("validate-ok") {
596*d83cc019SAndroid Build Coastguard Worker 			const char *argv[] = { "runner",
597*d83cc019SAndroid Build Coastguard Worker 					       "--test-list", filename,
598*d83cc019SAndroid Build Coastguard Worker 					       testdatadir,
599*d83cc019SAndroid Build Coastguard Worker 					       "path-to-results",
600*d83cc019SAndroid Build Coastguard Worker 			};
601*d83cc019SAndroid Build Coastguard Worker 
602*d83cc019SAndroid Build Coastguard Worker 			igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
603*d83cc019SAndroid Build Coastguard Worker 
604*d83cc019SAndroid Build Coastguard Worker 			igt_assert(validate_settings(settings));
605*d83cc019SAndroid Build Coastguard Worker 		}
606*d83cc019SAndroid Build Coastguard Worker 
607*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
608*d83cc019SAndroid Build Coastguard Worker 			unlink(filename);
609*d83cc019SAndroid Build Coastguard Worker 		}
610*d83cc019SAndroid Build Coastguard Worker 	}
611*d83cc019SAndroid Build Coastguard Worker 
612*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("validate-no-test-list") {
613*d83cc019SAndroid Build Coastguard Worker 		const char *nosuchfile = "no-such-file";
614*d83cc019SAndroid Build Coastguard Worker 		const char *argv[] = { "runner",
615*d83cc019SAndroid Build Coastguard Worker 				       "--test-list", nosuchfile,
616*d83cc019SAndroid Build Coastguard Worker 				       testdatadir,
617*d83cc019SAndroid Build Coastguard Worker 				       "path-to-results",
618*d83cc019SAndroid Build Coastguard Worker 		};
619*d83cc019SAndroid Build Coastguard Worker 
620*d83cc019SAndroid Build Coastguard Worker 		igt_assert_lt(open(nosuchfile, O_RDONLY), 0);
621*d83cc019SAndroid Build Coastguard Worker 		igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
622*d83cc019SAndroid Build Coastguard Worker 
623*d83cc019SAndroid Build Coastguard Worker 		igt_assert(!validate_settings(settings));
624*d83cc019SAndroid Build Coastguard Worker 	}
625*d83cc019SAndroid Build Coastguard Worker 
626*d83cc019SAndroid Build Coastguard Worker 	igt_subtest_group {
627*d83cc019SAndroid Build Coastguard Worker 		char dirname[] = "tmpdirXXXXXX";
628*d83cc019SAndroid Build Coastguard Worker 		struct job_list *list = malloc(sizeof(*list));
629*d83cc019SAndroid Build Coastguard Worker 
630*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
631*d83cc019SAndroid Build Coastguard Worker 			igt_require(mkdtemp(dirname) != NULL);
632*d83cc019SAndroid Build Coastguard Worker 			init_job_list(list);
633*d83cc019SAndroid Build Coastguard Worker 		}
634*d83cc019SAndroid Build Coastguard Worker 
635*d83cc019SAndroid Build Coastguard Worker 		igt_subtest("job-list-no-test-list-txt") {
636*d83cc019SAndroid Build Coastguard Worker 			const char *argv[] = { "runner",
637*d83cc019SAndroid Build Coastguard Worker 					       dirname,
638*d83cc019SAndroid Build Coastguard Worker 					       "path-to-results",
639*d83cc019SAndroid Build Coastguard Worker 			};
640*d83cc019SAndroid Build Coastguard Worker 
641*d83cc019SAndroid Build Coastguard Worker 			igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
642*d83cc019SAndroid Build Coastguard Worker 
643*d83cc019SAndroid Build Coastguard Worker 			igt_assert(!create_job_list(list, settings));
644*d83cc019SAndroid Build Coastguard Worker 		}
645*d83cc019SAndroid Build Coastguard Worker 
646*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
647*d83cc019SAndroid Build Coastguard Worker 			rmdir(dirname);
648*d83cc019SAndroid Build Coastguard Worker 			free_job_list(list);
649*d83cc019SAndroid Build Coastguard Worker 			free(list);
650*d83cc019SAndroid Build Coastguard Worker 		}
651*d83cc019SAndroid Build Coastguard Worker 	}
652*d83cc019SAndroid Build Coastguard Worker 
653*d83cc019SAndroid Build Coastguard Worker 	job_list_filter_test("nofilters", "-n", "placeholderargs", 5, 3);
654*d83cc019SAndroid Build Coastguard Worker 	job_list_filter_test("binary-include", "-t", "successtest", 2, 1);
655*d83cc019SAndroid Build Coastguard Worker 	job_list_filter_test("binary-exclude", "-x", "successtest", 3, 2);
656*d83cc019SAndroid Build Coastguard Worker 	job_list_filter_test("subtest-include", "-t", "first-subtest", 1, 1);
657*d83cc019SAndroid Build Coastguard Worker 	job_list_filter_test("subtest-exclude", "-x", "second-subtest", 4, 3);
658*d83cc019SAndroid Build Coastguard Worker 	job_list_filter_test("piglit-names", "-t", "igt@successtest", 2, 1);
659*d83cc019SAndroid Build Coastguard Worker 	job_list_filter_test("piglit-names-subtest", "-t", "igt@successtest@first", 1, 1);
660*d83cc019SAndroid Build Coastguard Worker 
661*d83cc019SAndroid Build Coastguard Worker 	igt_subtest_group {
662*d83cc019SAndroid Build Coastguard Worker 		char filename[] = "tmplistXXXXXX";
663*d83cc019SAndroid Build Coastguard Worker 		const char testlisttext[] = "igt@successtest@first-subtest\n"
664*d83cc019SAndroid Build Coastguard Worker 			"igt@successtest@second-subtest\n"
665*d83cc019SAndroid Build Coastguard Worker 			"igt@nosubtests\n";
666*d83cc019SAndroid Build Coastguard Worker 		int multiple;
667*d83cc019SAndroid Build Coastguard Worker 		struct job_list *list = malloc(sizeof(*list));
668*d83cc019SAndroid Build Coastguard Worker 
669*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
670*d83cc019SAndroid Build Coastguard Worker 			int fd;
671*d83cc019SAndroid Build Coastguard Worker 			igt_require((fd = mkstemp(filename)) >= 0);
672*d83cc019SAndroid Build Coastguard Worker 			igt_require(write(fd, testlisttext, strlen(testlisttext)) == strlen(testlisttext));
673*d83cc019SAndroid Build Coastguard Worker 			close(fd);
674*d83cc019SAndroid Build Coastguard Worker 			init_job_list(list);
675*d83cc019SAndroid Build Coastguard Worker 		}
676*d83cc019SAndroid Build Coastguard Worker 
677*d83cc019SAndroid Build Coastguard Worker 		for (multiple = 0; multiple < 2; multiple++) {
678*d83cc019SAndroid Build Coastguard Worker 			igt_subtest_f("job-list-testlist-%s", multiple ? "multiple" : "normal") {
679*d83cc019SAndroid Build Coastguard Worker 				const char *argv[] = { "runner",
680*d83cc019SAndroid Build Coastguard Worker 						       "--test-list", filename,
681*d83cc019SAndroid Build Coastguard Worker 						       multiple ? "--multiple-mode" : "--sync",
682*d83cc019SAndroid Build Coastguard Worker 						       testdatadir,
683*d83cc019SAndroid Build Coastguard Worker 						       "path-to-results",
684*d83cc019SAndroid Build Coastguard Worker 				};
685*d83cc019SAndroid Build Coastguard Worker 
686*d83cc019SAndroid Build Coastguard Worker 				igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
687*d83cc019SAndroid Build Coastguard Worker 				igt_assert(create_job_list(list, settings));
688*d83cc019SAndroid Build Coastguard Worker 
689*d83cc019SAndroid Build Coastguard Worker 				igt_assert_eq(list->size, multiple ? 2 : 3);
690*d83cc019SAndroid Build Coastguard Worker 
691*d83cc019SAndroid Build Coastguard Worker 				igt_assert_eqstr(list->entries[0].binary, "successtest");
692*d83cc019SAndroid Build Coastguard Worker 				if (!multiple) igt_assert_eqstr(list->entries[1].binary, "successtest");
693*d83cc019SAndroid Build Coastguard Worker 				igt_assert_eqstr(list->entries[multiple ? 1 : 2].binary, "nosubtests");
694*d83cc019SAndroid Build Coastguard Worker 
695*d83cc019SAndroid Build Coastguard Worker 				igt_assert_eq(list->entries[0].subtest_count, multiple ? 2 : 1);
696*d83cc019SAndroid Build Coastguard Worker 				igt_assert_eq(list->entries[1].subtest_count, multiple ? 0 : 1);
697*d83cc019SAndroid Build Coastguard Worker 				if (!multiple) igt_assert_eq(list->entries[2].subtest_count, 0);
698*d83cc019SAndroid Build Coastguard Worker 
699*d83cc019SAndroid Build Coastguard Worker 				igt_assert_eqstr(list->entries[0].subtests[0], "first-subtest");
700*d83cc019SAndroid Build Coastguard Worker 				igt_assert_eqstr(list->entries[multiple ? 0 : 1].subtests[multiple ? 1 : 0], "second-subtest");
701*d83cc019SAndroid Build Coastguard Worker 			}
702*d83cc019SAndroid Build Coastguard Worker 
703*d83cc019SAndroid Build Coastguard Worker 			igt_subtest_f("job-list-testlist-filtered-%s", multiple ? "multiple" : "normal") {
704*d83cc019SAndroid Build Coastguard Worker 				const char *argv[] = { "runner",
705*d83cc019SAndroid Build Coastguard Worker 						       "--test-list", filename,
706*d83cc019SAndroid Build Coastguard Worker 						       multiple ? "--multiple-mode" : "--sync",
707*d83cc019SAndroid Build Coastguard Worker 						       "-t", "successtest",
708*d83cc019SAndroid Build Coastguard Worker 						       "-x", "first",
709*d83cc019SAndroid Build Coastguard Worker 						       testdatadir,
710*d83cc019SAndroid Build Coastguard Worker 						       "path-to-results",
711*d83cc019SAndroid Build Coastguard Worker 				};
712*d83cc019SAndroid Build Coastguard Worker 
713*d83cc019SAndroid Build Coastguard Worker 				igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
714*d83cc019SAndroid Build Coastguard Worker 				igt_assert(create_job_list(list, settings));
715*d83cc019SAndroid Build Coastguard Worker 
716*d83cc019SAndroid Build Coastguard Worker 				igt_assert_eq(list->size, 1);
717*d83cc019SAndroid Build Coastguard Worker 				igt_assert_eqstr(list->entries[0].binary, "successtest");
718*d83cc019SAndroid Build Coastguard Worker 
719*d83cc019SAndroid Build Coastguard Worker 				igt_assert_eq(list->entries[0].subtest_count, 1);
720*d83cc019SAndroid Build Coastguard Worker 				igt_assert_eqstr(list->entries[0].subtests[0], "second-subtest");
721*d83cc019SAndroid Build Coastguard Worker 			}
722*d83cc019SAndroid Build Coastguard Worker 		}
723*d83cc019SAndroid Build Coastguard Worker 
724*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
725*d83cc019SAndroid Build Coastguard Worker 			unlink(filename);
726*d83cc019SAndroid Build Coastguard Worker 			free_job_list(list);
727*d83cc019SAndroid Build Coastguard Worker 			free(list);
728*d83cc019SAndroid Build Coastguard Worker 		}
729*d83cc019SAndroid Build Coastguard Worker 	}
730*d83cc019SAndroid Build Coastguard Worker 
731*d83cc019SAndroid Build Coastguard Worker 	igt_subtest_group {
732*d83cc019SAndroid Build Coastguard Worker 		char dirname[] = "tmpdirXXXXXX";
733*d83cc019SAndroid Build Coastguard Worker 		volatile int dirfd = -1, fd = -1;
734*d83cc019SAndroid Build Coastguard Worker 		struct settings *cmp_settings = malloc(sizeof(*cmp_settings));
735*d83cc019SAndroid Build Coastguard Worker 
736*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
737*d83cc019SAndroid Build Coastguard Worker 			igt_require(mkdtemp(dirname) != NULL);
738*d83cc019SAndroid Build Coastguard Worker 			rmdir(dirname);
739*d83cc019SAndroid Build Coastguard Worker 			init_settings(cmp_settings);
740*d83cc019SAndroid Build Coastguard Worker 		}
741*d83cc019SAndroid Build Coastguard Worker 
742*d83cc019SAndroid Build Coastguard Worker 		igt_subtest("settings-serialize") {
743*d83cc019SAndroid Build Coastguard Worker 			const char *argv[] = { "runner",
744*d83cc019SAndroid Build Coastguard Worker 					       "-n", "foo",
745*d83cc019SAndroid Build Coastguard Worker 					       "--abort-on-monitored-error",
746*d83cc019SAndroid Build Coastguard Worker 					       "--test-list", "path-to-test-list",
747*d83cc019SAndroid Build Coastguard Worker 					       "--ignore-missing",
748*d83cc019SAndroid Build Coastguard Worker 					       "--dry-run",
749*d83cc019SAndroid Build Coastguard Worker 					       "-t", "pattern1",
750*d83cc019SAndroid Build Coastguard Worker 					       "-t", "pattern2",
751*d83cc019SAndroid Build Coastguard Worker 					       "-x", "xpattern1",
752*d83cc019SAndroid Build Coastguard Worker 					       "-x", "xpattern2",
753*d83cc019SAndroid Build Coastguard Worker 					       "-s",
754*d83cc019SAndroid Build Coastguard Worker 					       "-l", "verbose",
755*d83cc019SAndroid Build Coastguard Worker 					       "--overwrite",
756*d83cc019SAndroid Build Coastguard Worker 					       "--multiple-mode",
757*d83cc019SAndroid Build Coastguard Worker 					       "--inactivity-timeout", "27",
758*d83cc019SAndroid Build Coastguard Worker 					       "--overall-timeout", "360",
759*d83cc019SAndroid Build Coastguard Worker 					       "--use-watchdog",
760*d83cc019SAndroid Build Coastguard Worker 					       "--piglit-style-dmesg",
761*d83cc019SAndroid Build Coastguard Worker 					       testdatadir,
762*d83cc019SAndroid Build Coastguard Worker 					       dirname,
763*d83cc019SAndroid Build Coastguard Worker 			};
764*d83cc019SAndroid Build Coastguard Worker 
765*d83cc019SAndroid Build Coastguard Worker 			igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
766*d83cc019SAndroid Build Coastguard Worker 
767*d83cc019SAndroid Build Coastguard Worker 			igt_assert(serialize_settings(settings));
768*d83cc019SAndroid Build Coastguard Worker 
769*d83cc019SAndroid Build Coastguard Worker 			dirfd = open(dirname, O_DIRECTORY, O_RDONLY);
770*d83cc019SAndroid Build Coastguard Worker 			igt_assert_f(dirfd >= 0, "Serialization did not create the results directory\n");
771*d83cc019SAndroid Build Coastguard Worker 
772*d83cc019SAndroid Build Coastguard Worker 			igt_assert_f((fd = openat(dirfd, "metadata.txt", O_RDONLY)),
773*d83cc019SAndroid Build Coastguard Worker 				     "Opening %s/metadata.txt failed\n", dirname);
774*d83cc019SAndroid Build Coastguard Worker 			close(fd);
775*d83cc019SAndroid Build Coastguard Worker 
776*d83cc019SAndroid Build Coastguard Worker 			igt_assert_f(read_settings_from_dir(cmp_settings, dirfd), "Reading settings failed\n");
777*d83cc019SAndroid Build Coastguard Worker 			assert_settings_equal(settings, cmp_settings);
778*d83cc019SAndroid Build Coastguard Worker 		}
779*d83cc019SAndroid Build Coastguard Worker 
780*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
781*d83cc019SAndroid Build Coastguard Worker 			close(fd);
782*d83cc019SAndroid Build Coastguard Worker 			close(dirfd);
783*d83cc019SAndroid Build Coastguard Worker 			clear_directory(dirname);
784*d83cc019SAndroid Build Coastguard Worker 			free_settings(cmp_settings);
785*d83cc019SAndroid Build Coastguard Worker 			free(cmp_settings);
786*d83cc019SAndroid Build Coastguard Worker 		}
787*d83cc019SAndroid Build Coastguard Worker 	}
788*d83cc019SAndroid Build Coastguard Worker 
789*d83cc019SAndroid Build Coastguard Worker 	igt_subtest_group {
790*d83cc019SAndroid Build Coastguard Worker 		char dirname[] = "tmpdirXXXXXX";
791*d83cc019SAndroid Build Coastguard Worker 		volatile int dirfd = -1, fd = -1;
792*d83cc019SAndroid Build Coastguard Worker 		struct job_list *list, *cmp_list;
793*d83cc019SAndroid Build Coastguard Worker 		int multiple;
794*d83cc019SAndroid Build Coastguard Worker 
795*d83cc019SAndroid Build Coastguard Worker 		list = malloc(sizeof(*list));
796*d83cc019SAndroid Build Coastguard Worker 		cmp_list = malloc(sizeof(*cmp_list));
797*d83cc019SAndroid Build Coastguard Worker 
798*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
799*d83cc019SAndroid Build Coastguard Worker 			init_job_list(list);
800*d83cc019SAndroid Build Coastguard Worker 			init_job_list(cmp_list);
801*d83cc019SAndroid Build Coastguard Worker 			igt_require(mkdtemp(dirname) != NULL);
802*d83cc019SAndroid Build Coastguard Worker 			rmdir(dirname);
803*d83cc019SAndroid Build Coastguard Worker 		}
804*d83cc019SAndroid Build Coastguard Worker 
805*d83cc019SAndroid Build Coastguard Worker 		for (multiple = 0; multiple < 2; multiple++) {
806*d83cc019SAndroid Build Coastguard Worker 			igt_subtest_f("job-list-serialize-%s", multiple ? "multiple" : "normal") {
807*d83cc019SAndroid Build Coastguard Worker 				const char *argv[] = { "runner",
808*d83cc019SAndroid Build Coastguard Worker 						       /* Ugly */
809*d83cc019SAndroid Build Coastguard Worker 						       multiple ? "--multiple-mode" : "--sync",
810*d83cc019SAndroid Build Coastguard Worker 						       testdatadir,
811*d83cc019SAndroid Build Coastguard Worker 						       dirname,
812*d83cc019SAndroid Build Coastguard Worker 				};
813*d83cc019SAndroid Build Coastguard Worker 
814*d83cc019SAndroid Build Coastguard Worker 				igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
815*d83cc019SAndroid Build Coastguard Worker 				igt_assert(create_job_list(list, settings));
816*d83cc019SAndroid Build Coastguard Worker 
817*d83cc019SAndroid Build Coastguard Worker 				igt_assert(serialize_settings(settings));
818*d83cc019SAndroid Build Coastguard Worker 				igt_assert(serialize_job_list(list, settings));
819*d83cc019SAndroid Build Coastguard Worker 
820*d83cc019SAndroid Build Coastguard Worker 				dirfd = open(dirname, O_DIRECTORY, O_RDONLY);
821*d83cc019SAndroid Build Coastguard Worker 				igt_assert_f(dirfd >= 0, "Serialization did not create the results directory\n");
822*d83cc019SAndroid Build Coastguard Worker 
823*d83cc019SAndroid Build Coastguard Worker 				igt_assert_f((fd = openat(dirfd, "joblist.txt", O_RDONLY)) >= 0,
824*d83cc019SAndroid Build Coastguard Worker 					     "Opening %s/joblist.txt failed\n", dirname);
825*d83cc019SAndroid Build Coastguard Worker 				close(fd);
826*d83cc019SAndroid Build Coastguard Worker 				fd = -1;
827*d83cc019SAndroid Build Coastguard Worker 
828*d83cc019SAndroid Build Coastguard Worker 				igt_assert_f(read_job_list(cmp_list, dirfd), "Reading job list failed\n");
829*d83cc019SAndroid Build Coastguard Worker 				assert_job_list_equal(list, cmp_list);
830*d83cc019SAndroid Build Coastguard Worker 			}
831*d83cc019SAndroid Build Coastguard Worker 
832*d83cc019SAndroid Build Coastguard Worker 			igt_fixture {
833*d83cc019SAndroid Build Coastguard Worker 				close(fd);
834*d83cc019SAndroid Build Coastguard Worker 				close(dirfd);
835*d83cc019SAndroid Build Coastguard Worker 				clear_directory(dirname);
836*d83cc019SAndroid Build Coastguard Worker 				free_job_list(cmp_list);
837*d83cc019SAndroid Build Coastguard Worker 				free_job_list(list);
838*d83cc019SAndroid Build Coastguard Worker 			}
839*d83cc019SAndroid Build Coastguard Worker 		}
840*d83cc019SAndroid Build Coastguard Worker 
841*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
842*d83cc019SAndroid Build Coastguard Worker 			free(cmp_list);
843*d83cc019SAndroid Build Coastguard Worker 			free(list);
844*d83cc019SAndroid Build Coastguard Worker 		}
845*d83cc019SAndroid Build Coastguard Worker 	}
846*d83cc019SAndroid Build Coastguard Worker 
847*d83cc019SAndroid Build Coastguard Worker 	igt_subtest_group {
848*d83cc019SAndroid Build Coastguard Worker 		char dirname[] = "tmpdirXXXXXX";
849*d83cc019SAndroid Build Coastguard Worker 		struct job_list *list = malloc(sizeof(*list));
850*d83cc019SAndroid Build Coastguard Worker 		volatile int dirfd = -1, subdirfd = -1, fd = -1;
851*d83cc019SAndroid Build Coastguard Worker 
852*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
853*d83cc019SAndroid Build Coastguard Worker 			init_job_list(list);
854*d83cc019SAndroid Build Coastguard Worker 			igt_require(mkdtemp(dirname) != NULL);
855*d83cc019SAndroid Build Coastguard Worker 			rmdir(dirname);
856*d83cc019SAndroid Build Coastguard Worker 		}
857*d83cc019SAndroid Build Coastguard Worker 
858*d83cc019SAndroid Build Coastguard Worker 		igt_subtest("dry-run-option") {
859*d83cc019SAndroid Build Coastguard Worker 			struct execute_state state;
860*d83cc019SAndroid Build Coastguard Worker 			const char *argv[] = { "runner",
861*d83cc019SAndroid Build Coastguard Worker 					       "--dry-run",
862*d83cc019SAndroid Build Coastguard Worker 					       testdatadir,
863*d83cc019SAndroid Build Coastguard Worker 					       dirname,
864*d83cc019SAndroid Build Coastguard Worker 			};
865*d83cc019SAndroid Build Coastguard Worker 
866*d83cc019SAndroid Build Coastguard Worker 			igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
867*d83cc019SAndroid Build Coastguard Worker 			igt_assert(create_job_list(list, settings));
868*d83cc019SAndroid Build Coastguard Worker 
869*d83cc019SAndroid Build Coastguard Worker 			igt_assert(initialize_execute_state(&state, settings, list));
870*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(state.next, 0);
871*d83cc019SAndroid Build Coastguard Worker 			igt_assert(state.dry);
872*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(list->size, 5);
873*d83cc019SAndroid Build Coastguard Worker 
874*d83cc019SAndroid Build Coastguard Worker 			igt_assert_f((dirfd = open(dirname, O_DIRECTORY | O_RDONLY)) >= 0,
875*d83cc019SAndroid Build Coastguard Worker 				     "Dry run initialization didn't create the results directory.\n");
876*d83cc019SAndroid Build Coastguard Worker 
877*d83cc019SAndroid Build Coastguard Worker 			/* Execute from just initialize_execute_state should fail */
878*d83cc019SAndroid Build Coastguard Worker 			igt_assert(execute(&state, settings, list));
879*d83cc019SAndroid Build Coastguard Worker 			igt_assert_f(openat(dirfd, "0", O_DIRECTORY | O_RDONLY) < 0,
880*d83cc019SAndroid Build Coastguard Worker 				     "Dry run executed when it should not have.\n");
881*d83cc019SAndroid Build Coastguard Worker 			igt_assert_f((fd = openat(dirfd, "metadata.txt", O_RDONLY)) >= 0,
882*d83cc019SAndroid Build Coastguard Worker 				     "Dry run initialization didn't serialize settings.\n");
883*d83cc019SAndroid Build Coastguard Worker 			close(fd);
884*d83cc019SAndroid Build Coastguard Worker 			igt_assert_f((fd = openat(dirfd, "joblist.txt", O_RDONLY)) >= 0,
885*d83cc019SAndroid Build Coastguard Worker 				     "Dry run initialization didn't serialize the job list.\n");
886*d83cc019SAndroid Build Coastguard Worker 			close(fd);
887*d83cc019SAndroid Build Coastguard Worker 			igt_assert_f((fd = openat(dirfd, "uname.txt", O_RDONLY)) < 0,
888*d83cc019SAndroid Build Coastguard Worker 				     "Dry run initialization created uname.txt.\n");
889*d83cc019SAndroid Build Coastguard Worker 
890*d83cc019SAndroid Build Coastguard Worker 			igt_assert(initialize_execute_state_from_resume(dirfd, &state, settings, list));
891*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(state.next, 0);
892*d83cc019SAndroid Build Coastguard Worker 			igt_assert(!state.dry);
893*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(list->size, 5);
894*d83cc019SAndroid Build Coastguard Worker 			/* initialize_execute_state_from_resume() closes the dirfd */
895*d83cc019SAndroid Build Coastguard Worker 			igt_assert_f((dirfd = open(dirname, O_DIRECTORY | O_RDONLY)) >= 0,
896*d83cc019SAndroid Build Coastguard Worker 				     "Dry run resume somehow deleted the results directory.\n");
897*d83cc019SAndroid Build Coastguard Worker 
898*d83cc019SAndroid Build Coastguard Worker 			/* Execute from resume should work */
899*d83cc019SAndroid Build Coastguard Worker 			igt_assert(execute(&state, settings, list));
900*d83cc019SAndroid Build Coastguard Worker 			igt_assert_f((fd = openat(dirfd, "uname.txt", O_RDONLY)) >= 0,
901*d83cc019SAndroid Build Coastguard Worker 				     "Dry run resume didn't create uname.txt.\n");
902*d83cc019SAndroid Build Coastguard Worker 			close(fd);
903*d83cc019SAndroid Build Coastguard Worker 			igt_assert_f((subdirfd = openat(dirfd, "0", O_DIRECTORY | O_RDONLY)) >= 0,
904*d83cc019SAndroid Build Coastguard Worker 				     "Dry run resume didn't create result directory.\n");
905*d83cc019SAndroid Build Coastguard Worker 			igt_assert_f((fd = openat(subdirfd, "journal.txt", O_RDONLY)) >= 0,
906*d83cc019SAndroid Build Coastguard Worker 				     "Dry run resume didn't create a journal.\n");
907*d83cc019SAndroid Build Coastguard Worker 		}
908*d83cc019SAndroid Build Coastguard Worker 
909*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
910*d83cc019SAndroid Build Coastguard Worker 			close(fd);
911*d83cc019SAndroid Build Coastguard Worker 			close(dirfd);
912*d83cc019SAndroid Build Coastguard Worker 			close(subdirfd);
913*d83cc019SAndroid Build Coastguard Worker 			clear_directory(dirname);
914*d83cc019SAndroid Build Coastguard Worker 			free_job_list(list);
915*d83cc019SAndroid Build Coastguard Worker 			free(list);
916*d83cc019SAndroid Build Coastguard Worker 		}
917*d83cc019SAndroid Build Coastguard Worker 	}
918*d83cc019SAndroid Build Coastguard Worker 
919*d83cc019SAndroid Build Coastguard Worker 	igt_subtest_group {
920*d83cc019SAndroid Build Coastguard Worker 		char dirname[] = "tmpdirXXXXXX";
921*d83cc019SAndroid Build Coastguard Worker 		struct job_list *list = malloc(sizeof(*list));
922*d83cc019SAndroid Build Coastguard Worker 		volatile int dirfd = -1, fd = -1;
923*d83cc019SAndroid Build Coastguard Worker 
924*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
925*d83cc019SAndroid Build Coastguard Worker 			init_job_list(list);
926*d83cc019SAndroid Build Coastguard Worker 			igt_require(mkdtemp(dirname) != NULL);
927*d83cc019SAndroid Build Coastguard Worker 			rmdir(dirname);
928*d83cc019SAndroid Build Coastguard Worker 		}
929*d83cc019SAndroid Build Coastguard Worker 
930*d83cc019SAndroid Build Coastguard Worker 		igt_subtest("execute-initialize-new-run") {
931*d83cc019SAndroid Build Coastguard Worker 			struct execute_state state;
932*d83cc019SAndroid Build Coastguard Worker 			const char *argv[] = { "runner",
933*d83cc019SAndroid Build Coastguard Worker 					       testdatadir,
934*d83cc019SAndroid Build Coastguard Worker 					       dirname,
935*d83cc019SAndroid Build Coastguard Worker 			};
936*d83cc019SAndroid Build Coastguard Worker 
937*d83cc019SAndroid Build Coastguard Worker 			igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
938*d83cc019SAndroid Build Coastguard Worker 			igt_assert(create_job_list(list, settings));
939*d83cc019SAndroid Build Coastguard Worker 
940*d83cc019SAndroid Build Coastguard Worker 			igt_assert(initialize_execute_state(&state, settings, list));
941*d83cc019SAndroid Build Coastguard Worker 
942*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(state.next, 0);
943*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(list->size, 5);
944*d83cc019SAndroid Build Coastguard Worker 			igt_assert_f((dirfd = open(dirname, O_DIRECTORY | O_RDONLY)) >= 0,
945*d83cc019SAndroid Build Coastguard Worker 				     "Execute state initialization didn't create the results directory.\n");
946*d83cc019SAndroid Build Coastguard Worker 			igt_assert_f((fd = openat(dirfd, "metadata.txt", O_RDONLY)) >= 0,
947*d83cc019SAndroid Build Coastguard Worker 				     "Execute state initialization didn't serialize settings.\n");
948*d83cc019SAndroid Build Coastguard Worker 			close(fd);
949*d83cc019SAndroid Build Coastguard Worker 			igt_assert_f((fd = openat(dirfd, "joblist.txt", O_RDONLY)) >= 0,
950*d83cc019SAndroid Build Coastguard Worker 				     "Execute state initialization didn't serialize the job list.\n");
951*d83cc019SAndroid Build Coastguard Worker 			close(fd);
952*d83cc019SAndroid Build Coastguard Worker 			igt_assert_f((fd = openat(dirfd, "journal.txt", O_RDONLY)) < 0,
953*d83cc019SAndroid Build Coastguard Worker 				     "Execute state initialization created a journal.\n");
954*d83cc019SAndroid Build Coastguard Worker 			igt_assert_f((fd = openat(dirfd, "uname.txt", O_RDONLY)) < 0,
955*d83cc019SAndroid Build Coastguard Worker 				     "Execute state initialization created uname.txt.\n");
956*d83cc019SAndroid Build Coastguard Worker 		}
957*d83cc019SAndroid Build Coastguard Worker 
958*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
959*d83cc019SAndroid Build Coastguard Worker 			close(fd);
960*d83cc019SAndroid Build Coastguard Worker 			close(dirfd);
961*d83cc019SAndroid Build Coastguard Worker 			clear_directory(dirname);
962*d83cc019SAndroid Build Coastguard Worker 			free_job_list(list);
963*d83cc019SAndroid Build Coastguard Worker 			free(list);
964*d83cc019SAndroid Build Coastguard Worker 		}
965*d83cc019SAndroid Build Coastguard Worker 	}
966*d83cc019SAndroid Build Coastguard Worker 
967*d83cc019SAndroid Build Coastguard Worker 	igt_subtest_group {
968*d83cc019SAndroid Build Coastguard Worker 		char dirname[] = "tmpdirXXXXXX";
969*d83cc019SAndroid Build Coastguard Worker 		struct job_list *list = malloc(sizeof(*list));
970*d83cc019SAndroid Build Coastguard Worker 		volatile int dirfd = -1, subdirfd = -1, fd = -1;
971*d83cc019SAndroid Build Coastguard Worker 
972*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
973*d83cc019SAndroid Build Coastguard Worker 			init_job_list(list);
974*d83cc019SAndroid Build Coastguard Worker 			igt_require(mkdtemp(dirname) != NULL);
975*d83cc019SAndroid Build Coastguard Worker 		}
976*d83cc019SAndroid Build Coastguard Worker 
977*d83cc019SAndroid Build Coastguard Worker 		igt_subtest("execute-initialize-subtest-started") {
978*d83cc019SAndroid Build Coastguard Worker 			struct execute_state state;
979*d83cc019SAndroid Build Coastguard Worker 			const char *argv[] = { "runner",
980*d83cc019SAndroid Build Coastguard Worker 					       "--multiple-mode",
981*d83cc019SAndroid Build Coastguard Worker 					       "-t", "successtest",
982*d83cc019SAndroid Build Coastguard Worker 					       testdatadir,
983*d83cc019SAndroid Build Coastguard Worker 					       dirname,
984*d83cc019SAndroid Build Coastguard Worker 			};
985*d83cc019SAndroid Build Coastguard Worker 			const char journaltext[] = "first-subtest\n";
986*d83cc019SAndroid Build Coastguard Worker 			const char excludestring[] = "!first-subtest";
987*d83cc019SAndroid Build Coastguard Worker 
988*d83cc019SAndroid Build Coastguard Worker 			igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
989*d83cc019SAndroid Build Coastguard Worker 			igt_assert(create_job_list(list, settings));
990*d83cc019SAndroid Build Coastguard Worker 			igt_assert(list->size == 1);
991*d83cc019SAndroid Build Coastguard Worker 			igt_assert(list->entries[0].subtest_count == 0);
992*d83cc019SAndroid Build Coastguard Worker 
993*d83cc019SAndroid Build Coastguard Worker 			igt_assert(serialize_settings(settings));
994*d83cc019SAndroid Build Coastguard Worker 			igt_assert(serialize_job_list(list, settings));
995*d83cc019SAndroid Build Coastguard Worker 
996*d83cc019SAndroid Build Coastguard Worker 			igt_assert((dirfd = open(dirname, O_DIRECTORY | O_RDONLY)) >= 0);
997*d83cc019SAndroid Build Coastguard Worker 			igt_assert(mkdirat(dirfd, "0", 0770) == 0);
998*d83cc019SAndroid Build Coastguard Worker 			igt_assert((subdirfd = openat(dirfd, "0", O_DIRECTORY | O_RDONLY)) >= 0);
999*d83cc019SAndroid Build Coastguard Worker 			igt_assert((fd = openat(subdirfd, "journal.txt", O_CREAT | O_WRONLY | O_EXCL, 0660)) >= 0);
1000*d83cc019SAndroid Build Coastguard Worker 			igt_assert(write(fd, journaltext, strlen(journaltext)) == strlen(journaltext));
1001*d83cc019SAndroid Build Coastguard Worker 
1002*d83cc019SAndroid Build Coastguard Worker 			free_job_list(list);
1003*d83cc019SAndroid Build Coastguard Worker 			free_settings(settings);
1004*d83cc019SAndroid Build Coastguard Worker 			igt_assert(initialize_execute_state_from_resume(dirfd, &state, settings, list));
1005*d83cc019SAndroid Build Coastguard Worker 
1006*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(state.next, 0);
1007*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(list->size, 1);
1008*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(list->entries[0].subtest_count, 2);
1009*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eqstr(list->entries[0].subtests[0], "*");
1010*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eqstr(list->entries[0].subtests[1], excludestring);
1011*d83cc019SAndroid Build Coastguard Worker 		}
1012*d83cc019SAndroid Build Coastguard Worker 
1013*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
1014*d83cc019SAndroid Build Coastguard Worker 			close(fd);
1015*d83cc019SAndroid Build Coastguard Worker 			close(subdirfd);
1016*d83cc019SAndroid Build Coastguard Worker 			close(dirfd);
1017*d83cc019SAndroid Build Coastguard Worker 			clear_directory(dirname);
1018*d83cc019SAndroid Build Coastguard Worker 			free_job_list(list);
1019*d83cc019SAndroid Build Coastguard Worker 			free(list);
1020*d83cc019SAndroid Build Coastguard Worker 		}
1021*d83cc019SAndroid Build Coastguard Worker 	}
1022*d83cc019SAndroid Build Coastguard Worker 
1023*d83cc019SAndroid Build Coastguard Worker 	igt_subtest_group {
1024*d83cc019SAndroid Build Coastguard Worker 		char dirname[] = "tmpdirXXXXXX";
1025*d83cc019SAndroid Build Coastguard Worker 		struct job_list *list = malloc(sizeof(*list));
1026*d83cc019SAndroid Build Coastguard Worker 		volatile int dirfd = -1, subdirfd = -1, fd = -1;
1027*d83cc019SAndroid Build Coastguard Worker 
1028*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
1029*d83cc019SAndroid Build Coastguard Worker 			init_job_list(list);
1030*d83cc019SAndroid Build Coastguard Worker 			igt_require(mkdtemp(dirname) != NULL);
1031*d83cc019SAndroid Build Coastguard Worker 		}
1032*d83cc019SAndroid Build Coastguard Worker 
1033*d83cc019SAndroid Build Coastguard Worker 		igt_subtest("execute-initialize-all-subtests-started") {
1034*d83cc019SAndroid Build Coastguard Worker 			struct execute_state state;
1035*d83cc019SAndroid Build Coastguard Worker 			const char *argv[] = { "runner",
1036*d83cc019SAndroid Build Coastguard Worker 					       "--multiple-mode",
1037*d83cc019SAndroid Build Coastguard Worker 					       "-t", "successtest@first-subtest",
1038*d83cc019SAndroid Build Coastguard Worker 					       "-t", "successtest@second-subtest",
1039*d83cc019SAndroid Build Coastguard Worker 					       testdatadir,
1040*d83cc019SAndroid Build Coastguard Worker 					       dirname,
1041*d83cc019SAndroid Build Coastguard Worker 			};
1042*d83cc019SAndroid Build Coastguard Worker 			const char journaltext[] = "first-subtest\nsecond-subtest\n";
1043*d83cc019SAndroid Build Coastguard Worker 
1044*d83cc019SAndroid Build Coastguard Worker 			igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
1045*d83cc019SAndroid Build Coastguard Worker 			igt_assert(create_job_list(list, settings));
1046*d83cc019SAndroid Build Coastguard Worker 			igt_assert(list->size == 1);
1047*d83cc019SAndroid Build Coastguard Worker 			igt_assert(list->entries[0].subtest_count == 2);
1048*d83cc019SAndroid Build Coastguard Worker 
1049*d83cc019SAndroid Build Coastguard Worker 			igt_assert(serialize_settings(settings));
1050*d83cc019SAndroid Build Coastguard Worker 			igt_assert(serialize_job_list(list, settings));
1051*d83cc019SAndroid Build Coastguard Worker 
1052*d83cc019SAndroid Build Coastguard Worker 			igt_assert((dirfd = open(dirname, O_DIRECTORY | O_RDONLY)) >= 0);
1053*d83cc019SAndroid Build Coastguard Worker 			igt_assert(mkdirat(dirfd, "0", 0770) == 0);
1054*d83cc019SAndroid Build Coastguard Worker 			igt_assert((subdirfd = openat(dirfd, "0", O_DIRECTORY | O_RDONLY)) >= 0);
1055*d83cc019SAndroid Build Coastguard Worker 			igt_assert((fd = openat(subdirfd, "journal.txt", O_CREAT | O_WRONLY | O_EXCL, 0660)) >= 0);
1056*d83cc019SAndroid Build Coastguard Worker 			igt_assert(write(fd, journaltext, strlen(journaltext)) == strlen(journaltext));
1057*d83cc019SAndroid Build Coastguard Worker 
1058*d83cc019SAndroid Build Coastguard Worker 			free_job_list(list);
1059*d83cc019SAndroid Build Coastguard Worker 			free_settings(settings);
1060*d83cc019SAndroid Build Coastguard Worker 			igt_assert(initialize_execute_state_from_resume(dirfd, &state, settings, list));
1061*d83cc019SAndroid Build Coastguard Worker 
1062*d83cc019SAndroid Build Coastguard Worker 			/* All subtests are in journal, the entry should be considered completed */
1063*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(state.next, 1);
1064*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(list->size, 1);
1065*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(list->entries[0].subtest_count, 4);
1066*d83cc019SAndroid Build Coastguard Worker 		}
1067*d83cc019SAndroid Build Coastguard Worker 
1068*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
1069*d83cc019SAndroid Build Coastguard Worker 			close(fd);
1070*d83cc019SAndroid Build Coastguard Worker 			close(subdirfd);
1071*d83cc019SAndroid Build Coastguard Worker 			close(dirfd);
1072*d83cc019SAndroid Build Coastguard Worker 			clear_directory(dirname);
1073*d83cc019SAndroid Build Coastguard Worker 			free_job_list(list);
1074*d83cc019SAndroid Build Coastguard Worker 			free(list);
1075*d83cc019SAndroid Build Coastguard Worker 		}
1076*d83cc019SAndroid Build Coastguard Worker 	}
1077*d83cc019SAndroid Build Coastguard Worker 
1078*d83cc019SAndroid Build Coastguard Worker 	igt_subtest_group {
1079*d83cc019SAndroid Build Coastguard Worker 		char dirname[] = "tmpdirXXXXXX";
1080*d83cc019SAndroid Build Coastguard Worker 		struct job_list *list = malloc(sizeof(*list));
1081*d83cc019SAndroid Build Coastguard Worker 		volatile int dirfd = -1, subdirfd = -1, fd = -1;
1082*d83cc019SAndroid Build Coastguard Worker 
1083*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
1084*d83cc019SAndroid Build Coastguard Worker 			init_job_list(list);
1085*d83cc019SAndroid Build Coastguard Worker 			igt_require(mkdtemp(dirname) != NULL);
1086*d83cc019SAndroid Build Coastguard Worker 		}
1087*d83cc019SAndroid Build Coastguard Worker 
1088*d83cc019SAndroid Build Coastguard Worker 		igt_subtest("execute-initialize-subtests-complete") {
1089*d83cc019SAndroid Build Coastguard Worker 			struct execute_state state;
1090*d83cc019SAndroid Build Coastguard Worker 			const char *argv[] = { "runner",
1091*d83cc019SAndroid Build Coastguard Worker 					       "--multiple-mode",
1092*d83cc019SAndroid Build Coastguard Worker 					       testdatadir,
1093*d83cc019SAndroid Build Coastguard Worker 					       dirname,
1094*d83cc019SAndroid Build Coastguard Worker 			};
1095*d83cc019SAndroid Build Coastguard Worker 			const char journaltext[] = "first-subtest\nsecond-subtest\nexit:0\n";
1096*d83cc019SAndroid Build Coastguard Worker 
1097*d83cc019SAndroid Build Coastguard Worker 			igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
1098*d83cc019SAndroid Build Coastguard Worker 			igt_assert(create_job_list(list, settings));
1099*d83cc019SAndroid Build Coastguard Worker 			igt_assert(list->size == 3);
1100*d83cc019SAndroid Build Coastguard Worker 
1101*d83cc019SAndroid Build Coastguard Worker 			if (!strcmp(list->entries[0].binary, "no-subtests")) {
1102*d83cc019SAndroid Build Coastguard Worker 				struct job_list_entry tmp = list->entries[0];
1103*d83cc019SAndroid Build Coastguard Worker 				list->entries[0] = list->entries[1];
1104*d83cc019SAndroid Build Coastguard Worker 				list->entries[1] = tmp;
1105*d83cc019SAndroid Build Coastguard Worker 			}
1106*d83cc019SAndroid Build Coastguard Worker 
1107*d83cc019SAndroid Build Coastguard Worker 			igt_assert(list->entries[0].subtest_count == 0);
1108*d83cc019SAndroid Build Coastguard Worker 
1109*d83cc019SAndroid Build Coastguard Worker 			igt_assert(serialize_settings(settings));
1110*d83cc019SAndroid Build Coastguard Worker 			igt_assert(serialize_job_list(list, settings));
1111*d83cc019SAndroid Build Coastguard Worker 
1112*d83cc019SAndroid Build Coastguard Worker 			igt_assert_lte(0, dirfd = open(dirname, O_DIRECTORY | O_RDONLY));
1113*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(mkdirat(dirfd, "0", 0770), 0);
1114*d83cc019SAndroid Build Coastguard Worker 			igt_assert((subdirfd = openat(dirfd, "0", O_DIRECTORY | O_RDONLY)) >= 0);
1115*d83cc019SAndroid Build Coastguard Worker 			igt_assert_lte(0, fd = openat(subdirfd, "journal.txt", O_CREAT | O_WRONLY | O_EXCL, 0660));
1116*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(write(fd, journaltext, sizeof(journaltext)), sizeof(journaltext));
1117*d83cc019SAndroid Build Coastguard Worker 
1118*d83cc019SAndroid Build Coastguard Worker 			free_job_list(list);
1119*d83cc019SAndroid Build Coastguard Worker 			free_settings(settings);
1120*d83cc019SAndroid Build Coastguard Worker 			igt_assert(initialize_execute_state_from_resume(dirfd, &state, settings, list));
1121*d83cc019SAndroid Build Coastguard Worker 
1122*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(state.next, 1);
1123*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(list->size, 3);
1124*d83cc019SAndroid Build Coastguard Worker 		}
1125*d83cc019SAndroid Build Coastguard Worker 
1126*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
1127*d83cc019SAndroid Build Coastguard Worker 			close(fd);
1128*d83cc019SAndroid Build Coastguard Worker 			close(subdirfd);
1129*d83cc019SAndroid Build Coastguard Worker 			close(dirfd);
1130*d83cc019SAndroid Build Coastguard Worker 			clear_directory(dirname);
1131*d83cc019SAndroid Build Coastguard Worker 			free_job_list(list);
1132*d83cc019SAndroid Build Coastguard Worker 			free(list);
1133*d83cc019SAndroid Build Coastguard Worker 		}
1134*d83cc019SAndroid Build Coastguard Worker 	}
1135*d83cc019SAndroid Build Coastguard Worker 
1136*d83cc019SAndroid Build Coastguard Worker 	igt_subtest_group {
1137*d83cc019SAndroid Build Coastguard Worker 		struct job_list *list = malloc(sizeof(*list));
1138*d83cc019SAndroid Build Coastguard Worker 		volatile int dirfd = -1, subdirfd = -1, fd = -1;
1139*d83cc019SAndroid Build Coastguard Worker 		int multiple;
1140*d83cc019SAndroid Build Coastguard Worker 
1141*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
1142*d83cc019SAndroid Build Coastguard Worker 			init_job_list(list);
1143*d83cc019SAndroid Build Coastguard Worker 		}
1144*d83cc019SAndroid Build Coastguard Worker 
1145*d83cc019SAndroid Build Coastguard Worker 		for (multiple = 0; multiple < 2; multiple++) {
1146*d83cc019SAndroid Build Coastguard Worker 			char dirname[] = "tmpdirXXXXXX";
1147*d83cc019SAndroid Build Coastguard Worker 
1148*d83cc019SAndroid Build Coastguard Worker 			igt_fixture {
1149*d83cc019SAndroid Build Coastguard Worker 				igt_require(mkdtemp(dirname) != NULL);
1150*d83cc019SAndroid Build Coastguard Worker 				rmdir(dirname);
1151*d83cc019SAndroid Build Coastguard Worker 			}
1152*d83cc019SAndroid Build Coastguard Worker 
1153*d83cc019SAndroid Build Coastguard Worker 			igt_subtest_f("execute-subtests-%s", multiple ? "multiple" : "normal") {
1154*d83cc019SAndroid Build Coastguard Worker 				struct execute_state state;
1155*d83cc019SAndroid Build Coastguard Worker 				const char *argv[] = { "runner",
1156*d83cc019SAndroid Build Coastguard Worker 						       multiple ? "--multiple-mode" : "--sync",
1157*d83cc019SAndroid Build Coastguard Worker 						       "-t", "-subtest",
1158*d83cc019SAndroid Build Coastguard Worker 						       testdatadir,
1159*d83cc019SAndroid Build Coastguard Worker 						       dirname,
1160*d83cc019SAndroid Build Coastguard Worker 				};
1161*d83cc019SAndroid Build Coastguard Worker 				char testdirname[16];
1162*d83cc019SAndroid Build Coastguard Worker 				size_t expected_tests = multiple ? 2 : 3;
1163*d83cc019SAndroid Build Coastguard Worker 				size_t i;
1164*d83cc019SAndroid Build Coastguard Worker 
1165*d83cc019SAndroid Build Coastguard Worker 				igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
1166*d83cc019SAndroid Build Coastguard Worker 				igt_assert(create_job_list(list, settings));
1167*d83cc019SAndroid Build Coastguard Worker 				igt_assert(initialize_execute_state(&state, settings, list));
1168*d83cc019SAndroid Build Coastguard Worker 
1169*d83cc019SAndroid Build Coastguard Worker 				igt_assert(execute(&state, settings, list));
1170*d83cc019SAndroid Build Coastguard Worker 				igt_assert_f((dirfd = open(dirname, O_DIRECTORY | O_RDONLY)) >= 0,
1171*d83cc019SAndroid Build Coastguard Worker 					     "Execute didn't create the results directory\n");
1172*d83cc019SAndroid Build Coastguard Worker 
1173*d83cc019SAndroid Build Coastguard Worker 				igt_assert_f((fd = openat(dirfd, "uname.txt", O_RDONLY)) >= 0,
1174*d83cc019SAndroid Build Coastguard Worker 					     "Execute didn't create uname.txt\n");
1175*d83cc019SAndroid Build Coastguard Worker 				close(fd);
1176*d83cc019SAndroid Build Coastguard Worker 				fd = -1;
1177*d83cc019SAndroid Build Coastguard Worker 
1178*d83cc019SAndroid Build Coastguard Worker 				for (i = 0; i < expected_tests; i++) {
1179*d83cc019SAndroid Build Coastguard Worker 					snprintf(testdirname, 16, "%zd", i);
1180*d83cc019SAndroid Build Coastguard Worker 
1181*d83cc019SAndroid Build Coastguard Worker 					igt_assert_f((subdirfd = openat(dirfd, testdirname, O_DIRECTORY | O_RDONLY)) >= 0,
1182*d83cc019SAndroid Build Coastguard Worker 						     "Execute didn't create result directory '%s'\n", testdirname);
1183*d83cc019SAndroid Build Coastguard Worker 					assert_execution_results_exist(subdirfd);
1184*d83cc019SAndroid Build Coastguard Worker 					close(subdirfd);
1185*d83cc019SAndroid Build Coastguard Worker 				}
1186*d83cc019SAndroid Build Coastguard Worker 
1187*d83cc019SAndroid Build Coastguard Worker 				snprintf(testdirname, 16, "%zd", expected_tests);
1188*d83cc019SAndroid Build Coastguard Worker 				igt_assert_f((subdirfd = openat(dirfd, testdirname, O_DIRECTORY | O_RDONLY)) < 0,
1189*d83cc019SAndroid Build Coastguard Worker 					     "Execute created too many directories\n");
1190*d83cc019SAndroid Build Coastguard Worker 			}
1191*d83cc019SAndroid Build Coastguard Worker 
1192*d83cc019SAndroid Build Coastguard Worker 			igt_fixture {
1193*d83cc019SAndroid Build Coastguard Worker 				close(fd);
1194*d83cc019SAndroid Build Coastguard Worker 				close(subdirfd);
1195*d83cc019SAndroid Build Coastguard Worker 				close(dirfd);
1196*d83cc019SAndroid Build Coastguard Worker 				clear_directory(dirname);
1197*d83cc019SAndroid Build Coastguard Worker 				free_job_list(list);
1198*d83cc019SAndroid Build Coastguard Worker 			}
1199*d83cc019SAndroid Build Coastguard Worker 		}
1200*d83cc019SAndroid Build Coastguard Worker 
1201*d83cc019SAndroid Build Coastguard Worker 		igt_fixture
1202*d83cc019SAndroid Build Coastguard Worker 			free(list);
1203*d83cc019SAndroid Build Coastguard Worker 	}
1204*d83cc019SAndroid Build Coastguard Worker 
1205*d83cc019SAndroid Build Coastguard Worker 	igt_subtest_group {
1206*d83cc019SAndroid Build Coastguard Worker 		igt_subtest("metadata-read-old-style-infer-dmesg-warn-piglit-style") {
1207*d83cc019SAndroid Build Coastguard Worker 			char metadata[] = "piglit_style_dmesg : 1\n";
1208*d83cc019SAndroid Build Coastguard Worker 			FILE *f = fmemopen(metadata, strlen(metadata), "r");
1209*d83cc019SAndroid Build Coastguard Worker 			igt_assert(f);
1210*d83cc019SAndroid Build Coastguard Worker 
1211*d83cc019SAndroid Build Coastguard Worker 			igt_assert(read_settings_from_file(settings, f));
1212*d83cc019SAndroid Build Coastguard Worker 
1213*d83cc019SAndroid Build Coastguard Worker 			igt_assert(settings->piglit_style_dmesg);
1214*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(settings->dmesg_warn_level, 5);
1215*d83cc019SAndroid Build Coastguard Worker 
1216*d83cc019SAndroid Build Coastguard Worker 			fclose(f);
1217*d83cc019SAndroid Build Coastguard Worker 		}
1218*d83cc019SAndroid Build Coastguard Worker 
1219*d83cc019SAndroid Build Coastguard Worker 		igt_subtest("metadata-read-overrides-dmesg-warn-piglit-style") {
1220*d83cc019SAndroid Build Coastguard Worker 			char metadata[] = "piglit_style_dmesg : 1\ndmesg_warn_level : 3";
1221*d83cc019SAndroid Build Coastguard Worker 			FILE *f = fmemopen(metadata, strlen(metadata), "r");
1222*d83cc019SAndroid Build Coastguard Worker 			igt_assert(f);
1223*d83cc019SAndroid Build Coastguard Worker 
1224*d83cc019SAndroid Build Coastguard Worker 			igt_assert(read_settings_from_file(settings, f));
1225*d83cc019SAndroid Build Coastguard Worker 
1226*d83cc019SAndroid Build Coastguard Worker 			igt_assert(settings->piglit_style_dmesg);
1227*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(settings->dmesg_warn_level, 3);
1228*d83cc019SAndroid Build Coastguard Worker 
1229*d83cc019SAndroid Build Coastguard Worker 			fclose(f);
1230*d83cc019SAndroid Build Coastguard Worker 		}
1231*d83cc019SAndroid Build Coastguard Worker 
1232*d83cc019SAndroid Build Coastguard Worker 		igt_subtest("metadata-read-old-style-infer-dmesg-warn-default") {
1233*d83cc019SAndroid Build Coastguard Worker 			char metadata[] = "piglit_style_dmesg : 0\n";
1234*d83cc019SAndroid Build Coastguard Worker 			FILE *f = fmemopen(metadata, strlen(metadata), "r");
1235*d83cc019SAndroid Build Coastguard Worker 			igt_assert(f);
1236*d83cc019SAndroid Build Coastguard Worker 
1237*d83cc019SAndroid Build Coastguard Worker 			igt_assert(read_settings_from_file(settings, f));
1238*d83cc019SAndroid Build Coastguard Worker 
1239*d83cc019SAndroid Build Coastguard Worker 			igt_assert(!settings->piglit_style_dmesg);
1240*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(settings->dmesg_warn_level, 4);
1241*d83cc019SAndroid Build Coastguard Worker 
1242*d83cc019SAndroid Build Coastguard Worker 			fclose(f);
1243*d83cc019SAndroid Build Coastguard Worker 		}
1244*d83cc019SAndroid Build Coastguard Worker 
1245*d83cc019SAndroid Build Coastguard Worker 		igt_subtest("metadata-read-overrides-dmesg-warn-default") {
1246*d83cc019SAndroid Build Coastguard Worker 			char metadata[] = "piglit_style_dmesg : 0\ndmesg_warn_level : 3";
1247*d83cc019SAndroid Build Coastguard Worker 			FILE *f = fmemopen(metadata, strlen(metadata), "r");
1248*d83cc019SAndroid Build Coastguard Worker 			igt_assert(f);
1249*d83cc019SAndroid Build Coastguard Worker 
1250*d83cc019SAndroid Build Coastguard Worker 			igt_assert(read_settings_from_file(settings, f));
1251*d83cc019SAndroid Build Coastguard Worker 
1252*d83cc019SAndroid Build Coastguard Worker 			igt_assert(!settings->piglit_style_dmesg);
1253*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(settings->dmesg_warn_level, 3);
1254*d83cc019SAndroid Build Coastguard Worker 
1255*d83cc019SAndroid Build Coastguard Worker 			fclose(f);
1256*d83cc019SAndroid Build Coastguard Worker 		}
1257*d83cc019SAndroid Build Coastguard Worker 	}
1258*d83cc019SAndroid Build Coastguard Worker 
1259*d83cc019SAndroid Build Coastguard Worker 	igt_subtest_group {
1260*d83cc019SAndroid Build Coastguard Worker 		struct job_list *list = malloc(sizeof(*list));
1261*d83cc019SAndroid Build Coastguard Worker 		volatile int dirfd = -1, subdirfd = -1, fd = -1;
1262*d83cc019SAndroid Build Coastguard Worker 		int multiple;
1263*d83cc019SAndroid Build Coastguard Worker 
1264*d83cc019SAndroid Build Coastguard Worker 		igt_fixture {
1265*d83cc019SAndroid Build Coastguard Worker 			init_job_list(list);
1266*d83cc019SAndroid Build Coastguard Worker 		}
1267*d83cc019SAndroid Build Coastguard Worker 
1268*d83cc019SAndroid Build Coastguard Worker 		for (multiple = 0; multiple < 2; multiple++) {
1269*d83cc019SAndroid Build Coastguard Worker 			char dirname[] = "tmpdirXXXXXX";
1270*d83cc019SAndroid Build Coastguard Worker 
1271*d83cc019SAndroid Build Coastguard Worker 			igt_fixture {
1272*d83cc019SAndroid Build Coastguard Worker 				igt_require(mkdtemp(dirname) != NULL);
1273*d83cc019SAndroid Build Coastguard Worker 				rmdir(dirname);
1274*d83cc019SAndroid Build Coastguard Worker 			}
1275*d83cc019SAndroid Build Coastguard Worker 
1276*d83cc019SAndroid Build Coastguard Worker 			igt_subtest_f("execute-skipper-journal-%s", multiple ? "multiple" : "normal") {
1277*d83cc019SAndroid Build Coastguard Worker 				struct execute_state state;
1278*d83cc019SAndroid Build Coastguard Worker 				const char *argv[] = { "runner",
1279*d83cc019SAndroid Build Coastguard Worker 						       multiple ? "--multiple-mode" : "--sync",
1280*d83cc019SAndroid Build Coastguard Worker 						       "-t", "skippers",
1281*d83cc019SAndroid Build Coastguard Worker 						       testdatadir,
1282*d83cc019SAndroid Build Coastguard Worker 						       dirname,
1283*d83cc019SAndroid Build Coastguard Worker 				};
1284*d83cc019SAndroid Build Coastguard Worker 				char *dump;
1285*d83cc019SAndroid Build Coastguard Worker 				const char *expected_0 = multiple ?
1286*d83cc019SAndroid Build Coastguard Worker 					"skip-one\nskip-two\nexit:77 (" :
1287*d83cc019SAndroid Build Coastguard Worker 					"skip-one\nexit:77 (";
1288*d83cc019SAndroid Build Coastguard Worker 				const char *expected_1 = "skip-two\nexit:77 (";
1289*d83cc019SAndroid Build Coastguard Worker 
1290*d83cc019SAndroid Build Coastguard Worker 				igt_assert(parse_options(ARRAY_SIZE(argv), (char**)argv, settings));
1291*d83cc019SAndroid Build Coastguard Worker 				igt_assert(create_job_list(list, settings));
1292*d83cc019SAndroid Build Coastguard Worker 				igt_assert(initialize_execute_state(&state, settings, list));
1293*d83cc019SAndroid Build Coastguard Worker 
1294*d83cc019SAndroid Build Coastguard Worker 				igt_assert(execute(&state, settings, list));
1295*d83cc019SAndroid Build Coastguard Worker 				igt_assert_f((dirfd = open(dirname, O_DIRECTORY | O_RDONLY)) >= 0,
1296*d83cc019SAndroid Build Coastguard Worker 					     "Execute didn't create the results directory\n");
1297*d83cc019SAndroid Build Coastguard Worker 
1298*d83cc019SAndroid Build Coastguard Worker 				igt_assert_f((fd = openat(dirfd, "uname.txt", O_RDONLY)) >= 0,
1299*d83cc019SAndroid Build Coastguard Worker 					     "Execute didn't create uname.txt\n");
1300*d83cc019SAndroid Build Coastguard Worker 				close(fd);
1301*d83cc019SAndroid Build Coastguard Worker 				fd = -1;
1302*d83cc019SAndroid Build Coastguard Worker 
1303*d83cc019SAndroid Build Coastguard Worker 				igt_assert_f((subdirfd = openat(dirfd, "0", O_DIRECTORY | O_RDONLY)) >= 0,
1304*d83cc019SAndroid Build Coastguard Worker 					     "Execute didn't create result directory '0'\n");
1305*d83cc019SAndroid Build Coastguard Worker 				dump = dump_file(subdirfd, "journal.txt");
1306*d83cc019SAndroid Build Coastguard Worker 				igt_assert_f(dump != NULL,
1307*d83cc019SAndroid Build Coastguard Worker 					     "Execute didn't create the journal\n");
1308*d83cc019SAndroid Build Coastguard Worker 				/* Trim out the runtime */
1309*d83cc019SAndroid Build Coastguard Worker 				dump[strlen(expected_0)] = '\0';
1310*d83cc019SAndroid Build Coastguard Worker 				igt_assert_eqstr(dump, expected_0);
1311*d83cc019SAndroid Build Coastguard Worker 				free(dump);
1312*d83cc019SAndroid Build Coastguard Worker 				close(subdirfd);
1313*d83cc019SAndroid Build Coastguard Worker 				subdirfd = -1;
1314*d83cc019SAndroid Build Coastguard Worker 
1315*d83cc019SAndroid Build Coastguard Worker 				if (!multiple) {
1316*d83cc019SAndroid Build Coastguard Worker 					igt_assert_f((subdirfd = openat(dirfd, "1", O_DIRECTORY | O_RDONLY)) >= 0,
1317*d83cc019SAndroid Build Coastguard Worker 						     "Execute didn't create result directory '1'\n");
1318*d83cc019SAndroid Build Coastguard Worker 					dump = dump_file(subdirfd, "journal.txt");
1319*d83cc019SAndroid Build Coastguard Worker 					igt_assert_f(dump != NULL,
1320*d83cc019SAndroid Build Coastguard Worker 						     "Execute didn't create the journal\n");
1321*d83cc019SAndroid Build Coastguard Worker 					dump[strlen(expected_1)] = '\0';
1322*d83cc019SAndroid Build Coastguard Worker 					igt_assert_eqstr(dump, expected_1);
1323*d83cc019SAndroid Build Coastguard Worker 					free(dump);
1324*d83cc019SAndroid Build Coastguard Worker 					close(subdirfd);
1325*d83cc019SAndroid Build Coastguard Worker 					subdirfd = -1;
1326*d83cc019SAndroid Build Coastguard Worker 				}
1327*d83cc019SAndroid Build Coastguard Worker 			}
1328*d83cc019SAndroid Build Coastguard Worker 
1329*d83cc019SAndroid Build Coastguard Worker 			igt_fixture {
1330*d83cc019SAndroid Build Coastguard Worker 				close(fd);
1331*d83cc019SAndroid Build Coastguard Worker 				close(subdirfd);
1332*d83cc019SAndroid Build Coastguard Worker 				close(dirfd);
1333*d83cc019SAndroid Build Coastguard Worker 				clear_directory(dirname);
1334*d83cc019SAndroid Build Coastguard Worker 				free_job_list(list);
1335*d83cc019SAndroid Build Coastguard Worker 			}
1336*d83cc019SAndroid Build Coastguard Worker 		}
1337*d83cc019SAndroid Build Coastguard Worker 
1338*d83cc019SAndroid Build Coastguard Worker 		igt_fixture
1339*d83cc019SAndroid Build Coastguard Worker 			free(list);
1340*d83cc019SAndroid Build Coastguard Worker 	}
1341*d83cc019SAndroid Build Coastguard Worker 
1342*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("file-descriptor-leakage") {
1343*d83cc019SAndroid Build Coastguard Worker 		int i;
1344*d83cc019SAndroid Build Coastguard Worker 
1345*d83cc019SAndroid Build Coastguard Worker 		/*
1346*d83cc019SAndroid Build Coastguard Worker 		 * This is a build-time test, and it's expected that
1347*d83cc019SAndroid Build Coastguard Worker 		 * all subtests are normally run. Keep this one at the
1348*d83cc019SAndroid Build Coastguard Worker 		 * end.
1349*d83cc019SAndroid Build Coastguard Worker 		 *
1350*d83cc019SAndroid Build Coastguard Worker 		 * Try to close some number of fds after stderr and
1351*d83cc019SAndroid Build Coastguard Worker 		 * expect EBADF for each one.
1352*d83cc019SAndroid Build Coastguard Worker 		 */
1353*d83cc019SAndroid Build Coastguard Worker 		for (i = 3; i < 400; i++) {
1354*d83cc019SAndroid Build Coastguard Worker 			errno = 0;
1355*d83cc019SAndroid Build Coastguard Worker 			igt_assert_neq(close(i), 0);
1356*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(errno, EBADF);
1357*d83cc019SAndroid Build Coastguard Worker 		}
1358*d83cc019SAndroid Build Coastguard Worker 	}
1359*d83cc019SAndroid Build Coastguard Worker 
1360*d83cc019SAndroid Build Coastguard Worker 	igt_fixture {
1361*d83cc019SAndroid Build Coastguard Worker 		free_settings(settings);
1362*d83cc019SAndroid Build Coastguard Worker 		free(settings);
1363*d83cc019SAndroid Build Coastguard Worker 	}
1364*d83cc019SAndroid Build Coastguard Worker }
1365