# regress/Makefile[.in] - regression test Makefile
#
# This file is part of adns, which is
-# Copyright (C) 1997-2000,2003,2006 Ian Jackson
+# Copyright (C) 1997-2000,2003,2006,2014-2016,2020 Ian Jackson
+# Copyright (C) 2014 Mark Wooding
# Copyright (C) 1999-2000,2003,2006 Tony Finch
# Copyright (C) 1991 Massachusetts Institute of Technology
# (See the file INSTALL for full details.)
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
+# the Free Software Foundation; either version 3, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+# along with this program; if not, write to the Free Software Foundation.
srcdir= @srcdir@
VPATH= @srcdir@
CLIENTS= adnstest adnshost adnslogres $(PROGS_SYSDEP)
AUTOCHDRS= harness.h hsyscalls.h hredirect.h
-AUTOCSRCS= hrecord.c hplayback.c hcommon.c
-include $(srcdir)/../settings.make
+AUTOCSRCS= hrecord.c hplayback.c hcommon.c hfuzzraw.c
+include ../settings.make
include $(srcdir)/../src/adns.make
-DIRCFLAGS= -I$(srcdir)/../src
+DIRCFLAGS= -I../src -I$(srcdir) -I$(srcdir)/../src
HCPPFLAGS= -DADNS_REGRESS_TEST -I.
+#HCPPFLAGS+= -DFUZZRAW_SYNC
REDIRLIBOBJS= $(addsuffix _d.o, $(basename $(LIBOBJS)))
HARNLOBJS= hcommon.o $(REDIRLIBOBJS)
-TARGETS= $(addsuffix _record, $(CLIENTS)) $(addsuffix _playback, $(CLIENTS))
+TARGETS= $(addsuffix _record, $(CLIENTS)) \
+ $(addsuffix _playback, $(CLIENTS)) \
+ $(addsuffix _fuzz, $(CLIENTS)) \
+ $(addsuffix _fuzzraw, $(CLIENTS))
ADH_OBJS= adh-main_c.o adh-opts_c.o adh-query_c.o
-ALL_OBJS= $(HARNLOBJS) dtest.o hrecord.o hplayback.o
+ALL_OBJS= $(HARNLOBJS) dtest.o hrecord.o hplayback.o hnonfuzz.o hfuzz.o
.PRECIOUS: $(AUTOCSRCS) $(AUTOCHDRS)
all install uninstall: $(TARGETS)
-check: $(TARGETS)
- ./checkall
+ALL_TESTS:=$(patsubst $(srcdir)/case-%.sys,%,$(wildcard $(srcdir)/case-*.sys))
+
+check: $(TARGETS) $(addprefix check-,$(ALL_TESTS))
+ @echo
+ @echo 'all tests passed or maybe skipped.'
+
+checkfuzz: $(TARGETS) \
+ $(addprefix checkfuzz-,$(ALL_TESTS)) \
+ $(addprefix checkfuzzraw-,$(ALL_TESTS))
+ @echo
+ @echo 'all fuzzes passed or maybe skipped.'
+# this target is mostly useful as prep work for running the fuzzer;
+# it doesn't really test any of adns
+
+fuzzcat.d: checkfuzz
+ $(srcdir)/categorisefuzz $(ALL_TESTS)
+ perl -ne 'print $$1,"\n" while m/\"([^"% ]{2,})\"/g' \
+ $(srcdir)/../src/*.[ch] $(srcdir)/../client/*.[ch] \
+ | sort -u >fuzzcat.d/dictionary
+
+
+check-%: case-%.sys
+ @srcdir=$(srcdir) $(srcdir)/r1test $* || test $$? = 5
+
+fuzz-%: case-%.sys $(TARGETS) make1fuzz shlib
+ srcdir=$(srcdir) $(srcdir)/make1fuzz $*
+
+fuzzraw-%: fuzz-%
+
+.PRECIOUS: fuzz-%
+
+checkfuzz-%: fuzz-% $(TARGETS)
+ @srcdir=$(srcdir) $(srcdir)/check1fuzz $<
+
+checkfuzzraw-%: fuzz-% $(TARGETS)
+ @srcdir=$(srcdir) $(srcdir)/check1fuzz $<
LINK_CMD= $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@
-%_record: %_c.o hrecord.o $(HARNLOBJS)
+%_record: %_c.o hrecord.o hnonfuzz.o $(HARNLOBJS)
+ $(LINK_CMD)
+
+%_playback: %_c.o hplayback.o hnonfuzz.o $(HARNLOBJS)
+ $(LINK_CMD)
+
+%_fuzz: %_c.o hplayback.o hfuzz.o $(HARNLOBJS)
+ $(LINK_CMD)
+
+%_fuzzraw: %_c.o hfuzzraw.o hfuzz.o $(HARNLOBJS)
+ $(LINK_CMD)
+
+.SECONDARY: $(addsuffix _c.o, $(filter-out adnshost, $(CLIENTS)))
+# Without this, make will remove <client>_c.o after building <client>.
+# This wastes effort. (Debian bug #4073.)
+#
+# Also, it exposes us to a bug (in make 3.81, at least) which can
+# cause make to run the rule for building <client> without building
+# <client>_c.o! (Debian #756123.)
+#
+# See also Savannah #29620, http://savannah.gnu.org/bugs/index.php?29620
+
+adnshost_%: $(ADH_OBJS) h%.o hnonfuzz.o $(HARNLOBJS)
$(LINK_CMD)
-%_playback: %_c.o hplayback.o $(HARNLOBJS)
+adnshost_fuzz: $(ADH_OBJS) hplayback.o hfuzz.o $(HARNLOBJS)
$(LINK_CMD)
-adnshost_%: $(ADH_OBJS) h%.o $(HARNLOBJS)
+adnshost_fuzzraw: $(ADH_OBJS) hfuzzraw.o hfuzz.o $(HARNLOBJS)
$(LINK_CMD)
%_d.o: $(srcdir)/../src/%.c hredirect.h
$(ADH_OBJS): $(srcdir)/../client/adnshost.h
%:: %.m4 hmacros.i4 hsyscalls.i4
- $(M4) -P $< >$@-a.new
+ $(M4) -P -I$(srcdir) $< >$@-a.new
sed -e 's/hm_comma/,/g; s/hm_squote/'\''/g; /^[ ]*$$/d' <$@-a.new >$@-b.new
- @mv -f $@-b.new $@; rm -f $@-a.new
+ @mv -f $@-b.new $(srcdir)/$@; rm -f $@-a.new