From 133bb9f870bc82bfaad8abd71dc65fb1d50c28b9 Mon Sep 17 00:00:00 2001 From: Stefan Krenz Date: Wed, 27 Apr 2022 16:00:07 +0200 Subject: [PATCH] feat: Add testing environment --- .github/workflows/build.yml | 95 +++++++++++++++++----------------- .gitignore | 2 + phpunit.xml | 14 ----- tests/utils/Dockerfile | 23 ++++---- tests/utils/composer.test.json | 16 +++--- tests/utils/default-command.sh | 9 ---- tests/utils/docker-compose.yml | 11 ++-- tests/utils/lint-php-files | 6 +++ tests/utils/php.test.ini | 18 +++++++ tests/utils/run-tests | 77 +++++++++++++++++++++++++++ 10 files changed, 180 insertions(+), 91 deletions(-) delete mode 100755 tests/utils/default-command.sh create mode 100755 tests/utils/lint-php-files create mode 100644 tests/utils/php.test.ini create mode 100755 tests/utils/run-tests diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1a4ffcf..41ce426 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,45 +16,36 @@ jobs: with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - name: Setup PHP with PECL extension - uses: shivammathur/setup-php@v2 - with: - php-version: '8.0' - extensions: curl, json, :opcache, xdebug, mbstring, xdebug - coverage: xdebug - ini-values: memory_limit=-1,error_reporting=-1,log_errors_max_len=0,zend.assertions=1,assert.exception=1,xdebug.show_exception_trace=0,suhosin.executor.include.whitelist=phar,xdebug.mode="develop,coverage" - - name: Validate composer.json and composer.lock run: composer validate --strict - - name: Get Composer Cache Directory - id: composer-cache - run: | - echo "::set-output name=dir::$(composer config cache-files-dir)" - - - uses: actions/cache@v3 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-dev-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: | - ${{ runner.os }}-dev-composer- - - name: Install dependencies uses: php-actions/composer@v6 with: command: install dev: yes - php_version: 8.0 + php_version: 7.4 version: 2 - args: --ignore-platform-reqs --prefer-dist -no --no-progress + args: --ignore-platform-reqs --prefer-dist -no --no-progress --no-plugins + + - name: Create .env for docker + run: | + rm -f tests/utils/.env + echo "USER_ID=$(id -u)" >> tests/utils/.env + echo "GROUP_ID=$(id -g)" >> tests/utils/.env + + - name: Build test container + run: docker-compose build tests - name: Run tests - run: composer test + run: | + docker-compose run --rm tests --all + docker-compose down - name: Compress HTML code coverage run: | cd build/ - tar -czf /tmp/code-coverage-html.tar.gz code-coverage-html/ + tar -czf /tmp/code-coverage-html.tar.gz html/ - name: Upload HTML code coverage report uses: actions/upload-artifact@v2 @@ -67,20 +58,42 @@ jobs: uses: actions/upload-artifact@v2 with: name: code-coverage-clover - path: build/code-coverage-clover.xml + path: build/clover.xml retention-days: 1 - - name: Upload PHPUnit junit report + - name: Upload PHP-formatted code coverage report uses: actions/upload-artifact@v2 with: - name: phpunit-junit - path: build/junit.xml + name: code-coverage-php + path: build/coverage.cov retention-days: 1 - - name: Fix code coverage paths +# Currently unavailable +# - name: Upload PHPUnit junit report +# uses: actions/upload-artifact@v2 +# with: +# name: phpunit-junit +# path: build/junit.xml +# retention-days: 1 + + - name: Upload OXID metrics report + uses: actions/upload-artifact@v2 + with: + name: metrics + path: build/metrics.txt + retention-days: 1 + + - name: Upload OXID pdepend report + uses: actions/upload-artifact@v2 + with: + name: pdepend + path: build/pdepend.xml + retention-days: 1 + + - name: Fix code coverage paths + # Currently unavailable: sed -i 's@'$GITHUB_WORKSPACE'@/github/workspace/@g' build/junit.xml run: | - sed -i 's@'$GITHUB_WORKSPACE'@/github/workspace/@g' build/code-coverage-clover.xml - sed -i 's@'$GITHUB_WORKSPACE'@/github/workspace/@g' build/junit.xml + sed -i 's@/app/@/github/workspace/@g' build/clover.xml - name: SonarCloud Scan uses: SonarSource/sonarcloud-github-action@master @@ -88,6 +101,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} # Needed to get PR information, if any SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} with: + # Currently unavailable: -Dsonar.php.tests.reportPath=build/junit.xml args: > -Dsonar.projectKey=MakairaIO_oxid-connect-essential -Dsonar.organization=makairaio @@ -95,8 +109,7 @@ jobs: -Dsonar.sources=src/ -Dsonar.tests=tests/ -Dsonar.sourceEncoding=UTF-8 - -Dsonar.php.tests.reportPath=build/junit.xml - -Dsonar.php.coverage.reportPaths=build/code-coverage-clover.xml + -Dsonar.php.coverage.reportPaths=build/clover.xml release: name: Create a new release @@ -110,24 +123,12 @@ jobs: fetch-depth: 0 persist-credentials: false - - name: Get Composer Cache Directory - id: composer-cache - run: | - echo "::set-output name=dir::$(composer config cache-files-dir)" - - - uses: actions/cache@v3 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-nodev-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: | - ${{ runner.os }}-nodev-composer- - - name: Install dependencies uses: php-actions/composer@v6 with: command: install - dev: no - php_version: 8.0 + dev: yes + php_version: 7.4 version: 2 args: --ignore-platform-reqs --prefer-dist -no --no-progress diff --git a/.gitignore b/.gitignore index 6c299b6..3a013ac 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ !/build/.gitkeep /.idea /composer.lock +/tests/reports/ +tests/utils/.env diff --git a/phpunit.xml b/phpunit.xml index fdbfe58..ee1eb33 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -10,18 +10,4 @@ tests/ - - - - src/ - - - - - - - - - - diff --git a/tests/utils/Dockerfile b/tests/utils/Dockerfile index 29c5ce1..17882f8 100644 --- a/tests/utils/Dockerfile +++ b/tests/utils/Dockerfile @@ -2,9 +2,10 @@ FROM marmaladegmbh/php:7.4 COPY tests/utils/composer.test.json /app/composer.json COPY tests/utils/config.test.php /app/ +COPY tests/utils/php.test.ini /usr/local/etc/php/conf.d/zz-custom.ini COPY . /app/modules/oxid-connect-essential/ COPY tests/utils/install-mysql-client /usr/bin/ -COPY tests/utils/default-command.sh / +COPY tests/utils/run-tests /usr/local/bin/run-tests COPY tests/utils/generated-services-updater /app/bin/ WORKDIR /app @@ -12,14 +13,18 @@ WORKDIR /app ENV PARTIAL_MODULE_PATHS=makaira/oxid-connect-essential RUN install-mysql-client dev && \ - apt install -y libmagickwand-6.q16-6 && \ + apt-get install -y libmagickwand-6.q16-6 && \ ln -snf /bin/composer2 /bin/composer && \ - /bin/composer install -nq && \ + /bin/composer install --no-progress -nq && \ echo "include __DIR__ . '/../config.test.php';" >> source/config.inc.php && \ - rm -rf app/modules/ && \ - apt autoremove -yqq --purge && \ - apt clean && \ - rm -rf /var/lib/apt/lists/* + apt-get autoremove -yqq --purge && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* && \ + . /app/modules/oxid-connect-essential/tests/utils/.env && \ + chown -R $USER_ID:$GROUP_ID . && \ + rm -f vendor/makaira/oxid-connect-essential && \ + rm -rf source/modules/makaira/oxid-connect-essential && \ + bin/generated-services-updater - -CMD /default-command.sh +ENTRYPOINT ["run-tests"] +CMD ["--unit"] diff --git a/tests/utils/composer.test.json b/tests/utils/composer.test.json index d5084ef..7b93933 100644 --- a/tests/utils/composer.test.json +++ b/tests/utils/composer.test.json @@ -51,12 +51,16 @@ "oe:ide-helper:generate": [ "if [ -f ./vendor/bin/oe-eshop-ide_helper ]; then oe-eshop-ide_helper; fi" ], - "test": [ - "@dev:update", + "run-tests": [ + "runtests" + ], + "run-tests-coverage": [ "runtests-coverage" ], + "run-metrics": [ + "runmetrics" + ], "dev:update": [ - "@dev:remove-mod", "@dev:update-mod", "@dev:activate-mod", "@dev:clear-tmp" @@ -64,12 +68,6 @@ "dev:clear-tmp": [ "find source/tmp/ -type f -delete" ], - "dev:remove-mod": [ - "oe-console oe:module:deactivate makaira_oxid-connect-essential", - "rm -f vendor/makaira/oxid-connect-essential", - "rm -rf source/modules/makaira/oxid-connect-essential", - "@php bin/generated-services-updater" - ], "dev:activate-mod": [ "oe-console oe:module:activate makaira_oxid-connect-essential" ], diff --git a/tests/utils/default-command.sh b/tests/utils/default-command.sh deleted file mode 100755 index 516e7b6..0000000 --- a/tests/utils/default-command.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -composer2 test - -c2exit=$? - -test -f /app/source/log/oxideshop.log && cat /app/source/log/oxideshop.log - -exit $c2exit diff --git a/tests/utils/docker-compose.yml b/tests/utils/docker-compose.yml index 65573a1..f59b1ec 100644 --- a/tests/utils/docker-compose.yml +++ b/tests/utils/docker-compose.yml @@ -1,15 +1,16 @@ services: - shop: + tests: build: context: ../../ dockerfile: ./tests/utils/Dockerfile volumes: - "../../:/app/modules/oxid-connect-essential" - - "./config.test.php:/app/config.test.php:ro" + - "/etc/passwd:/etc/passwd:ro" + - "/etc/group:/etc/group:ro" depends_on: - db + user: ${USER_ID:?You must set the user ID in the .env file}:${GROUP_ID:?You must set the group ID in the .env file} environment: - COMPOSE_PROJECT_NAME: ${COMPOSE_PROJECT_NAME:-Foo} APP_DATA: "/app_data" PHPINI_MEMORY_LIMIT: 1G PHPINI_SESSION__GC_MAXLIFETIME: "3600" @@ -24,6 +25,9 @@ services: PHPINI_XDEBUG__VAR_DISPLAY_MAX_DATA: 1024 PHPINI_XDEBUG__VAR_DISPLAY_MAX_DEPTH: 10 PHP_IDE_CONFIG: serverName=oxid64-tests.${DOMAIN:-makaira.vm} + extra_hosts: + - "host.docker.internal:host-gateway" + restart: "no" db: image: mysql:5.7 @@ -45,3 +49,4 @@ services: MYSQL_DATABASE: oxid MYSQL_USER: oxid MYSQL_PASSWORD: oxid + restart: "no" diff --git a/tests/utils/lint-php-files b/tests/utils/lint-php-files new file mode 100755 index 0000000..6240118 --- /dev/null +++ b/tests/utils/lint-php-files @@ -0,0 +1,6 @@ +#!/bin/sh + +files=$(find ./src/ -iname '*.php') +for f in $files; do + php -l $f +done diff --git a/tests/utils/php.test.ini b/tests/utils/php.test.ini new file mode 100644 index 0000000..7d6b953 --- /dev/null +++ b/tests/utils/php.test.ini @@ -0,0 +1,18 @@ +zend_extension=xdebug.so +memory_limit=-1 +max_execution_time=0 + +[session] +session.gc_maxliftime=3600 + +[xdebug] +xdebug.start_with_request=trigger +xdebug.output_dir=/app_data +xdebug.client_host=host.docker.internal +xdebug.client_port=9000 +xdebug.cli_color=1 +xdebug.max_nesting_level=512 +xdebug.var_display_max_children=256 +xdebug.var_display_max_data=1024 +xdebug.var_display_max_depth=10 +xdebug.mode=debug,coverage diff --git a/tests/utils/run-tests b/tests/utils/run-tests new file mode 100755 index 0000000..000c59f --- /dev/null +++ b/tests/utils/run-tests @@ -0,0 +1,77 @@ +#!/bin/bash + +set -e + +cleanup() { + test -f source/log/oxideshop.log && cat source/log/oxideshop.log +} + +trap cleanup EXIT + +run_tests=0 +run_tests_coverage=0 +run_metrics=0 +update=1 + +# Call getopt to validate the provided input. +options=$(getopt -o umc -l unit -l metrics -l code-coverage -l all -l no-update -- "$@") +[ $? -eq 0 ] || { + echo "Incorrect options provided" + exit 1 +} +eval set -- "$options" +while true; do + case "$1" in + -u | --unit) run_tests=1; shift ;; + -m | --metrics) run_metrics=1; shift ;; + -c | --code-coverage) run_metrics=1; run_tests_coverage=1; shift ;; + --all) run_tests=1; run_tests_coverage=1; run_metrics=1; shift ;; + --no-update) update=0; shift ;; + --) shift; break ;; + *) break ;; + esac + shift +done + +# Update the module in OXID +if [ $update -eq 1 ]; then + composer dev:update +fi + +mkdir -p odules/oxid-connect-essential/build/ + +set +e + +# Run PHPUnit tests +composer_exit=0 +if [ $run_tests -eq 1 ]; then + sub_command="" + if [ $run_tests_coverage -eq 1 ]; then + sub_command="-coverage" + fi + composer "run-tests$sub_command" + composer_exit=$? +fi + +if [ -d source/modules/makaira/oxid-connect-essential/tests/reports ]; then + cp -rf source/modules/makaira/oxid-connect-essential/tests/reports/* modules/oxid-connect-essential/build/ +fi + +if [ $composer_exit -ne 0 ]; then + exit $composer_exit +fi + +# Run metrics tests +composer_exit=0 +if [ $run_metrics -eq 1 ]; then + composer "run-metrics" + composer_exit=$? +fi + +if [ -d source/modules/makaira/oxid-connect-essential/tests/reports ]; then + cp -rf source/modules/makaira/oxid-connect-essential/tests/reports/* modules/oxid-connect-essential/build/ +fi + +if [ $composer_exit -ne 0 ]; then + exit $composer_exit +fi