diff options
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | Makefile | 13 | ||||
-rw-r--r-- | config.c | 47 |
3 files changed, 61 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore index c7ce8fe..8af4cb8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,10 @@ *.conf *.o +*.t /calico /pounce config.mk localhost.crt localhost.key tags +test diff --git a/Makefile b/Makefile index c0ea331..d8f8504 100644 --- a/Makefile +++ b/Makefile @@ -23,7 +23,9 @@ OBJS += ring.o OBJS += server.o OBJS += state.o -dev: tags all +TESTS += config.t + +dev: tags all test all: ${BINS} @@ -37,6 +39,15 @@ ${OBJS}: bounce.h compat.h dispatch.o: compat.h +test: ${TESTS} + set -e; ${TESTS:%=./%;} + touch test + +.SUFFIXES: .t + +.c.t: + ${CC} ${CFLAGS} -DTEST ${LDFLAGS} $< ${LDLIBS} -o $@ + tags: *.c *.h ctags -w *.c *.h diff --git a/config.c b/config.c index 653ae16..befb1fc 100644 --- a/config.c +++ b/config.c @@ -136,3 +136,50 @@ int getopt_config( file = NULL; } } + +#ifdef TEST +#include <assert.h> +#include <sysexits.h> + +static const struct option LongOpts[] = { + { "foo", no_argument, NULL, 'f' }, + { "bar", required_argument, NULL, 'b' }, + {0}, +}; + +static char Test[] = { + "\n" + WS "\n" + "#foo\n" + WS "#foo\n" + "foo\n" + WS "foo\n" + "foo" WS "\n" + "bar=baz\n" + "bar" WS "=baz\n" + "bar=" WS "baz\n" + "bar" WS "=" WS "baz\n" + "bar = # baz \n" + "foo" +}; + +int main(void) { + int argc = 1; + char *argv[] = { "test", NULL }; + file = fmemopen(Test, sizeof(Test) - 1, "r"); + if (!file) err(EX_OSERR, "fmemopen"); + + for (int i = 0; i < 3; ++i) { + assert('f' == getopt_config(argc, argv, "", LongOpts, NULL)); + } + for (int i = 0; i < 4; ++i) { + assert('b' == getopt_config(argc, argv, "", LongOpts, NULL)); + assert(!strcmp("baz", optarg)); + } + assert('b' == getopt_config(argc, argv, "", LongOpts, NULL)); + assert(!strcmp("# baz ", optarg)); + assert('f' == getopt_config(argc, argv, "", LongOpts, NULL)); + assert(-1 == getopt_config(argc, argv, "", LongOpts, NULL)); +} + +#endif |