1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
<?php
/**
*
* @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 to manage a Nextcloud test server started directly by the acceptance
* tests themselves using the PHP built-in web server.
*
* The Nextcloud test server is executed using the PHP built-in web server
* directly from the grandparent directory of the acceptance tests directory
* (that is, the root directory of the Nextcloud server); 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.
*
* The Nextcloud server is available at "127.0.0.1", so it is expected to see
* "127.0.0.1" as a trusted domain (which would be the case 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 {
/**
* @var string
*/
private $phpServerPid;
/**
* Creates a new NextcloudTestServerLocalHelper.
*/
public function __construct() {
$this->phpServerPid = "";
}
/**
* 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 PHP server is not running (as cleanUp may not
// have been called).
$this->killPhpServer();
$this->execOrException("cd ../../ && git reset --hard HEAD");
$this->execOrException("cd ../../ && git clean -d --force");
// execOrException is not used because the server is started in the
// background, so the command will always succeed even if the server
// itself fails.
$this->phpServerPid = exec("php -S 127.0.0.1:80 -t ../../ >/dev/null 2>&1 & echo $!");
$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 kills the running Nextcloud test server, if any.
*/
public function cleanUp() {
$this->killPhpServer();
}
/**
* Returns the base URL of the Nextcloud test server.
*
* @return string the base URL of the Nextcloud test server.
*/
public function getBaseUrl() {
return "http://127.0.0.1/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));
}
}
/**
* Kills the PHP built-in web server started in setUp, if any.
*/
private function killPhpServer() {
if ($this->phpServerPid == "") {
return;
}
// execOrException is not used because the PID may no longer exist when
// trying to kill it.
exec("kill " . $this->phpServerPid);
$this->phpServerPid = "";
}
}
|