From 95318c663159a0143edbe41e2e8c94bc057276a8 Mon Sep 17 00:00:00 2001 From: Sébastien Marie Date: Mon, 22 Jun 2015 13:44:20 +0200 Subject: add regress testsuite for patterns --- regress/patterns/Makefile | 20 ++++++++ regress/patterns/patterns-tester.c | 98 ++++++++++++++++++++++++++++++++++++++ regress/patterns/test-patterns.in | 23 +++++++++ regress/patterns/test-patterns.out | 87 +++++++++++++++++++++++++++++++++ 4 files changed, 228 insertions(+) create mode 100644 regress/patterns/Makefile create mode 100644 regress/patterns/patterns-tester.c create mode 100644 regress/patterns/test-patterns.in create mode 100644 regress/patterns/test-patterns.out diff --git a/regress/patterns/Makefile b/regress/patterns/Makefile new file mode 100644 index 0000000..024f96e --- /dev/null +++ b/regress/patterns/Makefile @@ -0,0 +1,20 @@ +# $OpenBSD$ + +HTTPDSRC = ${.CURDIR}/../../httpd + +.PATH: ${HTTPDSRC} + +REGRESS_TARGETS= test-patterns + +CLEANFILES += patterns-tester + +patterns-tester: patterns-tester.c patterns.c patterns.h + ${CC} -o $@ ${CFLAGS} ${.CURDIR}/patterns-tester.c ${HTTPDSRC}/patterns.c -I${HTTPDSRC} + +test-patterns: patterns-tester test-patterns.out test-patterns.in + cat ${.CURDIR}/test-patterns.in | grep -v '^#' | \ + while IFS=' ' read string pattern comments ; do \ + ./patterns-tester "$${string}" "$${pattern}" 2>&1 || true; \ + done | diff -I 'OpenBSD' -u ${.CURDIR}/test-patterns.out - + +.include diff --git a/regress/patterns/patterns-tester.c b/regress/patterns/patterns-tester.c new file mode 100644 index 0000000..9134c0c --- /dev/null +++ b/regress/patterns/patterns-tester.c @@ -0,0 +1,98 @@ +/* $OpenBSD$ */ +/* + * Copyright (c) 2015 Sebastien Marie + * + * 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 "patterns.h" + +extern char * malloc_options; + +static void read_string(char *, size_t); +static void read_string_stop(void); + +static void +read_string(char *buf, size_t len) +{ + size_t i; + + /* init */ + bzero(buf, len); + + /* read */ + if (fgets(buf, len, stdin) == NULL) + err(1, "fgets"); + + /* strip '\n' */ + i = strnlen(buf, len); + if (i != 0) + buf[i-1] = '\0'; +} + +static void +read_string_stop() +{ + if (getchar() != EOF) + errx(1, "read_string_stop: too many input"); +} + +int +main(int argc, char *argv[]) +{ + char string[1024]; + char pattern[1024]; + struct str_match m; + const char *errstr = NULL; + int ret; + size_t i; + + /* configure malloc */ + malloc_options = "S"; + + /* read testcase */ + if (argc != 3) { + /* from stdin (useful for afl) */ + read_string(string, sizeof(string)); + read_string(pattern, sizeof(pattern)); + read_string_stop(); + } else { + /* from arguments */ + strlcpy(string, argv[1], sizeof(string)); + strlcpy(pattern, argv[2], sizeof(pattern)); + } + + /* print testcase */ + printf("string='%s'\n", string); + printf("pattern='%s'\n", pattern); + + /* test it ! */ + ret = str_match(string, pattern, &m, &errstr); + if (errstr != NULL) + errx(1, "str_match: %s", errstr); + + /* print result */ + printf("ret=%d num=%d\n", ret, m.sm_nmatch); + for (i=0; i