Add integration tests for downloading basic zip files

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
pull/7972/head
Daniel Calviño Sánchez 6 years ago committed by Roeland Jago Douma
parent 5a7986c25d
commit 6ee5469a03
No known key found for this signature in database
GPG Key ID: F941078878347C0C

@ -542,6 +542,15 @@ pipeline:
when:
matrix:
TESTS: integration-remote-api
integration-download:
image: nextcloudci/integration-php7.0:integration-php7.0-6
commands:
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
- cd build/integration
- ./run.sh features/download.feature
when:
matrix:
TESTS: integration-download
acceptance-access-levels:
image: nextcloudci/integration-php7.0:integration-php7.0-6
commands:
@ -738,6 +747,7 @@ matrix:
- TESTS: integration-ldap-features
- TESTS: integration-trashbin
- TESTS: integration-remote-api
- TESTS: integration-download
- TESTS: acceptance
TESTS-ACCEPTANCE: access-levels
- TESTS: acceptance

@ -39,6 +39,7 @@ require __DIR__ . '/../../vendor/autoload.php';
trait BasicStructure {
use Auth;
use Download;
use Trashbin;
/** @var string */
@ -381,6 +382,18 @@ trait BasicStructure {
return trim($lastStdOut);
}
/**
* @Given file :filename is created :times times in :user user data
* @param string $filename
* @param string $times
* @param string $user
*/
public function fileIsCreatedTimesInUserData($filename, $times, $user) {
for ($i = 0; $i < $times; $i++) {
file_put_contents($this->getDataDirectory() . "/$user/files" . "$filename-$i", "content-$i");
}
}
public function createFileSpecificSize($name, $size) {
$file = fopen("work/" . "$name", 'w');
fseek($file, $size - 1, SEEK_CUR);

@ -0,0 +1,131 @@
<?php
/**
*
* @copyright Copyright (c) 2018, Daniel Calviño Sánchez (danxuliu@gmail.com)
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
use GuzzleHttp\Client;
use GuzzleHttp\Message\ResponseInterface;
require __DIR__ . '/../../vendor/autoload.php';
trait Download {
/** @var string **/
private $downloadedFile;
/** @AfterScenario **/
public function cleanupDownloadedFile() {
$this->downloadedFile = null;
}
/**
* @When user :user downloads zip file for entries :entries in folder :folder
*/
public function userDownloadsZipFileForEntriesInFolder($user, $entries, $folder) {
$this->asAn($user);
$this->sendingToDirectUrl('GET', "/index.php/apps/files/ajax/download.php?dir=" . $folder . "&files=[" . $entries . "]");
$this->theHTTPStatusCodeShouldBe('200');
$this->getDownloadedFile();
}
private function getDownloadedFile() {
$this->downloadedFile = '';
$body = $this->response->getBody();
while (!$body->eof()) {
$this->downloadedFile .= $body->read(8192);
}
$body->close();
}
/**
* @Then the downloaded zip file is a zip32 file
*/
public function theDownloadedZipFileIsAZip32File() {
// assertNotContains is not used to prevent the whole file from being
// printed in case of error.
PHPUnit_Framework_Assert::assertTrue(
strpos($this->downloadedFile, "\x50\x4B\x06\x06") === false,
"File contains the zip64 end of central dir signature"
);
}
/**
* @Then the downloaded zip file contains a file named :fileName with the contents of :sourceFileName from :user data
*/
public function theDownloadedZipFileContainsAFileNamedWithTheContentsOfFromData($fileName, $sourceFileName, $user) {
$fileHeaderRegExp = '/';
$fileHeaderRegExp .= "\x50\x4B\x03\x04"; // Local file header signature
$fileHeaderRegExp .= '.{22,22}'; // Ignore from "version needed to extract" to "uncompressed size"
$fileHeaderRegExp .= preg_quote(pack('v', strlen($fileName)), '/'); // File name length
$fileHeaderRegExp .= '(.{2,2})'; // Get "extra field length"
$fileHeaderRegExp .= preg_quote($fileName, '/'); // File name
$fileHeaderRegExp .= '/s'; // PCRE_DOTALL, so all characters (including bytes that happen to be new line characters) match
// assertRegExp is not used to prevent the whole file from being printed
// in case of error and to be able to get the extra field length.
PHPUnit_Framework_Assert::assertEquals(
1, preg_match($fileHeaderRegExp, $this->downloadedFile, $matches),
"Local header for file did not appear once in zip file"
);
$extraFieldLength = unpack('vextraFieldLength', $matches[1])['extraFieldLength'];
$expectedFileContents = file_get_contents($this->getDataDirectory() . "/$user/files" . $sourceFileName);
$fileHeaderAndContentRegExp = '/';
$fileHeaderAndContentRegExp .= "\x50\x4B\x03\x04"; // Local file header signature
$fileHeaderAndContentRegExp .= '.{22,22}'; // Ignore from "version needed to extract" to "uncompressed size"
$fileHeaderAndContentRegExp .= preg_quote(pack('v', strlen($fileName)), '/'); // File name length
$fileHeaderAndContentRegExp .= '.{2,2}'; // Ignore "extra field length"
$fileHeaderAndContentRegExp .= preg_quote($fileName, '/'); // File name
$fileHeaderAndContentRegExp .= '.{' . $extraFieldLength . ',' . $extraFieldLength . '}'; // Ignore "extra field"
$fileHeaderAndContentRegExp .= preg_quote($expectedFileContents, '/'); // File contents
$fileHeaderAndContentRegExp .= '/s'; // PCRE_DOTALL, so all characters (including bytes that happen to be new line characters) match
// assertRegExp is not used to prevent the whole file from being printed
// in case of error.
PHPUnit_Framework_Assert::assertEquals(
1, preg_match($fileHeaderAndContentRegExp, $this->downloadedFile),
"Local header and contents for file did not appear once in zip file"
);
}
/**
* @Then the downloaded zip file contains a folder named :folderName
*/
public function theDownloadedZipFileContainsAFolderNamed($folderName) {
$folderHeaderRegExp = '/';
$folderHeaderRegExp .= "\x50\x4B\x03\x04"; // Local file header signature
$folderHeaderRegExp .= '.{22,22}'; // Ignore from "version needed to extract" to "uncompressed size"
$folderHeaderRegExp .= preg_quote(pack('v', strlen($folderName)), '/'); // File name length
$folderHeaderRegExp .= '.{2,2}'; // Ignore "extra field length"
$folderHeaderRegExp .= preg_quote($folderName, '/'); // File name
$folderHeaderRegExp .= '/s'; // PCRE_DOTALL, so all characters (including bytes that happen to be new line characters) match
// assertRegExp is not used to prevent the whole file from being printed
// in case of error.
PHPUnit_Framework_Assert::assertEquals(
1, preg_match($folderHeaderRegExp, $this->downloadedFile),
"Local header for folder did not appear once in zip file"
);
}
}

@ -0,0 +1,144 @@
Feature: download
Scenario: downloading 2 small files returns a zip32
Given using new dav path
And user "user0" exists
And User "user0" copies file "/welcome.txt" to "/welcome2.txt"
When user "user0" downloads zip file for entries '"welcome.txt","welcome2.txt"' in folder "/"
Then the downloaded zip file is a zip32 file
And the downloaded zip file contains a file named "welcome.txt" with the contents of "/welcome.txt" from "user0" data
And the downloaded zip file contains a file named "welcome2.txt" with the contents of "/welcome2.txt" from "user0" data
Scenario: downloading a small file and a directory returns a zip32
Given using new dav path
And user "user0" exists
And user "user0" created a folder "/emptySubFolder"
When user "user0" downloads zip file for entries '"welcome.txt","emptySubFolder"' in folder "/"
Then the downloaded zip file is a zip32 file
And the downloaded zip file contains a file named "welcome.txt" with the contents of "/welcome.txt" from "user0" data
And the downloaded zip file contains a folder named "emptySubFolder/"
Scenario: downloading a small file and 2 nested directories returns a zip32
Given using new dav path
And user "user0" exists
And user "user0" created a folder "/subFolder"
And user "user0" created a folder "/subFolder/emptySubSubFolder"
When user "user0" downloads zip file for entries '"welcome.txt","subFolder"' in folder "/"
Then the downloaded zip file is a zip32 file
And the downloaded zip file contains a file named "welcome.txt" with the contents of "/welcome.txt" from "user0" data
And the downloaded zip file contains a folder named "subFolder/"
And the downloaded zip file contains a folder named "subFolder/emptySubSubFolder/"
Scenario: downloading dir with 2 small files returns a zip32
Given using new dav path
And user "user0" exists
And user "user0" created a folder "/sparseFolder"
And User "user0" copies file "/welcome.txt" to "/sparseFolder/welcome.txt"
And User "user0" copies file "/welcome.txt" to "/sparseFolder/welcome2.txt"
When user "user0" downloads zip file for entries '"sparseFolder"' in folder "/"
Then the downloaded zip file is a zip32 file
And the downloaded zip file contains a folder named "sparseFolder/"
And the downloaded zip file contains a file named "sparseFolder/welcome.txt" with the contents of "/sparseFolder/welcome.txt" from "user0" data
And the downloaded zip file contains a file named "sparseFolder/welcome2.txt" with the contents of "/sparseFolder/welcome2.txt" from "user0" data
Scenario: downloading dir with a small file and a directory returns a zip32
Given using new dav path
And user "user0" exists
And user "user0" created a folder "/sparseFolder"
And User "user0" copies file "/welcome.txt" to "/sparseFolder/welcome.txt"
And user "user0" created a folder "/sparseFolder/emptySubFolder"
When user "user0" downloads zip file for entries '"sparseFolder"' in folder "/"
Then the downloaded zip file is a zip32 file
And the downloaded zip file contains a folder named "sparseFolder/"
And the downloaded zip file contains a file named "sparseFolder/welcome.txt" with the contents of "/sparseFolder/welcome.txt" from "user0" data
And the downloaded zip file contains a folder named "sparseFolder/emptySubFolder/"
Scenario: downloading dir with a small file and 2 nested directories returns a zip32
Given using new dav path
And user "user0" exists
And user "user0" created a folder "/sparseFolder"
And User "user0" copies file "/welcome.txt" to "/sparseFolder/welcome.txt"
And user "user0" created a folder "/sparseFolder/subFolder"
And user "user0" created a folder "/sparseFolder/subFolder/emptySubSubFolder"
When user "user0" downloads zip file for entries '"sparseFolder"' in folder "/"
Then the downloaded zip file is a zip32 file
And the downloaded zip file contains a folder named "sparseFolder/"
And the downloaded zip file contains a file named "sparseFolder/welcome.txt" with the contents of "/sparseFolder/welcome.txt" from "user0" data
And the downloaded zip file contains a folder named "sparseFolder/subFolder/"
And the downloaded zip file contains a folder named "sparseFolder/subFolder/emptySubSubFolder/"
Scenario: downloading (from folder) 2 small files returns a zip32
Given using new dav path
And user "user0" exists
And user "user0" created a folder "/baseFolder"
And User "user0" copies file "/welcome.txt" to "/baseFolder/welcome.txt"
And User "user0" copies file "/welcome.txt" to "/baseFolder/welcome2.txt"
When user "user0" downloads zip file for entries '"welcome.txt","welcome2.txt"' in folder "/baseFolder/"
Then the downloaded zip file is a zip32 file
And the downloaded zip file contains a file named "welcome.txt" with the contents of "/baseFolder/welcome.txt" from "user0" data
And the downloaded zip file contains a file named "welcome2.txt" with the contents of "/baseFolder/welcome2.txt" from "user0" data
Scenario: downloading (from folder) a small file and a directory returns a zip32
Given using new dav path
And user "user0" exists
And user "user0" created a folder "/baseFolder"
And User "user0" copies file "/welcome.txt" to "/baseFolder/welcome.txt"
And user "user0" created a folder "/baseFolder/emptySubFolder"
When user "user0" downloads zip file for entries '"welcome.txt","emptySubFolder"' in folder "/baseFolder/"
Then the downloaded zip file is a zip32 file
And the downloaded zip file contains a file named "welcome.txt" with the contents of "/baseFolder/welcome.txt" from "user0" data
And the downloaded zip file contains a folder named "emptySubFolder/"
Scenario: downloading (from folder) a small file and 2 nested directories returns a zip32
Given using new dav path
And user "user0" exists
And user "user0" created a folder "/baseFolder"
And User "user0" copies file "/welcome.txt" to "/baseFolder/welcome.txt"
And user "user0" created a folder "/baseFolder/subFolder"
And user "user0" created a folder "/baseFolder/subFolder/emptySubSubFolder"
When user "user0" downloads zip file for entries '"welcome.txt","subFolder"' in folder "/baseFolder/"
Then the downloaded zip file is a zip32 file
And the downloaded zip file contains a file named "welcome.txt" with the contents of "/baseFolder/welcome.txt" from "user0" data
And the downloaded zip file contains a folder named "subFolder/"
And the downloaded zip file contains a folder named "subFolder/emptySubSubFolder/"
Scenario: downloading (from folder) dir with 2 small files returns a zip32
Given using new dav path
And user "user0" exists
And user "user0" created a folder "/baseFolder"
And user "user0" created a folder "/baseFolder/sparseFolder"
And User "user0" copies file "/welcome.txt" to "/baseFolder/sparseFolder/welcome.txt"
And User "user0" copies file "/welcome.txt" to "/baseFolder/sparseFolder/welcome2.txt"
When user "user0" downloads zip file for entries '"sparseFolder"' in folder "/baseFolder/"
Then the downloaded zip file is a zip32 file
And the downloaded zip file contains a folder named "sparseFolder/"
And the downloaded zip file contains a file named "sparseFolder/welcome.txt" with the contents of "/baseFolder/sparseFolder/welcome.txt" from "user0" data
And the downloaded zip file contains a file named "sparseFolder/welcome2.txt" with the contents of "/baseFolder/sparseFolder/welcome2.txt" from "user0" data
Scenario: downloading (from folder) dir with a small file and a directory returns a zip32
Given using new dav path
And user "user0" exists
And user "user0" created a folder "/baseFolder"
And user "user0" created a folder "/baseFolder/sparseFolder"
And User "user0" copies file "/welcome.txt" to "/baseFolder/sparseFolder/welcome.txt"
And user "user0" created a folder "/baseFolder/sparseFolder/emptySubFolder"
When user "user0" downloads zip file for entries '"sparseFolder"' in folder "/baseFolder/"
Then the downloaded zip file is a zip32 file
And the downloaded zip file contains a folder named "sparseFolder/"
And the downloaded zip file contains a file named "sparseFolder/welcome.txt" with the contents of "/baseFolder/sparseFolder/welcome.txt" from "user0" data
And the downloaded zip file contains a folder named "sparseFolder/emptySubFolder/"
Scenario: downloading (from folder) dir with a small file and 2 nested directories returns a zip32
Given using new dav path
And user "user0" exists
And user "user0" created a folder "/baseFolder"
And user "user0" created a folder "/baseFolder/sparseFolder"
And User "user0" copies file "/welcome.txt" to "/baseFolder/sparseFolder/welcome.txt"
And user "user0" created a folder "/baseFolder/sparseFolder/subFolder"
And user "user0" created a folder "/baseFolder/sparseFolder/subFolder/emptySubSubFolder"
When user "user0" downloads zip file for entries '"sparseFolder"' in folder "/baseFolder/"
Then the downloaded zip file is a zip32 file
And the downloaded zip file contains a folder named "sparseFolder/"
And the downloaded zip file contains a file named "sparseFolder/welcome.txt" with the contents of "/baseFolder/sparseFolder/welcome.txt" from "user0" data
And the downloaded zip file contains a folder named "sparseFolder/subFolder/"
And the downloaded zip file contains a folder named "sparseFolder/subFolder/emptySubSubFolder/"
Loading…
Cancel
Save