#!/usr/bin/make -f
# -*- makefile -*-

# The structure follows debian/rules of the python-opentelemetry source
# package: every upstream sub-project is built, installed and tested in its
# own loop iteration. Refer to README.Debian!

#export DH_VERBOSE = 1

export TMP_DIST-PACKAGES_FOLDER=$(CURDIR)/.pybuild/dist-packages/build

PYTHON_OPENTELEMETRY_PACKAGES=\
opentelemetry-instrumentation \
$(NULL)

PYTHON_OPENTELEMETRY_UTIL_PACKAGES=\
opentelemetry-util-http \
$(NULL)

PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGES=\
opentelemetry-instrumentation-aiohttp-client \
opentelemetry-instrumentation-aiohttp-server \
opentelemetry-instrumentation-asgi \
opentelemetry-instrumentation-aws-lambda \
opentelemetry-instrumentation-django \
opentelemetry-instrumentation-fastapi \
opentelemetry-instrumentation-flask \
opentelemetry-instrumentation-httpx \
opentelemetry-instrumentation-requests \
opentelemetry-instrumentation-system-metrics \
opentelemetry-instrumentation-wsgi \
$(NULL)

PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGES=\
opentelemetry-propagator-aws-xray \
$(NULL)

%:
	dh $@

override_dh_clean:
	dh_clean
	rm -rf .pybuild
	find -type d -name ".pytest_cache" -exec rm -rf {} \; -prune
	find -type d -name "__pycache__" -exec rm -rf {} \; -prune

override_dh_auto_build:
	for PYTHON_OPENTELEMETRY_PACKAGE in $(PYTHON_OPENTELEMETRY_PACKAGES); do \
	    echo "\n########\n# Building package $${PYTHON_OPENTELEMETRY_PACKAGE}\n########" ;\
	    PYBUILD_NAME=$${PYTHON_OPENTELEMETRY_PACKAGE} ;\
	    dh_auto_build --buildsystem=pybuild --sourcedirectory $${PYTHON_OPENTELEMETRY_PACKAGE} -- --name=$${PYTHON_OPENTELEMETRY_PACKAGE} ;\
	done
	for PYTHON_OPENTELEMETRY_UTIL_PACKAGE in $(PYTHON_OPENTELEMETRY_UTIL_PACKAGES); do \
	    echo "\n########\n# Building package $${PYTHON_OPENTELEMETRY_UTIL_PACKAGE}\n########" ;\
	    PYBUILD_NAME=$${PYTHON_OPENTELEMETRY_UTIL_PACKAGE} ;\
	    dh_auto_build --buildsystem=pybuild --sourcedirectory util/$${PYTHON_OPENTELEMETRY_UTIL_PACKAGE} -- --name=$${PYTHON_OPENTELEMETRY_UTIL_PACKAGE} ;\
	done
	for PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE in $(PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGES); do \
	    echo "\n########\n# Building package $${PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE}\n########" ;\
	    PYBUILD_NAME=$${PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE} ;\
	    dh_auto_build --buildsystem=pybuild --sourcedirectory instrumentation/$${PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE} -- --name=$${PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE} ;\
	done
	for PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE in $(PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGES); do \
	    echo "\n########\n# Building package $${PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE}\n########" ;\
	    PYBUILD_NAME=$${PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE} ;\
	    dh_auto_build --buildsystem=pybuild --sourcedirectory propagator/$${PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE} -- --name=$${PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE} ;\
	done
	# The sub-projects import each other (e.g. django needs wsgi and
	# util-http), so for the tests we copy all of them into one folder we
	# can use as PYTHONPATH.
	mkdir .pybuild/dist-packages && \
	for FOLDER in `find .pybuild/cpython3_3.*_opentelemetry-*/ -maxdepth 1 -type d -name build`; do \
	    echo "Copy $${FOLDER} -> .pybuild/dist-packages" ;\
	    cp -a $${FOLDER} .pybuild/dist-packages ;\
	done

