00001 #include <u/libu.h>
00002
00003 enum { MAX_MODS = 1024 };
00004
00005 test_runner_t _mods[MAX_MODS] = { NULL };
00006 test_runner_t *_top = _mods;
00007
00008 char *_mods_nm[MAX_MODS] = { NULL };
00009 char **_top_nm = _mods_nm;
00010
00011 int _test_cnt = 0;
00012 int _test_fail = 0;
00013 int _test_ok = 0;
00014 int _verbose = 0;
00015
00016 static char **arg;
00017 static int narg;
00018
00019 static void usage(const char *prog)
00020 {
00021 static const char *us =
00022 "usage: %s OPTIONS [ MODULE ... ]\n"
00023 "\n"
00024 " -h display this help \n"
00025 " -v be verbose \n"
00026 "\n"
00027 " Available modules:\n";
00028 char **p;
00029
00030 fprintf(stderr, us, prog);
00031
00032 for(p = _mods_nm; p != _top_nm; ++p)
00033 fprintf(stderr, " %s\n", *p);
00034 fprintf(stderr, "\n");
00035
00036 exit(1);
00037 }
00038
00039 static int parse_opt(int argc, char **argv)
00040 {
00041 int ret;
00042
00043 while((ret = getopt(argc, argv, "vh")) != -1)
00044 {
00045 switch(ret)
00046 {
00047 case 'v':
00048 _verbose = 1;
00049 break;
00050 default:
00051 case 'h':
00052 usage(argv[0]);
00053 }
00054 }
00055
00056 narg = argc - optind;
00057 arg = argv + optind;
00058
00059 return 0;
00060 }
00061
00062 static int run_test_module(const char *module)
00063 {
00064 char **m;
00065 int i;
00066
00067 for(i = 0, m = _mods_nm; m < _top_nm; ++m, ++i)
00068 {
00069 if(!strcasecmp(*m, module))
00070 {
00071 _mods[i]();
00072 return 0;
00073 }
00074 }
00075
00076 con_err("unknown module %s", module);
00077
00078 return 0;
00079 err:
00080 return ~0;
00081 }
00082
00083 int u_test_run(int argc, char **argv)
00084 {
00085 test_runner_t *p;
00086 int i;
00087
00088 dbg_err_if(parse_opt(argc, argv));
00089
00090 if(narg)
00091 {
00092
00093 for(i = 0; i < narg; ++i)
00094 dbg_err_if(run_test_module(arg[i]));
00095 } else {
00096
00097 for(i = 0, p = _mods; p < _top; ++p, ++i)
00098 (*p)();
00099 }
00100
00101 printf("%d test run, %d failed\n", _test_cnt, _test_fail);
00102
00103 return 0;
00104 err:
00105 return ~0;
00106 }
00107
00108