1*86b64dcbSAndroid Build Coastguard Worker /*
2*86b64dcbSAndroid Build Coastguard Worker * libusb test library helper functions
3*86b64dcbSAndroid Build Coastguard Worker * Copyright © 2012 Toby Gray <[email protected]>
4*86b64dcbSAndroid Build Coastguard Worker *
5*86b64dcbSAndroid Build Coastguard Worker * This library is free software; you can redistribute it and/or
6*86b64dcbSAndroid Build Coastguard Worker * modify it under the terms of the GNU Lesser General Public
7*86b64dcbSAndroid Build Coastguard Worker * License as published by the Free Software Foundation; either
8*86b64dcbSAndroid Build Coastguard Worker * version 2.1 of the License, or (at your option) any later version.
9*86b64dcbSAndroid Build Coastguard Worker *
10*86b64dcbSAndroid Build Coastguard Worker * This library is distributed in the hope that it will be useful,
11*86b64dcbSAndroid Build Coastguard Worker * but WITHOUT ANY WARRANTY; without even the implied warranty of
12*86b64dcbSAndroid Build Coastguard Worker * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13*86b64dcbSAndroid Build Coastguard Worker * Lesser General Public License for more details.
14*86b64dcbSAndroid Build Coastguard Worker *
15*86b64dcbSAndroid Build Coastguard Worker * You should have received a copy of the GNU Lesser General Public
16*86b64dcbSAndroid Build Coastguard Worker * License along with this library; if not, write to the Free Software
17*86b64dcbSAndroid Build Coastguard Worker * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18*86b64dcbSAndroid Build Coastguard Worker */
19*86b64dcbSAndroid Build Coastguard Worker
20*86b64dcbSAndroid Build Coastguard Worker #include <config.h>
21*86b64dcbSAndroid Build Coastguard Worker
22*86b64dcbSAndroid Build Coastguard Worker #include <errno.h>
23*86b64dcbSAndroid Build Coastguard Worker #include <stdarg.h>
24*86b64dcbSAndroid Build Coastguard Worker #include <stdbool.h>
25*86b64dcbSAndroid Build Coastguard Worker #include <stdio.h>
26*86b64dcbSAndroid Build Coastguard Worker #include <string.h>
27*86b64dcbSAndroid Build Coastguard Worker
28*86b64dcbSAndroid Build Coastguard Worker #include "libusb_testlib.h"
29*86b64dcbSAndroid Build Coastguard Worker
30*86b64dcbSAndroid Build Coastguard Worker #if defined(PLATFORM_POSIX)
31*86b64dcbSAndroid Build Coastguard Worker #define NULL_PATH "/dev/null"
32*86b64dcbSAndroid Build Coastguard Worker #elif defined(PLATFORM_WINDOWS)
33*86b64dcbSAndroid Build Coastguard Worker #define NULL_PATH "nul"
34*86b64dcbSAndroid Build Coastguard Worker #endif
35*86b64dcbSAndroid Build Coastguard Worker
36*86b64dcbSAndroid Build Coastguard Worker /**
37*86b64dcbSAndroid Build Coastguard Worker * Converts a test result code into a human readable string.
38*86b64dcbSAndroid Build Coastguard Worker */
test_result_to_str(libusb_testlib_result result)39*86b64dcbSAndroid Build Coastguard Worker static const char *test_result_to_str(libusb_testlib_result result)
40*86b64dcbSAndroid Build Coastguard Worker {
41*86b64dcbSAndroid Build Coastguard Worker switch (result) {
42*86b64dcbSAndroid Build Coastguard Worker case TEST_STATUS_SUCCESS:
43*86b64dcbSAndroid Build Coastguard Worker return "Success";
44*86b64dcbSAndroid Build Coastguard Worker case TEST_STATUS_FAILURE:
45*86b64dcbSAndroid Build Coastguard Worker return "Failure";
46*86b64dcbSAndroid Build Coastguard Worker case TEST_STATUS_ERROR:
47*86b64dcbSAndroid Build Coastguard Worker return "Error";
48*86b64dcbSAndroid Build Coastguard Worker case TEST_STATUS_SKIP:
49*86b64dcbSAndroid Build Coastguard Worker return "Skip";
50*86b64dcbSAndroid Build Coastguard Worker default:
51*86b64dcbSAndroid Build Coastguard Worker return "Unknown";
52*86b64dcbSAndroid Build Coastguard Worker }
53*86b64dcbSAndroid Build Coastguard Worker }
54*86b64dcbSAndroid Build Coastguard Worker
print_usage(const char * progname)55*86b64dcbSAndroid Build Coastguard Worker static void print_usage(const char *progname)
56*86b64dcbSAndroid Build Coastguard Worker {
57*86b64dcbSAndroid Build Coastguard Worker printf("Usage: %s [-l] [-v] [<test_name> ...]\n", progname);
58*86b64dcbSAndroid Build Coastguard Worker printf(" -l List available tests\n");
59*86b64dcbSAndroid Build Coastguard Worker printf(" -v Don't redirect STDERR before running tests\n");
60*86b64dcbSAndroid Build Coastguard Worker printf(" -h Display this help and exit\n");
61*86b64dcbSAndroid Build Coastguard Worker }
62*86b64dcbSAndroid Build Coastguard Worker
libusb_testlib_logf(const char * fmt,...)63*86b64dcbSAndroid Build Coastguard Worker void libusb_testlib_logf(const char *fmt, ...)
64*86b64dcbSAndroid Build Coastguard Worker {
65*86b64dcbSAndroid Build Coastguard Worker va_list va;
66*86b64dcbSAndroid Build Coastguard Worker
67*86b64dcbSAndroid Build Coastguard Worker va_start(va, fmt);
68*86b64dcbSAndroid Build Coastguard Worker vfprintf(stdout, fmt, va);
69*86b64dcbSAndroid Build Coastguard Worker va_end(va);
70*86b64dcbSAndroid Build Coastguard Worker fputc('\n', stdout);
71*86b64dcbSAndroid Build Coastguard Worker fflush(stdout);
72*86b64dcbSAndroid Build Coastguard Worker }
73*86b64dcbSAndroid Build Coastguard Worker
libusb_testlib_run_tests(int argc,char * argv[],const libusb_testlib_test * tests)74*86b64dcbSAndroid Build Coastguard Worker int libusb_testlib_run_tests(int argc, char *argv[],
75*86b64dcbSAndroid Build Coastguard Worker const libusb_testlib_test *tests)
76*86b64dcbSAndroid Build Coastguard Worker {
77*86b64dcbSAndroid Build Coastguard Worker int run_count = 0;
78*86b64dcbSAndroid Build Coastguard Worker int idx = 0;
79*86b64dcbSAndroid Build Coastguard Worker int pass_count = 0;
80*86b64dcbSAndroid Build Coastguard Worker int fail_count = 0;
81*86b64dcbSAndroid Build Coastguard Worker int error_count = 0;
82*86b64dcbSAndroid Build Coastguard Worker int skip_count = 0;
83*86b64dcbSAndroid Build Coastguard Worker
84*86b64dcbSAndroid Build Coastguard Worker /* Setup default mode of operation */
85*86b64dcbSAndroid Build Coastguard Worker char **test_names = NULL;
86*86b64dcbSAndroid Build Coastguard Worker int test_count = 0;
87*86b64dcbSAndroid Build Coastguard Worker bool list_tests = false;
88*86b64dcbSAndroid Build Coastguard Worker bool verbose = false;
89*86b64dcbSAndroid Build Coastguard Worker
90*86b64dcbSAndroid Build Coastguard Worker /* Parse command line options */
91*86b64dcbSAndroid Build Coastguard Worker if (argc >= 2) {
92*86b64dcbSAndroid Build Coastguard Worker for (int j = 1; j < argc; j++) {
93*86b64dcbSAndroid Build Coastguard Worker const char *argstr = argv[j];
94*86b64dcbSAndroid Build Coastguard Worker size_t arglen = strlen(argstr);
95*86b64dcbSAndroid Build Coastguard Worker
96*86b64dcbSAndroid Build Coastguard Worker if (argstr[0] == '-' || argstr[0] == '/') {
97*86b64dcbSAndroid Build Coastguard Worker if (arglen == 2) {
98*86b64dcbSAndroid Build Coastguard Worker switch (argstr[1]) {
99*86b64dcbSAndroid Build Coastguard Worker case 'l':
100*86b64dcbSAndroid Build Coastguard Worker list_tests = true;
101*86b64dcbSAndroid Build Coastguard Worker continue;
102*86b64dcbSAndroid Build Coastguard Worker case 'v':
103*86b64dcbSAndroid Build Coastguard Worker verbose = true;
104*86b64dcbSAndroid Build Coastguard Worker continue;
105*86b64dcbSAndroid Build Coastguard Worker case 'h':
106*86b64dcbSAndroid Build Coastguard Worker print_usage(argv[0]);
107*86b64dcbSAndroid Build Coastguard Worker return 0;
108*86b64dcbSAndroid Build Coastguard Worker }
109*86b64dcbSAndroid Build Coastguard Worker }
110*86b64dcbSAndroid Build Coastguard Worker
111*86b64dcbSAndroid Build Coastguard Worker fprintf(stderr, "Unknown option: '%s'\n", argstr);
112*86b64dcbSAndroid Build Coastguard Worker print_usage(argv[0]);
113*86b64dcbSAndroid Build Coastguard Worker return 1;
114*86b64dcbSAndroid Build Coastguard Worker } else {
115*86b64dcbSAndroid Build Coastguard Worker /* End of command line options, remaining must be list of tests to run */
116*86b64dcbSAndroid Build Coastguard Worker test_names = argv + j;
117*86b64dcbSAndroid Build Coastguard Worker test_count = argc - j;
118*86b64dcbSAndroid Build Coastguard Worker break;
119*86b64dcbSAndroid Build Coastguard Worker }
120*86b64dcbSAndroid Build Coastguard Worker }
121*86b64dcbSAndroid Build Coastguard Worker }
122*86b64dcbSAndroid Build Coastguard Worker
123*86b64dcbSAndroid Build Coastguard Worker /* Validate command line options */
124*86b64dcbSAndroid Build Coastguard Worker if (test_names && list_tests) {
125*86b64dcbSAndroid Build Coastguard Worker fprintf(stderr, "List of tests requested but test list provided\n");
126*86b64dcbSAndroid Build Coastguard Worker print_usage(argv[0]);
127*86b64dcbSAndroid Build Coastguard Worker return 1;
128*86b64dcbSAndroid Build Coastguard Worker }
129*86b64dcbSAndroid Build Coastguard Worker
130*86b64dcbSAndroid Build Coastguard Worker /* Setup test log output */
131*86b64dcbSAndroid Build Coastguard Worker if (!verbose) {
132*86b64dcbSAndroid Build Coastguard Worker if (!freopen(NULL_PATH, "w", stderr)) {
133*86b64dcbSAndroid Build Coastguard Worker printf("Failed to open null handle: %d\n", errno);
134*86b64dcbSAndroid Build Coastguard Worker return 1;
135*86b64dcbSAndroid Build Coastguard Worker }
136*86b64dcbSAndroid Build Coastguard Worker }
137*86b64dcbSAndroid Build Coastguard Worker
138*86b64dcbSAndroid Build Coastguard Worker /* Act on any options not related to running tests */
139*86b64dcbSAndroid Build Coastguard Worker if (list_tests) {
140*86b64dcbSAndroid Build Coastguard Worker while (tests[idx].function)
141*86b64dcbSAndroid Build Coastguard Worker libusb_testlib_logf("%s", tests[idx++].name);
142*86b64dcbSAndroid Build Coastguard Worker return 0;
143*86b64dcbSAndroid Build Coastguard Worker }
144*86b64dcbSAndroid Build Coastguard Worker
145*86b64dcbSAndroid Build Coastguard Worker /* Run any requested tests */
146*86b64dcbSAndroid Build Coastguard Worker while (tests[idx].function) {
147*86b64dcbSAndroid Build Coastguard Worker const libusb_testlib_test *test = &tests[idx++];
148*86b64dcbSAndroid Build Coastguard Worker libusb_testlib_result test_result;
149*86b64dcbSAndroid Build Coastguard Worker
150*86b64dcbSAndroid Build Coastguard Worker if (test_count > 0) {
151*86b64dcbSAndroid Build Coastguard Worker /* Filtering tests to run, check if this is one of them */
152*86b64dcbSAndroid Build Coastguard Worker int i;
153*86b64dcbSAndroid Build Coastguard Worker
154*86b64dcbSAndroid Build Coastguard Worker for (i = 0; i < test_count; i++) {
155*86b64dcbSAndroid Build Coastguard Worker if (!strcmp(test_names[i], test->name))
156*86b64dcbSAndroid Build Coastguard Worker /* Matches a requested test name */
157*86b64dcbSAndroid Build Coastguard Worker break;
158*86b64dcbSAndroid Build Coastguard Worker }
159*86b64dcbSAndroid Build Coastguard Worker if (i == test_count) {
160*86b64dcbSAndroid Build Coastguard Worker /* Failed to find a test match, so do the next loop iteration */
161*86b64dcbSAndroid Build Coastguard Worker continue;
162*86b64dcbSAndroid Build Coastguard Worker }
163*86b64dcbSAndroid Build Coastguard Worker }
164*86b64dcbSAndroid Build Coastguard Worker libusb_testlib_logf("Starting test run: %s...", test->name);
165*86b64dcbSAndroid Build Coastguard Worker test_result = test->function();
166*86b64dcbSAndroid Build Coastguard Worker libusb_testlib_logf("%s (%d)", test_result_to_str(test_result), test_result);
167*86b64dcbSAndroid Build Coastguard Worker switch (test_result) {
168*86b64dcbSAndroid Build Coastguard Worker case TEST_STATUS_SUCCESS: pass_count++; break;
169*86b64dcbSAndroid Build Coastguard Worker case TEST_STATUS_FAILURE: fail_count++; break;
170*86b64dcbSAndroid Build Coastguard Worker case TEST_STATUS_ERROR: error_count++; break;
171*86b64dcbSAndroid Build Coastguard Worker case TEST_STATUS_SKIP: skip_count++; break;
172*86b64dcbSAndroid Build Coastguard Worker }
173*86b64dcbSAndroid Build Coastguard Worker run_count++;
174*86b64dcbSAndroid Build Coastguard Worker }
175*86b64dcbSAndroid Build Coastguard Worker
176*86b64dcbSAndroid Build Coastguard Worker libusb_testlib_logf("---");
177*86b64dcbSAndroid Build Coastguard Worker libusb_testlib_logf("Ran %d tests", run_count);
178*86b64dcbSAndroid Build Coastguard Worker libusb_testlib_logf("Passed %d tests", pass_count);
179*86b64dcbSAndroid Build Coastguard Worker libusb_testlib_logf("Failed %d tests", fail_count);
180*86b64dcbSAndroid Build Coastguard Worker libusb_testlib_logf("Error in %d tests", error_count);
181*86b64dcbSAndroid Build Coastguard Worker libusb_testlib_logf("Skipped %d tests", skip_count);
182*86b64dcbSAndroid Build Coastguard Worker
183*86b64dcbSAndroid Build Coastguard Worker return fail_count + error_count;
184*86b64dcbSAndroid Build Coastguard Worker }
185