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