diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/Makefile | 29 | ||||
-rw-r--r-- | test/assert.c | 43 |
2 files changed, 68 insertions, 4 deletions
diff --git a/test/Makefile b/test/Makefile index 833e7d68e..39953a3d3 100644 --- a/test/Makefile +++ b/test/Makefile @@ -81,10 +81,19 @@ ifeq ($(MAKECMDGOALS),coverage) COV_CXXFLAGS ?= -fprofile-arcs -ftest-coverage -O0 COV_LDFLAGS ?= -lgcov -fprofile-arcs TESTROOT := $(COV_ROOT) + ifeq ($(NOASSERTCOVERAGE),yes) + NOCOV_TESTSOURCES ?= + COV_CPPFLAGS ?= + else + NOCOV_TESTSOURCES ?= test/assert.c + COV_CPPFLAGS ?= -D__assert_fail=__ns_assert_fail + endif else COV_CFLAGS ?= -O0 COV_CXXFLAGS ?= -O0 + COV_CPPFLAGS ?= TESTROOT := build/$(HOST)-test + NOCOV_TESTSOURCES ?= endif @@ -123,7 +132,7 @@ ifneq ($(CC_MAJOR),2) COMMON_WARNFLAGS += -Wno-unused-parameter endif -TESTCFLAGS := -std=c99 -g \ +BASE_TESTCFLAGS := -std=c99 -g \ $(COMMON_WARNFLAGS) \ -D_BSD_SOURCE \ -D_POSIX_C_SOURCE=200809L \ @@ -131,8 +140,10 @@ TESTCFLAGS := -std=c99 -g \ -Itest -Iinclude -Icontent/handlers -Ifrontends -I. -I.. \ -Dnsgtk \ $(shell pkg-config --cflags libcurl libparserutils libwapcaplet libdom libnsutils libutf8proc) \ - $(LIB_CFLAGS) \ - $(COV_CFLAGS) + $(LIB_CFLAGS) +TESTCFLAGS := $(BASE_TESTCFLAGS) \ + $(COV_CFLAGS) \ + $(COV_CPPFLAGS) TESTLDFLAGS := -L$(TESTROOT) \ $(shell pkg-config --libs libcurl libparserutils libwapcaplet libdom libnsutils libutf8proc) -lz \ @@ -149,7 +160,7 @@ TESTSOURCES := GCOV ?= gcov define gen_test_target -$$(TESTROOT)/$(1): $$(sort $$(addprefix $$(TESTROOT)/,$$(subst /,_,$$(patsubst %.c,%.o,$$(patsubst %.cpp,%.o,$$(patsubst %.m,%.o,$$(patsubst %.s,%.o,$$($(1)_SRCS)))))))) +$$(TESTROOT)/$(1): $$(sort $$(addprefix $$(TESTROOT)/,$$(subst /,_,$$(patsubst %.c,%.o,$$(patsubst %.cpp,%.o,$$(patsubst %.m,%.o,$$(patsubst %.s,%.o,$$($(1)_SRCS) $$(NOCOV_TESTSOURCES)))))))) $$(VQ)echo "LINKTEST: $$@" $$(Q)$$(CC) $$(TESTCFLAGS) $$^ -o $$@ $$($(1)_LD) $$(TESTLDFLAGS) @@ -171,12 +182,22 @@ $$(TESTROOT)/$(2): $(1) $$(TESTROOT)/created endef +define compile_test_nocov_target_c +$$(TESTROOT)/$(2): $(1) $$(TESTROOT)/created + $$(VQ)echo " COMPILE: $(1) (No coverage)" + $$(Q)$$(RM) $$(TESTROOT)/$(2) + $$(Q)$$(CC) $$(BASE_TESTCFLAGS) -o $$(TESTROOT)/$(2) -c $(1) + +endef + # Generate target for each test program and the list of objects it needs $(eval $(foreach TST,$(TESTS), $(call gen_test_target,$(TST)))) # generate target rules for test objects $(eval $(foreach SOURCE,$(sort $(filter %.c,$(TESTSOURCES))), \ $(call compile_test_target_c,$(SOURCE),$(subst /,_,$(SOURCE:.c=.o)),$(subst /,_,$(SOURCE:.c=.d))))) +$(eval $(foreach SOURCE,$(sort $(filter %.c,$(NOCOV_TESTSOURCES))), \ + $(call compile_test_nocov_target_c,$(SOURCE),$(subst /,_,$(SOURCE:.c=.o)),$(subst /,_,$(SOURCE:.c=.d))))) .PHONY:test coverage diff --git a/test/assert.c b/test/assert.c new file mode 100644 index 000000000..d21926e5e --- /dev/null +++ b/test/assert.c @@ -0,0 +1,43 @@ +/* + * Copyright 2017 Daniel Silverstone <dsilvers@netsurf-browser.org> + * + * This file is part of NetSurf, http://www.netsurf-browser.org/ + * + * NetSurf 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; version 2 of the License. + * + * NetSurf is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * 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, see <http://www.gnu.org/licenses/>. + */ + +/** + * \file + * Hack for assertion coverage output + */ + +/* Bring in the real __assert_fail */ +#include <assert.h> + +/* This is what everyone else calls */ +extern void +__ns_assert_fail(const char *__assertion, const char *__file, + unsigned int __line, const char *__function) + __THROW __attribute__ ((__noreturn__)); + +/* We use this to flush coverage data */ +extern void __gcov_flush(void); + +/* And here's our entry point */ +void +__ns_assert_fail(const char *__assertion, const char *__file, + unsigned int __line, const char *__function) +{ + __gcov_flush(); + __assert_fail(__assertion, __file, __line, __function); +} |