]> source.dussan.org Git - nextcloud-server.git/commitdiff
Restructured FeatureContext to reuse some parts and run two servers in parallel
authorSergio Bertolin <sbertolin@solidgear.es>
Tue, 24 Nov 2015 12:48:06 +0000 (12:48 +0000)
committerThomas Müller <thomas.mueller@tmit.eu>
Thu, 26 Nov 2015 16:03:17 +0000 (17:03 +0100)
build/integration/config/behat.yml
build/integration/features/bootstrap/BasicStructure.php [new file with mode: 0644]
build/integration/features/bootstrap/FeatureContext.php
build/integration/features/bootstrap/FederationContext.php [new file with mode: 0644]
build/integration/features/bootstrap/Provisioning.php [new file with mode: 0644]
build/integration/features/bootstrap/Sharing.php [new file with mode: 0644]
build/integration/features/bootstrap/WebDav.php [new file with mode: 0644]
build/integration/federation/federated.feature [new file with mode: 0644]
build/integration/run.sh

index c9d6754a0fa8196876333c3cc12687057fc83862..37ed2b117f3991f1e0cb53cbc7a68ea6f512775d 100644 (file)
@@ -12,6 +12,17 @@ default:
               - admin
               - admin
             regular_user_password: 123456
+    federation:
+      paths:
+        - %paths.base%/../federation
+      contexts:
+        - FederationContext:
+            baseUrl:  http://localhost:8080/ocs/
+            admin:
+              - admin
+              - admin
+            regular_user_password: 123456
+
 
   extensions:
       jarnaiz\JUnitFormatter\JUnitFormatterExtension:
diff --git a/build/integration/features/bootstrap/BasicStructure.php b/build/integration/features/bootstrap/BasicStructure.php
new file mode 100644 (file)
index 0000000..01a288a
--- /dev/null
@@ -0,0 +1,170 @@
+<?php
+
+use Behat\Behat\Context\Context;
+use Behat\Behat\Context\SnippetAcceptingContext;
+use GuzzleHttp\Client;
+use GuzzleHttp\Message\ResponseInterface;
+
+require __DIR__ . '/../../vendor/autoload.php';
+
+trait BasicStructure{
+       /** @var string */
+       private $currentUser = '';
+
+       /** @var string */
+       private $currentServer = '';
+
+       /** @var string */
+       private $baseUrl = '';
+
+       /** @var ResponseInterface */
+       private $response = null;
+
+       public function __construct($baseUrl, $admin, $regular_user_password) {
+
+               // Initialize your context here
+               $this->baseUrl = $baseUrl;
+               $this->adminUser = $admin;
+               $this->regularUser = $regular_user_password;
+               $this->localBaseUrl = substr($this->baseUrl, 0, -4);
+               $this->remoteBaseUrl = substr($this->baseUrl, 0, -4);
+               $this->currentServer = 'LOCAL';
+
+               // in case of ci deployment we take the server url from the environment
+               $testServerUrl = getenv('TEST_SERVER_URL');
+               if ($testServerUrl !== false) {
+                       $this->baseUrl = $testServerUrl;
+                       $this->localBaseUrl = $testServerUrl;
+               }
+
+               // federated server url from the environment
+               $testRemoteServerUrl = getenv('TEST_SERVER_FED_URL');
+               if ($testRemoteServerUrl !== false) {
+                       $this->remoteBaseUrl = $testRemoteServerUrl;
+               }
+       }
+
+       /**
+        * @Given /^As an "([^"]*)"$/
+        */
+       public function asAn($user) {
+               $this->currentUser = $user;
+       }
+
+       /**
+        * @Given /^Using server "([^"]*)"$/
+        */
+       public function usingServer($server) {
+               if ($server === 'LOCAL'){
+                       $this->baseUrl = $this->localBaseUrl;
+                       $this->currentServer = 'LOCAL';
+               } elseif ($server === 'REMOTE'){
+                       $this->baseUrl = $this->remoteBaseUrl;
+                       $this->currentServer = 'REMOTE';
+               } else{
+                       PHPUnit_Framework_Assert::fail("Server can only be LOCAL or REMOTE");
+               }
+       }
+
+       /**
+        * @When /^sending "([^"]*)" to "([^"]*)"$/
+        */
+       public function sendingTo($verb, $url) {
+               $this->sendingToWith($verb, $url, null);
+       }
+
+       /**
+        * Parses the xml answer to get ocs response which doesn't match with
+        * http one in v1 of the api.
+        * @param ResponseInterface $response
+        * @return string
+        */
+       public function getOCSResponse($response) {
+               return $response->xml()->meta[0]->statuscode;
+       }
+
+       /**
+        * This function is needed to use a vertical fashion in the gherkin tables.
+        */
+       public function simplifyArray($arrayOfArrays){
+               $a = array_map(function($subArray) { return $subArray[0]; }, $arrayOfArrays);
+               return $a;
+       }
+
+       /**
+        * @When /^sending "([^"]*)" to "([^"]*)" with$/
+        * @param \Behat\Gherkin\Node\TableNode|null $formData
+        */
+       public function sendingToWith($verb, $url, $body) {
+               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php" . $url;
+               $client = new Client();
+               $options = [];
+               if ($this->currentUser === 'admin') {
+                       $options['auth'] = $this->adminUser;
+               } else {
+                       $options['auth'] = [$this->currentUser, $this->regularUser];
+               }
+               if ($body instanceof \Behat\Gherkin\Node\TableNode) {
+                       $fd = $body->getRowsHash();
+                       $options['body'] = $fd;
+               }
+
+               try {
+                       $this->response = $client->send($client->createRequest($verb, $fullUrl, $options));
+               } catch (\GuzzleHttp\Exception\ClientException $ex) {
+                       $this->response = $ex->getResponse();
+               }
+       }
+
+       public function isExpectedUrl($possibleUrl, $finalPart){
+               $baseUrlChopped = substr($this->baseUrl, 0, -4);
+               $endCharacter = strlen($baseUrlChopped) + strlen($finalPart);
+               return (substr($possibleUrl,0,$endCharacter) == "$baseUrlChopped" . "$finalPart");
+       }
+
+       /**
+        * @Then /^the OCS status code should be "([^"]*)"$/
+        */
+       public function theOCSStatusCodeShouldBe($statusCode) {
+               PHPUnit_Framework_Assert::assertEquals($statusCode, $this->getOCSResponse($this->response));
+       }
+
+       /**
+        * @Then /^the HTTP status code should be "([^"]*)"$/
+        */
+       public function theHTTPStatusCodeShouldBe($statusCode) {
+               PHPUnit_Framework_Assert::assertEquals($statusCode, $this->response->getStatusCode());
+       }
+
+       public static function removeFile($path, $filename){
+               if (file_exists("$path" . "$filename")) {
+                       unlink("$path" . "$filename");
+               }
+       }
+
+       /**
+        * @BeforeSuite
+        */
+       public static function addFilesToSkeleton(){
+               for ($i=0; $i<5; $i++){
+                       file_put_contents("../../core/skeleton/" . "textfile" . "$i" . ".txt", "ownCloud test text file\n");
+               }
+               if (!file_exists("../../core/skeleton/FOLDER")) {
+                       mkdir("../../core/skeleton/FOLDER", 0777, true);
+               }
+
+       }
+
+       /**
+        * @AfterSuite
+        */
+       public static function removeFilesFromSkeleton(){
+               for ($i=0; $i<5; $i++){
+                       self::removeFile("../../core/skeleton/", "textfile" . "$i" . ".txt");
+               }
+               if (is_dir("../../core/skeleton/FOLDER")) {
+                       rmdir("../../core/skeleton/FOLDER");
+               }
+       }
+}
+
index b3d928bb21db6f6ca32195ed5575904cdfff7c79..78ff4e7833d661962695ecfcb4f4c6094e861651 100644 (file)
@@ -7,1055 +7,13 @@ use GuzzleHttp\Message\ResponseInterface;
 
 require __DIR__ . '/../../vendor/autoload.php';
 
