From f6d34587a2d5d217484d5d4d4d9b9ec5ac7df844 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Calvi=C3=B1o=20S=C3=A1nchez?= Date: Mon, 9 Apr 2018 13:38:58 +0200 Subject: [PATCH 1/5] Use Docker image for acceptance tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Docker image for acceptance tests provides support for both the PHP built-in web server and the Apache web server; the acceptance tests for the server are run on the PHP built-in web server, but the acceptance tests for some apps will have to be run on the Apache web server (for example, Talk, as it uses long polling), so a Docker image to support both cases has to be used in "run.sh". ".drone.yml" was just updated for consistency, although it was not really needed. Signed-off-by: Daniel Calviño Sánchez --- .drone.yml | 12 ++++++------ tests/acceptance/run.sh | 6 +++++- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/.drone.yml b/.drone.yml index c6f35114a2..e6bb7b78ca 100644 --- a/.drone.yml +++ b/.drone.yml @@ -543,42 +543,42 @@ pipeline: matrix: TESTS: integration-remote-api acceptance-access-levels: - image: nextcloudci/integration-php7.0:integration-php7.0-6 + image: nextcloudci/acceptance-php7.1:acceptance-php7.1-2 commands: - tests/acceptance/run-local.sh --timeout-multiplier 10 --nextcloud-server-domain acceptance-access-levels --selenium-server selenium:4444 allow-git-repository-modifications features/access-levels.feature when: matrix: TESTS-ACCEPTANCE: access-levels acceptance-app-comments: - image: nextcloudci/integration-php7.0:integration-php7.0-6 + image: nextcloudci/acceptance-php7.1:acceptance-php7.1-2 commands: - tests/acceptance/run-local.sh --timeout-multiplier 10 --nextcloud-server-domain acceptance-app-comments --selenium-server selenium:4444 allow-git-repository-modifications features/app-comments.feature when: matrix: TESTS-ACCEPTANCE: app-comments acceptance-app-files: - image: nextcloudci/integration-php7.0:integration-php7.0-6 + image: nextcloudci/acceptance-php7.1:acceptance-php7.1-2 commands: - tests/acceptance/run-local.sh --timeout-multiplier 10 --nextcloud-server-domain acceptance-app-files --selenium-server selenium:4444 allow-git-repository-modifications features/app-files.feature when: matrix: TESTS-ACCEPTANCE: app-files acceptance-app-theming: - image: nextcloudci/integration-php7.0:integration-php7.0-6 + image: nextcloudci/acceptance-php7.1:acceptance-php7.1-2 commands: - tests/acceptance/run-local.sh --timeout-multiplier 10 --nextcloud-server-domain acceptance-app-theming --selenium-server selenium:4444 allow-git-repository-modifications features/app-theming.feature when: matrix: TESTS-ACCEPTANCE: app-theming acceptance-header: - image: nextcloudci/integration-php7.0:integration-php7.0-6 + image: nextcloudci/acceptance-php7.1:acceptance-php7.1-2 commands: - tests/acceptance/run-local.sh --timeout-multiplier 10 --nextcloud-server-domain acceptance-header --selenium-server selenium:4444 allow-git-repository-modifications features/header.feature when: matrix: TESTS-ACCEPTANCE: header acceptance-login: - image: nextcloudci/integration-php7.0:integration-php7.0-6 + image: nextcloudci/acceptance-php7.1:acceptance-php7.1-2 commands: - tests/acceptance/run-local.sh --timeout-multiplier 10 --nextcloud-server-domain acceptance-login --selenium-server selenium:4444 allow-git-repository-modifications features/login.feature when: diff --git a/tests/acceptance/run.sh b/tests/acceptance/run.sh index d915382284..f2bc66048d 100755 --- a/tests/acceptance/run.sh +++ b/tests/acceptance/run.sh @@ -138,7 +138,7 @@ function prepareDocker() { # 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.1:php7.1-15 bash + docker run --detach --name=$NEXTCLOUD_LOCAL_CONTAINER --network=container:$SELENIUM_CONTAINER --interactive --tty nextcloudci/acceptance-php7.1:acceptance-php7.1-2 bash # Use the $TMPDIR or, if not set, fall back to /tmp. NEXTCLOUD_LOCAL_TAR="$($MKTEMP --tmpdir="${TMPDIR:-/tmp}" --suffix=.tar nextcloud-local-XXXXXXXXXX)" @@ -153,6 +153,10 @@ function prepareDocker() { docker exec $NEXTCLOUD_LOCAL_CONTAINER mkdir /nextcloud docker cp - $NEXTCLOUD_LOCAL_CONTAINER:/nextcloud/ < "$NEXTCLOUD_LOCAL_TAR" + # Link the default Apache directory to the root directory of the Nextcloud + # server to make possible to run the Nextcloud server on Apache if needed. + docker exec $NEXTCLOUD_LOCAL_CONTAINER ln --symbolic /nextcloud /var/www/html + # 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 From a09b787a01cfbd00270321fdddcfb87574327e5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Calvi=C3=B1o=20S=C3=A1nchez?= Date: Mon, 9 Apr 2018 14:30:42 +0200 Subject: [PATCH 2/5] Install and configure Nextcloud server as www-data MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apache sub-processes are run as the www-data user, and they need to be able to write to the "apps", "config" and "data" directories, so they have to belong to that user, and therefore the Nextcloud server has to be installed and configured too as the www-data user. The PHP built-in web server will still be run as the root user, but in that case the owner of those directories makes no difference, so this is compatible with both cases. Signed-off-by: Daniel Calviño Sánchez --- tests/acceptance/run-local.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/acceptance/run-local.sh b/tests/acceptance/run-local.sh index 91f1729bee..dc17d7ba60 100755 --- a/tests/acceptance/run-local.sh +++ b/tests/acceptance/run-local.sh @@ -192,7 +192,14 @@ if [ "$NEXTCLOUD_SERVER_DOMAIN" != "$DEFAULT_NEXTCLOUD_SERVER_DOMAIN" ]; then fi echo "Installing and configuring Nextcloud server" -$ACCEPTANCE_TESTS_DIR/installAndConfigureServer.sh $INSTALL_AND_CONFIGURE_SERVER_PARAMETERS +# The server is installed and configured using the www-data user as it is the +# user that Apache sub-processes will be run as; the PHP built-in web server is +# run as the root user, and in that case the permissions of apps, config and +# data dirs makes no difference, so this is valid for both cases. +mkdir data +chown -R www-data:www-data apps config data +NEXTCLOUD_DIR=`pwd` +su --shell /bin/bash --login www-data --command "cd $NEXTCLOUD_DIR && $ACCEPTANCE_TESTS_DIR/installAndConfigureServer.sh $INSTALL_AND_CONFIGURE_SERVER_PARAMETERS" echo "Saving the default state so acceptance tests can reset to it" find . -name ".gitignore" -exec rm --force {} \; From ea21fe2dbcb9dd38c4fc8cfa49c2718c6e652af1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Calvi=C3=B1o=20S=C3=A1nchez?= Date: Mon, 9 Apr 2018 14:39:06 +0200 Subject: [PATCH 3/5] Add support for setting the domain also when a specific helper is used MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before, the domain was automatically added assuming that the NextcloudTestServerContext had no parameters defined in the Behat configuration. However, in order to use a helper for Apache it would need to be specified in the configuration with something like: - NextcloudTestServerContext: nextcloudTestServerHelper: NextcloudTestServerLocalApacheHelper The substitution now works both when a helper is specified and when it is not; note, however, that providing custom parameters to the helper is not supported, although they are not needed anyway so it is not really a problem. Signed-off-by: Daniel Calviño Sánchez --- tests/acceptance/run-local.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/acceptance/run-local.sh b/tests/acceptance/run-local.sh index dc17d7ba60..fcf6155d6f 100755 --- a/tests/acceptance/run-local.sh +++ b/tests/acceptance/run-local.sh @@ -144,8 +144,12 @@ if [ "$NEXTCLOUD_SERVER_DOMAIN" != "$DEFAULT_NEXTCLOUD_SERVER_DOMAIN" ]; then # https://github.com/Behat/Behat/issues/983). Thus, the default "behat.yml" # configuration file has to be adjusted to provide the appropriate # parameters for NextcloudTestServerContext. + # + # Note that the substitution below is only valid if no parameters for + # the helper are set in behat.yml, although it is valid if a specific + # helper is. ORIGINAL="\ - - NextcloudTestServerContext" + - NextcloudTestServerContext:\?" REPLACEMENT="\ - NextcloudTestServerContext:\n\ nextcloudTestServerHelperParameters:\n\ From aa96dfd1731ed448a34ea8a09a53289359711bda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Calvi=C3=B1o=20S=C3=A1nchez?= Date: Mon, 9 Apr 2018 18:35:16 +0200 Subject: [PATCH 4/5] Add helper to run acceptance tests on an Apache server MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The default and only helper to run acceptance tests run them on the PHP built-in web server. This commit introduces a new helper that can be used to run them on an Apache web server instead. This helper is meant to be used by the acceptance tests of apps that require a multi-threaded web server to run (like Talk, due to its use of long polling). To use the helper it is only needed to set it in the Behat configuration for the acceptance tests of the app, as explained in the "NextcloudTestServerContext" documentation. It is assumed that the acceptance tests are run using the default setup, and therefore inside a Docker container based on the image for acceptance tests from Nextcloud. Due to that the helper is expected to have root permissions, and thus it starts and stops the Apache web server directly using "service start/stop apache2". In the same way it also restores the owner and group for "apps", "config" and "data" to "www-data", as it is the user that Apache sub-processes are run as. Signed-off-by: Daniel Calviño Sánchez --- .../NextcloudTestServerLocalApacheHelper.php | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 tests/acceptance/features/core/NextcloudTestServerLocalApacheHelper.php diff --git a/tests/acceptance/features/core/NextcloudTestServerLocalApacheHelper.php b/tests/acceptance/features/core/NextcloudTestServerLocalApacheHelper.php new file mode 100644 index 0000000000..b552a86d25 --- /dev/null +++ b/tests/acceptance/features/core/NextcloudTestServerLocalApacheHelper.php @@ -0,0 +1,130 @@ +. + * + */ + +/** + * Helper to manage a Nextcloud test server started directly by the acceptance + * tests themselves using the Apache web server. + * + * The Nextcloud test server is executed using the Apache web server; the + * default Apache directory is expected to have been set to the root directory + * of the Nextcloud server (for example, by linking "var/www/html" to it); in + * any case, note that the acceptance tests must be run from the acceptance + * tests directory. The "setUp" method resets the Nextcloud server to its + * initial state and starts it, while the "cleanUp" method stops it. To be able + * to reset the Nextcloud server to its initial state a Git repository must be + * provided in the root directory of the Nextcloud server; the last commit in + * that Git repository must provide the initial state for the Nextcloud server + * expected by the acceptance tests. When the Nextcloud server is reset the + * owner of "apps", "config" and "data" must be set to the user that Apache + * server is run as; it is assumed that Apache is run as "www-data". + * + * The Nextcloud server is available at "$nextcloudServerDomain", which can be + * optionally specified when the NextcloudTestServerLocalApacheHelper is + * created; if no value is given "127.0.0.1" is used by default. In any case, + * the value of "$nextcloudServerDomain" must be seen as a trusted domain by the + * Nextcloud server (which would be the case for "127.0.0.1" if it was installed + * by running "occ maintenance:install"). The base URL to access the Nextcloud + * server can be got from "getBaseUrl". + */ +class NextcloudTestServerLocalApacheHelper implements NextcloudTestServerHelper { + + /** + * @var string + */ + private $nextcloudServerDomain; + + /** + * Creates a new NextcloudTestServerLocalApacheHelper. + */ + public function __construct($nextcloudServerDomain = "127.0.0.1") { + $this->nextcloudServerDomain = $nextcloudServerDomain; + } + + /** + * Sets up the Nextcloud test server. + * + * It resets the Nextcloud test server restoring its last saved Git state + * and then waits for the Nextcloud test server to start again; if the + * server can not be reset or if it does not start again after some time an + * exception is thrown (as it is just a warning for the test runner and + * nothing to be explicitly catched a plain base Exception is used). + * + * @throws \Exception if the Nextcloud test server can not be reset or + * started again. + */ + public function setUp() { + // Ensure that previous Apache server is not running (as cleanUp may not + // have been called). + $this->stopApacheServer(); + + $this->execOrException("cd ../../ && git reset --hard HEAD"); + $this->execOrException("cd ../../ && git clean -d --force"); + $this->execOrException("cd ../../ && chown -R www-data:www-data apps config data"); + + $this->execOrException("service apache2 start"); + + $timeout = 60; + if (!Utils::waitForServer($this->getBaseUrl(), $timeout)) { + throw new Exception("Nextcloud test server could not be started"); + } + } + + /** + * Cleans up the Nextcloud test server. + * + * It stops the running Nextcloud test server, if any. + */ + public function cleanUp() { + $this->stopApacheServer(); + } + + /** + * Returns the base URL of the Nextcloud test server. + * + * @return string the base URL of the Nextcloud test server. + */ + public function getBaseUrl() { + return "http://" . $this->nextcloudServerDomain . "/index.php"; + } + + /** + * Executes the given command, throwing an Exception if it fails. + * + * @param string $command the command to execute. + * @throws \Exception if the command fails to execute. + */ + private function execOrException($command) { + exec($command . " 2>&1", $output, $returnValue); + if ($returnValue != 0) { + throw new Exception("'$command' could not be executed: " . implode("\n", $output)); + } + } + + /** + * Stops the Apache server started in setUp, if any. + */ + private function stopApacheServer() { + $this->execOrException("service apache2 stop"); + } + +} From 4341d8731e6cd4ea59f3f23156979e7689f066d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Calvi=C3=B1o=20S=C3=A1nchez?= Date: Mon, 9 Apr 2018 19:07:19 +0200 Subject: [PATCH 5/5] Rename helper for PHP built-in web server MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For consistency with the helper for the Apache web server the helper for the PHP built-in web server was renamed too. Signed-off-by: Daniel Calviño Sánchez --- .../features/core/NextcloudTestServerContext.php | 14 +++++++------- ...p => NextcloudTestServerLocalBuiltInHelper.php} | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) rename tests/acceptance/features/core/{NextcloudTestServerLocalHelper.php => NextcloudTestServerLocalBuiltInHelper.php} (89%) diff --git a/tests/acceptance/features/core/NextcloudTestServerContext.php b/tests/acceptance/features/core/NextcloudTestServerContext.php index f8d13a656b..ff1296ba18 100644 --- a/tests/acceptance/features/core/NextcloudTestServerContext.php +++ b/tests/acceptance/features/core/NextcloudTestServerContext.php @@ -40,12 +40,12 @@ use Behat\Behat\Hook\Scope\BeforeScenarioScope; * * The Nextcloud server is provided by an instance of NextcloudTestServerHelper; * its class must be specified when this context is created. By default, - * "NextcloudTestServerLocalHelper" is used, although that can be customized - * using the "nextcloudTestServerHelper" parameter in "behat.yml". In the same - * way, the parameters to be passed to the helper when it is created can be - * customized using the "nextcloudTestServerHelperParameters" parameter, which - * is an array (without keys) with the value of the parameters in the same order - * as in the constructor of the helper class (by default, [ ]). + * "NextcloudTestServerLocalBuiltInHelper" is used, although that can be + * customized using the "nextcloudTestServerHelper" parameter in "behat.yml". In + * the same way, the parameters to be passed to the helper when it is created + * can be customized using the "nextcloudTestServerHelperParameters" parameter, + * which is an array (without keys) with the value of the parameters in the same + * order as in the constructor of the helper class (by default, [ ]). * * Example of custom parameters in "behat.yml": * default: @@ -73,7 +73,7 @@ class NextcloudTestServerContext implements Context { * @param array $nextcloudTestServerHelperParameters the parameters for the * constructor of the $nextcloudTestServerHelper class. */ - public function __construct($nextcloudTestServerHelper = "NextcloudTestServerLocalHelper", + public function __construct($nextcloudTestServerHelper = "NextcloudTestServerLocalBuiltInHelper", $nextcloudTestServerHelperParameters = [ ]) { $nextcloudTestServerHelperClass = new ReflectionClass($nextcloudTestServerHelper); diff --git a/tests/acceptance/features/core/NextcloudTestServerLocalHelper.php b/tests/acceptance/features/core/NextcloudTestServerLocalBuiltInHelper.php similarity index 89% rename from tests/acceptance/features/core/NextcloudTestServerLocalHelper.php rename to tests/acceptance/features/core/NextcloudTestServerLocalBuiltInHelper.php index b11a9ae821..722f580171 100644 --- a/tests/acceptance/features/core/NextcloudTestServerLocalHelper.php +++ b/tests/acceptance/features/core/NextcloudTestServerLocalBuiltInHelper.php @@ -36,14 +36,14 @@ * initial state for the Nextcloud server expected by the acceptance tests. * * The Nextcloud server is available at "$nextcloudServerDomain", which can be - * optionally specified when the NextcloudTestServerLocalHelper is created; if - * no value is given "127.0.0.1" is used by default. In any case, the value of - * "$nextcloudServerDomain" must be seen as a trusted domain by the Nextcloud - * server (which would be the case for "127.0.0.1" if it was installed by - * running "occ maintenance:install"). The base URL to access the Nextcloud + * optionally specified when the NextcloudTestServerLocalBuiltInHelper is + * created; if no value is given "127.0.0.1" is used by default. In any case, + * the value of "$nextcloudServerDomain" must be seen as a trusted domain by the + * Nextcloud server (which would be the case for "127.0.0.1" if it was installed + * by running "occ maintenance:install"). The base URL to access the Nextcloud * server can be got from "getBaseUrl". */ -class NextcloudTestServerLocalHelper implements NextcloudTestServerHelper { +class NextcloudTestServerLocalBuiltInHelper implements NextcloudTestServerHelper { /** * @var string @@ -56,7 +56,7 @@ class NextcloudTestServerLocalHelper implements NextcloudTestServerHelper { private $phpServerPid; /** - * Creates a new NextcloudTestServerLocalHelper. + * Creates a new NextcloudTestServerLocalBuiltInHelper. */ public function __construct($nextcloudServerDomain = "127.0.0.1") { $this->nextcloudServerDomain = $nextcloudServerDomain;