Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
364 changes: 364 additions & 0 deletions .github/workflows/acceptance.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,364 @@
on:
workflow_call:
inputs:
app-name:
description: 'Name of the app'
required: true
type: string
php-versions:
description: JSON array of PHP versions
required: false
type: string
default: '["8.3"]'
databases:
description: JSON array of databases
required: false
type: string
default: '["mariadb:10.6"]'
test-suites:
description: JSON array of acceptance test suite names
required: false
type: string
default: '[""]'
app-repository:
description: 'Repository of the app (optional, defaults to the current repository)'
required: false
type: string
default: ''
server-root:
description: 'The folder under the Apache root in which to install owncloud core'
required: false
type: string
default: ''
federated-root:
description: 'The folder under the Apache root in which to install a federated server'
required: false
type: string
default: ''
do-api-tests:
description: 'Whether to run API acceptance tests'
required: false
type: boolean
default: false
do-cli-tests:
description: 'Whether to run CLI acceptance tests'
required: false
type: boolean
default: false
do-webui-tests:
description: 'Whether to run WebUI acceptance tests'
required: false
type: boolean
default: false
additional-app:
description: 'Additional app to enable for testing'
required: false
type: string
default: ''
additional-app-github-token:
description: 'GitHub PAT to access the additional app repo - required if private'
required: false
type: string
default: ''
additional-packages:
description: Additional Linux packages to be installed - space separated
required: false
type: string
default: ''

jobs:
acceptance:
name: Acceptance tests
runs-on: ubuntu-latest
strategy:
fail-fast: true
matrix:
php: ${{ fromJSON(inputs.php-versions) }}
database: ${{ fromJSON(inputs.databases) }}
suite: ${{ fromJSON(inputs.test-suites) }}

services:
mysql:
image: >-
${{ (startsWith(matrix.database,'mysql:') || startsWith(matrix.database,'mariadb:')) && matrix.database || '' }}
env:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: owncloud
MYSQL_USER: owncloud
MYSQL_PASSWORD: owncloud
options: >-
--health-cmd="mysqladmin ping -u root -ppassword"
--health-interval=10s
--health-timeout=5s
--health-retries=3
ports:
- 3306:3306
postgres:
image: ${{ startsWith(matrix.database,'postgres:') && matrix.database || '' }}
env:
POSTGRES_DB: owncloud
POSTGRES_USER: owncloud
POSTGRES_PASSWORD: owncloud
ports:
- 5432:5432

steps:
- name: Clone owncloud/core
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
repository: owncloud/core

- name: Checkout apps/${{ inputs.app-name }}
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
path: apps/${{ inputs.app-name }}
repository: ${{ inputs.app-repository }}

- name: Checkout apps/${{ inputs.additional-app }}
if: ${{ inputs.additional-app != '' }}
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
path: apps/${{ inputs.additional-app }}
repository: owncloud/${{ inputs.additional-app }}
token: ${{ inputs.additional-app-github-token || github.token }}

- name: Install Linux packages
if: ${{ inputs.additional-packages }}
run: |
sudo apt-get install ${{ inputs.additional-packages }}

- name: Setup PHP
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
with:
php-version: ${{ matrix.php }}
extensions: apcu, ctype, curl, exif, fileinfo, gd, iconv, imagick, intl, json, mbstring, memcached, pdo, posix, simplexml, xml, zip, smbclient, ldap, krb5
ini-values: "memory_limit=1024M"
env:
fail-fast: true
KRB5_LINUX_LIBS: libkrb5-dev

- name: Install Apache
run: |
sudo apt-get update
sudo apt-get install -y libapache2-mod-php${{ matrix.php }}
sudo apt-get install -y apache2
sudo a2enmod rewrite
sudo service apache2 restart

- name: Configure Apache for server
run: |
sudo cp apps/${{ inputs.app-name }}/tests/acceptance/server.conf /etc/apache2/sites-available
sudo a2ensite server

- name: Configure Apache for federated
if: ${{ inputs.federated-root != '' }}
run: |
sudo cp apps/${{ inputs.app-name }}/tests/acceptance/federated.conf /etc/apache2/sites-available
sudo a2ensite federated

- name: Reload Apache to get new settings
run: |
sudo systemctl reload apache2

- name: Check Apache server status
run: curl http://localhost:80