+
 /**
  * Features context.
  */
 class FeatureContext implements Context, SnippetAcceptingContext {
-
-       /** @var string */
-       private $baseUrl = '';
-
-       /** @var ResponseInterface */
-       private $response = null;
-
-       /** @var string */
-       private $currentUser = '';
-
-       /** @var int */
-       private $apiVersion = 1;
-
-       /** @var int */
-       private $sharingApiVersion = 1;
-
-       /** @var string*/
-       private $davPath = "remote.php/webdav";
-
-       /** @var SimpleXMLElement */
-       private $lastShareData = null;
-
-       /** @var array */
-       private $createdUsers = [];
-
-       /** @var array */
-       private $createdGroups = [];
-
-       public function __construct($baseUrl, $admin, $regular_user_password) {
-
-               // Initialize your context here
-               $this->baseUrl = $baseUrl;
-               $this->adminUser = $admin;
-               $this->regularUser = $regular_user_password;
-
-               // in case of ci deployment we take the server url from the environment
-               $testServerUrl = getenv('TEST_SERVER_URL');
-               if ($testServerUrl !== false) {
-                       $this->baseUrl = $testServerUrl;
-               }
-       }
-
-       /**
-        * @When /^sending "([^"]*)" to "([^"]*)"$/
-        */
-       public function sendingTo($verb, $url) {
-               $this->sendingToWith($verb, $url, null);
-       }
-
-       /**
-        * Parses the xml answer to get ocs response which doesn't match with
-        * http one in v1 of the api.
-        * @param ResponseInterface $response
-        * @return string
-        */
-       public function getOCSResponse($response) {
-               return $response->xml()->meta[0]->statuscode;
-       }
-
-       /**
-        * Parses the xml answer to get the array of users returned.
-        * @param ResponseInterface $resp
-        * @return array
-        */
-       public function getArrayOfUsersResponded($resp) {
-               $listCheckedElements = $resp->xml()->data[0]->users[0]->element;
-               $extractedElementsArray = json_decode(json_encode($listCheckedElements), 1);
-               return $extractedElementsArray;
-       }
-
-       /**
-        * Parses the xml answer to get the array of groups returned.
-        * @param ResponseInterface $resp
-        * @return array
-        */
-       public function getArrayOfGroupsResponded($resp) {
-               $listCheckedElements = $resp->xml()->data[0]->groups[0]->element;
-               $extractedElementsArray = json_decode(json_encode($listCheckedElements), 1);
-               return $extractedElementsArray;
-       }
-
-       /**
-        * Parses the xml answer to get the array of subadmins returned.
-        * @param ResponseInterface $resp
-        * @return array
-        */
-       public function getArrayOfSubadminsResponded($resp) {
-               $listCheckedElements = $resp->xml()->data[0]->element;
-               $extractedElementsArray = json_decode(json_encode($listCheckedElements), 1);
-               return $extractedElementsArray;
-       }
-
-       /**
-        * Parses the xml answer to get the array of apps returned.
-        * @param ResponseInterface $resp
-        * @return array
-        */
-       public function getArrayOfAppsResponded($resp) {
-               $listCheckedElements = $resp->xml()->data[0]->apps[0]->element;
-               $extractedElementsArray = json_decode(json_encode($listCheckedElements), 1);
-               return $extractedElementsArray;
-       }
-
-       /**
-        * This function is needed to use a vertical fashion in the gherkin tables.
-        */
-       public function simplifyArray($arrayOfArrays){
-               $a = array_map(function($subArray) { return $subArray[0]; }, $arrayOfArrays);
-               return $a;
-       }
-
-       /**
-        * @Then /^users returned are$/
-        * @param \Behat\Gherkin\Node\TableNode|null $usersList
-        */
-       public function theUsersShouldBe($usersList) {
-               if ($usersList instanceof \Behat\Gherkin\Node\TableNode) {
-                       $users = $usersList->getRows();
-                       $usersSimplified = $this->simplifyArray($users);
-                       $respondedArray = $this->getArrayOfUsersResponded($this->response);
-                       PHPUnit_Framework_Assert::assertEquals($usersSimplified, $respondedArray, "", 0.0, 10, true);
-               }
-
-       }
-
-       /**
-        * @Then /^groups returned are$/
-        * @param \Behat\Gherkin\Node\TableNode|null $groupsList
-        */
-       public function theGroupsShouldBe($groupsList) {
-               if ($groupsList instanceof \Behat\Gherkin\Node\TableNode) {
-                       $groups = $groupsList->getRows();
-                       $groupsSimplified = $this->simplifyArray($groups);
-                       $respondedArray = $this->getArrayOfGroupsResponded($this->response);
-                       PHPUnit_Framework_Assert::assertEquals($groupsSimplified, $respondedArray, "", 0.0, 10, true);
-               }
-
-       }
-
-       /**
-        * @Then /^subadmin groups returned are$/
-        * @param \Behat\Gherkin\Node\TableNode|null $groupsList
-        */
-       public function theSubadminGroupsShouldBe($groupsList) {
-               if ($groupsList instanceof \Behat\Gherkin\Node\TableNode) {
-                       $groups = $groupsList->getRows();
-                       $groupsSimplified = $this->simplifyArray($groups);
-                       $respondedArray = $this->getArrayOfSubadminsResponded($this->response);
-                       PHPUnit_Framework_Assert::assertEquals($groupsSimplified, $respondedArray, "", 0.0, 10, true);
-               }
-
-       }
-
-       /**
-        * @Then /^subadmin users returned are$/
-        * @param \Behat\Gherkin\Node\TableNode|null $groupsList
-        */
-       public function theSubadminUsersShouldBe($groupsList) {
-               $this->theSubadminGroupsShouldBe($groupsList);
-       }
-
-       /**
-        * @Then /^apps returned are$/
-        * @param \Behat\Gherkin\Node\TableNode|null $appList
-        */
-       public function theAppsShouldBe($appList) {
-               if ($appList instanceof \Behat\Gherkin\Node\TableNode) {
-                       $apps = $appList->getRows();
-                       $appsSimplified = $this->simplifyArray($apps);
-                       $respondedArray = $this->getArrayOfAppsResponded($this->response);
-                       PHPUnit_Framework_Assert::assertEquals($appsSimplified, $respondedArray, "", 0.0, 10, true);
-               }
-
-       }
-
-       /**
-        * @Then /^the OCS status code should be "([^"]*)"$/
-        */
-       public function theOCSStatusCodeShouldBe($statusCode) {
-               PHPUnit_Framework_Assert::assertEquals($statusCode, $this->getOCSResponse($this->response));
-       }
-
-       /**
-        * @Then /^the HTTP status code should be "([^"]*)"$/
-        */
-       public function theHTTPStatusCodeShouldBe($statusCode) {
-               PHPUnit_Framework_Assert::assertEquals($statusCode, $this->response->getStatusCode());
-       }
-
-       /**
-        * @Given /^As an "([^"]*)"$/
-        */
-       public function asAn($user) {
-               $this->currentUser = $user;
-       }
-
-       /**
-        * @Given /^using api version "([^"]*)"$/
-        */
-       public function usingApiVersion($version) {
-               $this->apiVersion = $version;
-       }
-
-       /**
-        * @Given /^using dav path "([^"]*)"$/
-        */
-       public function usingDavPath($davPath) {
-               $this->davPath = $davPath;
-       }
-
-       /**
-        * @Given /^user "([^"]*)" exists$/
-        */
-       public function assureUserExists($user) {
-               try {
-                       $this->userExists($user);
-               } catch (\GuzzleHttp\Exception\ClientException $ex) {
-                       $previous_user = $this->currentUser;
-                       $this->currentUser = "admin";
-                       $this->creatingTheUser($user);
-                       $this->currentUser = $previous_user;
-               }
-               $this->userExists($user);
-               PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
-
-       }
-
-       public function userExists($user){
-               $fullUrl = $this->baseUrl . "v2.php/cloud/users/$user";
-               $client = new Client();
-               $options = [];
-               $options['auth'] = $this->adminUser;
-
-               $this->response = $client->get($fullUrl, $options);
-       }
-
-       /**
-        * @Then /^check that user "([^"]*)" belongs to group "([^"]*)"$/
-        */
-       public function checkThatUserBelongsToGroup($user, $group) {
-               $fullUrl = $this->baseUrl . "v2.php/cloud/users/$user/groups";
-               $client = new Client();
-               $options = [];
-               if ($this->currentUser === 'admin') {
-                       $options['auth'] = $this->adminUser;
-               }
-
-               $this->response = $client->get($fullUrl, $options);
-               $respondedArray = $this->getArrayOfGroupsResponded($this->response);
-               sort($respondedArray);
-               PHPUnit_Framework_Assert::assertContains($group, $respondedArray);
-               PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
-       }
-
-       public function userBelongsToGroup($user, $group) {
-               $fullUrl = $this->baseUrl . "v2.php/cloud/users/$user/groups";
-               $client = new Client();
-               $options = [];
-               if ($this->currentUser === 'admin') {
-                       $options['auth'] = $this->adminUser;
-               }
-
-               $this->response = $client->get($fullUrl, $options);
-               $groups = array($group);
-               $respondedArray = $this->getArrayOfGroupsResponded($this->response);
-
-               if (array_key_exists($group, $respondedArray)) {
-                       return True;
-               } else{
-                       return False;
-               }
-       }
-
-       /**
-        * @Given /^user "([^"]*)" belongs to group "([^"]*)"$/
-        */
-       public function assureUserBelongsToGroup($user, $group){
-               if (!$this->userBelongsToGroup($user, $group)){                 
-                       $previous_user = $this->currentUser;
-                       $this->currentUser = "admin";
-                       $this->addingUserToGroup($user, $group);
-                       $this->currentUser = $previous_user;
-               }
-               $this->checkThatUserBelongsToGroup($user, $group);
-
-       }
-
-       /**
-        * @Given /^user "([^"]*)" does not belong to group "([^"]*)"$/
-        */
-       public function userDoesNotBelongToGroup($user, $group) {
-               $fullUrl = $this->baseUrl . "v2.php/cloud/users/$user/groups";
-               $client = new Client();
-               $options = [];
-               if ($this->currentUser === 'admin') {
-                       $options['auth'] = $this->adminUser;
-               }
-
-               $this->response = $client->get($fullUrl, $options);
-               $groups = array($group);
-               $respondedArray = $this->getArrayOfGroupsResponded($this->response);
-               PHPUnit_Framework_Assert::assertNotEquals($groups, $respondedArray, "", 0.0, 10, true);
-               PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
-       }
-
-
-       /**
-        * @Given /^user "([^"]*)" is subadmin of group "([^"]*)"$/
-        */
-       public function userIsSubadminOfGroup($user, $group) {
-               $fullUrl = $this->baseUrl . "v2.php/cloud/groups/$group/subadmins";
-               $client = new Client();
-               $options = [];
-               if ($this->currentUser === 'admin') {
-                       $options['auth'] = $this->adminUser;
-               }
-
-               $this->response = $client->get($fullUrl, $options);
-               $respondedArray = $this->getArrayOfSubadminsResponded($this->response);
-               sort($respondedArray);
-               PHPUnit_Framework_Assert::assertContains($user, $respondedArray);
-               PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
-       }
-
-       /**
-        * @Given /^user "([^"]*)" is not a subadmin of group "([^"]*)"$/
-        */
-       public function userIsNotSubadminOfGroup($user, $group) {
-               $fullUrl = $this->baseUrl . "v2.php/cloud/groups/$group/subadmins";
-               $client = new Client();
-               $options = [];
-               if ($this->currentUser === 'admin') {
-                       $options['auth'] = $this->adminUser;
-               }
-
-               $this->response = $client->get($fullUrl, $options);
-               $respondedArray = $this->getArrayOfSubadminsResponded($this->response);
-               sort($respondedArray);
-               PHPUnit_Framework_Assert::assertNotContains($user, $respondedArray);
-               PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
-       }
-
-       /**
-        * @Given /^user "([^"]*)" does not exist$/
-        */
-       public function userDoesNotExist($user) {
-               try {
-                       $this->userExists($user);
-               } catch (\GuzzleHttp\Exception\ClientException $ex) {
-                       $this->response = $ex->getResponse();
-                       PHPUnit_Framework_Assert::assertEquals(404, $ex->getResponse()->getStatusCode());
-                       return;
-               }
-               $previous_user = $this->currentUser;
-               $this->currentUser = "admin";
-               $this->deletingTheUser($user);
-               $this->currentUser = $previous_user;
-               try {
-                       $this->userExists($user);
-               } catch (\GuzzleHttp\Exception\ClientException $ex) {
-                       $this->response = $ex->getResponse();
-                       PHPUnit_Framework_Assert::assertEquals(404, $ex->getResponse()->getStatusCode());
-               }
-       }
-
-       /**
-        * @Given /^app "([^"]*)" is disabled$/
-        */
-       public function appIsDisabled($app) {
-               $fullUrl = $this->baseUrl . "v2.php/cloud/apps?filter=disabled";
-               $client = new Client();
-               $options = [];
-               if ($this->currentUser === 'admin') {
-                       $options['auth'] = $this->adminUser;
-               }
-
-               $this->response = $client->get($fullUrl, $options);
-               $respondedArray = $this->getArrayOfAppsResponded($this->response);
-               PHPUnit_Framework_Assert::assertContains($app, $respondedArray);
-               PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
-       }
-
-       /**
-        * @Given /^app "([^"]*)" is enabled$/
-        */
-       public function appIsEnabled($app) {
-               $fullUrl = $this->baseUrl . "v2.php/cloud/apps?filter=enabled";
-               $client = new Client();
-               $options = [];
-               if ($this->currentUser === 'admin') {
-                       $options['auth'] = $this->adminUser;
-               }
-
-               $this->response = $client->get($fullUrl, $options);
-               $respondedArray = $this->getArrayOfAppsResponded($this->response);
-               PHPUnit_Framework_Assert::assertContains($app, $respondedArray);
-               PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
-       }
-
-       public function createUser($user) {
-               $previous_user = $this->currentUser;
-               $this->currentUser = "admin";
-               $this->creatingTheUser($user);
-               $this->userExists($user);
-               $this->currentUser = $previous_user;
-       }
-
-       public function deleteUser($user) {
-               $previous_user = $this->currentUser;
-               $this->currentUser = "admin";
-               $this->deletingTheUser($user);
-               $this->userDoesNotExist($user);
-               $this->currentUser = $previous_user;
-       }
-
-       public function createGroup($group) {
-               $previous_user = $this->currentUser;
-               $this->currentUser = "admin";
-               $this->creatingTheGroup($group);
-               $this->groupExists($group);
-               $this->currentUser = $previous_user;
-       }
-
-       public function deleteGroup($group) {
-               $previous_user = $this->currentUser;
-               $this->currentUser = "admin";
-               $this->deletingTheGroup($group);
-               $this->groupDoesNotExist($group);
-               $this->currentUser = $previous_user;
-       }
-
-       public function creatingTheUser($user) {
-               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/users";
-               $client = new Client();
-               $options = [];
-               if ($this->currentUser === 'admin') {
-                       $options['auth'] = $this->adminUser;
-               }
-
-               $options['body'] = [
-                                                       'userid' => $user,
-                                                       'password' => '123456'
-                                                       ];
-
-               $this->response = $client->send($client->createRequest("POST", $fullUrl, $options));
-               $this->createdUsers[$user] = $user;
-       }
-
-       /**
-        * @When /^creating the group "([^"]*)"$/
-        */
-       public function creatingTheGroup($group) {
-               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/groups";
-               $client = new Client();
-               $options = [];
-               if ($this->currentUser === 'admin') {
-                       $options['auth'] = $this->adminUser;
-               }
-
-               $options['body'] = [
-                                                       'groupid' => $group,
-                                                       ];
-
-               $this->response = $client->send($client->createRequest("POST", $fullUrl, $options));
-               $this->createdGroups[$group] = $group;
-       }
-
-       /**
-        * @When /^Deleting the user "([^"]*)"$/
-        */
-       public function deletingTheUser($user) {
-               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/users/$user";
-               $client = new Client();
-               $options = [];
-               if ($this->currentUser === 'admin') {
-                       $options['auth'] = $this->adminUser;
-               }
-
-               $this->response = $client->send($client->createRequest("DELETE", $fullUrl, $options));
-       }
-
-       /**
-        * @When /^Deleting the group "([^"]*)"$/
-        */
-       public function deletingTheGroup($group) {
-               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/groups/$group";
-               $client = new Client();
-               $options = [];
-               if ($this->currentUser === 'admin') {
-                       $options['auth'] = $this->adminUser;
-               }
-
-               $this->response = $client->send($client->createRequest("DELETE", $fullUrl, $options));
-       }
-
-       /**
-        * @Given /^Add user "([^"]*)" to the group "([^"]*)"$/
-        */
-       public function addUserToGroup($user, $group) {
-               $this->userExists($user);
-               $this->groupExists($group);
-               $this->addingUserToGroup($user, $group);
-
-       }
-
-       /**
-        * @When /^User "([^"]*)" is added to the group "([^"]*)"$/
-        */
-       public function addingUserToGroup($user, $group) {
-               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/users/$user/groups";
-               $client = new Client();
-               $options = [];
-               if ($this->currentUser === 'admin') {
-                       $options['auth'] = $this->adminUser;
-               }
-
-               $options['body'] = [
-                                                       'groupid' => $group,
-                                                       ];
-
-               $this->response = $client->send($client->createRequest("POST", $fullUrl, $options));
-       }
-
-
-       public function groupExists($group) {
-               $fullUrl = $this->baseUrl . "v2.php/cloud/groups/$group";
-               $client = new Client();
-               $options = [];
-               $options['auth'] = $this->adminUser;
-
-               $this->response = $client->get($fullUrl, $options);
-       }
-
-       /**
-        * @Given /^group "([^"]*)" exists$/
-        */
-       public function assureGroupExists($group) {
-               try {
-                       $this->groupExists($group);
-               } catch (\GuzzleHttp\Exception\ClientException $ex) {
-                       $previous_user = $this->currentUser;
-                       $this->currentUser = "admin";
-                       $this->creatingTheGroup($group);
-                       $this->currentUser = $previous_user;
-               }
-               $this->groupExists($group);
-               PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
-       }
-
-       /**
-        * @Given /^group "([^"]*)" does not exist$/
-        */
-       public function groupDoesNotExist($group) {
-               try {
-                       $this->groupExists($group);
-               } catch (\GuzzleHttp\Exception\ClientException $ex) {
-                       $this->response = $ex->getResponse();
-                       PHPUnit_Framework_Assert::assertEquals(404, $ex->getResponse()->getStatusCode());
-                       return;
-               }
-               $previous_user = $this->currentUser;
-               $this->currentUser = "admin";
-               $this->deletingTheGroup($group);
-               $this->currentUser = $previous_user;
-               try {
-                       $this->groupExists($group);
-               } catch (\GuzzleHttp\Exception\ClientException $ex) {
-                       $this->response = $ex->getResponse();
-                       PHPUnit_Framework_Assert::assertEquals(404, $ex->getResponse()->getStatusCode());
-               }
-       }
-
-       /**
-        * @When /^sending "([^"]*)" to "([^"]*)" with$/
-        * @param \Behat\Gherkin\Node\TableNode|null $formData
-        */
-       public function sendingToWith($verb, $url, $body) {
-               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php" . $url;
-               $client = new Client();
-               $options = [];
-               if ($this->currentUser === 'admin') {
-                       $options['auth'] = $this->adminUser;
-               } else {
-                       $options['auth'] = [$this->currentUser, $this->regularUser];
-               }
-               if ($body instanceof \Behat\Gherkin\Node\TableNode) {
-                       $fd = $body->getRowsHash();
-                       $options['body'] = $fd;
-               }
-
-               try {
-                       $this->response = $client->send($client->createRequest($verb, $fullUrl, $options));
-               } catch (\GuzzleHttp\Exception\ClientException $ex) {
-                       $this->response = $ex->getResponse();
-               }
-       }
-
-       /**
-        * @When /^creating a share with$/
-        * @param \Behat\Gherkin\Node\TableNode|null $formData
-        */
-       public function creatingShare($body) {
-               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/apps/files_sharing/api/v1/shares";
-               $client = new Client();
-               $options = [];
-               if ($this->currentUser === 'admin') {
-                       $options['auth'] = $this->adminUser;
-               } else {
-                       $options['auth'] = [$this->currentUser, $this->regularUser];
-               }
-
-               if ($body instanceof \Behat\Gherkin\Node\TableNode) {
-                       $fd = $body->getRowsHash();
-                       if (array_key_exists('expireDate', $fd)){
-                               $dateModification = $fd['expireDate'];
-                               $fd['expireDate'] = date('Y-m-d', strtotime($dateModification));
-                       }
-                       $options['body'] = $fd;
-               }
-
-               try {
-                       $this->response = $client->send($client->createRequest("POST", $fullUrl, $options));
-               } catch (\GuzzleHttp\Exception\ClientException $ex) {
-                       $this->response = $ex->getResponse();
-               }
-
-               $this->lastShareData = $this->response->xml();
-       }
-
-       /**
-        * @Then /^Public shared file "([^"]*)" can be downloaded$/
-        */
-       public function checkPublicSharedFile($filename) {
-               $client = new Client();
-               $options = [];
-               if (count($this->lastShareData->data->element) > 0){
-                       $url = $this->lastShareData->data[0]->url;
-               }
-               else{
-                       $url = $this->lastShareData->data->url;
-               }
-               $fullUrl = $url . "/download";
-               $options['save_to'] = "./$filename";
-               $this->response = $client->get($fullUrl, $options);
-               $finfo = new finfo;
-               $fileinfo = $finfo->file("./$filename", FILEINFO_MIME_TYPE);
-               PHPUnit_Framework_Assert::assertEquals($fileinfo, "text/plain");
-               if (file_exists("./$filename")) {
-                       unlink("./$filename");
-               }
-       }
-
-       /**
-        * @Then /^Public shared file "([^"]*)" with password "([^"]*)" can be downloaded$/
-        */
-       public function checkPublicSharedFileWithPassword($filename, $password) {
-               $client = new Client();
-               $options = [];
-               if (count($this->lastShareData->data->element) > 0){
-                       $token = $this->lastShareData->data[0]->token;
-               }
-               else{
-                       $token = $this->lastShareData->data->token;
-               }
-
-               $fullUrl = substr($this->baseUrl, 0, -4) . "public.php/webdav";
-               $options['auth'] = [$token, $password];
-               $options['save_to'] = "./$filename";
-               $this->response = $client->get($fullUrl, $options);
-               $finfo = new finfo;
-               $fileinfo = $finfo->file("./$filename", FILEINFO_MIME_TYPE);
-               PHPUnit_Framework_Assert::assertEquals($fileinfo, "text/plain");
-               if (file_exists("./$filename")) {
-                       unlink("./$filename");
-               }
-       }
-
-       /**
-        * @When /^Adding expiration date to last share$/
-        */
-       public function addingExpirationDate() {
-               $share_id = $this->lastShareData->data[0]->id;
-               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/apps/files_sharing/api/v{$this->sharingApiVersion}/shares/$share_id";
-               $client = new Client();
-               $options = [];
-               if ($this->currentUser === 'admin') {
-                       $options['auth'] = $this->adminUser;
-               } else {
-                       $options['auth'] = [$this->currentUser, $this->regularUser];
-               }
-               $date = date('Y-m-d', strtotime("+3 days"));
-               $options['body'] = ['expireDate' => $date];
-               $this->response = $client->send($client->createRequest("PUT", $fullUrl, $options));
-               PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
-       }
-
-       /**
-        * @When /^Updating last share with$/
-        * @param \Behat\Gherkin\Node\TableNode|null $body
-        */
-       public function updatingLastShare($body) {
-               $share_id = $this->lastShareData->data[0]->id;
-               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/apps/files_sharing/api/v{$this->sharingApiVersion}/shares/$share_id";
-               $client = new Client();
-               $options = [];
-               if ($this->currentUser === 'admin') {
-                       $options['auth'] = $this->adminUser;
-               } else {
-                       $options['auth'] = [$this->currentUser, $this->regularUser];
-               }
-
-               if ($body instanceof \Behat\Gherkin\Node\TableNode) {
-                       $fd = $body->getRowsHash();
-                       if (array_key_exists('expireDate', $fd)){
-                               $dateModification = $fd['expireDate'];
-                               $fd['expireDate'] = date('Y-m-d', strtotime($dateModification));
-                       }
-                       $options['body'] = $fd;
-               }
-
-               try {
-                       $this->response = $client->send($client->createRequest("PUT", $fullUrl, $options));
-               } catch (\GuzzleHttp\Exception\ClientException $ex) {
-                       $this->response = $ex->getResponse();
-               }
-
-               PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
-       }
-
-
-       public function createShare($user,
-                                                               $path = null,
-                                                               $shareType = null,
-                                                               $shareWith = null,
-                                                               $publicUpload = null,
-                                                               $password = null,
-                                                               $permissions = null){
-               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/apps/files_sharing/api/v{$this->sharingApiVersion}/shares";
-               $client = new Client();
-               $options = [];
-
-               if ($user === 'admin') {
-                       $options['auth'] = $this->adminUser;
-               } else {
-                       $options['auth'] = [$user, $this->regularUser];
-               }
-               $fd = [];
-               if (!is_null($path)){
-                       $fd['path'] = $path;
-               }
-               if (!is_null($shareType)){
-                       $fd['shareType'] = $shareType;
-               }
-               if (!is_null($shareWith)){
-                       $fd['shareWith'] = $shareWith;
-               }
-               if (!is_null($publicUpload)){
-                       $fd['publicUpload'] = $publicUpload;
-               }
-               if (!is_null($password)){
-                       $fd['password'] = $password;
-               }
-               if (!is_null($permissions)){
-                       $fd['permissions'] = $permissions;
-               }
-
-               $options['body'] = $fd;
-
-               try {
-                       $this->response = $client->send($client->createRequest("POST", $fullUrl, $options));
-                       $this->lastShareData = $this->response->xml();
-               } catch (\GuzzleHttp\Exception\ClientException $ex) {
-                       $this->response = $ex->getResponse();
-               }
-
-       }
-
-       public function isExpectedUrl($possibleUrl, $finalPart){
-               $baseUrlChopped = substr($this->baseUrl, 0, -4);
-               $endCharacter = strlen($baseUrlChopped) + strlen($finalPart);
-               return (substr($possibleUrl,0,$endCharacter) == "$baseUrlChopped" . "$finalPart");
-       }
-
-       public function isFieldInResponse($field, $contentExpected){
-               $data = $this->response->xml()->data[0];
-               if ((string)$field == 'expiration'){
-                       $contentExpected = date('Y-m-d', strtotime($contentExpected)) . " 00:00:00";
-               }
-               if (count($data->element) > 0){
-                       foreach($data as $element) {
-                               if ($contentExpected == "A_TOKEN"){
-                                       return (strlen((string)$element->$field) == 15);
-                               }
-                               elseif ($contentExpected == "A_NUMBER"){
-                                       return is_numeric((string)$element->$field);
-                               }
-                               elseif($contentExpected == "AN_URL"){
-                                       return $this->isExpectedUrl((string)$element->$field, "index.php/s/");
-                               }
-                               elseif ((string)$element->$field == $contentExpected){
-                                       return True;
-                               }
-                       }
-
-                       return False;
-               } else {
-                       if ($contentExpected == "A_TOKEN"){
-                                       return (strlen((string)$data->$field) == 15);
-                       }
-                       elseif ($contentExpected == "A_NUMBER"){
-                                       return is_numeric((string)$data->$field);
-                       }
-                       elseif($contentExpected == "AN_URL"){
-                                       return $this->isExpectedUrl((string)$data->$field, "index.php/s/");
-                       }
-                       elseif ($data->$field == $contentExpected){
-                                       return True;
-                       }
-                       return False;
-               }
-       }
-
-       /**
-        * @Then /^File "([^"]*)" should be included in the response$/
-        */
-       public function checkSharedFileInResponse($filename){
-               PHPUnit_Framework_Assert::assertEquals(True, $this->isFieldInResponse('file_target', "/$filename"));
-       }
-
-       /**
-        * @Then /^File "([^"]*)" should not be included in the response$/
-        */
-       public function checkSharedFileNotInResponse($filename){
-               PHPUnit_Framework_Assert::assertEquals(False, $this->isFieldInResponse('file_target', "/$filename"));
-       }
-
-       /**
-        * @Then /^User "([^"]*)" should be included in the response$/
-        */
-       public function checkSharedUserInResponse($user){
-               PHPUnit_Framework_Assert::assertEquals(True, $this->isFieldInResponse('share_with', "$user"));
-       }
-
-       /**
-        * @Then /^User "([^"]*)" should not be included in the response$/
-        */
-       public function checkSharedUserNotInResponse($user){
-               PHPUnit_Framework_Assert::assertEquals(False, $this->isFieldInResponse('share_with', "$user"));
-       }
-
-       public function isUserOrGroupInSharedData($userOrGroup){
-               $data = $this->response->xml()->data[0];
-               foreach($data as $element) {
-                       if ($element->share_with == $userOrGroup){
-                               return True;
-                       }
-               }
-               return False;
-       }
-
-       /**
-        * @Given /^file "([^"]*)" from user "([^"]*)" is shared with user "([^"]*)"$/
-        */
-       public function assureFileIsShared($filepath, $user1, $user2){
-               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/apps/files_sharing/api/v{$this->sharingApiVersion}/shares" . "?path=$filepath";
-               $client = new Client();
-               $options = [];
-               if ($user1 === 'admin') {
-                       $options['auth'] = $this->adminUser;
-               } else {
-                       $options['auth'] = [$user1, $this->regularUser];
-               }
-               $this->response = $client->get($fullUrl, $options);
-               if ($this->isUserOrGroupInSharedData($user2)){
-                       return;
-               } else {
-                       $this->createShare($user1, $filepath, 0, $user2, null, null, null);
-               }
-               $this->response = $client->get($fullUrl, $options);
-               PHPUnit_Framework_Assert::assertEquals(True, $this->isUserOrGroupInSharedData($user2));
-       }
-
-       /**
-        * @Given /^file "([^"]*)" from user "([^"]*)" is shared with group "([^"]*)"$/
-        */
-       public function assureFileIsSharedWithGroup($filepath, $user, $group){
-               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/apps/files_sharing/api/v{$this->sharingApiVersion}/shares" . "?path=$filepath";
-               $client = new Client();
-               $options = [];
-               if ($user === 'admin') {
-                       $options['auth'] = $this->adminUser;
-               } else {
-                       $options['auth'] = [$user, $this->regularUser];
-               }
-               $this->response = $client->get($fullUrl, $options);
-               if ($this->isUserOrGroupInSharedData($group)){
-                       return;
-               } else {
-                       $this->createShare($user, $filepath, 1, $group, null, null, null);
-               }
-               $this->response = $client->get($fullUrl, $options);
-               PHPUnit_Framework_Assert::assertEquals(True, $this->isUserOrGroupInSharedData($group));
-       }
-
-       public function makeDavRequest($user, $method, $path, $headers){
-               $fullUrl = substr($this->baseUrl, 0, -4) . $this->davPath . "$path";
-               $client = new Client();
-               $options = [];
-               if ($user === 'admin') {
-                       $options['auth'] = $this->adminUser;
-               } else {
-                       $options['auth'] = [$user, $this->regularUser];
-               }
-               $request = $client->createRequest($method, $fullUrl, $options);
-               foreach ($headers as $key => $value) {
-                       $request->addHeader($key, $value);      
-               }
-               //$this->response = $client->send($request);
-               return $client->send($request);
-       }
-
-       /**
-        * @Given /^User "([^"]*)" moved file "([^"]*)" to "([^"]*)"$/
-        */
-       public function userMovedFile($user, $fileSource, $fileDestination){
-               $fullUrl = substr($this->baseUrl, 0, -4) . $this->davPath;
-               $headers['Destination'] = $fullUrl . $fileDestination;
-               $this->response = $this->makeDavRequest($user, "MOVE", $fileSource, $headers);
-               PHPUnit_Framework_Assert::assertEquals(201, $this->response->getStatusCode());
-       }
-
-       /**
-        * @When /^User "([^"]*)" moves file "([^"]*)" to "([^"]*)"$/
-        */
-       public function userMovesFile($user, $fileSource, $fileDestination){
-               $fullUrl = substr($this->baseUrl, 0, -4) . $this->davPath;
-               $headers['Destination'] = $fullUrl . $fileDestination;
-               $this->response = $this->makeDavRequest($user, "MOVE", $fileSource, $headers);
-       }
-
-       /**
-        * @When /^Deleting last share$/
-        */
-       public function deletingLastShare(){
-               $share_id = $this->lastShareData->data[0]->id;
-               $url = "/apps/files_sharing/api/v{$this->sharingApiVersion}/shares/$share_id";
-               $this->sendingToWith("DELETE", $url, null);
-       }
-
-       /**
-        * @When /^Getting info of last share$/
-        */
-       public function gettingInfoOfLastShare(){
-               $share_id = $this->lastShareData->data[0]->id;
-               $url = "/apps/files_sharing/api/v{$this->sharingApiVersion}/shares/$share_id";
-               $this->sendingToWith("GET", $url, null);
-       }
-
-       /**
-        * @Then /^last share_id is included in the answer$/
-        */
-       public function checkingLastShareIDIsIncluded(){
-               $share_id = $this->lastShareData->data[0]->id;
-               if (!$this->isFieldInResponse('id', $share_id)){
-                       PHPUnit_Framework_Assert::fail("Share id $share_id not found in response");
-               }
-       }
-
-       /**
-        * @Then /^last share_id is not included in the answer$/
-        */
-       public function checkingLastShareIDIsNotIncluded(){
-               $share_id = $this->lastShareData->data[0]->id;
-               if ($this->isFieldInResponse('id', $share_id)){
-                       PHPUnit_Framework_Assert::fail("Share id $share_id has been found in response");
-               }
-       }
-
-       /**
-        * @Then /^Share fields of last share match with$/
-        * @param \Behat\Gherkin\Node\TableNode|null $formData
-        */
-       public function checkShareFields($body){
-               if ($body instanceof \Behat\Gherkin\Node\TableNode) {
-                       $fd = $body->getRowsHash();
-
-                       foreach($fd as $field => $value) {
-                               if (!$this->isFieldInResponse($field, $value)){
-                                       PHPUnit_Framework_Assert::fail("$field" . " doesn't have value " . "$value");
-                               }
-                       }
-               }
-       }
-
-       public static function removeFile($path, $filename){
-               if (file_exists("$path" . "$filename")) {
-                       unlink("$path" . "$filename");
-               }
-       }
-
-       /**
-        * @BeforeSuite
-        */
-       public static function addFilesToSkeleton(){
-               for ($i=0; $i<5; $i++){
-                       file_put_contents("../../core/skeleton/" . "textfile" . "$i" . ".txt", "ownCloud test text file\n");
-               }
-               if (!file_exists("../../core/skeleton/FOLDER")) {
-                       mkdir("../../core/skeleton/FOLDER", 0777, true);
-               }
-
-       }
-
-       /**
-        * @AfterSuite
-        */
-       public static function removeFilesFromSkeleton(){
-               for ($i=0; $i<5; $i++){
-                       self::removeFile("../../core/skeleton/", "textfile" . "$i" . ".txt");
-               }
-               if (is_dir("../../core/skeleton/FOLDER")) {
-                       rmdir("../../core/skeleton/FOLDER");
-               }
-       }
-
-       /**
-        * @BeforeScenario
-        * @AfterScenario
-        */
-       public function cleanupUsers()
-       {
-               foreach($this->createdUsers as $user) {
-                       $this->deleteUser($user);
-               }
-       }
-
-
-       /**
-        * @BeforeScenario
-        * @AfterScenario
-        */
-       public function cleanupGroups()
-       {
-               foreach($this->createdGroups as $group) {
-                       $this->deleteGroup($group);
-               }
-       }
+       use BasicStructure;
+       use Provisioning;
+       use Sharing;
+       use WebDav;
 }
