diff options
Diffstat (limited to 'build')
-rw-r--r-- | build/integration/composer.json | 3 | ||||
-rw-r--r-- | build/integration/data/textfile.txt | 3 | ||||
-rw-r--r-- | build/integration/features/bootstrap/BasicStructure.php | 18 | ||||
-rw-r--r-- | build/integration/features/bootstrap/Provisioning.php | 18 | ||||
-rw-r--r-- | build/integration/features/bootstrap/Sharing.php | 4 | ||||
-rw-r--r-- | build/integration/features/bootstrap/WebDav.php | 109 | ||||
-rw-r--r-- | build/integration/features/sharing-v1.feature | 40 | ||||
-rw-r--r-- | build/integration/features/webdav-related.feature | 22 | ||||
-rwxr-xr-x | build/integration/run.sh | 11 |
9 files changed, 202 insertions, 26 deletions
diff --git a/build/integration/composer.json b/build/integration/composer.json index 2f0f8a815ce..a9516391a41 100644 --- a/build/integration/composer.json +++ b/build/integration/composer.json @@ -3,6 +3,7 @@ "phpunit/phpunit": "~4.6", "behat/behat": "^3.0", "guzzlehttp/guzzle": "~5.0", - "jarnaiz/behat-junit-formatter": "^1.3" + "jarnaiz/behat-junit-formatter": "^1.3", + "sabre/dav": "3.0.x-dev" } } diff --git a/build/integration/data/textfile.txt b/build/integration/data/textfile.txt new file mode 100644 index 00000000000..efffdeff159 --- /dev/null +++ b/build/integration/data/textfile.txt @@ -0,0 +1,3 @@ +This is a testfile. + +Cheers.
\ No newline at end of file diff --git a/build/integration/features/bootstrap/BasicStructure.php b/build/integration/features/bootstrap/BasicStructure.php index 01a288a6c6a..bf3b1d50814 100644 --- a/build/integration/features/bootstrap/BasicStructure.php +++ b/build/integration/features/bootstrap/BasicStructure.php @@ -152,6 +152,14 @@ trait BasicStructure{ if (!file_exists("../../core/skeleton/FOLDER")) { mkdir("../../core/skeleton/FOLDER", 0777, true); } + if (!file_exists("../../core/skeleton/PARENT")) { + mkdir("../../core/skeleton/PARENT", 0777, true); + } + file_put_contents("../../core/skeleton/PARENT/" . "parent.txt", "ownCloud test text file\n"); + if (!file_exists("../../core/skeleton/PARENT/CHILD")) { + mkdir("../../core/skeleton/PARENT/CHILD", 0777, true); + } + file_put_contents("../../core/skeleton/PARENT/CHILD/" . "child.txt", "ownCloud test text file\n"); } @@ -165,6 +173,16 @@ trait BasicStructure{ if (is_dir("../../core/skeleton/FOLDER")) { rmdir("../../core/skeleton/FOLDER"); } + self::removeFile("../../core/skeleton/PARENT/CHILD/", "child.txt"); + if (is_dir("../../core/skeleton/PARENT/CHILD")) { + rmdir("../../core/skeleton/PARENT/CHILD"); + } + self::removeFile("../../core/skeleton/PARENT/", "parent.txt"); + if (is_dir("../../core/skeleton/PARENT")) { + rmdir("../../core/skeleton/PARENT"); + } + + } } diff --git a/build/integration/features/bootstrap/Provisioning.php b/build/integration/features/bootstrap/Provisioning.php index 05a8885d96d..9a21c0bb1d4 100644 --- a/build/integration/features/bootstrap/Provisioning.php +++ b/build/integration/features/bootstrap/Provisioning.php @@ -175,7 +175,7 @@ trait Provisioning { * @Given /^user "([^"]*)" belongs to group "([^"]*)"$/ */ public function assureUserBelongsToGroup($user, $group){ - if (!$this->userBelongsToGroup($user, $group)){ + if (!$this->userBelongsToGroup($user, $group)){ $previous_user = $this->currentUser; $this->currentUser = "admin"; $this->addingUserToGroup($user, $group); @@ -431,7 +431,7 @@ trait Provisioning { $this->theSubadminGroupsShouldBe($groupsList); } - /** + /** * Parses the xml answer to get the array of users returned. * @param ResponseInterface $resp * @return array @@ -511,6 +511,20 @@ trait Provisioning { } /** + * @Given user :user has a quota of :quota + */ + public function userHasAQuotaOf($user, $quota) + { + $body = new \Behat\Gherkin\Node\TableNode([ + 0 => ['key', 'quota'], + 1 => ['value', $quota], + ]); + + // method used from BasicStructure trait + $this->sendingToWith("PUT", "/cloud/users/" . $user, $body); + } + + /** * @BeforeScenario * @AfterScenario */ diff --git a/build/integration/features/bootstrap/Sharing.php b/build/integration/features/bootstrap/Sharing.php index 9c5dc9f374b..5103b4af508 100644 --- a/build/integration/features/bootstrap/Sharing.php +++ b/build/integration/features/bootstrap/Sharing.php @@ -273,7 +273,7 @@ trait Sharing{ } /** - * @Given /^file "([^"]*)" from user "([^"]*)" is shared with user "([^"]*)"$/ + * @Given /^file "([^"]*)" of 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"; @@ -295,7 +295,7 @@ trait Sharing{ } /** - * @Given /^file "([^"]*)" from user "([^"]*)" is shared with group "([^"]*)"$/ + * @Given /^file "([^"]*)" of 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"; diff --git a/build/integration/features/bootstrap/WebDav.php b/build/integration/features/bootstrap/WebDav.php index 1bda8175eeb..a682467f52d 100644 --- a/build/integration/features/bootstrap/WebDav.php +++ b/build/integration/features/bootstrap/WebDav.php @@ -2,8 +2,9 @@ use Behat\Behat\Context\Context; use Behat\Behat\Context\SnippetAcceptingContext; -use GuzzleHttp\Client; +use GuzzleHttp\Client as GClient; use GuzzleHttp\Message\ResponseInterface; +use Sabre\DAV\Client as SClient; require __DIR__ . '/../../vendor/autoload.php'; @@ -20,9 +21,9 @@ trait WebDav{ $this->davPath = $davPath; } - public function makeDavRequest($user, $method, $path, $headers){ + public function makeDavRequest($user, $method, $path, $headers, $body = null){ $fullUrl = substr($this->baseUrl, 0, -4) . $this->davPath . "$path"; - $client = new Client(); + $client = new GClient(); $options = []; if ($user === 'admin') { $options['auth'] = $this->adminUser; @@ -30,10 +31,16 @@ trait WebDav{ $options['auth'] = [$user, $this->regularUser]; } $request = $client->createRequest($method, $fullUrl, $options); - foreach ($headers as $key => $value) { - $request->addHeader($key, $value); + if (!is_null($headers)){ + foreach ($headers as $key => $value) { + $request->addHeader($key, $value); + } } - //$this->response = $client->send($request); + + if (!is_null($body)) { + $request->setBody($body); + } + return $client->send($request); } @@ -56,5 +63,95 @@ trait WebDav{ $this->response = $this->makeDavRequest($user, "MOVE", $fileSource, $headers); } + /** + * @When /^Downloading file "([^"]*)" with range "([^"]*)"$/ + */ + public function downloadFileWithRange($fileSource, $range){ + $fullUrl = substr($this->baseUrl, 0, -4) . $this->davPath; + $headers['Range'] = $range; + $this->response = $this->makeDavRequest($this->currentUser, "GET", $fileSource, $headers); + } + + /** + * @When /^Downloading last public shared file with range "([^"]*)"$/ + */ + public function downloadPublicFileWithRange($range){ + $token = $this->lastShareData->data->token; + $fullUrl = substr($this->baseUrl, 0, -4) . "public.php/webdav"; + $headers['Range'] = $range; + + $client = new GClient(); + $options = []; + $options['auth'] = [$token, ""]; + + $request = $client->createRequest("GET", $fullUrl, $options); + $request->addHeader('Range', $range); + + $this->response = $client->send($request); + } + + /** + * @Then /^Downloaded content should be "([^"]*)"$/ + */ + public function downloadedContentShouldBe($content){ + PHPUnit_Framework_Assert::assertEquals($content, (string)$this->response->getBody()); + } + + /*Returns the elements of a propfind, $folderDepth requires 1 to see elements without children*/ + public function listFolder($user, $path, $folderDepth){ + $fullUrl = substr($this->baseUrl, 0, -4); + + $settings = array( + 'baseUri' => $fullUrl, + 'userName' => $user, + ); + + if ($user === 'admin') { + $settings['password'] = $this->adminUser[1]; + } else { + $settings['password'] = $this->regularUser; + } + + $client = new SClient($settings); + + $response = $client->propfind($this->davPath . "/", array( + '{DAV:}getetag' + ), $folderDepth); + + return $response; + } + + /** + * @Then /^user "([^"]*)" should see following elements$/ + * @param \Behat\Gherkin\Node\TableNode|null $expectedElements + */ + public function checkElementList($user, $expectedElements){ + $elementList = $this->listFolder($user, '/', 2); + if ($expectedElements instanceof \Behat\Gherkin\Node\TableNode) { + $elementRows = $expectedElements->getRows(); + $elementsSimplified = $this->simplifyArray($elementRows); + foreach($elementsSimplified as $expectedElement) { + $webdavPath = "/" . $this->davPath . $expectedElement; + if (!array_key_exists($webdavPath,$elementList)){ + PHPUnit_Framework_Assert::fail("$webdavPath" . " is not in propfind answer"); + } + } + } + } + + /** + * @When User :user uploads file :source to :destination + */ + public function userUploadsAFileTo($user, $source, $destination) + { + $file = \GuzzleHttp\Stream\Stream::factory(fopen($source, 'r')); + try { + $this->response = $this->makeDavRequest($user, "PUT", $destination, [], $file); + } catch (\GuzzleHttp\Exception\ServerException $e) { + // 4xx and 5xx responses cause an exception + $this->response = $e->getResponse(); + } + } + } diff --git a/build/integration/features/sharing-v1.feature b/build/integration/features/sharing-v1.feature index 32bb943d2d7..e00fd47baeb 100644 --- a/build/integration/features/sharing-v1.feature +++ b/build/integration/features/sharing-v1.feature @@ -199,7 +199,7 @@ Feature: sharing Scenario: getting all shares of a user using that user Given user "user0" exists And user "user1" exists - And file "textfile0.txt" from user "user0" is shared with user "user1" + And file "textfile0.txt" of user "user0" is shared with user "user1" And As an "user0" When sending "GET" to "/apps/files_sharing/api/v1/shares" Then the OCS status code should be "100" @@ -209,7 +209,7 @@ Feature: sharing Scenario: getting all shares of a user using another user Given user "user0" exists And user "user1" exists - And file "textfile0.txt" from user "user0" is shared with user "user1" + And file "textfile0.txt" of user "user0" is shared with user "user1" And As an "admin" When sending "GET" to "/apps/files_sharing/api/v1/shares" Then the OCS status code should be "100" @@ -221,8 +221,8 @@ Feature: sharing And user "user1" exists And user "user2" exists And user "user3" exists - And file "textfile0.txt" from user "user0" is shared with user "user1" - And file "textfile0.txt" from user "user0" is shared with user "user2" + And file "textfile0.txt" of user "user0" is shared with user "user1" + And file "textfile0.txt" of user "user0" is shared with user "user2" And As an "user0" When sending "GET" to "/apps/files_sharing/api/v1/shares?path=textfile0.txt" Then the OCS status code should be "100" @@ -236,8 +236,8 @@ Feature: sharing And user "user1" exists And user "user2" exists And user "user3" exists - And file "textfile0.txt" from user "user0" is shared with user "user1" - And file "textfile0.txt" from user "user1" is shared with user "user2" + And file "textfile0.txt" of user "user0" is shared with user "user1" + And file "textfile0.txt" of user "user1" is shared with user "user2" And As an "user0" When sending "GET" to "/apps/files_sharing/api/v1/shares?reshares=true&path=textfile0.txt" Then the OCS status code should be "100" @@ -249,7 +249,7 @@ Feature: sharing Scenario: getting share info of a share Given user "user0" exists And user "user1" exists - And file "textfile0.txt" from user "user0" is shared with user "user1" + And file "textfile0.txt" of user "user0" is shared with user "user1" And As an "user0" When Getting info of last share Then the OCS status code should be "100" @@ -279,7 +279,7 @@ Feature: sharing And user "user1" exists And group "group1" exists And user "user1" belongs to group "group1" - And file "textfile0.txt" from user "user0" is shared with group "group1" + And file "textfile0.txt" of user "user0" is shared with group "group1" And User "user1" moved file "/textfile0.txt" to "/FOLDER/textfile0.txt" And As an "user0" When Updating last share with @@ -306,7 +306,7 @@ Feature: sharing Scenario: Sharee can see the share Given user "user0" exists And user "user1" exists - And file "textfile0.txt" from user "user0" is shared with user "user1" + And file "textfile0.txt" of user "user0" is shared with user "user1" And As an "user1" When sending "GET" to "/apps/files_sharing/api/v1/shares?shared_with_me=true" Then the OCS status code should be "100" @@ -357,19 +357,35 @@ Feature: sharing Given user "user0" exists And user "user1" exists And user "user2" exists - And file "textfile0.txt" from user "user0" is shared with user "user1" + And file "textfile0.txt" of user "user0" is shared with user "user1" And As an "user2" When Getting info of last share Then the OCS status code should be "404" And the HTTP status code should be "200" + Scenario: Share of folder and sub-folder to same user - core#20645 + Given As an "admin" + And user "user0" exists + And user "user1" exists + And group "group0" exists + And user "user1" belongs to group "group0" + And file "/PARENT" of user "user0" is shared with user "user1" + When file "/PARENT/CHILD" of user "user0" is shared with group "group0" + Then user "user1" should see following elements + | /FOLDER/ | + | /PARENT/ | + | /CHILD/ | + | /PARENT/parent.txt | + | /CHILD/child.txt | + And the HTTP status code should be "200" + Scenario: Delete all group shares Given As an "admin" And user "user0" exists And user "user1" exists And group "group1" exists And user "user1" belongs to group "group1" - And file "textfile0.txt" from user "user0" is shared with group "group1" + And file "textfile0.txt" of user "user0" is shared with group "group1" And User "user1" moved file "/textfile0.txt" to "/FOLDER/textfile0.txt" And As an "user0" And Deleting last share @@ -382,7 +398,7 @@ Feature: sharing Scenario: delete a share Given user "user0" exists And user "user1" exists - And file "textfile0.txt" from user "user0" is shared with user "user1" + And file "textfile0.txt" of user "user0" is shared with user "user1" And As an "user0" When Deleting last share Then the OCS status code should be "100" diff --git a/build/integration/features/webdav-related.feature b/build/integration/features/webdav-related.feature index 961b6b03431..8be2c196308 100644 --- a/build/integration/features/webdav-related.feature +++ b/build/integration/features/webdav-related.feature @@ -9,7 +9,29 @@ Feature: sharing When User "user0" moves file "/textfile0.txt" to "/FOLDER/textfile0.txt" Then the HTTP status code should be "201" + Scenario: download a file with range + Given using dav path "remote.php/webdav" + And As an "admin" + When Downloading file "/welcome.txt" with range "bytes=51-77" + Then Downloaded content should be "example file for developers" + + Scenario: Upload forbidden if quota is 0 + Given using dav path "remote.php/webdav" + And As an "admin" + And user "user0" exists + And user "user0" has a quota of "0" + When User "user0" uploads file "data/textfile.txt" to "/asdf.txt" + Then the HTTP status code should be "507" + + Scenario: download a public shared file with range + Given user "user0" exists + And As an "user0" + When creating a share with + | path | welcome.txt | + | shareType | 3 | + And Downloading last public shared file with range "bytes=51-77" + Then Downloaded content should be "example file for developers" diff --git a/build/integration/run.sh b/build/integration/run.sh index bd2c2856ac7..76c01068deb 100755 --- a/build/integration/run.sh +++ b/build/integration/run.sh @@ -2,12 +2,11 @@ composer install -# TODO: avoid port collision on jenkins - use $EXECUTOR_NUMBER +# avoid port collision on jenkins - use $EXECUTOR_NUMBER if [ -z "$EXECUTOR_NUMBER" ]; then EXECUTOR_NUMBER=0 fi PORT=$((8080 + $EXECUTOR_NUMBER)) -#PORT=8080 echo $PORT php -S localhost:$PORT -t ../.. & PHPPID=$! @@ -22,7 +21,13 @@ 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 +vendor/bin/behat -f junit -f pretty $1 +RESULT=$? kill $PHPPID kill $PHPPID_FED + +tail "../../data/owncloud.log" + +exit $RESULT + |