summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build/integration/features/bootstrap/FederationContext.php33
-rw-r--r--build/integration/federation_features/federated.feature95
-rwxr-xr-xbuild/integration/run.sh6
3 files changed, 130 insertions, 4 deletions
diff --git a/build/integration/features/bootstrap/FederationContext.php b/build/integration/features/bootstrap/FederationContext.php
index a4472c54b1b..423708adc10 100644
--- a/build/integration/features/bootstrap/FederationContext.php
+++ b/build/integration/features/bootstrap/FederationContext.php
@@ -41,10 +41,30 @@ class FederationContext implements Context, SnippetAcceptingContext {
use CommandLine;
/** @var string */
+ private static $phpFederatedServerPid = '';
+
+ /** @var string */
private $lastAcceptedRemoteShareId;
/**
* @BeforeScenario
+ * @AfterScenario
+ *
+ * The server is started also after the scenarios to ensure that it is
+ * properly cleaned up if stopped.
+ */
+ public function startFederatedServer() {
+ if (self::$phpFederatedServerPid !== '') {
+ return;
+ }
+
+ $port = getenv('PORT_FED');
+
+ self::$phpFederatedServerPid = exec('php -S localhost:' . $port . ' -t ../../ >/dev/null & echo $!');
+ }
+
+ /**
+ * @BeforeScenario
*/
public function cleanupRemoteStorages() {
// Ensure that dangling remote storages from previous tests will not
@@ -157,6 +177,19 @@ class FederationContext implements Context, SnippetAcceptingContext {
$this->sendingToWith('DELETE', "/apps/files_sharing/api/v1/remote_shares/" . $this->lastAcceptedRemoteShareId, null);
}
+ /**
+ * @When /^remote server is stopped$/
+ */
+ public function remoteServerIsStopped() {
+ if (self::$phpFederatedServerPid === '') {
+ return;
+ }
+
+ exec('kill ' . self::$phpFederatedServerPid);
+
+ self::$phpFederatedServerPid = '';
+ }
+
protected function resetAppConfigs() {
$this->deleteServerConfig('files_sharing', 'incoming_server2server_group_share_enabled');
$this->deleteServerConfig('files_sharing', 'outgoing_server2server_group_share_enabled');
diff --git a/build/integration/federation_features/federated.feature b/build/integration/federation_features/federated.feature
index a8af32387a0..8b627e55a42 100644
--- a/build/integration/federation_features/federated.feature
+++ b/build/integration/federation_features/federated.feature
@@ -318,6 +318,54 @@ Feature: federated
| type | file |
| file_id | A_NUMBER |
+ Scenario: List federated share from another server no longer reachable
+ Given Using server "LOCAL"
+ And user "user0" exists
+ Given Using server "REMOTE"
+ And user "user1" exists
+ # Rename file so it has a unique name in the target server (as the target
+ # server may have its own /textfile0.txt" file)
+ And User "user1" copies file "/textfile0.txt" to "/remote-share.txt"
+ And User "user1" from server "REMOTE" shares "/remote-share.txt" with user "user0" from server "LOCAL"
+ And Using server "LOCAL"
+ And User "user0" from server "LOCAL" accepts last pending share
+ And remote server is stopped
+ When As an "user0"
+ And sending "GET" to "/apps/files_sharing/api/v1/remote_shares"
+ Then the list of returned shares has 1 shares
+ And remote share 0 is returned with
+ | remote | http://localhost:8180/ |
+ | name | /remote-share.txt |
+ | owner | user1 |
+ | user | user0 |
+ | mountpoint | /remote-share.txt |
+
+ Scenario: List federated share from another server no longer reachable after caching the file entry
+ Given Using server "LOCAL"
+ And user "user0" exists
+ Given Using server "REMOTE"
+ And user "user1" exists
+ # Rename file so it has a unique name in the target server (as the target
+ # server may have its own /textfile0.txt" file)
+ And User "user1" copies file "/textfile0.txt" to "/remote-share.txt"
+ And User "user1" from server "REMOTE" shares "/remote-share.txt" with user "user0" from server "LOCAL"
+ And Using server "LOCAL"
+ And User "user0" from server "LOCAL" accepts last pending share
+ # Checking that the file exists caches the file entry, which causes an
+ # exception to be thrown when getting the file info if the remote server is
+ # unreachable.
+ And as "user0" the file "/remote-share.txt" exists
+ And remote server is stopped
+ When As an "user0"
+ And sending "GET" to "/apps/files_sharing/api/v1/remote_shares"
+ Then the list of returned shares has 1 shares
+ And remote share 0 is returned with
+ | remote | http://localhost:8180/ |
+ | name | /remote-share.txt |
+ | owner | user1 |
+ | user | user0 |
+ | mountpoint | /remote-share.txt |
+
Scenario: Delete federated share with another server
@@ -382,6 +430,30 @@ Feature: federated
And sending "GET" to "/apps/files_sharing/api/v1/shares"
And the list of returned shares has 0 shares
+ Scenario: Delete federated share from another server no longer reachable
+ Given Using server "LOCAL"
+ And user "user0" exists
+ Given Using server "REMOTE"
+ And user "user1" exists
+ # Rename file so it has a unique name in the target server (as the target
+ # server may have its own /textfile0.txt" file)
+ And User "user1" copies file "/textfile0.txt" to "/remote-share.txt"
+ And User "user1" from server "REMOTE" shares "/remote-share.txt" with user "user0" from server "LOCAL"
+ And Using server "LOCAL"
+ And User "user0" from server "LOCAL" accepts last pending share
+ And as "user0" the file "/remote-share.txt" exists
+ And As an "user0"
+ And sending "GET" to "/apps/files_sharing/api/v1/remote_shares"
+ And the list of returned shares has 1 shares
+ And remote server is stopped
+ When user "user0" deletes last accepted remote share
+ Then the OCS status code should be "100"
+ And the HTTP status code should be "200"
+ And as "user0" the file "/remote-share.txt" does not exist
+ And As an "user0"
+ And sending "GET" to "/apps/files_sharing/api/v1/remote_shares"
+ And the list of returned shares has 0 shares
+
Scenario: Delete federated share file from another server
Given Using server "LOCAL"
And user "user0" exists
@@ -410,3 +482,26 @@ Feature: federated
And As an "user1"
And sending "GET" to "/apps/files_sharing/api/v1/shares"
And the list of returned shares has 0 shares
+
+ Scenario: Delete federated share file from another server no longer reachable
+ Given Using server "LOCAL"
+ And user "user0" exists
+ Given Using server "REMOTE"
+ And user "user1" exists
+ # Rename file so it has a unique name in the target server (as the target
+ # server may have its own /textfile0.txt" file)
+ And User "user1" copies file "/textfile0.txt" to "/remote-share.txt"
+ And User "user1" from server "REMOTE" shares "/remote-share.txt" with user "user0" from server "LOCAL"
+ And Using server "LOCAL"
+ And User "user0" from server "LOCAL" accepts last pending share
+ And as "user0" the file "/remote-share.txt" exists
+ And As an "user0"
+ And sending "GET" to "/apps/files_sharing/api/v1/remote_shares"
+ And the list of returned shares has 1 shares
+ And remote server is stopped
+ When User "user0" deletes file "/remote-share.txt"
+ Then the HTTP status code should be "204"
+ And as "user0" the file "/remote-share.txt" does not exist
+ And As an "user0"
+ And sending "GET" to "/apps/files_sharing/api/v1/remote_shares"
+ And the list of returned shares has 0 shares
diff --git a/build/integration/run.sh b/build/integration/run.sh
index 4808ab58ef5..a20398e8ee9 100755
--- a/build/integration/run.sh
+++ b/build/integration/run.sh
@@ -38,11 +38,10 @@ php -S localhost:$PORT -t ../.. &
PHPPID=$!
echo $PHPPID
+# The federated server is started and stopped by the tests themselves
PORT_FED=$((8180 + $EXECUTOR_NUMBER))
echo $PORT_FED
-php -S localhost:$PORT_FED -t ../.. &
-PHPPID_FED=$!
-echo $PHPPID_FED
+export PORT_FED
export TEST_SERVER_URL="http://localhost:$PORT/ocs/"
export TEST_SERVER_FED_URL="http://localhost:$PORT_FED/ocs/"
@@ -65,7 +64,6 @@ vendor/bin/behat --strict -f junit -f pretty $TAGS $SCENARIO_TO_RUN
RESULT=$?
kill $PHPPID
-kill $PHPPID_FED
if [ "$INSTALLED" == "true" ]; then