netsurf/test/Makefile
Daniel Silverstone e499f5c08f Support coverage flushing on assert()
When assert() is called, which is not uncommon in utility code within NetSurf,
we lose coverage data for anything done before the assert() in the test.  This
commit corrects that oversight but is at least slightly GCC specific and may
need tweaks for non-Linux platforms.

By default, 'make coverage' will enable assert coverage, and it can be disabled
with 'make coverage NOASSERTCOVERAGE=yes' if necessary.

Signed-off-by: Daniel Silverstone <dsilvers@netsurf-browser.org>
2017-03-31 18:53:52 +01:00

221 lines
6.2 KiB
Makefile

#
# NetSurf unit tests
TESTS := \
nsurl \
urldbtest \
nsoption \
bloom \
hashtable \
urlescape \
utils \
messages \
time \
mimesniff \
corestrings #llcache
# sources necessary to use nsurl functionality
NSURL_SOURCES := utils/nsurl/nsurl.c utils/nsurl/parse.c utils/idna.c \
utils/punycode.c
# nsurl sources
nsurl_SRCS := $(NSURL_SOURCES) utils/corestrings.c test/log.c test/nsurl.c
# url database test sources
urldbtest_SRCS := $(NSURL_SOURCES) \
utils/bloom.c utils/nsoption.c utils/corestrings.c utils/time.c \
utils/hashtable.c utils/messages.c utils/utils.c \
content/urldb.c \
test/log.c test/urldbtest.c
# low level cache sources
llcache_SRCS := content/fetch.c content/fetchers/curl.c \
content/fetchers/about.c content/fetchers/data.c \
content/fetchers/resource.c content/llcache.c \
content/urldb.c \
image/image_cache.c \
$(NSURL_SOURCES) utils/base64.c utils/corestrings.c utils/hashtable.c \
utils/messages.c utils/url.c utils/useragent.c utils/utils.c \
test/log.c test/llcache.c
# messages test sources
messages_SRCS := utils/messages.c utils/hashtable.c test/log.c test/messages.c
# nsoption test sources
nsoption_SRCS := utils/nsoption.c test/log.c test/nsoption.c
# Bloom filter test sources
bloom_SRCS := utils/bloom.c test/bloom.c
# hash table test sources
hashtable_SRCS := utils/hashtable.c test/log.c test/hashtable.c
# url escape test sources
urlescape_SRCS := utils/url.c test/log.c test/urlescape.c
# utility test sources
utils_SRCS := $(NSURL_SOURCES) utils/utils.c utils/messages.c \
utils/hashtable.c utils/corestrings.c \
test/log.c test/utils.c
# time test sources
time_SRCS := utils/time.c test/log.c test/time.c
# mimesniff test sources
mimesniff_SRCS := $(NSURL_SOURCES) utils/hashtable.c utils/corestrings.c \
utils/http/generics.c utils/http/content-type.c \
utils/http/primitives.c utils/messages.c utils/http/parameter.c \
content/mimesniff.c \
test/log.c test/mimesniff.c
# corestrings test sources
corestrings_SRCS := $(NSURL_SOURCES) utils/corestrings.c \
test/log.c test/corestrings.c
corestrings_LD := -lmalloc_fig
# Coverage builds need additional flags
COV_ROOT := build/$(HOST)-coverage
ifeq ($(MAKECMDGOALS),coverage)
COV_CFLAGS ?= -fprofile-arcs -ftest-coverage -O0
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
# Extend flags with appropriate values from pkg-config for enabled features
#
# 1: pkg-config required modules for feature
# 2: Human-readable name for the feature
define pkg_cfg_detect_lib
ifeq ($$(PKG_CONFIG),)
$$(error pkg-config is required to auto-detect feature availability)
endif
PKG_CONFIG_$(1)_EXISTS := $$(shell $$(PKG_CONFIG) --exists $(1) && echo yes)
ifeq ($$(PKG_CONFIG_$(1)_EXISTS),yes)
LIB_CFLAGS += $$(shell $$(PKG_CONFIG) --cflags $(1))
LIB_CXXFLAGS += $$(shell $$(PKG_CONFIG) --cflags $(1))
LIB_LDFLAGS += $$(shell $$(PKG_CONFIG) --libs $(1))
ifneq ($(MAKECMDGOALS),clean)
$$(info PKG.CNFG: $(2) ($(1)) enabled)
endif
else
ifneq ($(MAKECMDGOALS),clean)
$$(info PKG.CNFG: $(2) ($(1)) disabled)
endif
endif
endef
$(eval $(call pkg_cfg_detect_lib,check,Check))
COMMON_WARNFLAGS = -W -Wall -Wundef -Wpointer-arith -Wcast-align \
-Wwrite-strings -Wmissing-declarations -Wuninitialized
ifneq ($(CC_MAJOR),2)
COMMON_WARNFLAGS += -Wno-unused-parameter
endif
BASE_TESTCFLAGS := -std=c99 -g \
$(COMMON_WARNFLAGS) \
-D_BSD_SOURCE \
-D_POSIX_C_SOURCE=200809L \
-D_XOPEN_SOURCE=600 \
-Itest -Iinclude -Icontent/handlers -Ifrontends -I. -I.. \
-Dnsgtk \
$(shell pkg-config --cflags libcurl libparserutils libwapcaplet libdom libnsutils libutf8proc) \
$(LIB_CFLAGS)
TESTCFLAGS := $(BASE_TESTCFLAGS) \
$(COV_CFLAGS) \
$(COV_CPPFLAGS)
TESTLDFLAGS := -L$(TESTROOT) \
$(shell pkg-config --libs libcurl libparserutils libwapcaplet libdom libnsutils libutf8proc) -lz \
$(LIB_LDFLAGS)\
$(COV_LDFLAGS)
# malloc faliure injection generator
$(TESTROOT)/libmalloc_fig.so:test/malloc_fig.c
$(CC) -shared -fPIC -I. -std=c99 $(COMMON_WARNFLAGS) $^ -o $@
# Source files for all tests being compiled
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) $$(NOCOV_TESTSOURCES))))))))
$$(VQ)echo "LINKTEST: $$@"
$$(Q)$$(CC) $$(TESTCFLAGS) $$^ -o $$@ $$($(1)_LD) $$(TESTLDFLAGS)
.PHONY:$(1)_test
$(1)_test:$$(TESTROOT)/$(1)
$$(VQ)echo "RUN TEST: $(1)"
$$(Q)LD_LIBRARY_PATH=$$(TESTROOT)/ $$(TESTROOT)/$(1)
TESTSOURCES += $$($(1)_SRCS)
endef
define compile_test_target_c
$$(TESTROOT)/$(2): $(1) $$(TESTROOT)/created
$$(VQ)echo " COMPILE: $(1)"
$$(Q)$$(RM) $$(TESTROOT)/$(2)
$$(Q)$$(CC) $$(TESTCFLAGS) -o $$(TESTROOT)/$(2) -c $(1)
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
test: $(TESTROOT)/created $(TESTROOT)/libmalloc_fig.so $(addsuffix _test,$(TESTS))
coverage: test
$(TESTROOT)/created:
$(VQ)echo " MKDIR: $(TESTROOT)"
$(Q)$(MKDIR) -p $(TESTROOT)
$(Q)$(TOUCH) $@
.PHONY: test-clean
test-clean:
$(VQ)echo " CLEAN: $(TESTROOT)"
$(VQ)echo " CLEAN: $(COV_ROOT)"
$(Q)$(RM) -r $(TESTROOT) $(COV_ROOT)
CLEANS += test-clean