mirror of
https://github.com/netsurf-browser/netsurf
synced 2024-11-22 06:21:45 +03:00
e499f5c08f
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>
221 lines
6.2 KiB
Makefile
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
|