include $(top_srcdir)/common/check.mak

CHECK_REGISTRY = $(top_builddir)/tests/check/test-registry.reg

GST_TOOLS_DIR = $(top_builddir)/tools

REGISTRY_ENVIRONMENT = \
	GST_REGISTRY=$(CHECK_REGISTRY)

AM_TESTS_ENVIRONMENT += \
        GST_STATE_IGNORE_ELEMENTS="$(STATE_IGNORE_ELEMENTS)"	\
        $(REGISTRY_ENVIRONMENT)					\
        GST_PLUGIN_SCANNER_1_0=$(top_builddir)/libs/gst/helpers/gst-plugin-scanner \
        GST_PLUGIN_SYSTEM_PATH_1_0=					\
        GST_PLUGIN_PATH_1_0=$(top_builddir)/plugins

plugindir = $(libdir)/gstreamer-@GST_API_VERSION@

# override to _not_ install the test plugins
install-pluginLTLIBRARIES:

# the core dumps of some machines have PIDs appended, test registry and
# profiling data
CLEANFILES = core core.* test-registry.* *.gcno *.gcda

SUPPRESSIONS = $(top_srcdir)/common/gst.supp

clean-local: clean-local-check

# These tests don't even build any longer:
#   gst/gstindex.c

if GST_DISABLE_PARSE
PARSE_CHECKS = pipelines/parse-disabled
else
PARSE_CHECKS = pipelines/simple-launch-lines pipelines/cleanup pipelines/parse-launch
endif

# Do not run the abi test in case any option which causes the API to change has
# been used
if !GST_DISABLE_REGISTRY
ABI_CHECKS = gst/gstabi
endif

if !GST_DISABLE_GST_DEBUG
PRINTF_CHECKS = gst/gstprintf
else
PRINTF_CHECKS =
endif

LIBSABI_CHECKS = libs/libsabi

if HAVE_CXX
CXX_CHECKS = gst/gstcpp libs/gstlibscpp
else
CXX_CHECKS =
endif

# if it's calling gst_element_factory_make(), it will probably not work without
# a registry
if GST_DISABLE_REGISTRY
REGISTRY_CHECKS =
else
REGISTRY_CHECKS =				\
	gst/gst					\
	gst/gstbin				\
	gst/gstchildproxy			\
	gst/gstcontext				\
	gst/gstcontroller			\
	gst/gstelement				\
	gst/gstelementfactory			\
	gst/gstevent				\
	gst/gstghostpad				\
	gst/gstplugin				\
	gst/gstpreset				\
	gst/gstprotection			\
	gst/gstquery				\
	gst/gstregistry				\
	gst/gsturi  				\
	gst/gstutils				\
	generic/sinks				\
	elements/capsfilter			\
	elements/concat				\
	elements/dataurisrc			\
	elements/fakesink			\
	elements/fakesrc			\
	elements/fdsrc			  	\
	elements/filesink			\
	elements/filesrc			\
	elements/funnel				\
	elements/identity			\
	elements/multiqueue			\
	elements/selector			\
	elements/tee			  	\
	elements/queue                          \
	elements/queue2                         \
	elements/valve                          \
	elements/streamiddemux			\
	libs/baseparse				\
	libs/basesrc				\
	libs/basesink				\
	libs/sparsefile				\
	libs/controller				\
	libs/queuearray				\
	libs/typefindhelper			\
	pipelines/seek				\
	pipelines/stress			\
	pipelines/queue-error
endif