override_dh_auto_install:
	for PYTHON_OPENTELEMETRY_PACKAGE in $(PYTHON_OPENTELEMETRY_PACKAGES); do \
	    echo "\n########\n# Installing package $${PYTHON_OPENTELEMETRY_PACKAGE}\n########" ;\
	    PYBUILD_NAME=$${PYTHON_OPENTELEMETRY_PACKAGE} ;\
	    dh_auto_install --buildsystem=pybuild --sourcedirectory $${PYTHON_OPENTELEMETRY_PACKAGE} -- --name=$${PYTHON_OPENTELEMETRY_PACKAGE} ;\
	done
	for PYTHON_OPENTELEMETRY_UTIL_PACKAGE in $(PYTHON_OPENTELEMETRY_UTIL_PACKAGES); do \
	    echo "\n########\n# Installing package $${PYTHON_OPENTELEMETRY_UTIL_PACKAGE}\n########" ;\
	    PYBUILD_NAME=$${PYTHON_OPENTELEMETRY_UTIL_PACKAGE} ;\
	    dh_auto_install --buildsystem=pybuild --sourcedirectory util/$${PYTHON_OPENTELEMETRY_UTIL_PACKAGE} -- --name=$${PYTHON_OPENTELEMETRY_UTIL_PACKAGE} ;\
	done
	for PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE in $(PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGES); do \
	    echo "\n########\n# Installing package $${PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE}\n########" ;\
	    PYBUILD_NAME=$${PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE} ;\
	    dh_auto_install --buildsystem=pybuild --sourcedirectory instrumentation/$${PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE} -- --name=$${PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE} ;\
	done
	for PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE in $(PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGES); do \
	    echo "\n########\n# Installing package $${PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE}\n########" ;\
	    PYBUILD_NAME=$${PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE} ;\
	    dh_auto_install --buildsystem=pybuild --sourcedirectory propagator/$${PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE} -- --name=$${PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE} ;\
	done

# The tests directory is passed explicitly, otherwise pytest picks up the
# testpaths of the repository-root pytest.ini, which points at the falcon
# instrumentation.
#
# A failing test suite does not stop the loops: all suites run, and the build
# fails at the end if any of them failed.
#
# The base package is tested against its own build dir only, like upstream
# does. Its auto_instrumentation tests load every installed instrumentor
# entry point, which with the shared folder imports django and breaks
# test_utils.py::UnwrapTestCase::test_noop_if_module_not_imported.
override_dh_auto_test:
ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
	set -e ;\
	for PYTHON_OPENTELEMETRY_PACKAGE in $(PYTHON_OPENTELEMETRY_PACKAGES); do \
	    echo "\n#######################\n# Run tests for $${PYTHON_OPENTELEMETRY_PACKAGE}\n#######################\n" ;\
	    cd $(CURDIR)/$${PYTHON_OPENTELEMETRY_PACKAGE} ;\
	    PYTHONPATH=`ls -d $(CURDIR)/.pybuild/cpython3_3.*_$${PYTHON_OPENTELEMETRY_PACKAGE}/build | head -n1` python3 -m pytest tests || echo $$PWD >> $(CURDIR)/.pybuild/tests-failed ;\
	done
	set -e ;\
	for PYTHON_OPENTELEMETRY_UTIL_PACKAGE in $(PYTHON_OPENTELEMETRY_UTIL_PACKAGES); do \
	    echo "\n#######################\n# Run tests for $${PYTHON_OPENTELEMETRY_UTIL_PACKAGE}\n#######################\n" ;\
	    cd $(CURDIR)/util/$${PYTHON_OPENTELEMETRY_UTIL_PACKAGE} ;\
	    PYTHONPATH=$(TMP_DIST-PACKAGES_FOLDER) python3 -m pytest tests || echo $$PWD >> $(CURDIR)/.pybuild/tests-failed ;\
	done
	set -e ;\
	for PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE in $(PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGES); do \
	    echo "\n#######################\n# Run tests for $${PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE}\n#######################\n" ;\
	    cd $(CURDIR)/instrumentation/$${PYTHON_OPENTELEMETRY_INSTRUMENTATION_PACKAGE} ;\
	    PYTHONPATH=$(TMP_DIST-PACKAGES_FOLDER) python3 -m pytest tests || echo $$PWD >> $(CURDIR)/.pybuild/tests-failed ;\
	done
	set -e ;\
	for PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE in $(PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGES); do \
	    echo "\n#######################\n# Run tests for $${PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE}\n#######################\n" ;\
	    cd $(CURDIR)/propagator/$${PYTHON_OPENTELEMETRY_PROPAGATOR_PACKAGE} ;\
	    PYTHONPATH=$(TMP_DIST-PACKAGES_FOLDER) python3 -m pytest tests || echo $$PWD >> $(CURDIR)/.pybuild/tests-failed ;\
	done
	test ! -e $(CURDIR)/.pybuild/tests-failed || { echo "Failed test suites:"; cat $(CURDIR)/.pybuild/tests-failed; false; }
endif
