t_api.c revision 9d5ed744c46ef241b9d3ba134bf3155e0b62ac9e
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC")
d878b8d87c3f46a25ccae9f5cfe6e39af67562e0Evan Hunt * Copyright (C) 1999-2003 Internet Software Consortium.
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence * Permission to use, copy, modify, and/or distribute this software for any
7de2c6e6d51f38daeb2d346f3f21dc01ccece6daEvan Hunt * purpose with or without fee is hereby granted, provided that the above
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence * copyright notice and this permission notice appear in all copies.
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
281bfa2a98f1d1721538086e1b550185559f1d8bMark Andrews * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
281bfa2a98f1d1721538086e1b550185559f1d8bMark Andrews * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
281bfa2a98f1d1721538086e1b550185559f1d8bMark Andrews * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
281bfa2a98f1d1721538086e1b550185559f1d8bMark Andrews * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
281bfa2a98f1d1721538086e1b550185559f1d8bMark Andrews * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
281bfa2a98f1d1721538086e1b550185559f1d8bMark Andrews * PERFORMANCE OF THIS SOFTWARE.
279c6ec074be17dce62dd1b2c6ed7c2cc56a7b78David Lawrence/* $Id: t_api.c,v 1.62 2008/01/14 23:46:56 tbox Exp $ */
7005cfed8cd3296d356883dcb414979f22e06b13Brian Wellingtonstatic const char *Usage =
7005cfed8cd3296d356883dcb414979f22e06b13Brian Wellington "\t-a : run all tests\n"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein "\t-b <dir> : chdir to dir before running tests"
6f7660093e70d3a7c80738b681ac0f5c1b661c00Mark Andrews "\t-c <config_file> : use specified config file\n"
6f7660093e70d3a7c80738b681ac0f5c1b661c00Mark Andrews "\t-d <debug_level> : set debug level to debug_level\n"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein "\t-h : print test info\n"
d8dcd6ad4617cc8d7df979bd62101fa9c4bac1bcBob Halley "\t-u : print usage info\n"
d8dcd6ad4617cc8d7df979bd62101fa9c4bac1bcBob Halley "\t-n <test_name> : run specified test name\n"
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein "\t-t <test_number> : run specified test number\n"
baf7c7e589f313f10b29d9119811fc4d36c2e4bcMark Andrews "\t-x : don't execute tests in a subproc\n"
baf7c7e589f313f10b29d9119811fc4d36c2e4bcMark Andrews "\t-q <timeout> : use 'timeout' as the timeout value\n";
a30e7fc23415fd238d067a8a871607bca36068baMichael Graff * -a --> run all tests
a30e7fc23415fd238d067a8a871607bca36068baMichael Graff * -b dir --> chdir to dir before running tests
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * -c config --> use config file 'config'
6286983c506433d642b23e64845c50be30f2a7f6Mark Andrews * -d --> turn on api debugging
6286983c506433d642b23e64845c50be30f2a7f6Mark Andrews * -h --> print out available test names
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * -u --> print usage info
8313838954d67250d0ed7edf67fba5da0790d1a7Michael Graff * -n name --> run test named name
8313838954d67250d0ed7edf67fba5da0790d1a7Michael Graff * -tn --> run test n
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austein * -x --> don't execute testcases in a subproc
8313838954d67250d0ed7edf67fba5da0790d1a7Michael Graff * -q timeout --> use 'timeout' as the timeout value
703e1c0bb66f3cd3d300358ca0c1fdf3cb5fb1c5Brian Wellington#define T_MAXTESTS 256 /*% must be 0 mod 8 */
60e5e10f8d2e2b0c41e8abad38cacd867caa6ab2Rob Austeinstatic const char * T_config;
bff8ac12a8c099257bdbf7d0c55d2d5b77591926Mark Andrews * -a option is now default.
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews * Parse args.
cffc2e06f906dd048af4cc27d487deb157f5a082Mark Andrews while ((c = isc_commandline_parse(argc, argv, ":at:c:d:n:huxq:b:"))
cffc2e06f906dd048af4cc27d487deb157f5a082Mark Andrews if (c == 'a') {
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews * Flag all tests to be run.
43fe2897fc80bbec2115310ca79d432a252f3ea4Mark Andrews else if (c == 'b') {
70e854766f5304f43e94212dc38ebaefe214148cMark Andrews else if (c == 't') {
d878b8d87c3f46a25ccae9f5cfe6e39af67562e0Evan Hunt * Turn off effect of -a default
d878b8d87c3f46a25ccae9f5cfe6e39af67562e0Evan Hunt * and allow multiple -t and -n
43501e6570e9081d459fb5c1a81b73c2c53c5df0Mark Andrews * Flag test tnum to be run.
8b56b8956fc1e6c70efacb4f71db28d0d1f0c577Mark Andrews else if (c == 'c') {
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews else if (c == 'd') {
87708bde16713bc02ff2598f4a82f98c699a2f2dMark Andrews else if (c == 'n') {
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews else if (c == 'h') {
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews else if (c == 'u') {
aa5b977943f9ee38241c804484cd84fafec6ff2bMark Andrews else if (c == 'x') {
9a97696b543b9957049a663b4f73245589c47921Mark Andrews else if (c == 'q') {
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews else if (c == ':') {
9a97696b543b9957049a663b4f73245589c47921Mark Andrews fprintf(stderr, "Option -%c requires an argument\n",
a5d43b72413db3edd6b36a58f9bdf2cf6ff692f2Bob Halley else if (c == '?') {
71bd858d8ed62672e7c23999dc7c02fd16a55089Evan Hunt * We don't want buffered output.
71bd858d8ed62672e7c23999dc7c02fd16a55089Evan Hunt * Setup signals.
3a7b1fb32a27df5326f7fea318f68703c0de7e2eMark Andrews * This is mostly here for NetBSD's pthread implementation, until
3a7b1fb32a27df5326f7fea318f68703c0de7e2eMark Andrews * people catch up to the latest unproven-pthread package.
0415ca35ada2cac6a86127eaca64f3a997aea121Evan Hunt * Output start stanza to journal.
9a97696b543b9957049a663b4f73245589c47921Mark Andrews snprintf(T_buf, sizeof(T_buf), "%s:", argv[0]);
d5518bf5bc1830f89f411288f39c5c9e6eb7511cMark Andrews * Setup the test environment using the config file.
c870001ae1bff0e38f622c4ed56872c7f1d2d336Mark Andrews * Now invoke all the test cases.
cae2cb086244dfb883739edbe79e34756079f70eMark Andrews } else if (T_pid > 0) {
b123b265e3a3d9b72a14230b6517e0f6fdb5c5b5Mark Andrews "the test case timed out\n");
9fffc937a9d0ba8f6c08f7502763f5d3107259c4Mark Andrews "the test case caused exception %d\n",
f54d0c9c6e65de367d4ef08f51d22a2fb4c56208Mark Andrews snprintf(T_buf, sizeof(T_buf), "%s:", argv[0]);
146484aced3e6c1b9cc88db5e75b8cbfd166f701Mark Andrewst_assert(const char *component, int anum, int class, const char *what, ...) {
5506903c9215faf42586307c2288942fd804c579Evan Hunt (void)printf("T:%s:%d:%s\n", component, anum, class == T_REQUIRED ?
2b50e0d877db0d668f363d50914232f82ad8c454Mark Andrews * Format text to a buffer.
f8727bd90366af835f551da1b5e1fdfcd2d3d01fBrian Wellington (void)vsnprintf(T_buf, sizeof(T_buf), what, args);
fd837244be31850a764863688bce11df9ce972f4Andreas Gustafsson (void) vsnprintf(T_buf, sizeof(T_buf), format, args);
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews const char *p;
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater p = "UNRESOLVED";
9a97696b543b9957049a663b4f73245589c47921Mark Andrews p = "UNSUPPORTED";
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 p = "UNTESTED";
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 p = "THREADONLY";
422009fe5b15e31e7f5d09212bd1480121a1464eEvan Hunt p = "UNKNOWN";
15bfd48fc5552ff1aae766021f42a250c001a098Michael Graff while (*p != NULL) {
577ca1471960830304d1d2b9bd543fa469af51c1Mark Andrews * Read in the config file at path, initializing T_env.
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater * note: no format checking for now ...
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater if ((**p == '#') || (strchr(*p, '=') == NULL)) {
a44bf3209afdb58360a82cf42e653dee5e0d4f26Automatic Updater * Skip comments and other junk.
6e9efadbea9febb0494e713e54dfea6f7ef70383Mark Andrews * Dump T_env to stdout.
int rval;
p = &T_env[0];
while (*p != NULL) {
rval = 0;
return(rval);
size_t n;
char *buf;
p = buf;
if ( n >= size ) {
size * sizeof(char));
p = buf + n;
if (c == EOF && n == 0U) {
return (NULL);
return (buf);
return(NULL);
int rval;
return(rval);
size_t n;
time_t t;
struct tm *p;
p = localtime(&t);
struct dns_errormap {
const char *text;
} dns_errormap[] = {
++pmap;
return (result);
struct dc_method_map {
unsigned int dc_method;
const char *text;
} dc_method_map[] = {
{ 0, NULL }
unsigned int dc_method;
++pmap;
return(dc_method);
int cnt;
cnt = 0;
*toks++ = p;
++cnt;
return(cnt);
printhelp(void) {
int cnt;
++pts;
++cnt;
printusage(void) {
int line;
int cnt;
int result;
int nfails;
int nprobs;
int npass;
npass = 0;
nfails = 0;
nprobs = 0;
line = 0;
++line;
(void)free(p);
switch (result) {
case T_PASS:
++npass;
case T_FAIL:
++nfails;
case T_UNTESTED:
++nprobs;
++nprobs;
(void)free(p);
++nprobs;
else if (nfails > 0)
else if (npass == 0)
return (result);