From b99bd7f4fce127e556532d5e0d289957d9548e83 Mon Sep 17 00:00:00 2001 From: Sergio Bertolin Date: Fri, 27 Nov 2015 12:55:48 +0000 Subject: [PATCH 1/5] Added sabre dav in webdav, modified skeleton to have parent and child folders --- build/integration/composer.json | 3 +- .../features/bootstrap/BasicStructure.php | 18 +++++++ .../integration/features/bootstrap/WebDav.php | 50 +++++++++++++++++-- build/integration/features/sharing-v1.feature | 12 +++++ 4 files changed, 77 insertions(+), 6 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/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/WebDav.php b/build/integration/features/bootstrap/WebDav.php index 1bda8175eeb..f38c7bec754 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'; @@ -22,7 +23,7 @@ trait WebDav{ public function makeDavRequest($user, $method, $path, $headers){ $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,11 @@ 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); return $client->send($request); } @@ -56,5 +58,43 @@ trait WebDav{ $this->response = $this->makeDavRequest($user, "MOVE", $fileSource, $headers); } + public function listFolder($user, $path){ + $fullUrl = substr($this->baseUrl, 0, -4); + + $settings = array( + 'baseUri' => $fullUrl, + 'userName' => $user, + ); + + echo "password del admin: " . $this->adminUser[1] . "\n"; + echo "fullUrl: " . $fullUrl . "\n"; + + if ($user === 'admin') { + $settings['password'] = $this->adminUser[1]; + } else { + $settings['password'] = $this->regularUser; + } + + $client = new SClient($settings); + + $response = $client->propfind($this->davPath . "/", array( + '{DAV:}displayname', + )); + + print_r($response); + /*$features = $client->options(); + + print_r($features);*/ + //return $this->response->xml(); + } + + /** + * @Then /^user "([^"]*)" should see following folders$/ + */ + public function checkList($user){ + $this->listFolder($user, '/'); + } + + } diff --git a/build/integration/features/sharing-v1.feature b/build/integration/features/sharing-v1.feature index 32bb943d2d7..fc2da430663 100644 --- a/build/integration/features/sharing-v1.feature +++ b/build/integration/features/sharing-v1.feature @@ -363,6 +363,18 @@ Feature: sharing 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" from user "user0" is shared with user "user1" + When file "/PARENT/CHILD" from user "user0" is shared with group "group0" + And As an "admin" + Then user "user1" should see following folders + And the HTTP status code should be "200" + Scenario: Delete all group shares Given As an "admin" And user "user0" exists From 40172e252b9141f76a50413e7ae58ba686bd7c2a Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Fri, 27 Nov 2015 15:38:45 +0100 Subject: [PATCH 2/5] Use depth 1 and valid properties to get a list --- build/integration/features/bootstrap/WebDav.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build/integration/features/bootstrap/WebDav.php b/build/integration/features/bootstrap/WebDav.php index f38c7bec754..20c2d0f7994 100644 --- a/build/integration/features/bootstrap/WebDav.php +++ b/build/integration/features/bootstrap/WebDav.php @@ -78,7 +78,8 @@ trait WebDav{ $client = new SClient($settings); $response = $client->propfind($this->davPath . "/", array( - '{DAV:}displayname', + '{DAV:}getetag', + 1 )); print_r($response); From 52f6592991956f79724b98036803fde6452e8c66 Mon Sep 17 00:00:00 2001 From: Sergio Bertolin Date: Mon, 30 Nov 2015 12:20:05 +0000 Subject: [PATCH 3/5] Making propfinds, having depth in mind and checking it in gherkin description --- .../integration/features/bootstrap/WebDav.php | 34 +++++++++++-------- build/integration/features/sharing-v1.feature | 8 +++-- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/build/integration/features/bootstrap/WebDav.php b/build/integration/features/bootstrap/WebDav.php index 20c2d0f7994..2bbe44e9c59 100644 --- a/build/integration/features/bootstrap/WebDav.php +++ b/build/integration/features/bootstrap/WebDav.php @@ -58,7 +58,8 @@ trait WebDav{ $this->response = $this->makeDavRequest($user, "MOVE", $fileSource, $headers); } - public function listFolder($user, $path){ + /*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( @@ -66,9 +67,6 @@ trait WebDav{ 'userName' => $user, ); - echo "password del admin: " . $this->adminUser[1] . "\n"; - echo "fullUrl: " . $fullUrl . "\n"; - if ($user === 'admin') { $settings['password'] = $this->adminUser[1]; } else { @@ -78,22 +76,28 @@ trait WebDav{ $client = new SClient($settings); $response = $client->propfind($this->davPath . "/", array( - '{DAV:}getetag', - 1 - )); + '{DAV:}getetag' + ), $folderDepth); - print_r($response); - /*$features = $client->options(); - - print_r($features);*/ - //return $this->response->xml(); + return $response; } /** - * @Then /^user "([^"]*)" should see following folders$/ + * @Then /^user "([^"]*)" should see following elements$/ + * @param \Behat\Gherkin\Node\TableNode|null $expectedElements */ - public function checkList($user){ - $this->listFolder($user, '/'); + 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"); + } + } + } } diff --git a/build/integration/features/sharing-v1.feature b/build/integration/features/sharing-v1.feature index fc2da430663..f32e2fa2f3e 100644 --- a/build/integration/features/sharing-v1.feature +++ b/build/integration/features/sharing-v1.feature @@ -371,8 +371,12 @@ Feature: sharing And user "user1" belongs to group "group0" And file "/PARENT" from user "user0" is shared with user "user1" When file "/PARENT/CHILD" from user "user0" is shared with group "group0" - And As an "admin" - Then user "user1" should see following folders + 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 From 69ca3a70d674c7c7599a4523c41fd87aa2adb3df Mon Sep 17 00:00:00 2001 From: Sergio Bertolin Date: Mon, 30 Nov 2015 14:07:02 +0000 Subject: [PATCH 4/5] Added webdav test to check range downloads --- build/integration/features/bootstrap/WebDav.php | 16 ++++++++++++++++ .../integration/features/webdav-related.feature | 6 ++++++ 2 files changed, 22 insertions(+) diff --git a/build/integration/features/bootstrap/WebDav.php b/build/integration/features/bootstrap/WebDav.php index 2bbe44e9c59..567f189c61e 100644 --- a/build/integration/features/bootstrap/WebDav.php +++ b/build/integration/features/bootstrap/WebDav.php @@ -58,6 +58,22 @@ 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); + } + + /** + * @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); diff --git a/build/integration/features/webdav-related.feature b/build/integration/features/webdav-related.feature index 961b6b03431..16955e27063 100644 --- a/build/integration/features/webdav-related.feature +++ b/build/integration/features/webdav-related.feature @@ -9,6 +9,12 @@ 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" + From 2c6e0da8f5e7160ffb55a991cab503ee5b64191d Mon Sep 17 00:00:00 2001 From: Sergio Bertolin Date: Mon, 30 Nov 2015 14:49:35 +0000 Subject: [PATCH 5/5] Change from with of --- .../features/bootstrap/Sharing.php | 4 +-- build/integration/features/sharing-v1.feature | 28 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) 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/sharing-v1.feature b/build/integration/features/sharing-v1.feature index f32e2fa2f3e..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,7 +357,7 @@ 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" @@ -369,8 +369,8 @@ Feature: sharing And user "user1" exists And group "group0" exists And user "user1" belongs to group "group0" - And file "/PARENT" from user "user0" is shared with user "user1" - When file "/PARENT/CHILD" from user "user0" is shared with 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/ | @@ -385,7 +385,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" And Deleting last share @@ -398,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"