# # NetSurf unit tests TESTS := \ nsurl \ urldbtest \ nsoption \ bloom \ hashtable \ urlescape \ utils \ messages \ time #llcache # nsurl sources nsurl_SRCS := utils/corestrings.c utils/nsurl.c utils/idna.c \ test/log.c test/nsurl.c # url database test sources urldbtest_SRCS := content/urldb.c \ utils/idna.c utils/bloom.c utils/nsoption.c utils/nsurl.c \ utils/corestrings.c \ utils/hashtable.c utils/messages.c utils/time.c utils/utils.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 \ utils/base64.c utils/corestrings.c utils/hashtable.c \ utils/nsurl.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 := utils/utils.c utils/messages.c utils/hashtable.c \ utils/corestrings.c utils/nsurl.c utils/idna.c \ test/log.c test/utils.c # time test sources time_SRCS := utils/time.c test/log.c test/time.c # 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) else COV_CFLAGS ?= -O0 COV_CXXFLAGS ?= -O0 TESTROOT := build/$(HOST)-test 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 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 libidn) \ $(LIB_CFLAGS) \ $(COV_CFLAGS) TESTLDFLAGS := $(shell pkg-config --libs libcurl libparserutils libwapcaplet libdom libnsutils libutf8proc libidn) -lz \ $(LIB_LDFLAGS)\ $(COV_LDFLAGS) # 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)))))))) $$(VQ)echo "LINKTEST: $$@" $$(Q)$$(CC) $$(TESTCFLAGS) $$^ -o $$@ $$(TESTLDFLAGS) .PHONY:$(1)_test $(1)_test:$$(TESTROOT)/$(1) $$(VQ)echo "RUN TEST: $(1)" $$(Q)$$(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 # 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))))) .PHONY:test coverage test: $(TESTROOT)/created $(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