Tests: fix project edit test sikuli IDE test.
Background click based on bitmap matching doesn't work.
Grid dots are not good match candidates.
Rendering probably affected by virtual display's bpp or rasterizer approximations.
#! gmake
# beremiz/tests/Makefile :
#
# Makefile to prepare and run Beremiz tests.
#
# For developper to:
# - quickly run a test (TDD) on current code
# - write new tests, debug existing tests
#
# Use cases :
#
# run given tests
# $ make run_python_exemple.sikuli
#
# run tests from particular test classes
# $ make ide_tests
#
# run one particular test in a Xnest window
# $ make xnest_run_python_exemple.sikuli
#
# run Xnest window with just xterm
# $ make xnest_xterm
#
# run Xnest window with sikuli IDE and xterm
# $ make xnest_sikuli
#
# build minimal beremiz and matiec to run tests
# $ make own_apps
#
# For CI/CD scripts to catch and report all failures. Use cases :
#
# run all tests
# $ make
#
#
# Test results, and other test byproducts are in $(test_dir),
# $(test_dir) defaults to $(HOME)/test and can be overloaded:
# $ make test_dir=${HOME}/other_test_dir
#
# Makefile attemps to use xvfb-run to run each test individually with its own
# X server instance. This behavior can be overloaded
# $ DISPLAY=:42 make xserver_command='echo "Using $DISPLAY X Server !";'
#
# Matiec and Beremiz code are expected to be clean, ready to build
# Any change in Matiec directory triggers rebuild of matiec.
# Any change in Matiec and Beremiz directory triggers copy of source code
# to $(test_dir)/build.
#
# BEREMIZPYTHONPATH is expected to be absolute path to python interpreter
#
# Please note:
# In order to run asside a freshly build Matiec, tested beremiz instance
# needs to run on code from $(test_dir)/build/beremiz, a fresh copy
# of the Beremiz directory $(src)/beremiz, where we run tests from.
#
all: source_check cli_tests ide_tests runtime_tests
# Variable $(src) is directory such that executed
# $(src)/Makefile is this file.
src := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
# $(workspace) is directory containing this project
workspace ?= $(abspath $(src)/../..)
test_dir ?= $(HOME)/test
build_dir = $(test_dir)/build
OWN_PROJECTS=beremiz matiec
tar_opts=--absolute-names --exclude=.hg --exclude=.git --exclude=.*.pyc --exclude=.*.swp
# sha1 checksum of source is used to force copy/compile on each change
define make_checksum_assign
$(1)_checksum = $(shell tar $(tar_opts) -c $(workspace)/$(1) | sha1sum | cut -d ' ' -f 1)
endef
$(foreach project,$(OWN_PROJECTS),$(eval $(call make_checksum_assign,$(project))))
$(build_dir):
mkdir -p $(build_dir)
define make_src_rule
$(build_dir)/$(1)/$($(1)_checksum).sha1: $(build_dir) $(workspace)/$(1)
rm -rf $(build_dir)/$(1)
tar -C $(workspace) $(tar_opts) -c $(1) | tar -C $(build_dir) -x
#cp -a $(workspace)/$(1) $(build_dir)/$(1)
touch $$@
endef
$(foreach project,$(OWN_PROJECTS),$(eval $(call make_src_rule,$(project))))
$(build_dir)/matiec/iec2c: | $(build_dir)/matiec/$(matiec_checksum).sha1
cd $(build_dir)/matiec && \
autoreconf -i && \
./configure && \
make
# TODO: use packge (deb/snap ?)
own_apps: $(build_dir)/matiec/iec2c $(build_dir)/beremiz/$(beremiz_checksum).sha1
touch $@
ide_test_dir = $(src)/ide_tests
sikuli_ide_tests = $(subst $(ide_test_dir)/,,$(wildcard $(ide_test_dir)/*.sikuli))
pytest_ide_tests = $(subst $(ide_test_dir)/,,$(wildcard $(ide_test_dir)/*.pytest))
define sikuli_idetest_command
(fluxbox >/dev/null 2>&1 &); BEREMIZPATH=$(build_dir)/beremiz sikulix -r $(src)/ide_tests/$(1) | tee test_stdout.txt; exit $$$${PIPESTATUS[0]}
endef
DELAY=400
KILL_DELAY=430
PYTEST=$(dir $(BEREMIZPYTHONPATH))/pytest
define pytest_idetest_command
(fluxbox >/dev/null 2>&1 &); PYTHONPATH=$(ide_test_dir) timeout -k $(KILL_DELAY) $(DELAY) $(PYTEST) --maxfail=1 --timeout=100 $(src)/ide_tests/$(1) | tee test_stdout.txt; exit $$$${PIPESTATUS[0]}
endef
# Xnest based interactive sessions for tests edit and debug.
# Would be nice with something equivalent to xvfb-run, waiting for USR1.
# Arbitrary "sleep 1" is probably enough for interactive use
define xnest_run
Xnest :42 -geometry 1920x1080+0+0 & export xnestpid=$$!; sleep 1; DISPLAY=:42 $(1); export res=$$?; kill $${xnestpid} 2>/dev/null; exit $${res}
endef
define prep_test
rm -rf $(test_dir)/$(1)_idetest
mkdir $(test_dir)/$(1)_idetest
cd $(test_dir)/$(1)_idetest
endef
xserver_command ?= xvfb-run -s '-screen 0 1920x1080x24'
define make_idetest_rule
$(test_dir)/$(1)_idetest/.passed: own_apps
$(call prep_test,$(1)); $(xserver_command) bash -c '$(call $(2),$(1))'
touch $$@
# Manually invoked rule {testname}.sikuli
$(1): $(test_dir)/$(1)_idetest/.passed
# Manually invoked rule xnest_{testname}.sikuli
# runs test in xnest so that one can see what happens
xnest_$(1): own_apps
$(call prep_test,$(1)); $$(call xnest_run, bash -c '$(call $(2),$(1))')
ide_tests_targets += $(test_dir)/$(1)_idetest/.passed
endef
$(foreach idetest,$(sikuli_ide_tests),$(eval $(call make_idetest_rule,$(idetest),sikuli_idetest_command)))
$(foreach idetest,$(pytest_ide_tests),$(eval $(call make_idetest_rule,$(idetest),pytest_idetest_command)))
ide_tests : $(ide_tests_targets)
echo "$(ide_tests_targets) : Passed"
xnest_xterm: own_apps
$(call xnest_run, bash -c '(fluxbox &);xterm')
xnest_sikuli: own_apps
$(call xnest_run, bash -c '(fluxbox &);(BEREMIZPATH=$(build_dir)/beremiz xterm -e sikulix &);xterm')
xvfb_sikuli: own_apps
echo "******************************************"
echo "On host, run 'xvncviewer 127.0.0.1:5900' to see sikuli X session"
echo "Docker container must be created with TESTDEBUG=YES. For example :"
echo "./clean_docker_container.sh && ./build_docker_image.sh && TESTDEBUG=YES ./create_docker_container.sh && ./build_in_docker.sh xvfb_sikuli"
echo "******************************************"
$(xserver_command) bash -c '(fluxbox &);(x11vnc &);(BEREMIZPATH=$(build_dir)/beremiz xterm -e sikulix &);xterm'
clean:
rm -rf $(ide_tests_targets) $(build_dir)
# TODOs
source_check:
echo TODO $@
cli_tests :
echo TODO $@
runtime_tests:
echo TODO $@