diff --git a/build/integration/features/bootstrap/FederationContext.php b/build/integration/features/bootstrap/FederationContext.php
new file mode 100644 (file)
index 0000000..279b520
--- /dev/null
@@ -0,0 +1,27 @@
+<?php
+
+use Behat\Behat\Context\Context;
+use Behat\Behat\Context\SnippetAcceptingContext;
+use GuzzleHttp\Client;
+use GuzzleHttp\Message\ResponseInterface;
+
+require __DIR__ . '/../../vendor/autoload.php';
+
+/**
+ * Federation context.
+ */
+class FederationContext implements Context, SnippetAcceptingContext {
+
+       use BasicStructure;
+       use Provisioning;
+       use Sharing;
+
+       /**
+        * @When /^User "([^"]*)" from server "([^"]*)" shares "([^"]*)" with user "([^"]*)" from server "([^"]*)"$/
+        */
+       public function federateSharing($userLocal, $serverLocal, $pathLocal, $userRemote, $serverRemote){
+               $shareWith = "$userRemote@" . substr($this->remoteBaseUrl, 0, -4);
+               $this->createShare($userLocal, $pathLocal, 6, $shareWith, null, null, null);
+       }
+
+}
diff --git a/build/integration/features/bootstrap/Provisioning.php b/build/integration/features/bootstrap/Provisioning.php
new file mode 100644 (file)
index 0000000..05a8885
--- /dev/null
@@ -0,0 +1,548 @@
+<?php
+
+use Behat\Behat\Context\Context;
+use Behat\Behat\Context\SnippetAcceptingContext;
+use GuzzleHttp\Client;
+use GuzzleHttp\Message\ResponseInterface;
+
+require __DIR__ . '/../../vendor/autoload.php';
+
+trait Provisioning {
+
+       /** @var int */
+       private $apiVersion = 1;
+
+       /** @var array */
+       private $createdUsers = [];
+
+       /** @var array */
+       private $createdRemoteUsers = [];
+
+       /** @var array */
+       private $createdRemoteGroups = [];
+       
+       /** @var array */
+       private $createdGroups = [];
+
+       /**
+        * @Given /^using api version "([^"]*)"$/
+        */
+       public function usingApiVersion($version) {
+               $this->apiVersion = $version;
+       }
+
+       /**
+        * @Given /^user "([^"]*)" exists$/
+        */
+       public function assureUserExists($user) {
+               try {
+                       $this->userExists($user);
+               } catch (\GuzzleHttp\Exception\ClientException $ex) {
+                       $previous_user = $this->currentUser;
+                       $this->currentUser = "admin";
+                       $this->creatingTheUser($user);
+                       $this->currentUser = $previous_user;
+               }
+               $this->userExists($user);
+               PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
+
+       }
+
+       /**
+        * @Given /^user "([^"]*)" does not exist$/
+        */
+       public function userDoesNotExist($user) {
+               try {
+                       $this->userExists($user);
+               } catch (\GuzzleHttp\Exception\ClientException $ex) {
+                       $this->response = $ex->getResponse();
+                       PHPUnit_Framework_Assert::assertEquals(404, $ex->getResponse()->getStatusCode());
+                       return;
+               }
+               $previous_user = $this->currentUser;
+               $this->currentUser = "admin";
+               $this->deletingTheUser($user);
+               $this->currentUser = $previous_user;
+               try {
+                       $this->userExists($user);
+               } catch (\GuzzleHttp\Exception\ClientException $ex) {
+                       $this->response = $ex->getResponse();
+                       PHPUnit_Framework_Assert::assertEquals(404, $ex->getResponse()->getStatusCode());
+               }
+       }
+
+       public function creatingTheUser($user) {
+               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/users";
+               $client = new Client();
+               $options = [];
+               if ($this->currentUser === 'admin') {
+                       $options['auth'] = $this->adminUser;
+               }
+
+               $options['body'] = [
+                                                       'userid' => $user,
+                                                       'password' => '123456'
+                                                       ];
+
+               $this->response = $client->send($client->createRequest("POST", $fullUrl, $options));
+               if ($this->currentServer === 'LOCAL'){
+                       $this->createdUsers[$user] = $user;
+               } elseif ($this->currentServer === 'REMOTE') {
+                       $this->createdRemoteUsers[$user] = $user;
+               }
+               
+       }
+
+       public function createUser($user) {
+               $previous_user = $this->currentUser;
+               $this->currentUser = "admin";
+               $this->creatingTheUser($user);
+               $this->userExists($user);
+               $this->currentUser = $previous_user;
+       }
+
+       public function deleteUser($user) {
+               $previous_user = $this->currentUser;
+               $this->currentUser = "admin";
+               $this->deletingTheUser($user);
+               $this->userDoesNotExist($user);
+               $this->currentUser = $previous_user;
+       }
+
+       public function createGroup($group) {
+               $previous_user = $this->currentUser;
+               $this->currentUser = "admin";
+               $this->creatingTheGroup($group);
+               $this->groupExists($group);
+               $this->currentUser = $previous_user;
+       }
+
+       public function deleteGroup($group) {
+               $previous_user = $this->currentUser;
+               $this->currentUser = "admin";
+               $this->deletingTheGroup($group);
+               $this->groupDoesNotExist($group);
+               $this->currentUser = $previous_user;
+       }
+
+       public function userExists($user){
+               $fullUrl = $this->baseUrl . "v2.php/cloud/users/$user";
+               $client = new Client();
+               $options = [];
+               $options['auth'] = $this->adminUser;
+
+               $this->response = $client->get($fullUrl, $options);
+       }
+
+       /**
+        * @Then /^check that user "([^"]*)" belongs to group "([^"]*)"$/
+        */
+       public function checkThatUserBelongsToGroup($user, $group) {
+               $fullUrl = $this->baseUrl . "v2.php/cloud/users/$user/groups";
+               $client = new Client();
+               $options = [];
+               if ($this->currentUser === 'admin') {
+                       $options['auth'] = $this->adminUser;
+               }
+
+               $this->response = $client->get($fullUrl, $options);
+               $respondedArray = $this->getArrayOfGroupsResponded($this->response);
+               sort($respondedArray);
+               PHPUnit_Framework_Assert::assertContains($group, $respondedArray);
+               PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
+       }
+
+       public function userBelongsToGroup($user, $group) {
+               $fullUrl = $this->baseUrl . "v2.php/cloud/users/$user/groups";
+               $client = new Client();
+               $options = [];
+               if ($this->currentUser === 'admin') {
+                       $options['auth'] = $this->adminUser;
+               }
+
+               $this->response = $client->get($fullUrl, $options);
+               $groups = array($group);
+               $respondedArray = $this->getArrayOfGroupsResponded($this->response);
+
+               if (array_key_exists($group, $respondedArray)) {
+                       return True;
+               } else{
+                       return False;
+               }
+       }
+
+       /**
+        * @Given /^user "([^"]*)" belongs to group "([^"]*)"$/
+        */
+       public function assureUserBelongsToGroup($user, $group){
+               if (!$this->userBelongsToGroup($user, $group)){                 
+                       $previous_user = $this->currentUser;
+                       $this->currentUser = "admin";
+                       $this->addingUserToGroup($user, $group);
+                       $this->currentUser = $previous_user;
+               }
+               $this->checkThatUserBelongsToGroup($user, $group);
+
+       }
+
+       /**
+        * @Given /^user "([^"]*)" does not belong to group "([^"]*)"$/
+        */
+       public function userDoesNotBelongToGroup($user, $group) {
+               $fullUrl = $this->baseUrl . "v2.php/cloud/users/$user/groups";
+               $client = new Client();
+               $options = [];
+               if ($this->currentUser === 'admin') {
+                       $options['auth'] = $this->adminUser;
+               }
+
+               $this->response = $client->get($fullUrl, $options);
+               $groups = array($group);
+               $respondedArray = $this->getArrayOfGroupsResponded($this->response);
+               PHPUnit_Framework_Assert::assertNotEquals($groups, $respondedArray, "", 0.0, 10, true);
+               PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
+       }
+
+               /**
+        * @When /^creating the group "([^"]*)"$/
+        */
+       public function creatingTheGroup($group) {
+               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/groups";
+               $client = new Client();
+               $options = [];
+               if ($this->currentUser === 'admin') {
+                       $options['auth'] = $this->adminUser;
+               }
+
+               $options['body'] = [
+                                                       'groupid' => $group,
+                                                       ];
+
+               $this->response = $client->send($client->createRequest("POST", $fullUrl, $options));
+               if ($this->currentServer === 'LOCAL'){
+                       $this->createdGroups[$group] = $group;
+               } elseif ($this->currentServer === 'REMOTE') {
+                       $this->createdRemoteGroups[$group] = $group;
+               }
+       }
+
+       /**
+        * @When /^Deleting the user "([^"]*)"$/
+        */
+       public function deletingTheUser($user) {
+               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/users/$user";
+               $client = new Client();
+               $options = [];
+               if ($this->currentUser === 'admin') {
+                       $options['auth'] = $this->adminUser;
+               }
+
+               $this->response = $client->send($client->createRequest("DELETE", $fullUrl, $options));
+       }
+
+       /**
+        * @When /^Deleting the group "([^"]*)"$/
+        */
+       public function deletingTheGroup($group) {
+               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/groups/$group";
+               $client = new Client();
+               $options = [];
+               if ($this->currentUser === 'admin') {
+                       $options['auth'] = $this->adminUser;
+               }
+
+               $this->response = $client->send($client->createRequest("DELETE", $fullUrl, $options));
+       }
+
+       /**
+        * @Given /^Add user "([^"]*)" to the group "([^"]*)"$/
+        */
+       public function addUserToGroup($user, $group) {
+               $this->userExists($user);
+               $this->groupExists($group);
+               $this->addingUserToGroup($user, $group);
+
+       }
+
+       /**
+        * @When /^User "([^"]*)" is added to the group "([^"]*)"$/
+        */
+       public function addingUserToGroup($user, $group) {
+               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/users/$user/groups";
+               $client = new Client();
+               $options = [];
+               if ($this->currentUser === 'admin') {
+                       $options['auth'] = $this->adminUser;
+               }
+
+               $options['body'] = [
+                                                       'groupid' => $group,
+                                                       ];
+
+               $this->response = $client->send($client->createRequest("POST", $fullUrl, $options));
+       }
+
+
+       public function groupExists($group) {
+               $fullUrl = $this->baseUrl . "v2.php/cloud/groups/$group";
+               $client = new Client();
+               $options = [];
+               $options['auth'] = $this->adminUser;
+
+               $this->response = $client->get($fullUrl, $options);
+       }
+
+       /**
+        * @Given /^group "([^"]*)" exists$/
+        */
+       public function assureGroupExists($group) {
+               try {
+                       $this->groupExists($group);
+               } catch (\GuzzleHttp\Exception\ClientException $ex) {
+                       $previous_user = $this->currentUser;
+                       $this->currentUser = "admin";
+                       $this->creatingTheGroup($group);
+                       $this->currentUser = $previous_user;
+               }
+               $this->groupExists($group);
+               PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
+       }
+
+       /**
+        * @Given /^group "([^"]*)" does not exist$/
+        */
+       public function groupDoesNotExist($group) {
+               try {
+                       $this->groupExists($group);
+               } catch (\GuzzleHttp\Exception\ClientException $ex) {
+                       $this->response = $ex->getResponse();
+                       PHPUnit_Framework_Assert::assertEquals(404, $ex->getResponse()->getStatusCode());
+                       return;
+               }
+               $previous_user = $this->currentUser;
+               $this->currentUser = "admin";
+               $this->deletingTheGroup($group);
+               $this->currentUser = $previous_user;
+               try {
+                       $this->groupExists($group);
+               } catch (\GuzzleHttp\Exception\ClientException $ex) {
+                       $this->response = $ex->getResponse();
+                       PHPUnit_Framework_Assert::assertEquals(404, $ex->getResponse()->getStatusCode());
+               }
+       }
+
+       /**
+        * @Given /^user "([^"]*)" is subadmin of group "([^"]*)"$/
+        */
+       public function userIsSubadminOfGroup($user, $group) {
+               $fullUrl = $this->baseUrl . "v2.php/cloud/groups/$group/subadmins";
+               $client = new Client();
+               $options = [];
+               if ($this->currentUser === 'admin') {
+                       $options['auth'] = $this->adminUser;
+               }
+
+               $this->response = $client->get($fullUrl, $options);
+               $respondedArray = $this->getArrayOfSubadminsResponded($this->response);
+               sort($respondedArray);
+               PHPUnit_Framework_Assert::assertContains($user, $respondedArray);
+               PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
+       }
+
+       /**
+        * @Given /^user "([^"]*)" is not a subadmin of group "([^"]*)"$/
+        */
+       public function userIsNotSubadminOfGroup($user, $group) {
+               $fullUrl = $this->baseUrl . "v2.php/cloud/groups/$group/subadmins";
+               $client = new Client();
+               $options = [];
+               if ($this->currentUser === 'admin') {
+                       $options['auth'] = $this->adminUser;
+               }
+
+               $this->response = $client->get($fullUrl, $options);
+               $respondedArray = $this->getArrayOfSubadminsResponded($this->response);
+               sort($respondedArray);
+               PHPUnit_Framework_Assert::assertNotContains($user, $respondedArray);
+               PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
+       }
+
+       /**
+        * @Then /^users returned are$/
+        * @param \Behat\Gherkin\Node\TableNode|null $usersList
+        */
+       public function theUsersShouldBe($usersList) {
+               if ($usersList instanceof \Behat\Gherkin\Node\TableNode) {
+                       $users = $usersList->getRows();
+                       $usersSimplified = $this->simplifyArray($users);
+                       $respondedArray = $this->getArrayOfUsersResponded($this->response);
+                       PHPUnit_Framework_Assert::assertEquals($usersSimplified, $respondedArray, "", 0.0, 10, true);
+               }
+
+       }
+
+       /**
+        * @Then /^groups returned are$/
+        * @param \Behat\Gherkin\Node\TableNode|null $groupsList
+        */
+       public function theGroupsShouldBe($groupsList) {
+               if ($groupsList instanceof \Behat\Gherkin\Node\TableNode) {
+                       $groups = $groupsList->getRows();
+                       $groupsSimplified = $this->simplifyArray($groups);
+                       $respondedArray = $this->getArrayOfGroupsResponded($this->response);
+                       PHPUnit_Framework_Assert::assertEquals($groupsSimplified, $respondedArray, "", 0.0, 10, true);
+               }
+
+       }
+
+       /**
+        * @Then /^subadmin groups returned are$/
+        * @param \Behat\Gherkin\Node\TableNode|null $groupsList
+        */
+       public function theSubadminGroupsShouldBe($groupsList) {
+               if ($groupsList instanceof \Behat\Gherkin\Node\TableNode) {
+                       $groups = $groupsList->getRows();
+                       $groupsSimplified = $this->simplifyArray($groups);
+                       $respondedArray = $this->getArrayOfSubadminsResponded($this->response);
+                       PHPUnit_Framework_Assert::assertEquals($groupsSimplified, $respondedArray, "", 0.0, 10, true);
+               }
+
+       }
+
+       /**
+        * @Then /^apps returned are$/
+        * @param \Behat\Gherkin\Node\TableNode|null $appList
+        */
+       public function theAppsShouldBe($appList) {
+               if ($appList instanceof \Behat\Gherkin\Node\TableNode) {
+                       $apps = $appList->getRows();
+                       $appsSimplified = $this->simplifyArray($apps);
+                       $respondedArray = $this->getArrayOfAppsResponded($this->response);
+                       PHPUnit_Framework_Assert::assertEquals($appsSimplified, $respondedArray, "", 0.0, 10, true);
+               }
+
+       }
+
+       /**
+        * @Then /^subadmin users returned are$/
+        * @param \Behat\Gherkin\Node\TableNode|null $groupsList
+        */
+       public function theSubadminUsersShouldBe($groupsList) {
+               $this->theSubadminGroupsShouldBe($groupsList);
+       }
+
+               /**
+        * Parses the xml answer to get the array of users returned.
+        * @param ResponseInterface $resp
+        * @return array
+        */
+       public function getArrayOfUsersResponded($resp) {
+               $listCheckedElements = $resp->xml()->data[0]->users[0]->element;
+               $extractedElementsArray = json_decode(json_encode($listCheckedElements), 1);
+               return $extractedElementsArray;
+       }
+
+       /**
+        * Parses the xml answer to get the array of groups returned.
+        * @param ResponseInterface $resp
+        * @return array
+        */
+       public function getArrayOfGroupsResponded($resp) {
+               $listCheckedElements = $resp->xml()->data[0]->groups[0]->element;
+               $extractedElementsArray = json_decode(json_encode($listCheckedElements), 1);
+               return $extractedElementsArray;
+       }
+
+       /**
+        * Parses the xml answer to get the array of apps returned.
+        * @param ResponseInterface $resp
+        * @return array
+        */
+       public function getArrayOfAppsResponded($resp) {
+               $listCheckedElements = $resp->xml()->data[0]->apps[0]->element;
+               $extractedElementsArray = json_decode(json_encode($listCheckedElements), 1);
+               return $extractedElementsArray;
+       }
+
+       /**
+        * Parses the xml answer to get the array of subadmins returned.
+        * @param ResponseInterface $resp
+        * @return array
+        */
+       public function getArrayOfSubadminsResponded($resp) {
+               $listCheckedElements = $resp->xml()->data[0]->element;
+               $extractedElementsArray = json_decode(json_encode($listCheckedElements), 1);
+               return $extractedElementsArray;
+       }
+
+
+       /**
+        * @Given /^app "([^"]*)" is disabled$/
+        */
+       public function appIsDisabled($app) {
+               $fullUrl = $this->baseUrl . "v2.php/cloud/apps?filter=disabled";
+               $client = new Client();
+               $options = [];
+               if ($this->currentUser === 'admin') {
+                       $options['auth'] = $this->adminUser;
+               }
+
+               $this->response = $client->get($fullUrl, $options);
+               $respondedArray = $this->getArrayOfAppsResponded($this->response);
+               PHPUnit_Framework_Assert::assertContains($app, $respondedArray);
+               PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
+       }
+
+       /**
+        * @Given /^app "([^"]*)" is enabled$/
+        */
+       public function appIsEnabled($app) {
+               $fullUrl = $this->baseUrl . "v2.php/cloud/apps?filter=enabled";
+               $client = new Client();
+               $options = [];
+               if ($this->currentUser === 'admin') {
+                       $options['auth'] = $this->adminUser;
+               }
+
+               $this->response = $client->get($fullUrl, $options);
+               $respondedArray = $this->getArrayOfAppsResponded($this->response);
+               PHPUnit_Framework_Assert::assertContains($app, $respondedArray);
+               PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
+       }
+
+       /**
+        * @BeforeScenario
+        * @AfterScenario
+        */
+       public function cleanupUsers()
+       {
+               $previousServer = $this->currentServer;
+               $this->usingServer('LOCAL');
+               foreach($this->createdUsers as $user) { 
+                       $this->deleteUser($user);
+               }
+               $this->usingServer('REMOTE');
+               foreach($this->createdRemoteUsers as $remoteUser) {
+                       $this->deleteUser($remoteUser);
+               }
+               $this->usingServer($previousServer);
+       }
+
+       /**
+        * @BeforeScenario
+        * @AfterScenario
+        */
+       public function cleanupGroups()
+       {
+               $previousServer = $this->currentServer;
+               $this->usingServer('LOCAL');
+               foreach($this->createdGroups as $group) {
+                       $this->deleteGroup($group);
+               }
+               $this->usingServer('REMOTE');
+               foreach($this->createdRemoteGroups as $remoteGroup) {
+                       $this->deleteUser($remoteGroup);
+               }
+               $this->usingServer($previousServer);
+       }
+}
diff --git a/build/integration/features/bootstrap/Sharing.php b/build/integration/features/bootstrap/Sharing.php
new file mode 100644 (file)
index 0000000..9c5dc9f
--- /dev/null
@@ -0,0 +1,374 @@
+<?php
+
+use Behat\Behat\Context\Context;
+use Behat\Behat\Context\SnippetAcceptingContext;
+use GuzzleHttp\Client;
+use GuzzleHttp\Message\ResponseInterface;
+
+require __DIR__ . '/../../vendor/autoload.php';
+
+
+
+trait Sharing{
+
+       /** @var int */
+       private $sharingApiVersion = 1;
+
+       /** @var SimpleXMLElement */
+       private $lastShareData = null;
+
+       /**
+        * @When /^creating a share with$/
+        * @param \Behat\Gherkin\Node\TableNode|null $formData
+        */
+       public function creatingShare($body) {
+               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/apps/files_sharing/api/v1/shares";
+               $client = new Client();
+               $options = [];
+               if ($this->currentUser === 'admin') {
+                       $options['auth'] = $this->adminUser;
+               } else {
+                       $options['auth'] = [$this->currentUser, $this->regularUser];
+               }
+
+               if ($body instanceof \Behat\Gherkin\Node\TableNode) {
+                       $fd = $body->getRowsHash();
+                       if (array_key_exists('expireDate', $fd)){
+                               $dateModification = $fd['expireDate'];
+                               $fd['expireDate'] = date('Y-m-d', strtotime($dateModification));
+                       }
+                       $options['body'] = $fd;
+               }
+
+               try {
+                       $this->response = $client->send($client->createRequest("POST", $fullUrl, $options));
+               } catch (\GuzzleHttp\Exception\ClientException $ex) {
+                       $this->response = $ex->getResponse();
+               }
+
+               $this->lastShareData = $this->response->xml();
+       }
+
+       /**
+        * @Then /^Public shared file "([^"]*)" can be downloaded$/
+        */
+       public function checkPublicSharedFile($filename) {
+               $client = new Client();
+               $options = [];
+               if (count($this->lastShareData->data->element) > 0){
+                       $url = $this->lastShareData->data[0]->url;
+               }
+               else{
+                       $url = $this->lastShareData->data->url;
+               }
+               $fullUrl = $url . "/download";
+               $options['save_to'] = "./$filename";
+               $this->response = $client->get($fullUrl, $options);
+               $finfo = new finfo;
+               $fileinfo = $finfo->file("./$filename", FILEINFO_MIME_TYPE);
+               PHPUnit_Framework_Assert::assertEquals($fileinfo, "text/plain");
+               if (file_exists("./$filename")) {
+                       unlink("./$filename");
+               }
+       }
+
+       /**
+        * @Then /^Public shared file "([^"]*)" with password "([^"]*)" can be downloaded$/
+        */
+       public function checkPublicSharedFileWithPassword($filename, $password) {
+               $client = new Client();
+               $options = [];
+               if (count($this->lastShareData->data->element) > 0){
+                       $token = $this->lastShareData->data[0]->token;
+               }
+               else{
+                       $token = $this->lastShareData->data->token;
+               }
+
+               $fullUrl = substr($this->baseUrl, 0, -4) . "public.php/webdav";
+               $options['auth'] = [$token, $password];
+               $options['save_to'] = "./$filename";
+               $this->response = $client->get($fullUrl, $options);
+               $finfo = new finfo;
+               $fileinfo = $finfo->file("./$filename", FILEINFO_MIME_TYPE);
+               PHPUnit_Framework_Assert::assertEquals($fileinfo, "text/plain");
+               if (file_exists("./$filename")) {
+                       unlink("./$filename");
+               }
+       }
+
+       /**
+        * @When /^Adding expiration date to last share$/
+        */
+       public function addingExpirationDate() {
+               $share_id = $this->lastShareData->data[0]->id;
+               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/apps/files_sharing/api/v{$this->sharingApiVersion}/shares/$share_id";
+               $client = new Client();
+               $options = [];
+               if ($this->currentUser === 'admin') {
+                       $options['auth'] = $this->adminUser;
+               } else {
+                       $options['auth'] = [$this->currentUser, $this->regularUser];
+               }
+               $date = date('Y-m-d', strtotime("+3 days"));
+               $options['body'] = ['expireDate' => $date];
+               $this->response = $client->send($client->createRequest("PUT", $fullUrl, $options));
+               PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
+       }
+
+       /**
+        * @When /^Updating last share with$/
+        * @param \Behat\Gherkin\Node\TableNode|null $body
+        */
+       public function updatingLastShare($body) {
+               $share_id = $this->lastShareData->data[0]->id;
+               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/apps/files_sharing/api/v{$this->sharingApiVersion}/shares/$share_id";
+               $client = new Client();
+               $options = [];
+               if ($this->currentUser === 'admin') {
+                       $options['auth'] = $this->adminUser;
+               } else {
+                       $options['auth'] = [$this->currentUser, $this->regularUser];
+               }
+
+               if ($body instanceof \Behat\Gherkin\Node\TableNode) {
+                       $fd = $body->getRowsHash();
+                       if (array_key_exists('expireDate', $fd)){
+                               $dateModification = $fd['expireDate'];
+                               $fd['expireDate'] = date('Y-m-d', strtotime($dateModification));
+                       }
+                       $options['body'] = $fd;
+               }
+
+               try {
+                       $this->response = $client->send($client->createRequest("PUT", $fullUrl, $options));
+               } catch (\GuzzleHttp\Exception\ClientException $ex) {
+                       $this->response = $ex->getResponse();
+               }
+
+               PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
+       }
+
+       public function createShare($user,
+                                                               $path = null,
+                                                               $shareType = null,
+                                                               $shareWith = null,
+                                                               $publicUpload = null,
+                                                               $password = null,
+                                                               $permissions = null){
+               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/apps/files_sharing/api/v{$this->sharingApiVersion}/shares";
+               $client = new Client();
+               $options = [];
+
+               if ($user === 'admin') {
+                       $options['auth'] = $this->adminUser;
+               } else {
+                       $options['auth'] = [$user, $this->regularUser];
+               }
+               $fd = [];
+               if (!is_null($path)){
+                       $fd['path'] = $path;
+               }
+               if (!is_null($shareType)){
+                       $fd['shareType'] = $shareType;
+               }
+               if (!is_null($shareWith)){
+                       $fd['shareWith'] = $shareWith;
+               }
+               if (!is_null($publicUpload)){
+                       $fd['publicUpload'] = $publicUpload;
+               }
+               if (!is_null($password)){
+                       $fd['password'] = $password;
+               }
+               if (!is_null($permissions)){
+                       $fd['permissions'] = $permissions;
+               }
+
+               $options['body'] = $fd;
+
+               try {
+                       $this->response = $client->send($client->createRequest("POST", $fullUrl, $options));
+                       $this->lastShareData = $this->response->xml();
+               } catch (\GuzzleHttp\Exception\ClientException $ex) {
+                       $this->response = $ex->getResponse();
+               }
+       }
+
+       public function isFieldInResponse($field, $contentExpected){
+               $data = $this->response->xml()->data[0];
+               if ((string)$field == 'expiration'){
+                       $contentExpected = date('Y-m-d', strtotime($contentExpected)) . " 00:00:00";
+               }
+               if (count($data->element) > 0){
+                       foreach($data as $element) {
+                               if ($contentExpected == "A_TOKEN"){
+                                       return (strlen((string)$element->$field) == 15);
+                               }
+                               elseif ($contentExpected == "A_NUMBER"){
+                                       return is_numeric((string)$element->$field);
+                               }
+                               elseif($contentExpected == "AN_URL"){
+                                       return $this->isExpectedUrl((string)$element->$field, "index.php/s/");
+                               }
+                               elseif ((string)$element->$field == $contentExpected){
+                                       return True;
+                               }
+                       }
+
+                       return False;
+               } else {
+                       if ($contentExpected == "A_TOKEN"){
+                                       return (strlen((string)$data->$field) == 15);
+                       }
+                       elseif ($contentExpected == "A_NUMBER"){
+                                       return is_numeric((string)$data->$field);
+                       }
+                       elseif($contentExpected == "AN_URL"){
+                                       return $this->isExpectedUrl((string)$data->$field, "index.php/s/");
+                       }
+                       elseif ($data->$field == $contentExpected){
+                                       return True;
+                       }
+                       return False;
+               }
+       }
+
+       /**
+        * @Then /^File "([^"]*)" should be included in the response$/
+        */
+       public function checkSharedFileInResponse($filename){
+               PHPUnit_Framework_Assert::assertEquals(True, $this->isFieldInResponse('file_target', "/$filename"));
+       }
+
+       /**
+        * @Then /^File "([^"]*)" should not be included in the response$/
+        */
+       public function checkSharedFileNotInResponse($filename){
+               PHPUnit_Framework_Assert::assertEquals(False, $this->isFieldInResponse('file_target', "/$filename"));
+       }
+
+       /**
+        * @Then /^User "([^"]*)" should be included in the response$/
+        */
+       public function checkSharedUserInResponse($user){
+               PHPUnit_Framework_Assert::assertEquals(True, $this->isFieldInResponse('share_with', "$user"));
+       }
+
+       /**
+        * @Then /^User "([^"]*)" should not be included in the response$/
+        */
+       public function checkSharedUserNotInResponse($user){
+               PHPUnit_Framework_Assert::assertEquals(False, $this->isFieldInResponse('share_with', "$user"));
+       }
+
+       public function isUserOrGroupInSharedData($userOrGroup){
+               $data = $this->response->xml()->data[0];
+               foreach($data as $element) {
+                       if ($element->share_with == $userOrGroup){
+                               return True;
+                       }
+               }
+               return False;
+       }
+
+       /**
+        * @Given /^file "([^"]*)" from user "([^"]*)" is shared with user "([^"]*)"$/
+        */
+       public function assureFileIsShared($filepath, $user1, $user2){
+               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/apps/files_sharing/api/v{$this->sharingApiVersion}/shares" . "?path=$filepath";
+               $client = new Client();
+               $options = [];
+               if ($user1 === 'admin') {
+                       $options['auth'] = $this->adminUser;
+               } else {
+                       $options['auth'] = [$user1, $this->regularUser];
+               }
+               $this->response = $client->get($fullUrl, $options);
+               if ($this->isUserOrGroupInSharedData($user2)){
+                       return;
+               } else {
+                       $this->createShare($user1, $filepath, 0, $user2, null, null, null);
+               }
+               $this->response = $client->get($fullUrl, $options);
+               PHPUnit_Framework_Assert::assertEquals(True, $this->isUserOrGroupInSharedData($user2));
+       }
+
+       /**
+        * @Given /^file "([^"]*)" from user "([^"]*)" is shared with group "([^"]*)"$/
+        */
+       public function assureFileIsSharedWithGroup($filepath, $user, $group){
+               $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/apps/files_sharing/api/v{$this->sharingApiVersion}/shares" . "?path=$filepath";
+               $client = new Client();
+               $options = [];
+               if ($user === 'admin') {
+                       $options['auth'] = $this->adminUser;
+               } else {
+                       $options['auth'] = [$user, $this->regularUser];
+               }
+               $this->response = $client->get($fullUrl, $options);
+               if ($this->isUserOrGroupInSharedData($group)){
+                       return;
+               } else {
+                       $this->createShare($user, $filepath, 1, $group, null, null, null);
+               }
+               $this->response = $client->get($fullUrl, $options);
+               PHPUnit_Framework_Assert::assertEquals(True, $this->isUserOrGroupInSharedData($group));
+       }
+
+       /**
+        * @When /^Deleting last share$/
+        */
+       public function deletingLastShare(){
+               $share_id = $this->lastShareData->data[0]->id;
+               $url = "/apps/files_sharing/api/v{$this->sharingApiVersion}/shares/$share_id";
+               $this->sendingToWith("DELETE", $url, null);
+       }
+
+       /**
+        * @When /^Getting info of last share$/
+        */
+       public function gettingInfoOfLastShare(){
+               $share_id = $this->lastShareData->data[0]->id;
+               $url = "/apps/files_sharing/api/v{$this->sharingApiVersion}/shares/$share_id";
+               $this->sendingToWith("GET", $url, null);
+       }
+
+       /**
+        * @Then /^last share_id is included in the answer$/
+        */
+       public function checkingLastShareIDIsIncluded(){
+               $share_id = $this->lastShareData->data[0]->id;
+               if (!$this->isFieldInResponse('id', $share_id)){
+                       PHPUnit_Framework_Assert::fail("Share id $share_id not found in response");
+               }
+       }
+
+       /**
+        * @Then /^last share_id is not included in the answer$/
+        */
+       public function checkingLastShareIDIsNotIncluded(){
+               $share_id = $this->lastShareData->data[0]->id;
+               if ($this->isFieldInResponse('id', $share_id)){
+                       PHPUnit_Framework_Assert::fail("Share id $share_id has been found in response");
+               }
+       }
+
+       /**
+        * @Then /^Share fields of last share match with$/
+        * @param \Behat\Gherkin\Node\TableNode|null $formData
+        */
+       public function checkShareFields($body){
+               if ($body instanceof \Behat\Gherkin\Node\TableNode) {
+                       $fd = $body->getRowsHash();
+
+                       foreach($fd as $field => $value) {
+                               if (!$this->isFieldInResponse($field, $value)){
+                                       PHPUnit_Framework_Assert::fail("$field" . " doesn't have value " . "$value");
+                               }
+                       }
+               }
+       }
+
+}
+
diff --git a/build/integration/features/bootstrap/WebDav.php b/build/integration/features/bootstrap/WebDav.php
new file mode 100644 (file)
index 0000000..1bda817
--- /dev/null
@@ -0,0 +1,60 @@
+<?php
+
+use Behat\Behat\Context\Context;
+use Behat\Behat\Context\SnippetAcceptingContext;
+use GuzzleHttp\Client;
+use GuzzleHttp\Message\ResponseInterface;
+
+require __DIR__ . '/../../vendor/autoload.php';
+
+
+trait WebDav{
+
+       /** @var string*/
+       private $davPath = "remote.php/webdav";
+
+       /**
+        * @Given /^using dav path "([^"]*)"$/
+        */
+       public function usingDavPath($davPath) {
+               $this->davPath = $davPath;
+       }       
+
+       public function makeDavRequest($user, $method, $path, $headers){
+               $fullUrl = substr($this->baseUrl, 0, -4) . $this->davPath . "$path";
+               $client = new Client();
+               $options = [];
+               if ($user === 'admin') {
+                       $options['auth'] = $this->adminUser;
+               } else {
+                       $options['auth'] = [$user, $this->regularUser];
+               }
+               $request = $client->createRequest($method, $fullUrl, $options);
+               foreach ($headers as $key => $value) {
+                       $request->addHeader($key, $value);      
+               }
+               //$this->response = $client->send($request);
+               return $client->send($request);
+       }
+
+       /**
+        * @Given /^User "([^"]*)" moved file "([^"]*)" to "([^"]*)"$/
+        */
+       public function userMovedFile($user, $fileSource, $fileDestination){
+               $fullUrl = substr($this->baseUrl, 0, -4) . $this->davPath;
+               $headers['Destination'] = $fullUrl . $fileDestination;
+               $this->response = $this->makeDavRequest($user, "MOVE", $fileSource, $headers);
+               PHPUnit_Framework_Assert::assertEquals(201, $this->response->getStatusCode());
+       }
+
+       /**
+        * @When /^User "([^"]*)" moves file "([^"]*)" to "([^"]*)"$/
+        */
+       public function userMovesFile($user, $fileSource, $fileDestination){
+               $fullUrl = substr($this->baseUrl, 0, -4) . $this->davPath;
+               $headers['Destination'] = $fullUrl . $fileDestination;
+               $this->response = $this->makeDavRequest($user, "MOVE", $fileSource, $headers);
+       }
+
+}
+
diff --git a/build/integration/federation/federated.feature b/build/integration/federation/federated.feature
new file mode 100644 (file)
index 0000000..5437d01
--- /dev/null
@@ -0,0 +1,26 @@
+Feature: federated
+       Background:
+               Given using api version "1"
+
+       Scenario: Federate share a file with another server
+               Given Using server "REMOTE"
+               And user "user1" exists
+               And Using server "LOCAL"
+               And user "user0" exists
+               When User "user0" from server "LOCAL" shares "/textfile0.txt" with user "user1" from server "REMOTE"
+               Then the OCS status code should be "100"
+               And the HTTP status code should be "200"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
index 5456a784404406d2fc13a4722e324dce7e40a719..bd2c2856ac74abb35403c5eb370d515fecaec7ea 100755 (executable)
@@ -13,7 +13,16 @@ php -S localhost:$PORT -t ../.. &
 PHPPID=$!
 echo $PHPPID
 
+PORT_FED=$((8180 + $EXECUTOR_NUMBER))
+echo $PORT_FED
+php -S localhost:$PORT_FED -t ../.. &
+PHPPID_FED=$!
+echo $PHPPID_FED
+
 export TEST_SERVER_URL="http://localhost:$PORT/ocs/"
+export TEST_SERVER_FED_URL="http://localhost:$PORT_FED/ocs/"
+
 vendor/bin/behat -f junit -f pretty
 
 kill $PHPPID
+kill $PHPPID_FED