#!/bin/bash set -eu readonly source_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" readonly DATA_DIR="${HOME}/.cloudron_test" readonly DEFAULT_TESTS="./syslog/*-test.js ./src/test/*-test.js ./src/routes/test/*-test.js" ! "${source_dir}/src/test/check-install" && exit 1 # cleanup old data dirs some of those docker container data requires sudo to be removed echo "=> Provide root password to purge any leftover data in ${DATA_DIR} and load apparmor profile:" sudo rm -rf ${DATA_DIR} # archlinux does not have apparmor if hash apparmor_parser 2>/dev/null; then echo "=> Loading app armor profile" sudo apparmor_parser --replace --write-cache ./setup/start/docker-cloudron-app.apparmor fi # create dir structure mkdir -p ${DATA_DIR} cd ${DATA_DIR} mkdir -p appsdata mkdir -p boxdata/box boxdata/mail boxdata/certs boxdata/mail/dkim/localhost boxdata/mail/dkim/foobar.com mkdir -p platformdata/addons/mail/banner platformdata/nginx/cert platformdata/nginx/applications/dashboard platformdata/collectd/collectd.conf.d platformdata/addons platformdata/logrotate.d platformdata/backup platformdata/logs/tasks platformdata/sftp/ssh platformdata/firewall platformdata/update sudo mkdir -p /mnt/cloudron-test-music /media/cloudron-test-music # volume test # put cert echo "=> Generating a localhost selfsigned cert" openssl req -x509 -newkey rsa:2048 -keyout platformdata/nginx/cert/host.key -out platformdata/nginx/cert/host.cert -days 3650 -subj '/CN=localhost' -nodes -config <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:*.localhost")) # clear out any containers if FAST is unset if [[ -z ${FAST+x} ]]; then echo "=> Delete all docker containers first" docker ps -qa --filter "label=isCloudronManaged" | xargs --no-run-if-empty docker rm -f docker rm -f mysql-server echo "==> To skip this run with: FAST=1 ./run-tests" else echo "==> WARNING!! Skipping docker container cleanup, the database might not be pristine!" fi # create docker network (while the infra code does this, most tests skip infra setup) docker network create --subnet=172.18.0.0/16 --ip-range=172.18.0.0/20 --gateway 172.18.0.1 cloudron --ipv6 --subnet=fd00:c107:d509::/64 || true # create the same mysql server version to test with OUT=`docker inspect mysql-server` || true if [[ "${OUT}" = "[]" ]]; then echo "=> Starting mysql-server..." # ulimit nofile is required to make it work on archlinux https://github.com/docker-library/mysql/issues/579#issuecomment-519495808 docker run --name mysql-server --ulimit nofile=262144:262144 -e MYSQL_ROOT_PASSWORD=password -d mysql:5.7 else echo "=> mysql-server already running. If you want to start fresh, run 'docker rm --force mysql-server'" fi export MYSQL_IP=`docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-server` echo "=> Waiting for mysql server to be ready..." while ! mysqladmin ping -h"${MYSQL_IP}" --silent; do sleep 1 done echo "=> Ensure local base image" docker pull cloudron/base:3.0.0@sha256:455c70428723e3a823198c57472785437eb6eab082e79b3ff04ea584faf46e92 echo "=> Create iptables blocklist" sudo ipset create cloudron_blocklist hash:net || true echo "=> Starting cloudron-syslog" syslog/syslog-service.js "${DATA_DIR}/platformdata/logs/" & echo "=> Ensure database" mysql -h"${MYSQL_IP}" -uroot -ppassword -e 'CREATE DATABASE IF NOT EXISTS box' echo "=> Run database migrations" cd "${source_dir}" BOX_ENV=test DATABASE_URL=mysql://root:password@${MYSQL_IP}/box node_modules/.bin/db-migrate up TESTS=${DEFAULT_TESTS} if [[ $# -gt 0 ]]; then TESTS="$*" fi echo "=> Run tests with mocha" BOX_ENV=test ./node_modules/.bin/mocha --bail --no-timeouts --exit -R spec ${TESTS}