- name: Delete default Apache server html files
run: sudo rm -Rf /var/www/html/*

- name: Install owncloud/core
run: |
docker run -v /var/www/html${{ inputs.server-root }}:/var/www/html${{ inputs.server-root }} \
--network=host \
-e PLUGIN_VERSION=${VERSION} \
-e PLUGIN_CORE_PATH=${CORE_PATH} \
-e PLUGIN_DB_TYPE=${DB_TYPE} \
-e PLUGIN_DB_NAME=${DB_NAME} \
-e PLUGIN_DB_HOST=${DB_HOST} \
-e PLUGIN_DB_USERNAME=${DB_USERNAME} \
-e PLUGIN_DB_PASSWORD=${DB_PASSWORD} \
owncloudci/core:php83
env:
VERSION: 'daily-master-qa'
CORE_PATH: /var/www/html${{ inputs.server-root }}
DB_TYPE: 'mysql'
DB_NAME: 'owncloud'
DB_HOST: '127.0.0.1'
DB_USERNAME: 'owncloud'
DB_PASSWORD: 'owncloud'

- name: Create database for federated server
if: ${{ inputs.federated-root != '' }}
run: |
mysql --host 127.0.0.1 --port 3306 -uroot -ppassword -e "CREATE DATABASE federated;"
mysql --host 127.0.0.1 --port 3306 -uroot -ppassword -e "GRANT ALL PRIVILEGES ON federated.* TO 'owncloud'@'%';"

- name: Install federated owncloud/core
if: ${{ inputs.federated-root != '' }}
run: |
docker run -v /var/www/html${{ inputs.federated-root }}:/var/www/html${{ inputs.federated-root }} \
--network=host \
-e PLUGIN_VERSION=${VERSION} \
-e PLUGIN_CORE_PATH=${CORE_PATH} \
-e PLUGIN_DB_TYPE=${DB_TYPE} \
-e PLUGIN_DB_NAME=${DB_NAME} \
-e PLUGIN_DB_HOST=${DB_HOST} \
-e PLUGIN_DB_USERNAME=${DB_USERNAME} \
-e PLUGIN_DB_PASSWORD=${DB_PASSWORD} \
owncloudci/core:php83
env:
VERSION: 'daily-master-qa'
CORE_PATH: /var/www/html${{ inputs.federated-root }}
DB_TYPE: 'mysql'
DB_NAME: federated
DB_HOST: '127.0.0.1'
DB_USERNAME: 'owncloud'
DB_PASSWORD: 'owncloud'

- name: Setup permissions for the backend of the Apache server
run: |
sudo chown -R www-data:www-data /var/www/html${{ inputs.server-root }}
sudo chmod -R 777 /var/www/html${{ inputs.server-root }}

- name: Setup permissions for the backend of the federated Apache server
if: ${{ inputs.federated-root != '' }}
run: |
sudo chown -R www-data:www-data /var/www/html${{ inputs.federated-root }}
sudo chmod -R 777 /var/www/html${{ inputs.federated-root }}

- name: Selenium
if: ${{ inputs.do-webui-tests }}
run: |
docker run -d --rm --network host \
--name selenium-chrome \
selenium/standalone-chrome-debug:3.141.59-oxygen

- name: Make local core
run: |
make

- name: Setup app ${{ inputs.app-name }}
run: |
cd apps/${{ inputs.app-name }}
make ci
sudo -u www-data mkdir /var/www/html${{ inputs.server-root }}/apps/${{ inputs.app-name }}
sudo -u www-data cp -r * /var/www/html${{ inputs.server-root }}/apps/${{ inputs.app-name }}
cd /var/www/html${{ inputs.server-root }}
sudo -u www-data php occ a:e ${{ inputs.app-name }}

- name: Setup app ${{ inputs.app-name }} on federated server
if: ${{ inputs.federated-root != '' }}
run: |
cd apps/${{ inputs.app-name }}
sudo -u www-data mkdir /var/www/html${{ inputs.federated-root }}/apps/${{ inputs.app-name }}
sudo -u www-data cp -r * /var/www/html${{ inputs.federated-root }}/apps/${{ inputs.app-name }}
cd /var/www/html${{ inputs.federated-root }}
sudo -u www-data php occ a:e ${{ inputs.app-name }}

- name: Setup additional app ${{ inputs.additional-app }}
if: ${{ inputs.additional-app != '' }}
run: |
cd apps/${{ inputs.additional-app }}
make ci
sudo -u www-data mkdir /var/www/html${{ inputs.server-root }}/apps/${{ inputs.additional-app }}
sudo -u www-data cp -r * /var/www/html${{ inputs.server-root }}/apps/${{ inputs.additional-app }}
cd /var/www/html${{ inputs.server-root }}
sudo -u www-data php occ a:e ${{ inputs.additional-app }}

- name: Setup additional app ${{ inputs.additional-app }} on federated server
if: ${{ inputs.additional-app != '' && inputs.federated-root != '' }}
run: |
cd apps/${{ inputs.additional-app }}
sudo -u www-data mkdir /var/www/html${{ inputs.federated-root }}/apps/${{ inputs.additional-app }}
sudo -u www-data cp -r * /var/www/html${{ inputs.federated-root }}/apps/${{ inputs.additional-app }}
cd /var/www/html${{ inputs.federated-root }}
sudo -u www-data php occ a:e ${{ inputs.additional-app }}

- name: Setup owncloud server settings
run: |
cd /var/www/html${{ inputs.server-root }}
sudo -u www-data php occ config:system:set trusted_domains 1 --value=localhost
sudo -u www-data php occ log:manage --level 2
sudo -u www-data php occ config:system:set csrf.disabled --value=true
sudo -u www-data php occ a:e testing
sudo -u www-data php occ a:l -e
sudo -u www-data php occ config:list

- name: Setup owncloud federated server settings
if: ${{ inputs.federated-root != '' }}
run: |
cd /var/www/html${{ inputs.federated-root }}
sudo -u www-data php occ config:system:set trusted_domains 1 --value=localhost
sudo -u www-data php occ log:manage --level 2
sudo -u www-data php occ config:system:set csrf.disabled --value=true
sudo -u www-data php occ a:e testing
sudo -u www-data php occ a:l -e
sudo -u www-data php occ config:list

- name: Check access to status
run: curl http://localhost:80${{ inputs.server-root }}/status.php

- name: Check access to login endpoint
run: curl http://localhost:80${{ inputs.server-root }}/login

- name: Check content of server files
run: |
sudo -u www-data cat /var/www/html${{ inputs.server-root }}/.htaccess
sudo -u www-data cat /var/www/html${{ inputs.server-root }}/config/config.php
sudo cat /etc/apache2/apache2.conf
sudo cat /etc/apache2/ports.conf
sudo ls -l /etc/apache2/sites-available
sudo ls -l /etc/apache2/sites-enabled
sudo cat /etc/apache2/sites-enabled/000-default.conf
sudo cat /etc/apache2/sites-enabled/server.conf

- name: Check access to federated status
if: ${{ inputs.federated-root != '' }}
run: curl http://localhost:80${{ inputs.federated-root }}/status.php

- name: Define environment variable pointing to the federated server
if: ${{ inputs.federated-root != '' }}
run: echo "TEST_SERVER_FED_URL=http://localhost${{ inputs.federated-root }}" >> $GITHUB_ENV

- name: Install libxml2-utils to get xmllint used by acceptance test script
run: sudo apt install -y libxml2-utils

- name: Run API acceptance tests
if: ${{ inputs.do-api-tests }}
env:
TEST_SERVER_URL: http://localhost${{ inputs.server-root }}
BEHAT_SUITE: ${{ matrix.suite }}
BEHAT_FILTER_TAGS: ""
run: |
cd apps/${{ inputs.app-name }}
make test-acceptance-api

- name: Run CLI acceptance tests
if: ${{ inputs.do-cli-tests }}
env:
TEST_SERVER_URL: http://localhost${{ inputs.server-root }}
BEHAT_SUITE: ${{ matrix.suite }}
BEHAT_FILTER_TAGS: ""
run: |
cd apps/${{ inputs.app-name }}
make test-acceptance-cli

- name: Run WebUI acceptance tests
if: ${{ inputs.do-webui-tests }}
env:
TEST_SERVER_URL: http://localhost${{ inputs.server-root }}
BROWSER: "chrome"
SELENIUM_HOST: "localhost"
SELENIUM_PORT: "4444"
BEHAT_SUITE: ${{ matrix.suite }}
BEHAT_FILTER_TAGS: ""
run: |
cd apps/${{ inputs.app-name }}
make test-acceptance-webui

- name: Display log file
if: failure()
run: |
sudo -u www-data ls -l /var/www/html${{ inputs.server-root }}
sudo -u www-data ls -l /var/www/html${{ inputs.server-root }}/data
sudo -u www-data cat /var/www/html${{ inputs.server-root }}/data/owncloud.log
22 changes: 22 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,25 @@ jobs:
with:
app-name: ${{ needs.get-vars.outputs.app-name }}
php-version: '8.3'

acceptance-api:
name: API acceptance tests
needs:
- get-vars
uses: ./.github/workflows/acceptance.yml
with:
app-name: ${{ needs.get-vars.outputs.app-name }}
do-api-tests: true
server-root: '/server'
federated-root: '/federated'

acceptance-webui:
name: WebUI acceptance tests
needs:
- get-vars
uses: ./.github/workflows/acceptance.yml
with:
app-name: ${{ needs.get-vars.outputs.app-name }}
do-webui-tests: true
test-suites: "['webUIActivityComments', 'webUIActivityCreateUpdate', 'webUIActivityDeleteRestore', 'webUIActivityFileMoveAndRename', 'webUIActivitySharingInternal', 'webUIActivityTags']"

Loading
Loading