diff --git a/.travis.yml b/.travis.yml
index fd2b7dd899..73d0ea8246 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -55,10 +55,12 @@ matrix:
before_install:
- if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then ( sudo apt-get -qq update ) fi
- - if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then ( sudo apt-get install freeglut3-dev libxmu-dev libxi-dev libfcgi-dev libxss-dev libnotify-dev libxcb-util0-dev libsqlite3-dev libgtk2.0-dev libwebkitgtk-dev mingw-w64 binutils-mingw-w64-i686 binutils-mingw-w64-x86-64 gcc-mingw-w64 gcc-mingw-w64-i686 gcc-mingw-w64-x86-64 g++-mingw-w64 g++-mingw-w64-i686 g++-mingw-w64-x86-64 ) fi
+ - if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then ( sudo apt-get install -y freeglut3-dev libxmu-dev libxi-dev libfcgi-dev libxss-dev libnotify-dev libxcb-util0-dev libsqlite3-dev libgtk2.0-dev libwebkitgtk-dev mingw-w64 binutils-mingw-w64-i686 binutils-mingw-w64-x86-64 gcc-mingw-w64 gcc-mingw-w64-i686 gcc-mingw-w64-x86-64 g++-mingw-w64 g++-mingw-w64-i686 g++-mingw-w64-x86-64 realpath ) fi
+ - if [[ "${BOINC_TYPE}" == "integration-test" ]]; then ( sudo apt-get install ansible/trusty-backports; sudo service mysql stop; ) fi
before_script:
- if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then ( ./_autosetup ) fi
+- if [[ "${BOINC_TYPE}" == "integration-test" ]]; then ( ./integration_test/installTestSuite.sh ) fi
script:
- if [[ "${BOINC_TYPE}" == "libs" ]]; then ( ./configure --disable-server --disable-client --disable-manager && make ) fi
@@ -72,4 +74,4 @@ script:
- if [[ "${BOINC_TYPE}" == "manager-osx" ]]; then ( ./3rdParty/buildMacDependencies.sh -q && ./mac_build/buildMacBOINC-CI.sh --no_shared_headers ) fi
- if [[ "${BOINC_TYPE}" == "manager-android" ]]; then ( /bin/true ) fi
- if [[ "${BOINC_TYPE}" == "unit-test" ]]; then ( /bin/true ) fi
-- if [[ "${BOINC_TYPE}" == "integration-test" ]]; then ( /bin/true ) fi
+- if [[ "${BOINC_TYPE}" == "integration-test" ]]; then ( ./integration_test/executeTestSuite.sh ) fi
diff --git a/integration_test/executeTestSuite.sh b/integration_test/executeTestSuite.sh
new file mode 100755
index 0000000000..30c677122c
--- /dev/null
+++ b/integration_test/executeTestSuite.sh
@@ -0,0 +1,101 @@
+#!/bin/bash
+set -x
+
+# This file is part of BOINC.
+# http://boinc.berkeley.edu
+# Copyright (C) 2018 University of California
+#
+# BOINC is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License
+# as published by the Free Software Foundation,
+# either version 3 of the License, or (at your option) any later version.
+#
+# BOINC is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with BOINC. If not, see .
+#
+
+## support script to install the boinc server docker environment
+## test_dir must be outside of the code directory because the code is copied/symlinked
+## into the testsuite
+
+# checks if a given path is canonical (absolute and does not contain relative links)
+# from http://unix.stackexchange.com/a/256437
+isPathCanonical() {
+ case "x$1" in
+ (x*/..|x*/../*|x../*|x*/.|x*/./*|x./*)
+ rc=1
+ ;;
+ (x/*)
+ rc=0
+ ;;
+ (*)
+ rc=1
+ ;;
+ esac
+ return $rc
+}
+
+# checks if first argument is a subpath of second argument
+isPathSubpath() {
+ case $(readlink -f $1)/ in
+ $(readlink -f $2)/*)
+ rc=0
+ ;;
+ $(readlink -f $1))
+ rc=0
+ ;;
+ *)
+ rc=1
+ ;;
+ esac
+ return $rc
+}
+
+# check working directory because the script needs to be called like: ./integration_test/installTestSuite.sh
+if [ ! -d "integration_test" ]; then
+ echo "start this script in the source root directory"
+ exit 1
+fi
+
+ROOTDIR=$(pwd)
+PREFIX=$(realpath -s $ROOTDIR/../bst)
+test_dir=""
+while [[ $# -gt 0 ]]; do
+ key="$1"
+ case $key in
+ --test_dir)
+ test_dir="$2"
+ shift
+ ;;
+ *)
+ echo "unrecognized option $key"
+ ;;
+ esac
+ shift # past argument or value
+done
+
+if [ "x$test_dir" != "x" ]; then
+ if isPathCanonical "$test_dir" && [ "$test_dir" != "/" ]; then
+ if isPathSubpath "$test_dir" "$ROOTDIR"; then
+ echo "test_dir must not be a subdirectory of $ROOTDIR"
+ exit 1
+ else
+ PREFIX="$test_dir"
+ fi
+ else
+ echo "test_dir must be an absolute path without ./ or ../ in it"
+ exit 1
+ fi
+fi
+
+cd "${PREFIX}/tests" || exit 1
+
+composer test
+if [ $? -ne 0 ]; then exit 1; fi
+
+cd "${ROOTDIR}" || exit 1
diff --git a/integration_test/installTestSuite.sh b/integration_test/installTestSuite.sh
new file mode 100755
index 0000000000..672ab759cc
--- /dev/null
+++ b/integration_test/installTestSuite.sh
@@ -0,0 +1,125 @@
+#!/bin/bash
+set -x
+
+# This file is part of BOINC.
+# http://boinc.berkeley.edu
+# Copyright (C) 2018 University of California
+#
+# BOINC is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License
+# as published by the Free Software Foundation,
+# either version 3 of the License, or (at your option) any later version.
+#
+# BOINC is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with BOINC. If not, see .
+#
+
+## support script to install the boinc server docker environment
+## test_dir must be outside of the code directory because the code is copied/symlinked
+## into the testsuite
+## The testsuite will also be cloned into test_dir
+
+# checks if a given path is canonical (absolute and does not contain relative links)
+# from http://unix.stackexchange.com/a/256437
+isPathCanonical() {
+ case "x$1" in
+ (x*/..|x*/../*|x../*|x*/.|x*/./*|x./*)
+ rc=1
+ ;;
+ (x/*)
+ rc=0
+ ;;
+ (*)
+ rc=1
+ ;;
+ esac
+ return $rc
+}
+
+# checks if first argument is a subpath of second argument
+isPathSubpath() {
+ case $(readlink -f $1)/ in
+ $(readlink -f $2)/*)
+ rc=0
+ ;;
+ $(readlink -f $1))
+ rc=0
+ ;;
+ *)
+ rc=1
+ ;;
+ esac
+ return $rc
+}
+
+# check working directory because the script needs to be called like: ./integration_test/installTestSuite.sh
+if [ ! -d "integration_test" ]; then
+ echo "start this script in the source root directory"
+ exit 1
+fi
+
+ROOTDIR=$(pwd)
+PREFIX=$(realpath -s $ROOTDIR/../bst)
+test_dir=""
+while [[ $# -gt 0 ]]; do
+ key="$1"
+ case $key in
+ --test_dir)
+ test_dir="$2"
+ shift
+ ;;
+ *)
+ echo "unrecognized option $key"
+ ;;
+ esac
+ shift # past argument or value
+done
+
+if [ "x$test_dir" != "x" ]; then
+ if isPathCanonical "$test_dir" && [ "$test_dir" != "/" ]; then
+ if isPathSubpath "$test_dir" "$ROOTDIR"; then
+ echo "test_dir must not be a subdirectory of $ROOTDIR"
+ exit 1
+ else
+ PREFIX="$test_dir"
+ fi
+ else
+ echo "test_dir must be an absolute path without ./ or ../ in it"
+ exit 1
+ fi
+fi
+
+if [ -d "$PREFIX" ]; then
+ echo "$PREFIX already exists. Will not clone but use it instead."
+else
+ git clone https://github.com/TheAspens/boinc-server-test.git "${PREFIX}"
+ if [ $? -ne 0 ]; then exit 1; fi
+fi
+
+cd "${PREFIX}/tests" || exit 1
+composer require phpunit/phpunit
+if [ $? -ne 0 ]; then exit 1; fi
+composer require guzzlehttp/guzzle
+if [ $? -ne 0 ]; then exit 1; fi
+composer update
+if [ $? -ne 0 ]; then exit 1; fi
+cd .. || exit 1
+
+cd "${PREFIX}/manage" || exit 1
+ansible-playbook -i hosts build.yml --extra-vars "boinc_dir=${ROOTDIR}"
+if [ $? -ne 0 ]; then exit 1; fi
+
+ansible-playbook -i hosts start.yml
+if [ $? -ne 0 ]; then exit 1; fi
+
+until $(curl -o /dev/null -SsifL http://127.0.0.1/boincserver/index.php ); do
+ printf '.'
+ sleep 5
+done
+
+cd "${ROOTDIR}" || exit 1