check_PROGRAMS =				\
	$(ABI_CHECKS)			     	\
	gst/gstatomicqueue			\
	gst/gstbuffer				\
	gst/gstbufferlist			\
	gst/gstbufferpool			\
	gst/gstmeta				\
	gst/gstmemory				\
	gst/gstbus				\
	gst/gstcaps     			\
	gst/gstcapsfeatures    			\
	$(CXX_CHECKS)			     	\
	gst/gstdatetime     			\
	gst/gstdeinit				\
	gst/gstdevice				\
	gst/gstinfo		 		\
	gst/gstiterator 			\
	gst/gstmessage	 			\
	gst/gstminiobject 			\
	gst/gstobject				\
	gst/gstpad				\
	gst/gstparamspecs			\
	gst/gstpipeline				\
	gst/gstpoll     			\
	gst/gstprotection     			\
	$(PRINTF_CHECKS)			\
	gst/gstpromise				\
	gst/gstsegment				\
	gst/gstsystemclock			\
	gst/gstclock				\
	gst/gststream				\
	gst/gststructure			\
	gst/gsttag				\
	gst/gsttracerrecord		 		\
	gst/gsttagsetter			\
	gst/gsttask				\
	gst/gsttoc				\
	gst/gsttocsetter			\
	gst/gstvalue				\
	generic/states				\
	$(PARSE_CHECKS)				\
	$(REGISTRY_CHECKS)			\
	$(LIBSABI_CHECKS)		     	\
	libs/adapter				\
	libs/aggregator				\
	libs/bitreader				\
	libs/bitwriter				\
	libs/bytereader				\
	libs/bytewriter				\
	libs/bitreader-noinline		\
	libs/bytereader-noinline	\
	libs/bytewriter-noinline	\
	libs/flowcombiner			\
	libs/sparsefile				\
	libs/collectpads			\
	libs/gstharness				\
	libs/gstnetclientclock			\
	libs/gstnettimeprovider			\
	libs/gsttestclock			\
	libs/transform1				\
	libs/transform2				\
	tools/gstinspect

# failing tests
noinst_PROGRAMS =

# elements to ignore for the state tests
# STATE_IGNORE_ELEMENTS =

TESTS = $(check_PROGRAMS)

noinst_HEADERS = \
	gst/capslist.h \
	gst/struct_arm.h \
	gst/struct_i386.h \
	gst/struct_i386w.h \
	gst/struct_hppa.h \
	gst/struct_ppc32.h \
	gst/struct_ppc64.h \
	gst/struct_sparc.h \
	gst/struct_x86_64.h \
	gst/struct_x86_64w.h \
	libs/struct_arm.h \
	libs/struct_i386.h \
	libs/struct_hppa.h \
	libs/struct_ppc32.h \
	libs/struct_ppc64.h \
	libs/struct_sparc.h \
	libs/struct_x86_64.h

EXTRA_DIST = \
	libs/test_transform.c

AM_CFLAGS = $(PTHREAD_CFLAGS) $(GST_OBJ_CFLAGS) -UG_DISABLE_ASSERT -UG_DISABLE_CAST_CHECKS \
	-DGST_CHECK_TEST_ENVIRONMENT_BEACON="\"GST_STATE_IGNORE_ELEMENTS\""
AM_CXXFLAGS = $(GST_OBJ_CXXFLAGS) -UG_DISABLE_ASSERT -UG_DISABLE_CAST_CHECKS \
	-DGST_CHECK_TEST_ENVIRONMENT_BEACON="\"GST_STATE_IGNORE_ELEMENTS\""
