summaryrefslogtreecommitdiffstats
path: root/tests/acceptance/run.sh
diff options
context:
space:
mode:
authorRoeland Jago Douma <rullzer@users.noreply.github.com>2017-04-21 20:53:32 +0200
committerGitHub <noreply@github.com>2017-04-21 20:53:32 +0200
commiteaa6f766e694f08e899c9469f668135c5d7b0c34 (patch)
treeea64cf5715f41ad8f05f1fb0149af0ff16f15035 /tests/acceptance/run.sh
parent867b3ee234b91ce5fbbbf3b81a5bcce59a0179a3 (diff)
parente970b5261fd0ae126db788d514ab4c7770688356 (diff)
downloadnextcloud-server-eaa6f766e694f08e899c9469f668135c5d7b0c34.tar.gz
nextcloud-server-eaa6f766e694f08e899c9469f668135c5d7b0c34.zip
Merge pull request #4208 from danxuliu/add-basic-acceptance-test-system
Add basic acceptance test system
Diffstat (limited to 'tests/acceptance/run.sh')
-rwxr-xr-xtests/acceptance/run.sh178
1 files changed, 178 insertions, 0 deletions
diff --git a/tests/acceptance/run.sh b/tests/acceptance/run.sh
new file mode 100755
index 00000000000..f9711cbb404
--- /dev/null
+++ b/tests/acceptance/run.sh
@@ -0,0 +1,178 @@
+#!/usr/bin/env bash
+
+# @copyright Copyright (c) 2017, Daniel Calviño Sánchez (danxuliu@gmail.com)
+#
+# @license GNU AGPL version 3 or any later version
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Helper script to run the acceptance tests, which test a running Nextcloud
+# instance from the point of view of a real user.
+#
+# The acceptance tests are run in its own Docker container; the grandparent
+# directory of the acceptance tests directory (that is, the root directory of
+# the Nextcloud server) is copied to the container and the acceptance tests are
+# run inside it. Once the tests end the container is stopped. The acceptance
+# tests also use the Selenium server to control a web browser, so the Selenium
+# server is also launched before the tests start in its own Docker container (it
+# will be stopped automatically too once the tests end).
+#
+# To perform its job, the script requires the "docker" command to be available.
+#
+# The Docker Command Line Interface (the "docker" command) requires special
+# permissions to talk to the Docker daemon, and those permissions are typically
+# available only to the root user. Please see the Docker documentation to find
+# out how to give access to a regular user to the Docker daemon:
+# https://docs.docker.com/engine/installation/linux/linux-postinstall/
+#
+# Note, however, that being able to communicate with the Docker daemon is the
+# same as being able to get root privileges for the system. Therefore, you must
+# give access to the Docker daemon (and thus run this script as) ONLY to trusted
+# and secure users:
+# https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
+#
+# Finally, take into account that this script will automatically remove the
+# Docker containers named "selenium-nextcloud-local-test-acceptance" and
+# "nextcloud-local-test-acceptance", even if the script did not create them
+# (probably you will not have containers nor images with those names, but just
+# in case).
+
+# Launches the Selenium server in a Docker container.
+#
+# The acceptance tests use Firefox by default but, unfortunately, Firefox >= 48
+# does not provide yet the same level of support as earlier versions for certain
+# features related to automated testing. Therefore, the Docker image used is not
+# the latest one, but an older version known to work.
+#
+# The acceptance tests expect the Selenium server to be accessible at
+# "127.0.0.1:4444"; as the Selenium server container and the container in which
+# the acceptance tests are run share the same network nothing else needs to be
+# done for the acceptance tests to access the Selenium server and for the
+# Selenium server to access the Nextcloud server. However, in order to ensure
+# from this script that the Selenium server was started the 4444 port of its
+# container is mapped to the 4444 port of the host.
+#
+# Besides the Selenium server, the Docker image also provides a VNC server, so
+# the 5900 port of the container is also mapped to the 5900 port of the host.
+#
+# The Docker container started here will be automatically stopped when the
+# script exits (see cleanUp). If the Selenium server can not be started then the
+# script will be exited immediately with an error state; the most common cause
+# for the Selenium server to fail to start is that another server is already
+# using the mapped ports in the host.
+#
+# As the web browser is run inside the Docker container it is not visible by
+# default. However, it can be viewed using VNC (for example,
+# "vncviewer 127.0.0.1:5900"); when asked for the password use "secret".
+function prepareSelenium() {
+ SELENIUM_CONTAINER=selenium-nextcloud-local-test-acceptance
+
+ echo "Starting Selenium server"
+ docker run --detach --name=$SELENIUM_CONTAINER --publish 4444:4444 --publish 5900:5900 selenium/standalone-firefox-debug:2.53.1-beryllium
+
+ echo "Waiting for Selenium server to be ready"
+ if ! timeout 10s bash -c "while ! curl 127.0.0.1:4444 >/dev/null 2>&1; do sleep 1; done"; then
+ echo "Could not start Selenium server; running" \
+ "\"docker run --rm --publish 4444:4444 --publish 5900:5900 selenium/standalone-firefox-debug:2.53.1-beryllium\"" \
+ "could give you a hint of the problem"
+
+ exit 1
+ fi
+}
+
+# Creates a Docker container to run both the acceptance tests and the Nextcloud
+# server used by them.
+#
+# This function starts a Docker container with a copy the Nextcloud code from
+# the grandparent directory, although ignoring any configuration or data that it
+# may provide (for example, if that directory was used directly to deploy a
+# Nextcloud instance in a web server). As the Nextcloud code is copied to the
+# container instead of referenced the original code can be modified while the
+# acceptance tests are running without interfering in them.
+function prepareDocker() {
+ NEXTCLOUD_LOCAL_CONTAINER=nextcloud-local-test-acceptance
+
+ echo "Starting the Nextcloud container"
+ # As the Nextcloud server container uses the network of the Selenium server
+ # container the Nextcloud server can be accessed at "127.0.0.1" from the
+ # Selenium server.
+ # The container exits immediately if no command is given, so a Bash session
+ # is created to prevent that.
+ docker run --detach --name=$NEXTCLOUD_LOCAL_CONTAINER --network=container:$SELENIUM_CONTAINER --interactive --tty nextcloudci/php7.0:php7.0-7 bash
+
+ # Use the $TMPDIR or, if not set, fall back to /tmp.
+ NEXTCLOUD_LOCAL_TAR="$(mktemp --tmpdir="${TMPDIR:-/tmp}" --suffix=.tar nextcloud-local-XXXXXXXXXX)"
+
+ # Setting the user and group of files in the tar would be superfluous, as
+ # "docker cp" does not take them into account (the extracted files are set
+ # to root).
+ echo "Copying local Git working directory of Nextcloud to the container"
+ tar --create --file="$NEXTCLOUD_LOCAL_TAR" --exclude=".git" --exclude="./build" --exclude="./config/config.php" --exclude="./data" --exclude="./data-autotest" --exclude="./tests" --directory=../../ .
+ tar --append --file="$NEXTCLOUD_LOCAL_TAR" --directory=../../ tests/acceptance/
+
+ docker exec $NEXTCLOUD_LOCAL_CONTAINER mkdir /nextcloud
+ docker cp - $NEXTCLOUD_LOCAL_CONTAINER:/nextcloud/ < "$NEXTCLOUD_LOCAL_TAR"
+
+ # run-local.sh expects a Git repository to be available in the root of the
+ # Nextcloud server, but it was excluded when the Git working directory was
+ # copied to the container to avoid copying the large and unneeded history of
+ # the repository.
+ docker exec $NEXTCLOUD_LOCAL_CONTAINER bash -c "cd nextcloud && git init"
+}
+
+# Removes/stops temporal elements created/started by this script.
+function cleanUp() {
+ # Disable (yes, "+" disables) exiting immediately on errors to ensure that
+ # all the cleanup commands are executed (well, no errors should occur during
+ # the cleanup anyway, but just in case).
+ set +o errexit
+
+ echo "Cleaning up"
+
+ if [ -f "$NEXTCLOUD_LOCAL_TAR" ]; then
+ echo "Removing $NEXTCLOUD_LOCAL_TAR"
+ rm $NEXTCLOUD_LOCAL_TAR
+ fi
+
+ # The name filter must be specified as "^/XXX$" to get an exact match; using
+ # just "XXX" would match every name that contained "XXX".
+ if [ -n "$(docker ps --all --quiet --filter name="^/$NEXTCLOUD_LOCAL_CONTAINER$")" ]; then
+ echo "Removing Docker container $NEXTCLOUD_LOCAL_CONTAINER"
+ docker rm --volumes --force $NEXTCLOUD_LOCAL_CONTAINER
+ fi
+
+ if [ -n "$(docker ps --all --quiet --filter name="^/$SELENIUM_CONTAINER$")" ]; then
+ echo "Removing Docker container $SELENIUM_CONTAINER"
+ docker rm --volumes --force $SELENIUM_CONTAINER
+ fi
+}
+
+# Exit immediately on errors.
+set -o errexit
+
+# Execute cleanUp when the script exits, either normally or due to an error.
+trap cleanUp EXIT
+
+# Ensure working directory is script directory, as some actions (like copying
+# the Git working directory to the container) expect that.
+cd "$(dirname $0)"
+
+# If no parameter is provided to this script all the acceptance tests are run.
+SCENARIO_TO_RUN=$1
+
+prepareSelenium
+prepareDocker
+
+echo "Running tests"
+docker exec $NEXTCLOUD_LOCAL_CONTAINER bash -c "cd nextcloud && tests/acceptance/run-local.sh allow-git-repository-modifications $SCENARIO_TO_RUN"