From 1821d7af478e41e145b8744ca33efbe2e634c621 Mon Sep 17 00:00:00 2001 From: Julien Cabieces Date: Wed, 17 Mar 2021 13:20:14 +0100 Subject: [PATCH] Run providers tests in different CI jobs --- .ci/config.ctest | 44 ---- .ci/config_build.ctest | 27 +++ .ci/config_test.ctest | 26 +++ .docker/docker-compose-testing-oracle.yml | 22 ++ .docker/docker-compose-testing-postgres.yml | 22 ++ .docker/docker-compose-testing.yml | 27 +-- .docker/docker-qgis-test.sh | 203 +++++++++++------- .docker/qgis3-build-deps.dockerfile | 116 +++++----- .github/workflows/run-tests.yml | 99 +++++++-- .../db_plugins/postgis/CMakeLists.txt | 1 + tests/code_layout/test_shellcheck.sh | 4 +- tests/src/analysis/CMakeLists.txt | 3 + tests/src/core/CMakeLists.txt | 4 + tests/src/gui/CMakeLists.txt | 7 + tests/src/python/CMakeLists.txt | 21 +- 15 files changed, 412 insertions(+), 214 deletions(-) create mode 100644 .ci/config_build.ctest create mode 100644 .ci/config_test.ctest create mode 100644 .docker/docker-compose-testing-oracle.yml create mode 100644 .docker/docker-compose-testing-postgres.yml diff --git a/.ci/config.ctest b/.ci/config.ctest index 3cacb1e29c9..afaf3458bf3 100644 --- a/.ci/config.ctest +++ b/.ci/config.ctest @@ -46,11 +46,6 @@ IF(NOT WIN32) SET(BoldWhite "${Esc}[1;37m") ENDIF(NOT WIN32) -# Requires a track on the CDash server -#ctest_start(Experimental TRACK Travis) -ctest_start(Experimental) -ctest_build (BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE BUILDRES NUMBER_WARNINGS NUMWARN NUMBER_ERRORS NUMERR) - # Create link to test results # CDash on OTB requires the date to be set for the search to work (used to be UTC-6, seems to be UTC now) SET(ENV{TZ} "UTC") @@ -58,42 +53,3 @@ EXECUTE_PROCESS(COMMAND date +%Y-%m-%d OUTPUT_VARIABLE CDASH_DATE) SET(RESULT_LINK "http://cdash.orfeo-toolbox.org/index.php?project=QGIS&filtercount=1&showfilters=1&field1=buildname/string&compare1=63&value1=$ENV{CTEST_BUILD_NAME}&date=${CDASH_DATE}") EXECUTE_PROCESS(COMMAND curl --data-urlencode "url=${RESULT_LINK}" -s http://tinyurl.com/api-create.php OUTPUT_VARIABLE SHORTURL) - -SET(IGNORE_BUILD_FAILURES $ENV{IGNORE_BUILD_FAILURES}) -IF(NOT IGNORE_BUILD_FAILURES) - IF(NOT ${BUILDRES} EQUAL 0 OR NOT ${NUMERR} EQUAL 0) - ctest_submit (RETRY_COUNT 3 RETRY_DELAY 30) - MESSAGE("") - MESSAGE(" ${Yellow}Test results submitted to:${ColorReset} ${SHORTURL}") - MESSAGE("") - MESSAGE( FATAL_ERROR " ${Red}Build failed. Not running tests.${ColorReset}" ) - MESSAGE("") - ENDIF(NOT ${BUILDRES} EQUAL 0 OR NOT ${NUMERR} EQUAL 0) -ENDIF(NOT IGNORE_BUILD_FAILURES) -ctest_test (BUILD "${CTEST_BINARY_DIRECTORY}" PARALLEL_LEVEL ${PARALLEL_LEVEL} RETURN_VALUE TESTRES) -IF(NOT ${NUMWARN} EQUAL 0 OR NOT ${TESTRES} EQUAL 0) - ctest_submit (RETRY_COUNT 3 RETRY_DELAY 30) - MESSAGE("") - MESSAGE(" ${Yellow}Test results submitted to:${ColorReset} ${SHORTURL}" ) - MESSAGE("") - SET(LEVEL "") - IF(NOT ${TESTRES} EQUAL 0) - SET(TESTRES_MESSAGE " Tests failed.") - SET(LEVEL FATAL_ERROR) - ENDIF(NOT ${TESTRES} EQUAL 0) - IF(NOT ${NUMWARN} EQUAL 0) - SET(WARNING_MESSAGE " Build warnings found.") - IF(NOT IGNORE_BUILD_FAILURES) - SET(LEVEL FATAL_ERROR) - ENDIF(NOT IGNORE_BUILD_FAILURES) - ENDIF(NOT ${NUMWARN} EQUAL 0) - MESSAGE( ${LEVEL} " ${Red}${TESTRES_MESSAGE} ${WARNING_MESSAGE}${ColorReset}" ) -ENDIF(NOT ${NUMWARN} EQUAL 0 OR NOT ${TESTRES} EQUAL 0) - -IF(NOT ${TESTRES} EQUAL 0) - MESSAGE("") - MESSAGE(" ${BoldGreen}Success${ColorReset}") - MESSAGE(" ${Green}All tests passed successfully.${ColorReset}") - MESSAGE("") - MESSAGE("") -ENDIF(NOT ${TESTRES} EQUAL 0) diff --git a/.ci/config_build.ctest b/.ci/config_build.ctest new file mode 100644 index 00000000000..fd3d7a6617a --- /dev/null +++ b/.ci/config_build.ctest @@ -0,0 +1,27 @@ +include(${CMAKE_CURRENT_LIST_DIR}/config.ctest) + +# Requires a track on the CDash server +ctest_start(Experimental) + +ctest_build (BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE BUILDRES NUMBER_WARNINGS NUMWARN NUMBER_ERRORS NUMERR) + + +SET(IGNORE_BUILD_FAILURES $ENV{IGNORE_BUILD_FAILURES}) +IF(NOT IGNORE_BUILD_FAILURES) + IF(NOT ${BUILDRES} EQUAL 0 OR NOT ${NUMERR} EQUAL 0) + ctest_submit (RETRY_COUNT 3 RETRY_DELAY 30) + MESSAGE("") + MESSAGE(" ${Yellow}Test results submitted to:${ColorReset} ${SHORTURL}") + MESSAGE("") + MESSAGE( FATAL_ERROR " ${Red}Build failed. Not running tests.${ColorReset}" ) + MESSAGE("") + ENDIF(NOT ${BUILDRES} EQUAL 0 OR NOT ${NUMERR} EQUAL 0) +ENDIF(NOT IGNORE_BUILD_FAILURES) + +IF(${BUILDRES} EQUAL 0 OR ${NUMERR} EQUAL 0) + MESSAGE("") + MESSAGE(" ${BoldGreen}Success${ColorReset}") + MESSAGE(" ${Green}Build passed successfully.${ColorReset}") + MESSAGE("") + MESSAGE("") +ENDIF(${BUILDRES} EQUAL 0 OR ${NUMERR} EQUAL 0) diff --git a/.ci/config_test.ctest b/.ci/config_test.ctest new file mode 100644 index 00000000000..c2bb1518a2d --- /dev/null +++ b/.ci/config_test.ctest @@ -0,0 +1,26 @@ +include(${CMAKE_CURRENT_LIST_DIR}/config.ctest) + +# Requires a track on the CDash server +ctest_start(Experimental) + +ctest_test (BUILD "${CTEST_BINARY_DIRECTORY}" PARALLEL_LEVEL ${PARALLEL_LEVEL} RETURN_VALUE TESTRES) +IF(NOT ${TESTRES} EQUAL 0) + ctest_submit (RETRY_COUNT 3 RETRY_DELAY 30) + MESSAGE("") + MESSAGE(" ${Yellow}Test results submitted to:${ColorReset} ${SHORTURL}" ) + MESSAGE("") + SET(LEVEL "") + IF(NOT ${TESTRES} EQUAL 0) + SET(TESTRES_MESSAGE " Tests failed.") + SET(LEVEL FATAL_ERROR) + ENDIF(NOT ${TESTRES} EQUAL 0) + MESSAGE( ${LEVEL} " ${Red}${TESTRES_MESSAGE} ${ColorReset}" ) +ENDIF(NOT ${TESTRES} EQUAL 0) + +IF(NOT ${TESTRES} EQUAL 0) + MESSAGE("") + MESSAGE(" ${BoldGreen}Success${ColorReset}") + MESSAGE(" ${Green}All tests passed successfully.${ColorReset}") + MESSAGE("") + MESSAGE("") +ENDIF(NOT ${TESTRES} EQUAL 0) diff --git a/.docker/docker-compose-testing-oracle.yml b/.docker/docker-compose-testing-oracle.yml new file mode 100644 index 00000000000..a7c97acab74 --- /dev/null +++ b/.docker/docker-compose-testing-oracle.yml @@ -0,0 +1,22 @@ +version: '3' +services: + + oracle: + image: oslandia/oracle-slim-for-qgis:18.4.0-xe + environment: + - ORACLE_SID=XE + - ORACLE_PWD=adminpass + - ORACLE_PDB=ORCLPDBTEST + - ORACLE_CHARACTERSET=AL32UTF8 + ports: + - 1521:1521 + + qgis-deps: + tty: true + image: qgis/qgis3-build-deps-bin-only:${DOCKER_TAG} + volumes: + - ${GH_WORKSPACE}:/root/QGIS + links: + - oracle + env_file: + - docker-variables.env diff --git a/.docker/docker-compose-testing-postgres.yml b/.docker/docker-compose-testing-postgres.yml new file mode 100644 index 00000000000..613030e0392 --- /dev/null +++ b/.docker/docker-compose-testing-postgres.yml @@ -0,0 +1,22 @@ +version: '3' +services: + postgres: + build: + dockerfile: Dockerfile-postgis + context: ../tests/testdata + environment: + - ALLOW_IP_RANGE="172.18.0.0/16" +# The following files are added in Dockerfile-postgis + - SSL_CERT_FILE=/etc/ssl/certs/postgres.crt + - SSL_KEY_FILE=/etc/ssl/private/postgres.key + - SSL_CA_FILE=/etc/ssl/certs/qgis_ca.crt + + qgis-deps: + tty: true + image: qgis/qgis3-build-deps-bin-only:${DOCKER_TAG} + volumes: + - ${GH_WORKSPACE}:/root/QGIS + links: + - postgres + env_file: + - docker-variables.env diff --git a/.docker/docker-compose-testing.yml b/.docker/docker-compose-testing.yml index 355f2aca1f8..3da8b07026b 100755 --- a/.docker/docker-compose-testing.yml +++ b/.docker/docker-compose-testing.yml @@ -1,26 +1,5 @@ version: '3' services: - postgres: - build: - dockerfile: Dockerfile-postgis - context: ../tests/testdata - environment: - - ALLOW_IP_RANGE="172.18.0.0/16" -# The following files are added in Dockerfile-postgis - - SSL_CERT_FILE=/etc/ssl/certs/postgres.crt - - SSL_KEY_FILE=/etc/ssl/private/postgres.key - - SSL_CA_FILE=/etc/ssl/certs/qgis_ca.crt - -# oracle: -# image: oslandia/oracle-for-qgis-tests-configured:18.4.0-xe -# environment: -# - ORACLE_SID=XE -# - ORACLE_PWD=adminpass -# - ORACLE_PDB=ORCLPDBTEST -# - ORACLE_CHARACTERSET=AL32UTF8 -# ports: -# - 1521:1521 - # Proving very fragile! # mssql: @@ -31,12 +10,10 @@ services: qgis-deps: tty: true - image: qgis_image + image: qgis/qgis3-build-deps-bin-only:${DOCKER_TAG} volumes: - ${GH_WORKSPACE}:/root/QGIS - links: - - postgres - # - oracle + # links: # - mssql env_file: - docker-variables.env diff --git a/.docker/docker-qgis-test.sh b/.docker/docker-qgis-test.sh index b6735b832d0..43e8d767075 100755 --- a/.docker/docker-qgis-test.sh +++ b/.docker/docker-qgis-test.sh @@ -5,11 +5,52 @@ set -e # Temporarily uncomment to debug ccache issues # cat /tmp/cache.debug -################################## -# Prepare HANA database connection -################################## +if [ $# -eq 1 ] && [ $1 = "HANA" ]; then + LABELS_TO_RUN="HANA" + RUN_HANA=YES + +elif [ $# -eq 1 ] && [ $1 = "POSTGRES" ]; then + LABELS_TO_RUN="POSTGRES" + RUN_POSTGRES=YES + +elif [ $# -eq 1 ] && [ $1 = "ORACLE" ]; then + LABELS_TO_RUN="ORACLE" + RUN_ORACLE=YES + +elif [ $# -eq 1 ] && [ $1 = "SQLSERVER" ]; then + LABELS_TO_RUN="SQLSERVER" + RUN_SQLSERVER=YES + +elif [ $# -eq 1 ] && [ $1 = "ALL_BUT_PROVIDERS" ]; then + LABELS_TO_EXCLUDE="HANA|POSTGRES|ORACLE|SQLSERVER" + +elif [ $# -gt 0 ] && [ $1 != "ALL" ]; then + echo "Invalid argument, expected values: ALL, ALL_BUT_PROVIDERS, POSTGRES, HANA, ORACLE, SQLSERVER" + exit 1 + +else + RUN_HANA=YES + RUN_POSTGRES=YES + RUN_ORACLE=YES + RUN_SQLSERVER=YES +fi + +if [ -n "$LABELS_TO_RUN" ]; then + echo "Only following test labels will be run: $LABELS_TO_RUN" + CTEST_OPTIONS="-L $LABELS_TO_RUN" +fi + +if [ -n "$LABELS_TO_EXCLUDE" ]; then + echo "Following test labels will be excluded: $LABELS_TO_EXCLUDE" + CTEST_OPTIONS="$CTEST_OPTIONS -LE $LABELS_TO_EXCLUDE" +fi + +if [ ${RUN_HANA:-"NO"} == "YES" ]; then + + ################################## + # Prepare HANA database connection + ################################## -if [ ${HANA_TESTS_ENABLED:-"OFF"} == "ON" ] ; then echo "::group::hana" echo "${bold}Load HANA database...${endbold}" @@ -32,90 +73,104 @@ if [ ${HANA_TESTS_ENABLED:-"OFF"} == "ON" ] ; then echo "::endgroup::" fi -############################ -# Restore postgres test data -############################ -echo "${bold}Load Postgres database...🐘${endbold}" +if [ ${RUN_POSTGRES:-"NO"} == "YES" ]; then -printf "[qgis_test]\nhost=postgres\nport=5432\ndbname=qgis_test\nuser=docker\npassword=docker" > ~/.pg_service.conf -export PGUSER=docker -export PGHOST=postgres -export PGPASSWORD=docker -export PGDATABASE=qgis_test + ############################ + # Restore postgres test data + ############################ + echo "${bold}Load Postgres database...🐘${endbold}" -# wait for the DB to be available -echo "Wait a moment while loading PostGreSQL database." -while ! PGPASSWORD='docker' psql -h postgres -U docker -p 5432 -l &> /dev/null -do - printf "🐘" - sleep 1 -done -echo " done 🥩" + printf "[qgis_test]\nhost=postgres\nport=5432\ndbname=qgis_test\nuser=docker\npassword=docker" > ~/.pg_service.conf + export PGUSER=docker + export PGHOST=postgres + export PGPASSWORD=docker + export PGDATABASE=qgis_test -pushd /root/QGIS > /dev/null -echo "Restoring postgres test data ..." -/root/QGIS/tests/testdata/provider/testdata_pg.sh -echo "Postgres test data restored ..." -popd > /dev/null # /root/QGIS + # wait for the DB to be available + echo "Wait a moment while loading PostGreSQL database." + while ! PGPASSWORD='docker' psql -h postgres -U docker -p 5432 -l &> /dev/null + do + printf "🐘" + sleep 1 + done + echo " done 🥩" -############################## -# Restore Oracle test data -############################## - -echo "${bold}Load Oracle database...🙏${endbold}" - -export ORACLE_HOST="oracle" -export QGIS_ORACLETEST_DBNAME="${ORACLE_HOST}/XEPDB1" -export QGIS_ORACLETEST_DB="host=${QGIS_ORACLETEST_DBNAME} port=1521 user='QGIS' password='qgis'" - -echo "Wait a moment while loading Oracle database." -COUNT=0 -while ! echo exit | sqlplus -L SYSTEM/adminpass@$QGIS_ORACLETEST_DBNAME &> /dev/null -do - printf "🙏" - sleep 5 - if [[ $(( COUNT++ )) -eq 200 ]]; then - break - fi -done -if [[ ${COUNT} -eq 201 ]]; then - echo "timeout, no oracle, no 🙏" -else - echo " done 👀" pushd /root/QGIS > /dev/null - /root/QGIS/tests/testdata/provider/testdata_oracle.sh $ORACLE_HOST + echo "Restoring postgres test data ..." + /root/QGIS/tests/testdata/provider/testdata_pg.sh + echo "Postgres test data restored ..." popd > /dev/null # /root/QGIS + fi -############################## -# Restore SQL Server test data -############################## +if [ ${RUN_ORACLE:-"NO"} == "YES" ]; then -# echo "Importing SQL Server test data..." + ############################## + # Restore Oracle test data + ############################## -# export SQLUSER=sa -# export SQLHOST=mssql -# export SQLPORT=1433 -# export SQLPASSWORD='' -# export SQLDATABASE=qgis_test + echo "${bold}Load Oracle database...🙏${endbold}" -# export PATH=$PATH:/opt/mssql-tools/bin + export ORACLE_HOST="oracle" + export QGIS_ORACLETEST_DBNAME="${ORACLE_HOST}/XEPDB1" + export QGIS_ORACLETEST_DB="host=${QGIS_ORACLETEST_DBNAME} port=1521 user='QGIS' password='qgis'" -# pushd /root/QGIS > /dev/null -# /root/QGIS/tests/testdata/provider/testdata_mssql.sh -# popd > /dev/null # /root/QGIS + echo "Wait a moment while loading Oracle database." + COUNT=0 + while ! echo exit | sqlplus -L SYSTEM/adminpass@$QGIS_ORACLETEST_DBNAME &> /dev/null + do + printf "🙏" + sleep 5 + if [[ $(( COUNT++ )) -eq 40 ]]; then + break + fi + done + if [[ ${COUNT} -eq 41 ]]; then + echo "timeout, no oracle, no 🙏" + else + echo " done 👀" + pushd /root/QGIS > /dev/null + /root/QGIS/tests/testdata/provider/testdata_oracle.sh $ORACLE_HOST + popd > /dev/null # /root/QGIS + fi -# echo "Setting up DSN for test SQL Server" +fi + +if [ ${RUN_SQLSERVER:-"NO"} == "YES" ]; then + + ############################## + # Restore SQL Server test data + ############################## + + echo "Importing SQL Server test data..." + + export SQLUSER=sa + export SQLHOST=mssql + export SQLPORT=1433 + export SQLPASSWORD='' + export SQLDATABASE=qgis_test + + export PATH=$PATH:/opt/mssql-tools/bin + + pushd /root/QGIS > /dev/null + /root/QGIS/tests/testdata/provider/testdata_mssql.sh + popd > /dev/null # /root/QGIS + + echo "Setting up DSN for test SQL Server" + + cat < /etc/odbc.ini +[ODBC Data Sources] +testsqlserver = ODBC Driver 17 for SQL Server + +[testsqlserver] +Driver = ODBC Driver 17 for SQL Server +Description = Test SQL Server +Server = mssql +EOT + +fi -# cat < /etc/odbc.ini -# [ODBC Data Sources] -# testsqlserver = ODBC Driver 17 for SQL Server -# [testsqlserver] -# Driver = ODBC Driver 17 for SQL Server -# Description = Test SQL Server -# Server = mssql -# EOT ########### # Run tests @@ -128,5 +183,5 @@ else echo "Flaky tests are run!" fi echo "List of skipped tests: $EXCLUDE_TESTS" -python3 /root/QGIS/.ci/ctest2ci.py xvfb-run ctest -V -E "${EXCLUDE_TESTS}" -S /root/QGIS/.ci/config.ctest --output-on-failure +python3 /root/QGIS/.ci/ctest2ci.py xvfb-run ctest -V $CTEST_OPTIONS -E "${EXCLUDE_TESTS}" -S /root/QGIS/.ci/config_test.ctest --output-on-failure diff --git a/.docker/qgis3-build-deps.dockerfile b/.docker/qgis3-build-deps.dockerfile index 776a57def10..2592ae6a2b3 100644 --- a/.docker/qgis3-build-deps.dockerfile +++ b/.docker/qgis3-build-deps.dockerfile @@ -1,7 +1,7 @@ ARG UBUNTU_BASE=20.04 -FROM ubuntu:${UBUNTU_BASE} +FROM ubuntu:${UBUNTU_BASE} as binary-only MAINTAINER Denis Rouzaud LABEL Description="Docker container with QGIS dependencies" Vendor="QGIS.org" Version="1.0" @@ -10,72 +10,47 @@ LABEL Description="Docker container with QGIS dependencies" Vendor="QGIS.org" Ve # && echo "deb-src http://ppa.launchpad.net/ubuntugis/ubuntugis-unstable/ubuntu xenial main" >> /etc/apt/sources.list \ # && apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 314DF160 \ - RUN apt-get update \ && apt-get install -y software-properties-common \ && apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y \ apt-transport-https \ - bison \ ca-certificates \ - ccache \ - clang \ cmake \ curl \ dh-python \ - flex \ gdal-bin \ - git \ graphviz \ - grass-dev \ + grass \ libaio1 \ - libexiv2-dev \ - libexpat1-dev \ - libfcgi-dev \ - libgdal-dev \ - libgeos-dev \ - libgsl-dev \ - libpdal-dev \ - libpq-dev \ - libproj-dev \ - libprotobuf-dev \ - libqca-qt5-2-dev \ + libexiv2-27 \ + libfcgi0ldbl \ + 'libgsl23|libgsl23' \ + 'libprotobuf-lite17|libprotobuf-lite23' \ libqca-qt5-2-plugins \ libqt53dextras5 \ libqt53drender5 \ libqt5concurrent5 \ - libqt5opengl5-dev \ + libqt5keychain1 \ libqt5positioning5 \ libqt5qml5 \ libqt5quick5 \ libqt5quickcontrols2-5 \ - libqt5scintilla2-dev \ + libqt5quickwidgets5 \ + libqt5serialport5 \ libqt5sql5-odbc \ libqt5sql5-sqlite \ - libqt5svg5-dev \ - libqt5webkit5-dev \ libqt5xml5 \ - libqt5serialport5-dev \ - libqwt-qt5-dev \ - libspatialindex-dev \ - libspatialite-dev \ - libsqlite3-dev \ + libqt5webkit5 \ + libqwt-qt5-6 \ + libspatialindex6 \ libsqlite3-mod-spatialite \ - libzip-dev \ - libzstd-dev \ + libzip5 \ lighttpd \ locales \ - ninja-build \ pdal \ - pkg-config \ poppler-utils \ postgresql-client \ - protobuf-compiler \ - pyqt5-dev \ - pyqt5-dev-tools \ - pyqt5.qsci-dev \ - python3-all-dev \ - python3-dev \ python3-future \ python3-gdal \ python3-mock \ @@ -90,22 +65,13 @@ RUN apt-get update \ python3-pyqt5.qtsvg \ python3-pyqt5.qtwebkit \ python3-sip \ - python3-sip-dev \ python3-termcolor \ python3-yaml \ - qt3d5-dev \ qt3d-assimpsceneimport-plugin \ qt3d-defaultgeometryloader-plugin \ qt3d-gltfsceneio-plugin \ qt3d-scene2d-plugin \ qt5-image-formats-plugins \ - qt5keychain-dev \ - qtbase5-dev \ - qtdeclarative5-dev-tools \ - qtpositioning5-dev \ - qttools5-dev \ - qttools5-dev-tools \ - qtbase5-private-dev \ saga \ spawn-fcgi \ supervisor \ @@ -116,9 +82,7 @@ RUN apt-get update \ xfonts-base \ xfonts-scalable \ xvfb \ - opencl-headers \ ocl-icd-libopencl1 \ - ocl-icd-opencl-dev \ && pip3 install \ psycopg2 \ numpy \ @@ -177,6 +141,60 @@ RUN echo "alias python=python3" >> ~/.bash_aliases RUN curl -k https://www.orfeo-toolbox.org/packages/archives/OTB/OTB-7.1.0-Linux64.run -o /tmp/OTB-Linux64.run && sh /tmp/OTB-Linux64.run --target /opt/otb ENV OTB_INSTALL_DIR=/opt/otb +FROM binary-only + +RUN apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y \ + bison \ + ccache \ + clang \ + cmake \ + flex \ + git \ + grass-dev \ + libexiv2-dev \ + libexpat1-dev \ + libfcgi-dev \ + libgdal-dev \ + libgeos-dev \ + libgsl-dev \ + libpdal-dev \ + libpq-dev \ + libproj-dev \ + libprotobuf-dev \ + libqca-qt5-2-dev \ + libqt5opengl5-dev \ + libqt5scintilla2-dev \ + libqt5svg5-dev \ + libqt5webkit5-dev \ + libqt5serialport5-dev \ + libqwt-qt5-dev \ + libspatialindex-dev \ + libspatialite-dev \ + libsqlite3-dev \ + libsqlite3-mod-spatialite \ + libzip-dev \ + libzstd-dev \ + ninja-build \ + protobuf-compiler \ + pyqt5-dev \ + pyqt5-dev-tools \ + pyqt5.qsci-dev \ + python3-all-dev \ + python3-dev \ + python3-sip-dev \ + qt3d5-dev \ + qt5keychain-dev \ + qtbase5-dev \ + qtdeclarative5-dev-tools \ + qtpositioning5-dev \ + qttools5-dev \ + qttools5-dev-tools \ + qtbase5-private-dev \ + opencl-headers \ + ocl-icd-opencl-dev \ + && apt-get clean + # Clazy RUN curl -k https://downloads.kdab.com/clazy/1.6/Clazy-x86_64-1.6.AppImage -o /tmp/Clazy.AppImage \ && chmod +x /tmp/Clazy.AppImage \ diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 306222aa0b3..fadc979d136 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -122,22 +122,19 @@ jobs: --env PUSH_TO_CDASH=true \ --env WITH_3D=${WITH_3D} \ qgis/qgis3-build-deps:${DOCKER_TAG} \ - /root/QGIS/.docker/docker-qgis-build.sh - docker commit qgis_container qgis_image + /bin/bash -c "/root/QGIS/.docker/docker-qgis-build.sh; ctest -V -S /root/QGIS/.ci/config_build.ctest" - - name: Push image - if: github.event_name == 'pull_request' && contains( github.event.pull_request.labels.*.name, 'Push Docker Image') - env: - GITHUB_PR_NUMBER: ${{github.event.number}} - run: | - docker login -u="${DOCKER_USERNAME}" -p="${DOCKER_PASSWORD}" - docker commit qgis_container qgis/qgis-pr-build:PR${GITHUB_PR_NUMBER} - docker push qgis/qgis-pr-build:PR${GITHUB_PR_NUMBER} - - - name: Run unit tests - id: tests + - name: Push artifact + id: push_artifact if: ${{ matrix.ubuntu-base == env.DEFAULT_UBUNTU_BASE }} - run: docker-compose -f .docker/docker-compose-testing.yml run qgis-deps /root/QGIS/.docker/docker-qgis-test.sh + run: tar --exclude='*.o' -cvzf build.tgz build + + - uses: actions/upload-artifact@v2 + if: ${{ matrix.ubuntu-base == env.DEFAULT_UBUNTU_BASE }} + with: + name: build.tgz + path: ./build.tgz + retention-days: 1 # - name: Test QGIS runners # id: runners @@ -231,3 +228,77 @@ jobs: # comment-id: ${{ steps.process-vars.outputs.COMMENT_ID }} # edit-mode: append # body: ${{ steps.process-vars.outputs.COMMENT_BODY }} + + run-tests: + name: Run tests + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + GH_WORKSPACE: ${{ github.workspace }} # used in docker compose + DEFAULT_UBUNTU_BASE: '20.04' + + runs-on: ubuntu-latest + + strategy: + matrix: + # tests run on 20.04 (Qt 5.12), compile test on 20.10 (Qt 5.14) + ubuntu-base: [20.04] + test-batch: [ALL_BUT_PROVIDERS, POSTGRES, ORACLE, HANA] + fail-fast: false + + needs: build + + steps: + + - name: Checkout + uses: actions/checkout@v2 + + - name: Set vars + env: + GITHUB_EVENT_NAME: ${{ github.event_name }} + GITHUB_REF: ${{ github.ref }} + GITHUB_PR_NUMBER: ${{github.event.number}} + UBUNTU_BASE: ${{ matrix.ubuntu-base }} + TEST_BATCH: ${{ matrix.test-batch }} + run: | + DOCKER_TAG=$(echo $( [[ ${GITHUB_EVENT_NAME} =~ ^pull_request$ ]] && echo ${GITHUB_BASE_REF} || echo ${GITHUB_REF##*/} ) | sed 's/^master$/latest/')$( [[ ${UBUNTU_BASE} != ${DEFAULT_UBUNTU_BASE} ]] && echo "_${UBUNTU_BASE}" || echo "" ) + CTEST_BUILD_NAME=$( [[ ${GITHUB_EVENT_NAME} =~ ^pull_request$ ]] && echo "PR${GITHUB_PR_NUMBER}" || echo ${GITHUB_REF##*/} )"_${GITHUB_SHA}_${TEST_BATCH}" + [[ ${UBUNTU_BASE} == "20.04" ]] && PATCH_QT_3D=true || PATCH_QT_3D=false + echo "DOCKER_TAG=${DOCKER_TAG}" >> $GITHUB_ENV + echo "CTEST_BUILD_NAME=${CTEST_BUILD_NAME}" >> $GITHUB_ENV + echo "PATCH_QT_3D=${PATCH_QT_3D}" >> $GITHUB_ENV + + - name: Print vars + run: | + echo DOCKER_TAG: ${DOCKER_TAG} + echo CTEST_BUILD_NAME: ${CTEST_BUILD_NAME} + echo PATCH_QT_3D: ${PATCH_QT_3D} + + - name: Build deps + env: + UBUNTU_BASE: ${{ matrix.ubuntu-base }} + run: | + pushd .docker + docker build --target binary-only --build-arg UBUNTU_BASE=${UBUNTU_BASE} --cache-from qgis/qgis3-build-deps:${DOCKER_TAG} -t qgis/qgis3-build-deps-bin-only:${DOCKER_TAG} -f qgis3-build-deps.dockerfile . + popd + + - name: Download build artifact + uses: actions/download-artifact@v2 + with: + name: build.tgz + path: . + + - name: Extract build artifact + run: tar xvzf build.tgz + + - name: Run tests + id: tests + env: + TEST_BATCH: ${{matrix.test-batch}} + run: | + DOCKERFILE=$( ( [[ ${TEST_BATCH} == "ORACLE" ]] && echo "docker-compose-testing-oracle.yml" ) \ + || ( [[ ${TEST_BATCH} == "POSTGRES" ]] && echo "docker-compose-testing-postgres.yml" ) \ + || echo "docker-compose-testing.yml" ) + echo "TEST_BATCH=$TEST_BATCH" + echo "DOCKERFILE=$DOCKERFILE" + docker-compose -f .docker/$DOCKERFILE run qgis-deps /root/QGIS/.docker/docker-qgis-test.sh $TEST_BATCH diff --git a/python/plugins/db_manager/db_plugins/postgis/CMakeLists.txt b/python/plugins/db_manager/db_plugins/postgis/CMakeLists.txt index a5ec9142e58..f71259b51f5 100644 --- a/python/plugins/db_manager/db_plugins/postgis/CMakeLists.txt +++ b/python/plugins/db_manager/db_plugins/postgis/CMakeLists.txt @@ -10,5 +10,6 @@ if(ENABLE_TESTS) if (ENABLE_PGTEST) ADD_PYTHON_TEST(dbmanager-postgis-connector connector_test.py) ADD_PYTHON_TEST(dbmanager-postgis-plugin plugin_test.py) + SET_TESTS_PROPERTIES(dbmanager-postgis-connector dbmanager-postgis-plugin PROPERTIES LABELS "POSTGRES") endif() endif() diff --git a/tests/code_layout/test_shellcheck.sh b/tests/code_layout/test_shellcheck.sh index f7559a6ef47..43e9c797913 100755 --- a/tests/code_layout/test_shellcheck.sh +++ b/tests/code_layout/test_shellcheck.sh @@ -3,9 +3,7 @@ # This runs shellcheck on all sh files -srcdir=$(dirname $0)/../../ - -DIR=$(git -C ${srcdir} rev-parse --show-toplevel) +DIR=$(realpath $(dirname $0)/../../) pushd ${DIR} > /dev/null || exit result=$(shellcheck -e SC2016,SC2015,SC2086,SC2002,SC1117,SC2154,SC2076,SC2046,SC1090,SC2038,SC2031,SC2030,SC2162,SC2044,SC2119,SC1001,SC2120,SC2059,SC2128,SC2005,SC2013,SC2027,SC2090,SC2089,SC2124,SC2001,SC2010,SC1072,SC1073,SC1009,SC2166,SC2045,SC2028,SC1091,SC1083,SC2021 $(find . -name '*.sh')) diff --git a/tests/src/analysis/CMakeLists.txt b/tests/src/analysis/CMakeLists.txt index 825c2bd51f3..f659354b353 100644 --- a/tests/src/analysis/CMakeLists.txt +++ b/tests/src/analysis/CMakeLists.txt @@ -67,3 +67,6 @@ set(TESTS foreach(TESTSRC ${TESTS}) ADD_QGIS_TEST(${TESTSRC}) endforeach(TESTSRC) + +SET_TESTS_PROPERTIES(qgis_processingtest + PROPERTIES LABELS "POSTGRES") diff --git a/tests/src/core/CMakeLists.txt b/tests/src/core/CMakeLists.txt index 784cda68a33..53e0d84d184 100644 --- a/tests/src/core/CMakeLists.txt +++ b/tests/src/core/CMakeLists.txt @@ -243,4 +243,8 @@ foreach(TESTSRC ${TESTS}) ADD_QGIS_TEST(${TESTSRC}) endforeach(TESTSRC) +if (ENABLE_PGTEST) + SET_TESTS_PROPERTIES(qgis_vectorlayerjoinbuffertest PROPERTIES LABELS "POSTGRES") +endif() + add_dependencies(qgis_coordinatereferencesystemtest synccrsdb) diff --git a/tests/src/gui/CMakeLists.txt b/tests/src/gui/CMakeLists.txt index ac8b550052d..efca16e1069 100644 --- a/tests/src/gui/CMakeLists.txt +++ b/tests/src/gui/CMakeLists.txt @@ -127,3 +127,10 @@ ADD_QGIS_TEST(singlebandpseudocolorrendererwidget testqgssinglebandpseudocolorre ADD_QGIS_TEST(doublevalidator testqgsdoublevalidator.cpp) ADD_QGIS_TEST(meshlayerpropertiesdialog testqgsmeshlayerpropertiesdialog.cpp) ADD_QGIS_TEST(externalresourcewidgetwrapper testqgsexternalresourcewidgetwrapper.cpp) + +SET_TESTS_PROPERTIES(qgis_listwidgettest PROPERTIES LABELS "POSTGRES") +if (ENABLE_PGTEST) + SET_TESTS_PROPERTIES(qgis_processingguitest qgis_valuerelationwidgetwrapper qgis_texteditwrapper + qgis_newdatabasetablewidget + PROPERTIES LABELS "POSTGRES") +endif() diff --git a/tests/src/python/CMakeLists.txt b/tests/src/python/CMakeLists.txt index 63b95f9a5f8..526ef96ee3d 100644 --- a/tests/src/python/CMakeLists.txt +++ b/tests/src/python/CMakeLists.txt @@ -231,7 +231,6 @@ ADD_PYTHON_TEST(PyQgsProcessingInPlace test_qgsprocessinginplace.py) ADD_PYTHON_TEST(PyQgsProcessingAlgRunner test_qgsprocessingalgrunner.py) ADD_PYTHON_TEST(PyQgsProcessingAlgDecorator test_processing_alg_decorator.py) ADD_PYTHON_TEST(PyQgsProcessingParameters test_qgsprocessingparameters.py) -ADD_PYTHON_TEST(PyQgsImportIntoPostGIS test_processing_importintopostgis.py) ADD_PYTHON_TEST(PyQgsProjectionSelectionWidgets test_qgsprojectionselectionwidgets.py) ADD_PYTHON_TEST(PyQgsProjectMetadata test_qgsprojectmetadata.py) ADD_PYTHON_TEST(PyQgsProjectServerValidator test_qgsprojectservervalidator.py) @@ -243,7 +242,6 @@ ADD_PYTHON_TEST(PyQgsProviderConnectionSpatialite test_qgsproviderconnection_spa ADD_PYTHON_TEST(PyQgsProviderRegistry test_qgsproviderregistry.py) ADD_PYTHON_TEST(PyQgsProviderSourceWidgetProviderRegistry test_qgssourcewidgetproviderregistry.py) ADD_PYTHON_TEST(TestQgsRandomMarkerSymbolLayer test_qgsrandommarkersymbollayer.py) -ADD_PYTHON_TEST(PyQgsQueryResultModel test_qgsqueryresultmodel.py) ADD_PYTHON_TEST(PyQgsRange test_qgsrange.py) ADD_PYTHON_TEST(PyQgsRangeSlider test_qgsrangeslider.py) ADD_PYTHON_TEST(PyQgsRangeWidgets test_qgsrangewidgets.py) @@ -314,7 +312,6 @@ ADD_PYTHON_TEST(PyQgsUnitTypes test_qgsunittypes.py) ADD_PYTHON_TEST(PyQgsValidityChecks test_qgsvaliditychecks.py) ADD_PYTHON_TEST(PyQgsValidityResultsWidget test_qgsvalidityresultswidget.py) ADD_PYTHON_TEST(PyQgsVectorFieldMarkerSymbolLayer test_qgsvectorfieldmarkersymbollayer.py) -ADD_PYTHON_TEST(PyQgsVectorFileWriter test_qgsvectorfilewriter.py) ADD_PYTHON_TEST(PyQgsVectorFileWriterTask test_qgsvectorfilewritertask.py) ADD_PYTHON_TEST(PyQgsVectorLayer test_qgsvectorlayer.py) ADD_PYTHON_TEST(PyQgsVectorLayerFeatureCounter test_qgsvectorlayerfeaturecounter.py) @@ -325,7 +322,6 @@ ADD_PYTHON_TEST(PyQgsVectorLayerRenderer test_qgsvectorlayerrenderer.py) ADD_PYTHON_TEST(PyQgsVectorLayerSelectedFeatureSource test_qgsvectorlayerselectedfeaturesource.py) ADD_PYTHON_TEST(PyQgsVectorLayerShapefile test_qgsvectorlayershapefile.py) ADD_PYTHON_TEST(PyQgsVectorLayerTemporalProperties test_qgsvectorlayertemporalproperties.py) -ADD_PYTHON_TEST(PyQgsVectorLayerUtils test_qgsvectorlayerutils.py) ADD_PYTHON_TEST(PyQgsZonalStatistics test_qgszonalstatistics.py) ADD_PYTHON_TEST(PyQgsVirtualLayerProvider test_provider_virtual.py) ADD_PYTHON_TEST(PyQgsVirtualLayerTask test_qgsvirtuallayertask.py) @@ -367,6 +363,10 @@ if (WITH_DESKTOP) endif() if (ENABLE_PGTEST) + ADD_PYTHON_TEST(PyQgsImportIntoPostGIS test_processing_importintopostgis.py) + ADD_PYTHON_TEST(PyQgsQueryResultModel test_qgsqueryresultmodel.py) + ADD_PYTHON_TEST(PyQgsVectorFileWriter test_qgsvectorfilewriter.py) + ADD_PYTHON_TEST(PyQgsVectorLayerUtils test_qgsvectorlayerutils.py) ADD_PYTHON_TEST(PyQgsPostgresProvider test_provider_postgres.py) ADD_PYTHON_TEST(PyQgsPostgresRasterProvider test_provider_postgresraster.py) ADD_PYTHON_TEST(PyQgsPostgresDomain test_qgspostgresdomain.py) @@ -386,23 +386,35 @@ if (ENABLE_PGTEST) ADD_PYTHON_TEST(PyQgsProviderConnectionPostgres test_qgsproviderconnection_postgres.py) if (WITH_SERVER) ADD_PYTHON_TEST(PyQgsServerWMSGetFeatureInfoPG test_qgsserver_wms_getfeatureinfo_postgres.py) + # project contains connection to Postgres database + ADD_PYTHON_TEST(PyQgsServerWMSGetFeatureInfo test_qgsserver_wms_getfeatureinfo.py) ADD_PYTHON_TEST(PyQgsServerAccessControlWMSGetPrintPG test_qgsserver_accesscontrol_wms_getprint_postgres.py) endif() + SET_TESTS_PROPERTIES(PyQgsImportIntoPostGIS PyQgsQueryResultModel PyQgsVectorFileWriter PyQgsPostgresProvider + PyQgsVectorLayerUtils PyQgsPostgresRasterProvider PyQgsPostgresDomain PyQgsPostgresTransaction + PyQgsRelationEditWidget PyQgsRelationPostgres PyQgsVectorLayerTools PyQgsProjectStoragePostgres + PyQgsAuthManagerPKIPostgresTest PyQgsAuthManagerPasswordPostgresTest PyQgsAuthManagerOgrPostgresTest + PyQgsDbManagerPostgis PyQgsDatabaseSchemaModel PyQgsDatabaseTableModel PyQgsDatabaseSchemaComboBox PyQgsDatabaseTableComboBox + PyQgsProviderConnectionPostgres PyQgsServerWMSGetFeatureInfoPG PyQgsServerAccessControlWMSGetPrintPG PyQgsServerWMSGetFeatureInfo + PROPERTIES LABELS "POSTGRES") endif() if (ENABLE_MSSQLTEST) ADD_PYTHON_TEST(PyQgsMssqlProvider test_provider_mssql.py) ADD_PYTHON_TEST(PyQgsProviderConnectionMssql test_qgsproviderconnection_mssql.py) + SET_TESTS_PROPERTIES(PyQgsMssqlProvider PyQgsProviderConnectionMssql PROPERTIES LABELS "MSSQL") endif() if (ENABLE_ORACLETEST) ADD_PYTHON_TEST(PyQgsOracleProvider test_provider_oracle.py) ADD_PYTHON_TEST(PyQgsProviderConnectionOracle test_qgsproviderconnection_oracle.py) + SET_TESTS_PROPERTIES(PyQgsOracleProvider PyQgsProviderConnectionOracle PROPERTIES LABELS "ORACLE") endif() if (ENABLE_HANATEST) ADD_PYTHON_TEST(PyQgsHanaProvider test_provider_hana.py TEST_TIMEOUT=600) ADD_PYTHON_TEST(PyQgsProviderConnectionHana test_qgsproviderconnection_hana.py TEST_TIMEOUT=120) + SET_TESTS_PROPERTIES(PyQgsHanaProvider PyQgsProviderConnectionHana PROPERTIES LABELS "HANA") endif (ENABLE_HANATEST) if (WITH_SERVER) @@ -418,7 +430,6 @@ if (WITH_SERVER) ADD_PYTHON_TEST(PyQgsServerWMSGetMapSizeProject test_qgsserver_wms_getmap_size_project.py) ADD_PYTHON_TEST(PyQgsServerWMSGetMapSizeServer test_qgsserver_wms_getmap_size_server.py) ADD_PYTHON_TEST(PyQgsServerWMSGetMapIgnoreBadLayers test_qgsserver_wms_getmap_ignore_bad_layers.py) - ADD_PYTHON_TEST(PyQgsServerWMSGetFeatureInfo test_qgsserver_wms_getfeatureinfo.py) ADD_PYTHON_TEST(PyQgsServerWMSGetLegendGraphic test_qgsserver_wms_getlegendgraphic.py) ADD_PYTHON_TEST(PyQgsServerWMSGetPrint test_qgsserver_wms_getprint.py) ADD_PYTHON_TEST(PyQgsServerWMSGetPrintExtra test_qgsserver_wms_getprint_extra.py)