diff --git a/tests/Makefile b/tests/Makefile index 50010f2..9a73157 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -1,28 +1,26 @@ CC = gcc -TESTSUITE = tester -TESTOBJS = test.o ../src/dns.o ../src/read.o ../src/encoding.o +TEST = test +OBJS = test.o base32.o +SRCOBJS = ../src/base32.o OS = `uname | tr "a-z" "A-Z"` -LDFLAGS = -lz -CFLAGS = -c -g -Wall -D$(OS) +LDFLAGS = -L/usr/local/lib -lcheck +CFLAGS = -g -Wall -D$(OS) -I../src -I/usr/local/include -all: $(TESTSUITE) +all: $(TEST) + ./$(TEST) -test: $(TESTSUITE) - @./$(TESTSUITE) - -$(TESTSUITE): $(TESTOBJS) - @echo LD $@ - @$(CC) $(TESTOBJS) -o $(TESTSUITE) $(LDFLAGS) - @echo Running tests... - @./$(TESTSUITE) +$(TEST): $(OBJS) $(SRCOBJS) + @echo Linking test + @$(CC) -o $@ $(SRCOBJS) $(OBJS) $(LDFLAGS) .c.o: - @echo CC $< - @$(CC) $(CFLAGS) $< -o $@ + @echo Building $< + @$(CC) $(CFLAGS) -c $< + clean: - @echo "Cleaning tests/" - @rm -f $(TESTSUITE) *~ *.o *.core + @echo "Cleaning..." + @rm -f *~ *.core $(TESTS) $(OBJS) diff --git a/tests/base32.c b/tests/base32.c new file mode 100644 index 0000000..3828532 --- /dev/null +++ b/tests/base32.c @@ -0,0 +1,64 @@ +#include +#include +#include +#include + +#include "base32.h" +#include "test.h" + +struct touple +{ + char *a; + char *b; +} testpairs[] = { + { "abc123", "mfrggmjsgm" }, + { NULL, NULL } +}; + +START_TEST(test_base32_encode) +{ + size_t len; + char *buf; + int i; + + len = 0; + buf = NULL; + + for (i = 0; testpairs[i].a != NULL; i++) { + base32_encode(&buf, &len, testpairs[i].a, strlen(testpairs[i].a)); + + fail_unless(strcmp(buf, testpairs[i].b) == 0, + va_str("'%s' != '%s'", buf, testpairs[i].b)); + } +} +END_TEST + +START_TEST(test_base32_decode) +{ + size_t len; + void *buf; + int i; + + len = 0; + buf = NULL; + + for (i = 0; testpairs[i].a != NULL; i++) { + base32_decode(&buf, &len, testpairs[i].b); + + fail_unless(strcmp(buf, testpairs[i].a) == 0, + va_str("'%s' != '%s'", buf, testpairs[i].a)); + } +} +END_TEST + +TCase * +test_base32_create_tests() +{ + TCase *tc; + + tc = tcase_create("Base32"); + tcase_add_test(tc, test_base32_encode); + tcase_add_test(tc, test_base32_decode); + + return tc; +} diff --git a/tests/origtest.c b/tests/origtest.c new file mode 100644 index 0000000..a2098cf --- /dev/null +++ b/tests/origtest.c @@ -0,0 +1,262 @@ +/* + * Copyright (c) 2006 Bjorn Andersson , Erik Ekman + * + * 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 THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 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 +#include +#include +#include +#include +#ifdef DARWIN +#include +#endif +#include +#include +#include +#include +#include + +#include "structs.h" +#include "encoding.h" +#include "dns.h" +#include "read.h" + +static void +test_readputshort() +{ + short tshort; + short putted; + short temps; + char buf[4]; + short *s; + char* p; + int i; + + printf(" * Testing read/putshort... "); + fflush(stdout); + + for (i = 0; i < 65536; i++) { + tshort = (unsigned short) i; + temps = htons(tshort); + p = buf; + putshort(&p, tshort); + s = &putted; + memcpy(s, buf, sizeof(short)); + if (putted != temps) { + printf("Bad value on putshort for %d\n", i); + exit(1); + } + s = &temps; + memcpy(buf, s, sizeof(short)); + p = buf; + readshort(NULL, &p, &temps); + if (temps != tshort) { + printf("Bad value on readshort for %d\n", i); + exit(1); + } + } + + printf("OK\n"); +} + +static void +test_readputlong() +{ + char buf[4]; + uint32_t putint; + uint32_t tempi; + uint32_t tint; + uint32_t *l; + char* p; + int i; + + printf(" * Testing read/putlong... "); + fflush(stdout); + + for (i = 0; i < 32; i++) { + tint = 0xF << i; + tempi = htonl(tint); + p = buf; + putlong(&p, tint); + l = &putint; + memcpy(l, buf, sizeof(uint32_t)); + if (putint != tempi) { + printf("Bad value on putlong for %d\n", i); + exit(2); + } + l = &tempi; + memcpy(buf, l, sizeof(uint32_t)); + p = buf; + readlong(NULL, &p, &tempi); + if (tempi != tint) { + printf("Bad value on readlong for %d\n", i); + exit(2); + } + } + + printf("OK\n"); +} + + +static void +test_readname() +{ + char emptyloop[] = { + 'A', 'A', 0x81, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01 }; + char infloop[] = { + 'A', 'A', 0x81, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 'A', 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01 }; + char longname[] = + "AA\x81\x80\x00\x01\x00\x00\x00\x00\x00\x00" + "\x3FzBCDEFGHIJKLMNOPQURSTUVXYZ0123456789abcdefghijklmnopqrstuvxyzAA" + "\x3FzBCDEFGHIJKLMNOPQURSTUVXYZ0123456789abcdefghijklmnopqrstuvxyzAA" + "\x3FzBCDEFGHIJKLMNOPQURSTUVXYZ0123456789abcdefghijklmnopqrstuvxyzAA" + "\x3FzBCDEFGHIJKLMNOPQURSTUVXYZ0123456789abcdefghijklmnopqrstuvxyzAA" + "\x3FzBCDEFGHIJKLMNOPQURSTUVXYZ0123456789abcdefghijklmnopqrstuvxyzAA" + "\x3FzBCDEFGHIJKLMNOPQURSTUVXYZ0123456789abcdefghijklmnopqrstuvxyzAA" + "\x00\x00\x01\x00\x01"; + char onejump[] = + "AA\x81\x80\x00\x01\x00\x00\x00\x00\x00\x00" + "\x02hh\xc0\x15\x00\x01\x00\x01\x05zBCDE\x00"; + char badjump[] = { + 'A', 'A', 0x81, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0xcc, 0x00, 0x01, 0x00, 0x01 }; + char badjump2[] = { + 'A', 'A', 0x81, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 'B', 'A', 0xfe, 0xcc, 0x00, 0x01, 0x00, 0x01 }; + char *jumper; + char buf[1024]; + char *data; + int rv; + + printf(" * Testing readname... "); + fflush(stdout); + + memset(buf, 0, sizeof(buf)); + data = emptyloop + sizeof(HEADER); + buf[1023] = 'A'; + rv = readname(emptyloop, sizeof(emptyloop), &data, buf, 1023); + assert(buf[1023] == 'A'); + + memset(buf, 0, sizeof(buf)); + data = infloop + sizeof(HEADER); + buf[4] = '\a'; + rv = readname(infloop, sizeof(infloop), &data, buf, 4); + assert(buf[4] == '\a'); + + memset(buf, 0, sizeof(buf)); + data = longname + sizeof(HEADER); + buf[256] = '\a'; + rv = readname(longname, sizeof(longname), &data, buf, 256); + assert(buf[256] == '\a'); + + memset(buf, 0, sizeof(buf)); + data = onejump + sizeof(HEADER); + rv = readname(onejump, sizeof(onejump), &data, buf, 256); + assert(rv == 9); + + // These two tests use malloc to cause segfault if jump is executed + memset(buf, 0, sizeof(buf)); + jumper = malloc(sizeof(badjump)); + if (jumper) { + memcpy(jumper, badjump, sizeof(badjump)); + data = jumper + sizeof(HEADER); + rv = readname(jumper, sizeof(badjump), &data, buf, 256); + assert(rv == 0); + } + free(jumper); + + memset(buf, 0, sizeof(buf)); + jumper = malloc(sizeof(badjump2)); + if (jumper) { + memcpy(jumper, badjump2, sizeof(badjump2)); + data = jumper + sizeof(HEADER); + rv = readname(jumper, sizeof(badjump2), &data, buf, 256); + assert(rv == 4); + assert(strcmp("BA.", buf) == 0); + } + free(jumper); + + printf("OK\n"); +} + +static void +test_encode_hostname() { + char buf[256]; + int len; + int ret; + + len = 256; + printf(" * Testing hostname encoding... "); + fflush(stdout); + + memset(buf, 0, 256); + ret = dns_encode_hostname( // More than 63 chars between dots + "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" + , buf, len); + assert(ret == -1); + + memset(buf, 0, 256); + ret = dns_encode_hostname( // More chars than fits into array + "ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ." + "ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ." + "ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ." + , buf, len); + assert(ret == -1); + assert(strlen(buf) < len); + + printf("OK\n"); +} + +static void +test_base32() { + char temp[256]; + char *start = "HELLOTEST"; + char *out = "1HELLOTEST"; + char *end; + char *tempend; + int codedlength; + + printf(" * Testing base32 encoding... "); + fflush(stdout); + + memset(temp, 0, sizeof(temp)); + end = malloc(16); + memset(end, 0, 16); + + codedlength = encode_data(start, 9, 256, temp, 0); + tempend = temp + strlen(temp); + decode_data(end, 16, temp, tempend); + assert(strcmp(out, end) == 0); + free(end); + + printf("OK\n"); +} + +int +main() +{ + printf("** iodine test suite\n"); + + test_readputshort(); + test_readputlong(); + test_readname(); + test_encode_hostname(); + test_base32(); + + printf("** All went well :)\n"); + return 0; +} diff --git a/tests/test.c b/tests/test.c index 8549d8b..84d6f19 100644 --- a/tests/test.c +++ b/tests/test.c @@ -1,262 +1,41 @@ -/* - * Copyright (c) 2006 Bjorn Andersson , Erik Ekman - * - * 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 THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 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 -#include -#include -#include -#include -#ifdef DARWIN -#include -#endif +#include #include -#include +#include #include -#include -#include -#include "../src/structs.h" -#include "../src/encoding.h" -#include "../src/dns.h" -#include "../src/read.h" - -static void -test_readputshort() +#include "test.h" + +char * +va_str(const char *fmt, ...) { - short tshort; - short putted; - short temps; - char buf[4]; - short *s; - char* p; - int i; + static char buf[512]; + va_list ap; - printf(" * Testing read/putshort... "); - fflush(stdout); + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); - for (i = 0; i < 65536; i++) { - tshort = (unsigned short) i; - temps = htons(tshort); - p = buf; - putshort(&p, tshort); - s = &putted; - memcpy(s, buf, sizeof(short)); - if (putted != temps) { - printf("Bad value on putshort for %d\n", i); - exit(1); - } - s = &temps; - memcpy(buf, s, sizeof(short)); - p = buf; - readshort(NULL, &p, &temps); - if (temps != tshort) { - printf("Bad value on readshort for %d\n", i); - exit(1); - } - } - - printf("OK\n"); -} - -static void -test_readputlong() -{ - char buf[4]; - uint32_t putint; - uint32_t tempi; - uint32_t tint; - uint32_t *l; - char* p; - int i; - - printf(" * Testing read/putlong... "); - fflush(stdout); - - for (i = 0; i < 32; i++) { - tint = 0xF << i; - tempi = htonl(tint); - p = buf; - putlong(&p, tint); - l = &putint; - memcpy(l, buf, sizeof(uint32_t)); - if (putint != tempi) { - printf("Bad value on putlong for %d\n", i); - exit(2); - } - l = &tempi; - memcpy(buf, l, sizeof(uint32_t)); - p = buf; - readlong(NULL, &p, &tempi); - if (tempi != tint) { - printf("Bad value on readlong for %d\n", i); - exit(2); - } - } - - printf("OK\n"); -} - - -static void -test_readname() -{ - char emptyloop[] = { - 'A', 'A', 0x81, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01 }; - char infloop[] = { - 'A', 'A', 0x81, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 'A', 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01 }; - char longname[] = - "AA\x81\x80\x00\x01\x00\x00\x00\x00\x00\x00" - "\x3FzBCDEFGHIJKLMNOPQURSTUVXYZ0123456789abcdefghijklmnopqrstuvxyzAA" - "\x3FzBCDEFGHIJKLMNOPQURSTUVXYZ0123456789abcdefghijklmnopqrstuvxyzAA" - "\x3FzBCDEFGHIJKLMNOPQURSTUVXYZ0123456789abcdefghijklmnopqrstuvxyzAA" - "\x3FzBCDEFGHIJKLMNOPQURSTUVXYZ0123456789abcdefghijklmnopqrstuvxyzAA" - "\x3FzBCDEFGHIJKLMNOPQURSTUVXYZ0123456789abcdefghijklmnopqrstuvxyzAA" - "\x3FzBCDEFGHIJKLMNOPQURSTUVXYZ0123456789abcdefghijklmnopqrstuvxyzAA" - "\x00\x00\x01\x00\x01"; - char onejump[] = - "AA\x81\x80\x00\x01\x00\x00\x00\x00\x00\x00" - "\x02hh\xc0\x15\x00\x01\x00\x01\x05zBCDE\x00"; - char badjump[] = { - 'A', 'A', 0x81, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xfe, 0xcc, 0x00, 0x01, 0x00, 0x01 }; - char badjump2[] = { - 'A', 'A', 0x81, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 'B', 'A', 0xfe, 0xcc, 0x00, 0x01, 0x00, 0x01 }; - char *jumper; - char buf[1024]; - char *data; - int rv; - - printf(" * Testing readname... "); - fflush(stdout); - - memset(buf, 0, sizeof(buf)); - data = emptyloop + sizeof(HEADER); - buf[1023] = 'A'; - rv = readname(emptyloop, sizeof(emptyloop), &data, buf, 1023); - assert(buf[1023] == 'A'); - - memset(buf, 0, sizeof(buf)); - data = infloop + sizeof(HEADER); - buf[4] = '\a'; - rv = readname(infloop, sizeof(infloop), &data, buf, 4); - assert(buf[4] == '\a'); - - memset(buf, 0, sizeof(buf)); - data = longname + sizeof(HEADER); - buf[256] = '\a'; - rv = readname(longname, sizeof(longname), &data, buf, 256); - assert(buf[256] == '\a'); - - memset(buf, 0, sizeof(buf)); - data = onejump + sizeof(HEADER); - rv = readname(onejump, sizeof(onejump), &data, buf, 256); - assert(rv == 9); - - // These two tests use malloc to cause segfault if jump is executed - memset(buf, 0, sizeof(buf)); - jumper = malloc(sizeof(badjump)); - if (jumper) { - memcpy(jumper, badjump, sizeof(badjump)); - data = jumper + sizeof(HEADER); - rv = readname(jumper, sizeof(badjump), &data, buf, 256); - assert(rv == 0); - } - free(jumper); - - memset(buf, 0, sizeof(buf)); - jumper = malloc(sizeof(badjump2)); - if (jumper) { - memcpy(jumper, badjump2, sizeof(badjump2)); - data = jumper + sizeof(HEADER); - rv = readname(jumper, sizeof(badjump2), &data, buf, 256); - assert(rv == 4); - assert(strcmp("BA.", buf) == 0); - } - free(jumper); - - printf("OK\n"); -} - -static void -test_encode_hostname() { - char buf[256]; - int len; - int ret; - - len = 256; - printf(" * Testing hostname encoding... "); - fflush(stdout); - - memset(buf, 0, 256); - ret = dns_encode_hostname( // More than 63 chars between dots - "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" - , buf, len); - assert(ret == -1); - - memset(buf, 0, 256); - ret = dns_encode_hostname( // More chars than fits into array - "ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ." - "ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ." - "ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ." - , buf, len); - assert(ret == -1); - assert(strlen(buf) < len); - - printf("OK\n"); -} - -static void -test_base32() { - char temp[256]; - char *start = "HELLOTEST"; - char *out = "1HELLOTEST"; - char *end; - char *tempend; - int codedlength; - - printf(" * Testing base32 encoding... "); - fflush(stdout); - - memset(temp, 0, sizeof(temp)); - end = malloc(16); - memset(end, 0, 16); - - codedlength = encode_data(start, 9, 256, temp, 0); - tempend = temp + strlen(temp); - decode_data(end, 16, temp, tempend); - assert(strcmp(out, end) == 0); - free(end); - - printf("OK\n"); + return buf; } int main() { - printf("** iodine test suite\n"); + SRunner *runner; + Suite *iodine; + TCase *test; + int failed; - test_readputshort(); - test_readputlong(); - test_readname(); - test_encode_hostname(); - test_base32(); + iodine = suite_create("Iodine"); - printf("** All went well :)\n"); - return 0; + test = test_base32_create_tests(); + suite_add_tcase(iodine, test); + + runner = srunner_create(iodine); + srunner_run_all(runner, CK_VERBOSE); + failed = srunner_ntests_failed(runner); + + srunner_free(runner); + + return (failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } diff --git a/tests/test.h b/tests/test.h new file mode 100644 index 0000000..c5a0708 --- /dev/null +++ b/tests/test.h @@ -0,0 +1,7 @@ +#ifndef __TEST_H__ +#define __TEST_H__ + +TCase *test_base32_create_tests(); +char *va_str(const char *, ...); + +#endif