if ENABLE_CYPRESS export NODE_PATH=$(abs_builddir)/node_modules V = $(if $(verbose),,@) abs_dir = $(if $(filter $(abs_builddir),$(abs_srcdir)),.,$(abs_srcdir)) CYPRESS_BINARY = $(abs_builddir)/node_modules/cypress/bin/cypress ESLINT_BINARY = $(abs_builddir)/node_modules/eslint/bin/eslint.js WAIT_ON_BINARY = $(abs_builddir)/node_modules/wait-on/bin/wait-on GET_PORT_BINARY = $(abs_builddir)/node_modules/get-port-cli/cli.js NPM_INSTALLED = $(abs_builddir)/workdir/npm_installed CAPABILITIES = $(if @ENABLE_SETCAP@,true,false) CYPRESS_CONFIG = $(abs_srcdir)/cypress.config.ts SERVER_ARG = $(subst :, ,$(shell basename $(if $(coolwsd),$(coolwsd),http://localhost:9980))) COOLWSD_SERVER = $(firstword $(SERVER_ARG)) FREE_PORT = $(lastword $(SERVER_ARG)) export COOLWSD_SERVER export FREE_PORT PARALLEL_SCRIPT = $(abs_srcdir)/run_parallel.sh PID_FILE=$(abs_builddir)/workdir/coolwsd.pid ERROR_LOG=$(abs_builddir)/workdir/error.log COOLWSD_LOG=$(abs_builddir)/cypress/wsd_logs/coolwsd.log COOLWSD_OUTPUT=$(abs_builddir)/cypress/wsd_logs/coolwsd_output.log SUPPORT_FILE_ABS = $(abs_srcdir)/support/index.js SUPPORT_FILE = $(if $(findstring $(abs_srcdir),$(abs_builddir)),support/index.js,$(SUPPORT_FILE_ABS)) DESKTOP_USER_AGENT = "cypress" DESKTOP_TEST_FOLDER = $(abs_srcdir)/integration_tests/desktop DESKTOP_DATA_FOLDER = $(abs_srcdir)/data/desktop/ DESKTOP_DATA_WORKDIR = $(if $(coolwsd),$(DESKTOP_DATA_FOLDER),$(abs_builddir)/workdir/data/desktop/) DESKTOP_TRACK_FOLDER = $(abs_builddir)/workdir/track/desktop IDLE_USER_AGENT = "cypress" IDLE_TEST_FOLDER = $(abs_srcdir)/integration_tests/idle IDLE_DATA_FOLDER = $(abs_srcdir)/data/idle/ IDLE_DATA_WORKDIR = $(if $(coolwsd),$(IDLE_DATA_FOLDER),$(abs_builddir)/workdir/data/idle/) IDLE_TRACK_FOLDER = $(abs_builddir)/workdir/track/idle MOBILE_USER_AGENT = "cypress-mobile" MOBILE_TEST_FOLDER = $(abs_srcdir)/integration_tests/mobile MOBILE_DATA_FOLDER = $(abs_srcdir)/data/mobile/ MOBILE_DATA_WORKDIR = $(if $(coolwsd),$(MOBILE_DATA_FOLDER),$(abs_builddir)/workdir/data/mobile/) MOBILE_TRACK_FOLDER = $(abs_builddir)/workdir/track/mobile MULTIUSER_TEST_FOLDER = $(abs_srcdir)/integration_tests/multiuser MULTIUSER_DATA_FOLDER = $(abs_srcdir)/data/multiuser/ MULTIUSER_DATA_WORKDIR = $(if $(coolwsd),$(MULTIUSER_DATA_FOLDER),$(abs_builddir)/workdir/data/multiuser/) MULTIUSER_TRACK_FOLDER=$(abs_builddir)/workdir/track/multiuser USER_INTERFACE = classic UPDATE_SCREENSHOT = false PHP_PROXY_PORT = 9983 NEXTCLOUD_PORT = 9980 ALLOWED_PORTS = $(if $(findstring php-proxy, $(CYPRESS_INTEGRATION)),$(PHP_PROXY_PORT),\ $(if $(findstring nextcloud, $(CYPRESS_INTEGRATION)),$(NEXTCLOUD_PORT),$(shell seq 9900 1 9980))) KILL_COMMAND=$(if $(coolwsd),true,pkill -F $(PID_FILE) || pkill --signal SIGKILL -F $(PID_FILE)) PARALLEL_BUILD = $(findstring -j,$(MAKEFLAGS)) DISPLAY_NUMBER = 100 HEADLESS_BUILD := $(findstring Command failed,$(shell xhost > /dev/null 2>&1 || echo "Command failed, so we are in a headless environment.")) export HEADLESS_DISPLAY=$(shell who | grep `whoami` | grep -v ": " | xargs | cut -d " " -f2) export DISPLAY=$(if $(HEADLESS_BUILD),:$(DISPLAY_NUMBER),$(shell echo $$DISPLAY)) COMMA :=, EMPTY := SPACE :=$(EMPTY) $(EMPTY) CORE_VERSION := $(subst $(SPACE),_,$(shell "@LO_PATH@"/program/soffice.bin --version 2> /dev/null)) BROWSER:=$(if $(CYPRESS_BROWSER),$(CYPRESS_BROWSER),$(CHROME)) A11Y_ENABLE:=$(if $(CYPRESS_A11Y),$(CYPRESS_A11Y),true) A11Y_TAG:=$(if $(findstring true,$(A11Y_ENABLE)),taga11yenabled,taga11ydisabled) if ENABLE_DEBUG FILTER_DEBUG=cypress:electron,cypress:launcher export DEBUG=$(if $(ENABLE_LOGGING),$(FILTER_DEBUG),) endif if HAVE_LO_PATH MOBILE_TEST_FILES=$(subst $(MOBILE_TEST_FOLDER)/,,$(wildcard $(MOBILE_TEST_FOLDER)/*_spec.js) $(wildcard $(MOBILE_TEST_FOLDER)/*/*_spec.js)) DESKTOP_TEST_FILES=$(subst $(DESKTOP_TEST_FOLDER)/,,$(wildcard $(DESKTOP_TEST_FOLDER)/*_spec.js) $(wildcard $(DESKTOP_TEST_FOLDER)/*/*_spec.js)) IDLE_TEST_FILES=$(subst $(IDLE_TEST_FOLDER)/,,$(wildcard $(IDLE_TEST_FOLDER)/*_spec.js) $(wildcard $(IDLE_TEST_FOLDER)/*/*_spec.js)) MULTIUSER_TEST_FILES=$(subst $(MULTIUSER_TEST_FOLDER)/,,$(wildcard $(MULTIUSER_TEST_FOLDER)/*_spec.js) $(wildcard $(MULTIUSER_TEST_FOLDER)/*/*_spec.js)) MOBILE_TEST_FILES_DONE= \ $(foreach test_file,$(MOBILE_TEST_FILES),$(MOBILE_TRACK_FOLDER)/$(test_file).done) DESKTOP_TEST_FILES_DONE= \ $(foreach test_file,$(DESKTOP_TEST_FILES),$(DESKTOP_TRACK_FOLDER)/$(test_file).done) IDLE_TEST_FILES_DONE= \ $(foreach test_file,$(IDLE_TEST_FILES),$(IDLE_TRACK_FOLDER)/$(test_file).done) MULTIUSER_TESTS_DONE= \ $(MULTIUSER_TRACK_FOLDER)/multiuser_tests.done check-local: do-check $(if $(wildcard $(ERROR_LOG)),$(error CypressError: some tests failed!)) # TODO: enable multiuser tests $(MULTIUSER_TESTS_DONE) do-check: $(DESKTOP_TEST_FILES_DONE) $(MOBILE_TEST_FILES_DONE) $(IDLE_TEST_FILES_DONE) $(V)$(KILL_COMMAND) || true $(if $(HEADLESS_BUILD),$(V)pkill Xvfb,) $(if $(wildcard $(ERROR_LOG)),$(V)cat $(ERROR_LOG)) $(PID_FILE): @JAILS_PATH@ $(NODE_BINS) $(call cleanup_before_run) $(call run_JS_error_check) $(if $(HEADLESS_BUILD),$(call start_Xvfb),) $(call start_coolwsd) setup_short_idle: $(eval SHORT_IDLE=1) setup_regular_idle: $(eval SHORT_IDLE=) start_short_idle_coolwsd: @JAILS_PATH@ $(NODE_BINS) setup_short_idle $(V)$(KILL_COMMAND) || true $(if $(HEADLESS_BUILD),$(V)pkill Xvfb,) $(call cleanup_before_run) $(call run_JS_error_check) $(if $(HEADLESS_BUILD),$(call start_Xvfb),) $(call start_coolwsd) $(MOBILE_TEST_FILES_DONE): $(PID_FILE) $(DESKTOP_TEST_FILES_DONE) $(if $(PARALLEL_BUILD),\ $(call run_mobile_tests,$(subst $(MOBILE_TRACK_FOLDER)/,,$(basename $@)),$(basename $@).log),\ $(call run_mobile_tests)) $(if $(PARALLEL_BUILD),\ $(V)mkdir -p $(dir $@) && touch $@\ ,\ $(V)$(foreach done_file,$(MOBILE_TEST_FILES_DONE),mkdir -p $(dir $(done_file)) && touch $(done_file) &&) true\ ) $(DESKTOP_TEST_FILES_DONE): $(PID_FILE) $(if $(PARALLEL_BUILD),\ $(call run_desktop_tests,$(subst $(DESKTOP_TRACK_FOLDER)/,,$(basename $@)),$(basename $@).log),\ $(call run_desktop_tests)) $(if $(PARALLEL_BUILD),\ $(V)mkdir -p $(dir $@) && touch $@\ ,\ $(V)$(foreach done_file,$(DESKTOP_TEST_FILES_DONE),mkdir -p $(dir $(done_file)) && touch $(done_file) &&) true\ ) $(MULTIUSER_TESTS_DONE): $(PID_FILE) $(MOBILE_TEST_FILES_DONE) $(IDLE_TEST_FILES_DONE) $(call run_all_multiuser_tests) $(V)mkdir -p $(dir $@) && touch $@ $(IDLE_TEST_FILES_DONE): start_short_idle_coolwsd $(PID_FILE) $(if $(PARALLEL_BUILD),\ $(call run_idle_tests,$(subst $(IDLE_TRACK_FOLDER)/,,$(basename $@)),$(basename $@).log),\ $(call run_idle_tests)) $(if $(PARALLEL_BUILD),\ $(V)mkdir -p $(dir $@) && touch $@\ ,\ $(V)$(foreach done_file,$(IDLE_TEST_FILES_DONE),mkdir -p $(dir $(done_file)) && touch $(done_file) &&) true\ ) @JAILS_PATH@: mkdir -p $@ define run_JS_error_check $(V)echo "Checking for JS errors in test code..." $(V)echo $(V)$(NODE) $(ESLINT_BINARY) $(abs_srcdir) \ --ignore-path $(abs_srcdir)/.eslintignore --config $(abs_srcdir)/.eslintrc $(V)echo endef define start_coolwsd $(if $(coolwsd),true,$(call start_coolwsd_instance)) endef define start_coolwsd_instance $(eval FREE_PORT:=$(shell $(GET_PORT_BINARY) --host=127.0.0.1 $(ALLOWED_PORTS))) export $FREE_PORT $(if $(findstring php-proxy, $(CYPRESS_INTEGRATION)),\ $(if $(findstring $(PHP_PROXY_PORT),$(FREE_PORT)),,$(error CypressError: $(PHP_PROXY_PORT) port is unavailable!))) $(if $(findstring nextcloud, $(CYPRESS_INTEGRATION)),\ $(if $(findstring $(NEXTCLOUD_PORT),$(FREE_PORT)),,$(error CypressError: $(NEXTCLOUD_PORT) port is unavailable!))) $(V)echo "Found available port for testing: $(FREE_PORT)" $(V)echo $(V)echo "Launching coolwsd..." $(V)fc-cache "@LO_PATH@"/share/fonts/truetype $(V)echo $(V)mkdir -p $(dir $(COOLWSD_OUTPUT)) ../coolwsd --o:sys_template_path="@SYSTEMPLATE_PATH@" \ --o:child_root_path="@JAILS_PATH@" --o:storage.filesystem[@allow]=true \ --o:security.capabilities="$(CAPABILITIES)" \ --disable-ssl --forcecaching \ --o:ssl.cert_file_path="$(abs_top_srcdir)/etc/cert.pem" \ --o:ssl.key_file_path="$(abs_top_srcdir)/etc/key.pem" \ --o:ssl.ca_file_path="$(abs_top_srcdir)/etc/ca-chain.cert.pem" \ --o:admin_console.username=admin --o:admin_console.password=admin \ --o:logging.file[@enable]=true --o:logging.level=trace \ --o:logging.disabled_areas="" --o:welcome.enable=false \ --o:user_interface.mode=$(USER_INTERFACE) \ --o:accessibility.enable=$(A11Y_ENABLE) \ --o:security.enable_macros_execution=true \ $(if $(SHORT_IDLE),--o:per_view.out_of_focus_timeout_secs=1) \ $(if $(SHORT_IDLE),--o:per_view.idle_timeout_secs=7) \ --port=$(FREE_PORT) \ --pidfile=$(PID_FILE) \ --o:logging.file.property[0]=$(COOLWSD_LOG) \ --unattended \ $(if $(findstring php-proxy, $(CYPRESS_INTEGRATION)),--o:net.proxy_prefix=true) \ > $(COOLWSD_OUTPUT) 2>&1 & $(V)$(WAIT_ON_BINARY) http://localhost:$(FREE_PORT) --timeout 60000 || (echo ==dump coolwsd.log== && cat $(COOLWSD_OUTPUT) && exit 1) $(V)echo endef #https://docs.cypress.io/guides/guides/continuous-integration.html#Xvfb define start_Xvfb $(V)echo "Launching Xvfb..." Xvfb :$(DISPLAY_NUMBER) -screen 0 1280x800x24 & while [ ! -f /tmp/.X$(DISPLAY_NUMBER)-lock ] ; do sleep 1; done $(V)echo endef define cleanup_before_run $(V)rm -f $(ERROR_LOG) $(V)rm -f $(PID_FILE) $(V)rm -rf cypress endef NODE_BINS = \ $(CYPRESS_BINARY) \ $(ESLINT_BINARY) \ $(WAIT_ON_BINARY) \ $(GET_PORT_BINARY) $(NODE_BINS): $(NPM_INSTALLED); $(NPM_INSTALLED): package.json eslint_plugin/index.js eslint_plugin/package.json $(V)npm install $(V)echo node_modules: $(V)ls node_modules $(V)mkdir -p $(dir $(NPM_INSTALLED)) $(V)touch $(NPM_INSTALLED) clean-local: rm -rf node_modules rm -rf workdir rm -rf cypress rm -rf package-lock.json rm -rf .nyc_output rm -rf coverage ############### # Mobile tests. ############### check-mobile: @JAILS_PATH@ $(NODE_BINS) $(call cleanup_before_run) $(call run_JS_error_check) $(if $(HEADLESS_BUILD),$(call start_Xvfb),) $(call start_coolwsd) $(call run_mobile_tests,$(spec)) $(if $(HEADLESS_BUILD),$(V)pkill Xvfb,) $(V)$(KILL_COMMAND) || true run-mobile: @JAILS_PATH@ $(NODE_BINS) $(call cleanup_before_run) $(call run_JS_error_check) $(call start_coolwsd) $(call run_interactive_mobile,$(spec)) || true $(V)$(KILL_COMMAND) || true MOBILE_CONFIG = \ specPattern=$(MOBILE_TEST_FOLDER)/**/*_spec.js,supportFile=$(SUPPORT_FILE),userAgent=$(MOBILE_USER_AGENT) MOBILE_ENV = \ CYPRESS_INCLUDE_TAGS=tagmobile,DATA_FOLDER=$(MOBILE_DATA_FOLDER),DATA_WORKDIR=$(MOBILE_DATA_WORKDIR),WSD_VERSION_HASH=$(COOLWSD_VERSION_HASH),SERVER=$(COOLWSD_SERVER),SERVER_PORT=$(FREE_PORT),LO_CORE_VERSION="$(CORE_VERSION)",INTEGRATION=$(CYPRESS_INTEGRATION) # Run one mobile test / all mobile tests in interactive test runner. # Parameters: # 1 - spec (optional): test file to run, if not specified all mobile tests are run. define run_interactive_mobile $(V)echo "Open cypress with mobile tests..." $(V)echo $(if $(1),\ $(eval SPEC_FILE=$(MOBILE_TEST_FOLDER)/$(1))\ $(call check_spec_existence,$(1),mobile)\ $(call run_interactive_single,$(MOBILE_CONFIG),$(MOBILE_ENV),$(SPEC_FILE))\ ,\ $(call run_interactive_all,$(MOBILE_CONFIG),$(MOBILE_ENV))\ ) endef # Run one mobile test / all mobile tests in headless mode. # Parameters: # 1 - spec (optional): test file to run, if not specified all mobile tests are run. # 2 - log (optional): log file for cypress run, needed for parallel build only. # 3 - +env (optional): additional env variables (will be appended to $(MOBILE_ENV). define run_mobile_tests $(V)echo $(if $(1),"Running cypress mobile test: $(1)","Running cypress mobile tests...") $(V)echo $(eval ENV_EXTENDED=$(MOBILE_ENV)$(if $(3),$(COMMA)$(3))) $(if $(and $(PARALLEL_BUILD), $(1)),\ $(V)$(call run_test_parallel,\ $(MOBILE_CONFIG),$(ENV_EXTENDED),$(1),mobile,$(2))\ ,\ $(eval SPEC_FILE=$(if $(1),$(MOBILE_TEST_FOLDER)/$(1)))\ $(if $(1),$(call check_spec_existence,$(1),mobile))\ $(call run_test_headless,\ $(MOBILE_CONFIG),$(ENV_EXTENDED),$(SPEC_FILE))\ ) endef ################ # Desktop tests. ################ check-desktop: @JAILS_PATH@ $(NODE_BINS) $(call cleanup_before_run) $(call run_JS_error_check) $(if $(HEADLESS_BUILD),$(call start_Xvfb),) $(call start_coolwsd) $(call run_desktop_tests,$(spec)) $(if $(HEADLESS_BUILD),$(V)pkill Xvfb,) $(V)$(KILL_COMMAND) || true run-desktop: @JAILS_PATH@ $(NODE_BINS) $(call cleanup_before_run) $(call run_JS_error_check) $(call start_coolwsd) $(call run_interactive_desktop,$(spec)) || true $(V)$(KILL_COMMAND) || true DESKTOP_CONFIG = \ specPattern=$(DESKTOP_TEST_FOLDER)/**/*_spec.js,supportFile=$(SUPPORT_FILE),userAgent=$(DESKTOP_USER_AGENT) DESKTOP_ENV = \ DATA_FOLDER=$(DESKTOP_DATA_FOLDER),DATA_WORKDIR=$(DESKTOP_DATA_WORKDIR),WSD_VERSION_HASH=$(COOLWSD_VERSION_HASH),SERVER=$(COOLWSD_SERVER),SERVER_PORT=$(FREE_PORT),LO_CORE_VERSION="$(CORE_VERSION)",INTEGRATION=$(CYPRESS_INTEGRATION),IMAGES_FOLDER=$(abs_top_srcdir)/browser/images/help/en/ DESKTOP_INCLUDE_TAGS = \ tagdesktop,$(A11Y_TAG) # Run one desktop test / all desktop tests in interactive test runner. # Parameters: # 1 - spec (optional): test file to run, if not specified all desktop tests are run. define run_interactive_desktop $(V)echo "Open cypress with desktop tests..." $(V)echo $(eval CYPRESS_INCLUDE_TAGS=$(DESKTOP_INCLUDE_TAGS)) $(V)echo Cypress tags: $(CYPRESS_INCLUDE_TAGS) $(V)echo $(eval export CYPRESS_INCLUDE_TAGS) $(if $(1),\ $(eval SPEC_FILE=$(DESKTOP_TEST_FOLDER)/$(1))\ $(call check_spec_existence,$(1),desktop)\ $(call run_interactive_single,$(DESKTOP_CONFIG),$(DESKTOP_ENV),$(SPEC_FILE))\ ,\ $(call run_interactive_all,$(DESKTOP_CONFIG),$(DESKTOP_ENV))\ ) endef # Run one desktop test / all desktop tests in headless mode. # Parameters: # 1 - spec (optional): test file to run, if not specified all desktop tests are run. # 2 - log (optional): log file for cypress run, needed for parallel build only. # 3 - +env (optional): additional env variables (will be appended to $(DESKTOP_ENV). define run_desktop_tests $(V)echo $(if $(1),"Running cypress desktop mode test: $(1)","Running cypress desktop mode tests...") $(V)echo $(eval CYPRESS_INCLUDE_TAGS=$(DESKTOP_INCLUDE_TAGS)) $(V)echo Cypress tags: $(CYPRESS_INCLUDE_TAGS) $(V)echo $(eval export CYPRESS_INCLUDE_TAGS) $(eval ENV_EXTENDED=$(DESKTOP_ENV)$(if $(3),$(COMMA)$(3))) $(if $(and $(PARALLEL_BUILD), $(1)),\ $(V)$(call run_test_parallel,\ $(DESKTOP_CONFIG),$(ENV_EXTENDED),$(1),desktop,$(2))\ ,\ $(eval SPEC_FILE=$(if $(1),$(DESKTOP_TEST_FOLDER)/$(1)))\ $(if $(1),$(call check_spec_existence,$(1),desktop))\ $(call run_test_headless,\ $(DESKTOP_CONFIG),$(ENV_EXTENDED),$(SPEC_FILE))\ ) endef ################ # Idle tests. ################ check-idle: @JAILS_PATH@ $(NODE_BINS) start_short_idle_coolwsd $(PID_FILE) $(call run_idle_tests,$(spec)) $(if $(HEADLESS_BUILD),$(V)pkill Xvfb,) $(V)$(KILL_COMMAND) || true run-idle: @JAILS_PATH@ $(NODE_BINS) start_short_idle_coolwsd $(PID_FILE) $(call run_interactive_idle,$(spec)) || true $(V)$(KILL_COMMAND) || true IDLE_CONFIG = \ specPattern=$(IDLE_TEST_FOLDER)/**/*_spec.js,supportFile=$(SUPPORT_FILE),userAgent=$(IDLE_USER_AGENT) IDLE_ENV = \ DATA_FOLDER=$(IDLE_DATA_FOLDER),DATA_WORKDIR=$(IDLE_DATA_WORKDIR),WSD_VERSION_HASH=$(COOLWSD_VERSION_HASH),SERVER=$(COOLWSD_SERVER),SERVER_PORT=$(FREE_PORT),LO_CORE_VERSION="$(CORE_VERSION)",INTEGRATION=$(CYPRESS_INTEGRATION),IMAGES_FOLDER=$(abs_top_srcdir)/browser/images/help/en/ IDLE_INCLUDE_TAGS = \ tagdesktop,$(A11Y_TAG) # Run one idle test / all idle tests in interactive test runner. # Parameters: # 1 - spec (optional): test file to run, if not specified all idle tests are run. define run_interactive_idle $(V)echo "Open cypress with idle tests..." $(V)echo $(eval CYPRESS_INCLUDE_TAGS=$(IDLE_INCLUDE_TAGS)) $(V)echo Cypress tags: $(CYPRESS_INCLUDE_TAGS) $(V)echo $(eval export CYPRESS_INCLUDE_TAGS) $(if $(1),\ $(eval SPEC_FILE=$(IDLE_TEST_FOLDER)/$(1))\ $(call check_spec_existence,$(1),idle)\ $(call run_interactive_single,$(IDLE_CONFIG),$(IDLE_ENV),$(SPEC_FILE))\ ,\ $(call run_interactive_all,$(IDLE_CONFIG),$(IDLE_ENV))\ ) endef # Run one idle test / all idle tests in headless mode. # Parameters: # 1 - spec (optional): test file to run, if not specified all idle tests are run. # 2 - log (optional): log file for cypress run, needed for parallel build only. # 3 - +env (optional): additional env variables (will be appended to $(IDLE_ENV). define run_idle_tests $(V)echo $(if $(1),"Running cypress idle test: $(1)","Running cypress idle tests...") $(V)echo $(eval CYPRESS_INCLUDE_TAGS=$(IDLE_INCLUDE_TAGS)) $(V)echo Cypress tags: $(CYPRESS_INCLUDE_TAGS) $(V)echo $(eval export CYPRESS_INCLUDE_TAGS) $(eval ENV_EXTENDED=$(IDLE_ENV)$(if $(3),$(COMMA)$(3))) $(if $(and $(PARALLEL_BUILD), $(1)),\ $(V)$(call run_test_parallel,\ $(IDLE_CONFIG),$(ENV_EXTENDED),$(1),idle,$(2))\ ,\ $(eval SPEC_FILE=$(if $(1),$(IDLE_TEST_FOLDER)/$(1)))\ $(if $(1),$(call check_spec_existence,$(1),idle))\ $(call run_test_headless,\ $(IDLE_CONFIG),$(ENV_EXTENDED),$(SPEC_FILE))\ ) endef ################### # Multi-user tests. ################### check-multi: @JAILS_PATH@ $(NODE_BINS) $(call cleanup_before_run) $(call run_JS_error_check) $(if $(HEADLESS_BUILD),$(call start_Xvfb),) $(call start_coolwsd) $(if $(spec), \ $(call run_multiuser_test,$(spec)), \ $(call run_all_multiuser_tests)) $(if $(HEADLESS_BUILD),$(V)pkill Xvfb,) $(V)$(KILL_COMMAND) || true run-multi: @JAILS_PATH@ $(NODE_BINS) $(call cleanup_before_run) $(call run_JS_error_check) $(call start_coolwsd) $(call run_interactive_multiuser,$(spec)) || true $(V)$(KILL_COMMAND) || true MULTIUSER_CONFIG = \ specPattern=$(MULTIUSER_TEST_FOLDER)/**/*_spec.js,supportFile=$(SUPPORT_FILE),userAgent=$(DESKTOP_USER_AGENT) MULTIUSER_ENV = \ CYPRESS_INCLUDE_TAGS=tagmultiuser,DATA_FOLDER=$(MULTIUSER_DATA_FOLDER),DATA_WORKDIR=$(MULTIUSER_DATA_WORKDIR),WSD_VERSION_HASH=$(COOLWSD_VERSION_HASH),SERVER=$(COOLWSD_SERVER),SERVER_PORT=$(FREE_PORT),LO_CORE_VERSION="$(CORE_VERSION)",INTEGRATION=$(CYPRESS_INTEGRATION) # Run all multi-user tests in headless mode. # Parameters: # 1 - +env (optional): additional env variables (will be appended to $(MULTIUSER_ENV). define run_all_multiuser_tests $(foreach test,$(MULTIUSER_TEST_FILES),$(call run_multiuser_test,$(test),$(1))) endef # Run one multiuser test / all multiuser tests in interactive test runner. # Parameters: # 1 - spec (optional): test file to run, if not specified all desktop tests are run. define run_interactive_multiuser $(V)echo "Open cypress with multiuser tests..." $(V)echo $(if $(1),\ $(eval SPEC_FILE=$(MULTIUSER_TEST_FOLDER)/$(1))\ $(call check_spec_existence,$(1),multi)\ $(call run_interactive_single,$(MULTIUSER_CONFIG),$(MULTIUSER_ENV),$(SPEC_FILE))\ ,\ $(call run_interactive_all,$(MULTIUSER_CONFIG),$(MULTIUSER_ENV))\ ) endef # Run one multi-user test in headless mode. # Parameters: # 1 - test name: test name to run. This test name means to test files (user1, user2). # 2 - +env (optional): additional env variables (will be appended to $(MULTIUSER_ENV). define run_multiuser_test $(call check_spec_existence,$(1),multi) $(V)echo "Running cypress multi-user test: $(1)" $(V)echo $(eval ENV_EXTENDED=$(MULTIUSER_ENV)$(if $(2),$(COMMA)$(2))) $(eval SPEC_FILE=$(if $(1),$(MULTIUSER_TEST_FOLDER)/$(1))) $(call run_test_headless,\ $(MULTIUSER_CONFIG),$(ENV_EXTENDED),$(SPEC_FILE)) endef ############################ # Mobile interference tests. ############################ check-interfer-mobile: do-interfer-mobile-check-log $(if $(wildcard $(ERROR_LOG)),$(error CypressError: some tests failed!)) do-interfer-mobile-check-log: do-interfer-mobile-check $(if $(wildcard $(ERROR_LOG)),$(V)cat $(ERROR_LOG)) do-interfer-mobile-check: @JAILS_PATH@ $(NODE_BINS) $(call cleanup_before_run) $(call run_JS_error_check) $(call start_coolwsd) $(if $(spec), \ $(call run_mobile_interference_test,$(spec)), \ $(call run_mobile_interference_tests)) $(V)$(KILL_COMMAND) || true run-interfer-mobile: @JAILS_PATH@ $(NODE_BINS) $(call cleanup_before_run) $(call run_JS_error_check) $(call start_coolwsd) $(V)echo $(V)echo "Running interfer mobile test in interactive test runner..." $(V)echo $(call check_spec_existence,$(spec),mobile) $(eval USER1_SPEC=$(MOBILE_TEST_FOLDER)/$(spec)) $(eval USER2_SPEC=interference_user_spec.js) $(eval USER2_LOG=$(MULTIUSER_TRACK_FOLDER)/$(USER2_SPEC).log) $(call run_interactive_single,\ $(INTERFER_MOBILE_CONFIG1),$(INTERFER_MOBILE_ENV1),$(USER1_SPEC)) & $(V)sleep 5 $(V)$(call run_test_parallel,\ $(INTERFER_MOBILE_CONFIG2),$(INTERFER_MOBILE_ENV2),$(USER2_SPEC),interfer,$(USER2_LOG)) || true $(V)$(KILL_COMMAND) || true INTERFER_MOBILE_CONFIG1 = \ specPattern=$(MOBILE_TEST_FOLDER)/**/*_spec.js,supportFile=$(SUPPORT_FILE),userAgent=$(MOBILE_USER_AGENT),defaultCommandTimeout=30000 INTERFER_MOBILE_ENV1 = \ CYPRESS_INCLUDE_TAGS=tagmobile,DATA_FOLDER=$(MOBILE_DATA_FOLDER),DATA_WORKDIR=$(MULTIUSER_DATA_WORKDIR),WSD_VERSION_HASH=$(COOLWSD_VERSION_HASH),SERVER=$(COOLWSD_SERVER),SERVER_PORT=$(FREE_PORT),LO_CORE_VERSION="$(CORE_VERSION)",INTEGRATION=$(CYPRESS_INTEGRATION),INTERFERENCE_TEST=true INTERFER_MOBILE_CONFIG2 = \ supportFile=$(SUPPORT_FILE),userAgent=$(MOBILE_USER_AGENT),defaultCommandTimeout=30000,retries=0 INTERFER_MOBILE_ENV2 = \ CYPRESS_INCLUDE_TAGS=tagmobile,DATA_FOLDER=$(MOBILE_DATA_FOLDER),DATA_WORKDIR=$(MULTIUSER_DATA_WORKDIR),WSD_VERSION_HASH=$(COOLWSD_VERSION_HASH),SERVER=$(COOLWSD_SERVER),SERVER_PORT=$(FREE_PORT),LO_CORE_VERSION="$(CORE_VERSION)",INTEGRATION=$(CYPRESS_INTEGRATION) # Run all mobile interference tests in headless mode. define run_mobile_interference_tests $(foreach test,$(MOBILE_TEST_FILES),$(call run_mobile_interference_test,$(test))) endef # Run one mobile interference test in headless mode. # Parameters: # 1 - mobile test file: test file to run parallel with the interference user spec file. define run_mobile_interference_test $(V)echo "Running cypress mobile interference test: $(1)" $(V)echo $(call check_spec_existence,$(1),mobile) $(eval USER1_SPEC=$(1)) $(eval USER2_SPEC=interference_user_spec.js) $(eval USER1_LOG=$(MULTIUSER_TRACK_FOLDER)/$(USER1_SPEC).log) $(eval USER2_LOG=$(MULTIUSER_TRACK_FOLDER)/$(USER2_SPEC).log) $(V)$(call run_test_parallel,\ $(INTERFER_MOBILE_CONFIG1),$(INTERFER_MOBILE_ENV1),$(USER1_SPEC),interfer-mobile,$(USER1_LOG)) & \ sleep 5 && \ $(call run_test_parallel,\ $(INTERFER_MOBILE_CONFIG2),$(INTERFER_MOBILE_ENV2),$(USER2_SPEC),interfer,$(USER2_LOG)) && \ wait # waits the background process to be finished endef ############################# # Desktop interference tests. ############################# check-interfer-desktop: do-interfer-desktop-check-log $(if $(wildcard $(ERROR_LOG)),$(error CypressError: some tests failed!)) do-interfer-desktop-check-log: do-interfer-desktop-check $(if $(wildcard $(ERROR_LOG)),$(V)cat $(ERROR_LOG)) do-interfer-desktop-check: @JAILS_PATH@ $(NODE_BINS) $(call cleanup_before_run) $(call run_JS_error_check) $(call start_coolwsd) $(if $(spec), \ $(call run_desktop_interference_test,$(spec)), \ $(call run_desktop_interference_tests)) $(V)$(KILL_COMMAND) || true run-interfer-desktop: @JAILS_PATH@ $(NODE_BINS) $(call cleanup_before_run) $(call run_JS_error_check) $(call start_coolwsd) $(V)echo $(V)echo "Running interfer desktop test in interactive test runner..." $(V)echo $(call check_spec_existence,$(spec),desktop) $(eval USER1_SPEC=$(DESKTOP_TEST_FOLDER)/$(spec)) $(eval USER2_SPEC=interference_user_spec.js) $(eval USER2_LOG=$(MULTIUSER_TRACK_FOLDER)/$(USER2_SPEC).log) $(call run_interactive_single,\ $(INTERFER_DESKTOP_CONFIG1),$(INTERFER_DESKTOP_ENV1),$(USER1_SPEC)) & $(V)sleep 5 $(V)$(call run_test_parallel,\ $(INTERFER_DESKTOP_CONFIG2),$(INTERFER_DESKTOP_ENV2),$(USER2_SPEC),interfer,$(USER2_LOG)) || true $(V)$(KILL_COMMAND) || true INTERFER_DESKTOP_CONFIG1 = \ specPattern=$(DESKTOP_TEST_FOLDER)/**/*_spec.js,supportFile=$(SUPPORT_FILE),userAgent=$(DESKTOP_USER_AGENT),defaultCommandTimeout=30000 INTERFER_DESKTOP_ENV1 = \ DATA_FOLDER=$(DESKTOP_DATA_FOLDER),DATA_WORKDIR=$(MULTIUSER_DATA_WORKDIR),WSD_VERSION_HASH=$(COOLWSD_VERSION_HASH),SERVER=$(COOLWSD_SERVER),SERVER_PORT=$(FREE_PORT),LO_CORE_VERSION="$(CORE_VERSION)",INTEGRATION=$(CYPRESS_INTEGRATION),INTERFERENCE_TEST=true INTERFER_DESKTOP_CONFIG2 = \ supportFile=$(SUPPORT_FILE),userAgent=$(DESKTOP_USER_AGENT),defaultCommandTimeout=30000,retries=0 INTERFER_DESKTOP_ENV2 = \ DATA_FOLDER=$(DESKTOP_DATA_FOLDER),DATA_WORKDIR=$(MULTIUSER_DATA_WORKDIR),WSD_VERSION_HASH=$(COOLWSD_VERSION_HASH),SERVER=$(COOLWSD_SERVER),SERVER_PORT=$(FREE_PORT),LO_CORE_VERSION="$(CORE_VERSION)",INTEGRATION=$(CYPRESS_INTEGRATION) # Run all desktop interference test in headless mode. define run_desktop_interference_tests $(foreach test,$(DESKTOP_TEST_FILES),$(call run_desktop_interference_test,$(test))) endef # Run one desktop interference test in headless mode. # Parameters: # 1 - desktop test file: test file to run parallel with the interference user spec file. define run_desktop_interference_test $(V)echo "Running cypress desktop interference test: $(1)" $(V)echo $(call check_spec_existence,$(1),desktop) $(eval USER1_SPEC=$(1)) $(eval USER2_SPEC=interference_user_spec.js) $(eval USER1_LOG=$(MULTIUSER_TRACK_FOLDER)/$(USER1_SPEC).log) $(eval USER2_LOG=$(MULTIUSER_TRACK_FOLDER)/$(USER2_SPEC).log) $(V)$(call run_test_parallel,\ $(INTERFER_DESKTOP_CONFIG1),$(INTERFER_DESKTOP_ENV1),$(USER1_SPEC),interfer-desktop,$(USER1_LOG)) & \ sleep 5 && \ $(call run_test_parallel,\ $(INTERFER_DESKTOP_CONFIG2),$(INTERFER_DESKTOP_ENV2),$(USER2_SPEC),interfer,$(USER2_LOG)) && \ wait # waits the background process to be finished endef ################ # Test coverage. ################ run-cov: do-run-cov $(if $(wildcard $(ERROR_LOG)),$(V)cat $(ERROR_LOG)) do-run-cov: @JAILS_PATH@ $(NODE_BINS) $(V)echo $(V)echo "Setup coverage tools..." $(V)echo rm -rf .nyc_output rm -rf coverage npm install @cypress/code-coverage --no-save $(V)echo "import '@cypress/code-coverage/support';" >> $(SUPPORT_FILE_ABS) $(V)echo "" >> $(SUPPORT_FILE_ABS) cd .. && npx nyc instrument --compact=false browser/src browser/dist/src && cd cypress_test $(V)echo $(V)echo "Run all tests..." $(V)echo $(call cleanup_before_run) $(call start_coolwsd) $(call run_desktop_tests,,,COVERAGE_RUN="1") $(call run_mobile_tests,,,COVERAGE_RUN="1") $(call run_all_multiuser_tests,COVERAGE_RUN="1") $(V)$(KILL_COMMAND) || true $(call run_idle_tests,,,COVERAGE_RUN="1") $(V)$(KILL_COMMAND) || true #################### # General functions. #################### # Open cypress interactive test runner window with all tests in it. # # Parameters: # 1 - config-file: cypress configuration file (e.g. cypress.config.ts). # 2 - config: cypress configuration (e.g. cypress' --config argument). # 3 - env: list of environment variables (e.g. cypress' --env argument). define run_interactive_all DEBUG='cypress:*' \ DISPLAY=$(if $(HEADLESS_BUILD),$(HEADLESS_DISPLAY),$(DISPLAY)) \ $(CYPRESS_BINARY) open \ --config-file $(CYPRESS_CONFIG) \ --config $(1) \ --env $(2) endef # Run single test in cypress interactive test runner. # # Parameters: # 1 - config-file: cypress configuration file (e.g. cypress.config.ts). # 2 - config: cypress configuration (e.g. cypress' --config argument). # 3 - env: list of environment variables (e.g. cypress' --env argument). # 4 - spec: test file path (e.g. cypress' --spec argument) define run_interactive_single DEBUG='cypress:*' \ DISPLAY=$(if $(HEADLESS_BUILD),$(HEADLESS_DISPLAY),$(DISPLAY)) \ $(CYPRESS_BINARY) run \ --browser $(BROWSER) \ --headed --no-exit \ --config-file $(CYPRESS_CONFIG) \ --config $(1),retries=0 \ --env $(2) \ --spec=$(3) endef # Run one test in parallel mode, using parallel running script. # # Parameters: # 1 - config: cypress configuration (e.g. cypress' --config argument). # 2 - env: list of environment variables (e.g. cypress' --env argument). # 3 - spec: test file path (e.g. cypress' --spec argument) # 4 - type: test type (e.g. mobile, desktop, multi-user) # 5 - log: log file path # 6 - config-file: cypress configuration file (e.g. cypress.config.ts) define run_test_parallel $(PARALLEL_SCRIPT) \ --browser $(BROWSER) \ --config $(1) \ --env $(2) \ --spec $(3) \ --type $(4) \ --log-file $(5) \ --config-file $(CYPRESS_CONFIG) endef # Run one test \ tests in headless mode. # # Parameters: # 1 - config-file: cypress configuration file (e.g. cypress.config.ts). # 2 - config: cypress configuration (e.g. cypress' --config argument). # 3 - env: list of environment variables (e.g. cypress' --env argument). # 4 - spec (optional): test file path (e.g. cypress' --spec argument) define run_test_headless $(CYPRESS_BINARY) run \ --browser $(BROWSER) \ --headless \ --config-file $(CYPRESS_CONFIG) \ --config $(1) \ --env $(2) \ $(if $(3),--spec=$(3)) \ || ($(KILL_COMMAND) && false) endef # Checks whether the given spec file exists. # We run this check when the spec file was specified by # the user so we can give clearer error message. # # Parameters: # 1 - spec: test file path (e.g. make check-mobile spec=...) # 2 - test type: mobile, desktop, idle or multi test. define check_spec_existence $(eval TEST_FILES=$(if $(filter mobile,$(2)),$(MOBILE_TEST_FILES),\ $(if $(filter desktop,$(2)),$(DESKTOP_TEST_FILES),\ $(if $(filter idle,$(2)),$(IDLE_TEST_FILES),\ $(if $(filter multi,$(2)),$(MULTIUSER_TEST_FILES)))))) $(if $(filter $(1),$(TEST_FILES)),,$(error CypressError: Can't find the given spec file!)) endef else check-local: $(error CypressError: Can't find LibreOffice core installation!) endif endif