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