t_api.c revision 7e74203c0f60816ce026fc20ac86a17ca17ec7c5
/*
* Copyright (C) 1999 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
#include <ctype.h>
#include <errno.h>
#include <limits.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>
#include <isc/commandline.h>
static char *Usage = "\t-a : run all tests\n"
"\t-b <dir> : chdir to dir before running tests"
"\t-c <config_file> : use specified config file\n"
"\t-d <debug_level> : set debug level to debug_level\n"
"\t-h : print test info\n"
"\t-u : print usage info\n"
"\t-n <test_name> : run specified test name\n"
"\t-t <test_number> : run specified test number\n"
"\t-x : don't execute tests in a subproc\n"
"\t-q <timeout> : use 'timeout' as the timeout value\n";
/*
* -a --> run all tests
* -b dir --> chdir to dir before running tests
* -c config --> use config file 'config'
* -d --> turn on api debugging
* -h --> print out available test names
* -u --> print usage info
* -n name --> run test named name
* -tn --> run test n
* -x --> don't execute testcases in a subproc
* -q timeout --> use 'timeout' as the timeout value
*/
#define T_MAXENV 256
#define T_DEFAULT_CONFIG "t_config"
#define T_BUFSIZ 256
#define T_BIGBUF 4096
#define T_TCTOUT 60
int T_debug;
int T_timeout;
static char *T_config;
static char *T_dir;
static int t_initconf(char *path);
static int t_dumpconf(char *path);
static void printhelp(void);
static void printusage(void);
static void t_sighandler();
static int T_int;
/*
* XXXMLG NetBSD's "default" pthreads implementation has a broken signal
* interface.
*
* Here, if using NetBSD, define SIGACTION() as pthread_sigaction(),
* otherwise make it sigaction().
*/
#if defined(__NetBSD__)
#define SIGACTION(a, b, c) pthread_sigaction((a), (b), (c))
#else
#endif
static void
t_sighandler(int sig) {
}
int
{
int c;
int tnum;
int subprocs;
int status;
int len;
int first;
first = 1;
subprocs = 1;
/* -a option is now default */
/* parse args */
if (c == 'a') {
/* flag all tests to be run */
}
else if (c == 'b') {
}
else if (c == 't') {
if (first) {
/*
* turn off effect of -a default
* and allow multiple -t and -n
* options
*/
first = 0;
}
/* flag test tnum to be run */
tnum -= 1;
}
}
else if (c == 'c') {
}
else if (c == 'd') {
}
else if (c == 'n') {
pts = &T_testlist[0];
tnum = 0;
if (first) {
first = 0;
}
break;
}
++pts;
++tnum;
}
exit(1);
}
}
else if (c == 'h') {
printhelp();
exit(0);
}
else if (c == 'u') {
printusage();
exit(0);
}
else if (c == 'x') {
subprocs = 0;
}
else if (c == 'q') {
}
else if (c == ':') {
exit(1);
}
else if (c == '?') {
exit(1);
}
}
/* set cwd */
/* we don't want buffered output */
/* setup signals */
/* output start stanza to journal */
/* setup the test environment using the config file */
if (T_debug)
/* now invoke all the test cases */
tnum = 0;
pts = &T_testlist[0];
if (subprocs) {
if (T_pid == 0) {
exit(0);
}
else if (T_pid > 0) {
T_int = 0;
if (WIFSIGNALED(status)) {
t_info("the test case timed out\n");
else
}
}
T_int = 0;
}
else if ((deadpid == -1) &&
break;
}
alarm(0);
}
else {
}
}
else {
}
}
++pts;
++tnum;
}
return(0);
}
void
const char *what, ...)
{
int n;
"A" : "C");
/* format text to a buffer */
(void) printf("\n");
}
void
{
}
void
{
char *p;
switch (result) {
case T_PASS:
p = "PASS";
break;
case T_FAIL:
p = "FAIL";
break;
case T_UNRESOLVED:
p = "UNRESOLVED";
break;
case T_UNSUPPORTED:
p = "UNSUPPORTED";
break;
case T_UNTESTED:
p = "UNTESTED";
break;
default:
p = "UNKNOWN";
break;
}
printf("R:%s\n", p);
}
char *
{
char *n;
char **p;
n = NULL;
p = &T_env[0];
while (*p != NULL) {
if ( *(*p + len) == '=') {
n = *p + len + 1;
break;
}
}
++p;
}
}
return(n);
}
/*
*
* read in the config file at path, initializing T_env
*
* note: no format checking for now ...
*
*/
static int
t_initconf(char *path)
{
int n;
int rval;
char **p;
rval = -1;
n = 0;
p = &T_env[0];
while (n < T_MAXENV) {
if (*p == NULL)
break;
/* skip comments and other junk */
(void) free(*p);
continue;
}
++p; ++n;
}
rval = 0;
}
return(rval);
}
/*
*
* dump T_env to stdout
*
*/
static int
t_dumpconf(char *path)
{
int rval;
char **p;
rval = -1;
p = &T_env[0];
while (*p != NULL) {
printf("C:%s\n", *p);
++p;
}
rval = 0;
}
return(rval);
}
/*
*
* read a newline or EOF terminated string from fp
* on success:
* return a malloc'd buf containing the string with
* the newline converted to a '\0'.
* on error:
* return NULL
*
* caller is responsible for freeing buf
*
*/
char *
{
int c;
size_t n;
char *buf;
char *p;
n = 0;
p = buf;
if (c == '\n')
break;
*p++ = c;
++n;
if ( n >= size ) {
break;
p = buf + n;
}
}
*p = '\0';
}
else {
return(NULL);
}
}
/*
*
* put info to log, using key
* for now, just dump it out.
* later format into pretty lines
*
*/
static int
{
int rval;
/* for now */
return(rval);
}
static char *
{
size_t n;
time_t t;
struct tm *p;
p = localtime(&t);
}
/* some generally used utilities */
struct dns_errormap {
char *text;
} dns_errormap[] = {
{ DNS_R_SUCCESS, "DNS_R_SUCCESS" },
{ DNS_R_NOMEMORY, "DNS_R_NOMEMORY" },
{ DNS_R_NOSPACE, "DNS_R_NOSPACE" },
{ DNS_R_LABELTOOLONG, "DNS_R_LABELTOOLONG" },
{ DNS_R_BADESCAPE, "DNS_R_BADESCAPE" },
{ DNS_R_BADBITSTRING, "DNS_R_BADBITSTRING" },
{ DNS_R_BITSTRINGTOOLONG, "DNS_R_BITSTRINGTOOLONG"},
{ DNS_R_EMPTYLABEL, "DNS_R_EMPTYLABEL" },
{ DNS_R_BADDOTTEDQUAD, "DNS_R_BADDOTTEDQUAD" },
{ DNS_R_UNEXPECTEDEND, "DNS_R_UNEXPECTEDEND" },
{ DNS_R_NOTIMPLEMENTED, "DNS_R_NOTIMPLEMENTED" },
{ DNS_R_UNKNOWN, "DNS_R_UNKNOWN" },
{ DNS_R_BADLABELTYPE, "DNS_R_BADLABELTYPE" },
{ DNS_R_BADPOINTER, "DNS_R_BADPOINTER" },
{ DNS_R_TOOMANYHOPS, "DNS_R_TOOMANYHOPS" },
{ DNS_R_DISALLOWED, "DNS_R_DISALLOWED" },
{ DNS_R_NOMORE, "DNS_R_NOMORE" },
{ DNS_R_EXTRATOKEN, "DNS_R_EXTRATOKEN" },
{ DNS_R_EXTRADATA, "DNS_R_EXTRADATA" },
{ DNS_R_TEXTTOOLONG, "DNS_R_TEXTTOOLONG" },
{ DNS_R_RANGE, "DNS_R_RANGE" },
{ DNS_R_EXISTS, "DNS_R_EXISTS" },
{ DNS_R_NOTFOUND, "DNS_R_NOTFOUND" },
{ DNS_R_SYNTAX, "DNS_R_SYNTAX" },
{ DNS_R_BADCKSUM, "DNS_R_BADCKSUM" },
{ DNS_R_BADAAAA, "DNS_R_BADAAAA" },
{ DNS_R_NOOWNER, "DNS_R_NOOWNER" },
{ DNS_R_NOTTL, "DNS_R_NOTTL" },
{ DNS_R_BADCLASS, "DNS_R_BADCLASS" },
{ DNS_R_UNEXPECTEDTOKEN, "DNS_R_UNEXPECTEDTOKEN" },
{ DNS_R_BADBASE64, "DNS_R_BADBASE64" },
{ DNS_R_PARTIALMATCH, "DNS_R_PARTIALMATCH" },
{ DNS_R_NEWORIGIN, "DNS_R_NEWORIGIN" },
{ DNS_R_UNCHANGED, "DNS_R_UNCHANGED" },
{ DNS_R_BADTTL, "DNS_R_BADTTL" },
{ DNS_R_NOREDATA, "DNS_R_NOREDATA" },
{ DNS_R_CONTINUE, "DNS_R_CONTINUE" },
{ DNS_R_DELEGATION, "DNS_R_DELEGATION" },
{ DNS_R_GLUE, "DNS_R_GLUE" },
{ DNS_R_DNAME, "DNS_R_DNAME" },
{ DNS_R_CNAME, "DNS_R_CNAME" },
{ DNS_R_NXDOMAIN, "DNS_R_NXDOMAIN" },
{ DNS_R_NXRDATASET, "DNS_R_NXRDATASET" },
{ DNS_R_BADDB, "DNS_R_BADDB" },
{ DNS_R_ZONECUT, "DNS_R_ZONECUT" },
{ (dns_result_t) 0, NULL }
};
t_dns_result_fromtext(char *name) {
struct dns_errormap *pmap;
pmap = dns_errormap;
break;
++pmap;
}
return(result);
}
struct dc_method_map {
int dc_method;
char *text;
} dc_method_map[] = {
{ DNS_COMPRESS_NONE, "DNS_COMPRESS_NONE" },
{ DNS_COMPRESS_GLOBAL14, "DNS_COMPRESS_GLOBAL14" },
{ DNS_COMPRESS_GLOBAL16, "DNS_COMPRESS_GLOBAL16" },
{ DNS_COMPRESS_GLOBAL, "DNS_COMPRESS_GLOBAL" },
{ DNS_COMPRESS_LOCAL, "DNS_COMPRESS_LOCAL" },
{ DNS_COMPRESS_ALL, "DNS_COMPRESS_ALL" },
{ 0, NULL }
};
int
t_dc_method_fromtext(char *name) {
int dc_method;
struct dc_method_map *pmap;
break;
++pmap;
}
return(dc_method);
}
int
int cnt;
char *p;
cnt = 0;
*toks++ = p;
++cnt;
}
}
return(cnt);
}
static void
printhelp() {
int cnt;
cnt = 1;
pts = &T_testlist[0];
printf("Available tests:\n");
++pts;
++cnt;
}
}
static void
printusage() {
}
int
char *p;
int line;
int cnt;
int result;
int nfails;
int nprobs;
nfails = 0;
nprobs = 0;
line = 0;
++line;
/* skip comment lines */
if ((isspace((int)*p)) || (*p == '#'))
continue;
++nfails;
else
++nprobs;
}
}
else {
t_info("bad format in %s at line %d\n",
++nprobs;
}
(void) free(p);
}
}
else {
++nprobs;
}
else if (nfails)
return(result);
}