1 /* 2 * Copyright (c) 2011 Alex Hornung <alex@alexhornung.com>. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in 13 * the documentation and/or other materials provided with the 14 * distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 19 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 20 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 22 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 24 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 25 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 26 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30 #include <sys/resource.h> 31 #include <sys/time.h> 32 #include <sys/types.h> 33 #include <sys/wait.h> 34 35 #include <errno.h> 36 #include <limits.h> 37 #include <signal.h> 38 #include <stdio.h> 39 #include <stdlib.h> 40 #include <stdint.h> 41 #include <string.h> 42 #include <unistd.h> 43 #include <pwd.h> 44 45 #include <err.h> 46 47 #include <libprop/proplib.h> 48 49 #include "parser.h" 50 #include "testcase.h" 51 #include "runlist.h" 52 #include <dfregress.h> 53 54 55 static void 56 usage(void) 57 { 58 fprintf(stderr, "Usage: dfregress [options] <input runlist>\n" 59 "Valid options are:\n" 60 " -o <output results plist file>\n" 61 " -t <testcase directory>\n" 62 " -p <pre/post command directory>\n"); 63 exit(1); 64 } 65 66 int 67 main(int argc, char *argv[]) 68 { 69 char runlist_file[PATH_MAX]; 70 char *p, *s; 71 int oflag = 0; 72 int tflag = 0; 73 int ch; 74 75 while ((ch = getopt(argc, argv, "h?o:t:p:")) != -1) { 76 switch (ch) { 77 case 'o': 78 if ((p = realpath(optarg, output_file)) == NULL) 79 err(1, "realpath(%s)", optarg); 80 oflag = 1; 81 break; 82 83 case 't': 84 if ((p = realpath(optarg, testcase_dir)) == NULL) 85 err(1, "realpath(%s)", optarg); 86 tflag = 1; 87 break; 88 89 case 'p': 90 if ((p = realpath(optarg, prepost_dir)) == NULL) 91 err(1, "realpath(%s)", optarg); 92 break; 93 94 case '?': 95 case 'h': 96 usage(); 97 /* NOTREACHED */ 98 break; 99 } 100 } 101 102 argc -= optind; 103 argv += optind; 104 105 if (argc != 1) 106 usage(); 107 /* NOTREACHED */ 108 109 if ((p = realpath(argv[0], runlist_file)) == NULL) 110 err(1, "realpath(%s)", argv[0]); 111 112 if (!tflag) { 113 /* 114 * No explicit testcase directory: 115 * Use default testcase directory - the directory where the 116 * runlist is. 117 */ 118 strcpy(testcase_dir, runlist_file); 119 p = strrchr(testcase_dir, '/'); 120 if (p == NULL) { 121 fprintf(stderr, "Unknown error while determining " 122 "default testcase directory. testcase_dir = %s\n", 123 testcase_dir); 124 exit(1); 125 /* NOTREACHED */ 126 } 127 128 *p = '\0'; 129 } 130 131 if (!oflag) { 132 /* 133 * No explicit output file: 134 * By default we'll take the basename of the runlist file 135 * and append .plist to it in the cwd; i.e.: 136 * /foo/bar/baz.run -> ./baz.plist 137 */ 138 p = strrchr(runlist_file, '/'); 139 if (p == NULL) { 140 fprintf(stderr, "Unkown error while determining " 141 "default output file. runlist_file = %s\n", 142 runlist_file); 143 exit(1); 144 /* NOTREACHED */ 145 } 146 147 ++p; 148 149 s = getcwd(output_file, PATH_MAX); 150 if (s == NULL) 151 err(1, "getcwd()"); 152 /* NOTREACHED */ 153 154 strcat(output_file, "/"); 155 strcat(output_file, p); 156 157 if ((p = strrchr(output_file, '.')) != NULL) 158 *p = '\0'; 159 160 161 strcat(output_file, ".plist"); 162 } 163 164 printf("Output plist results:\t%s\n", output_file); 165 printf("Runlist:\t\t%s\n", runlist_file); 166 printf("Testcase directory:\t%s\n", testcase_dir); 167 printf("\n"); 168 169 prop_array_t runlist = runlist_load_from_text(runlist_file); 170 runlist_iterate(runlist, runlist_run_test, runlist); 171 172 return 0; 173 } 174