LDADD = $(top_builddir)/libs/gst/check/libgstcheck-@GST_API_VERSION@.la \
	$(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \
	$(GST_OBJ_LIBS)

gst_gstcpp_SOURCES = gst/gstcpp.cc

libs_gstlibscpp_SOURCES = libs/gstlibscpp.cc

gst_gsttracerrecord_CFLAGS = $(GST_OBJ_CFLAGS) $(AM_CFLAGS) -DGST_USE_UNSTABLE_API

gst_gstutils_LDADD = $(LDADD) $(GSL_LIBS) $(GMP_LIBS)

gst_gstprintf_LDADD = \
	$(top_builddir)/gst/printf/libgstprintf.la \
	$(LDADD)

elements_fdsrc_CFLAGS=$(GST_OBJ_CFLAGS) $(AM_CFLAGS) \
	-DTESTFILE=\"$(top_srcdir)/configure.ac\"
elements_filesrc_CFLAGS=$(GST_OBJ_CFLAGS) $(AM_CFLAGS) \
	-DTESTFILE=\"$(top_srcdir)/configure.ac\"

libs_controller_LDADD = \
	$(top_builddir)/libs/gst/controller/libgstcontroller-@GST_API_VERSION@.la \
	$(LDADD)
libs_gstnetclientclock_LDADD = \
	$(top_builddir)/libs/gst/net/libgstnet-@GST_API_VERSION@.la \
	$(LDADD)
libs_gstnettimeprovider_LDADD = \
	$(top_builddir)/libs/gst/net/libgstnet-@GST_API_VERSION@.la \
	$(GIO_LIBS) $(LDADD)

# valgrind testing
# these just need valgrind fixing, period
VALGRIND_TO_FIX = \
	gst/gstinfo \
	gst/gsttracerrecord \
	tools/gstinspect

VALGRIND_IGNORE = \
	pipelines/stress

# these need fixing because the threads cause segfaults under valgrind
TESTS_THREADED =				\
	gst/gstminiobject 			\
	gst/gstobject

VALGRIND_TESTS_DISABLE = 					\
	$(TESTS_THREADED)					\
	$(VALGRIND_IGNORE)					\
	$(VALGRIND_TO_FIX)

# indexers does not get tested yet
COVERAGE_DIRS = \
	gst \
	libs/gst/base \
	libs/gst/controller \
	libs/gst/check \
	libs/gst/net \
	plugins/elements
COVERAGE_FILES = $(foreach dir,$(COVERAGE_DIRS),$(wildcard $(top_builddir)/$(dir)/*.gcov))
COVERAGE_FILES_REL = $(subst $(top_builddir)/,,$(COVERAGE_FILES))
COVERAGE_OUT_FILES = $(foreach dir,$(COVERAGE_DIRS),$(wildcard $(top_builddir)/$(dir)/*.gcov.out))
COVERAGE_OUT_FILES_REL = $(subst $(top_builddir)/,,$(COVERAGE_OUT_FILES))

debug:
	echo $(COVERAGE_FILES)
	echo $(COVERAGE_FILES_REL)

.PHONY: coverage
if GST_GCOV_ENABLED
# we rebuild a registry and do gst-inspect so that all the get/set codepaths
# are also covered
coverage:
	for file in `find $(top_builddir) -name '*.gcda'`; do rm $$file; done
	-rm $(CHECK_REGISTRY)
	echo "Inspecting all elements"
	for e in `$(GST_INSPECT) | head -n -2 | cut -d: -f2`; do $(GST_INSPECT) $$e > /dev/null 2>&1; done
	make check
	make coverage-report
else
coverage:
	echo "You need to configure with --enable-gcov to get coverage data"
	exit 1
endif

coverage-report:
	rm -r coverage
	for dir in $(COVERAGE_DIRS); do 				\
	  mkdir -p coverage/$$dir; 					\
	  make -C $(top_builddir)/$$dir gcov;				\
        done
	for dir in $(COVERAGE_DIRS); do					\
	    files="`ls $(top_builddir)/$$dir/*.gcov.out 2> /dev/null`"; \
          if test ! -z "$$files"; then					\
	    perl $(top_srcdir)/common/coverage/coverage-report.pl 	\
	      $(top_builddir)/$$dir/*.gcov.out >			\
	      coverage/$$dir/index.xml;					\
	    xsltproc $(top_srcdir)/common/coverage/coverage-report.xsl	\
	      coverage/$$dir/index.xml > coverage/$$dir/index.html;	\
	  fi; \
        done
	for file in $(COVERAGE_FILES_REL); do				\
	  echo Generating coverage/$$file.html; 			\
	  perl $(top_srcdir)/common/coverage/coverage-report-entry.pl   \
	    $(top_builddir)/$$file > coverage/$$file.html; 		\
	done
