You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nextcloud/tests/lib/Preview/Provider.php

196 lines
5.5 KiB
PHP

<?php
/**
* @author Olivier Paroz <owncloud@interfasys.ch>
*
* @copyright Copyright (c) 2015, ownCloud, Inc.
* @license AGPL-3.0
*
* This code is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* 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, version 3,
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
namespace Test\Preview;
use OC\Files\Node\File;
use OCP\Files\IRootFolder;
abstract class Provider extends \Test\TestCase {
/** @var string */
protected $imgPath;
/** @var int */
protected $width;
/** @var int */
protected $height;
/** @var \OC\Preview\Provider */
protected $provider;
/** @var int */
protected $maxWidth = 1024;
/** @var int */
protected $maxHeight = 1024;
/** @var bool */
protected $scalingUp = false;
/** @var int */
protected $userId;
/** @var \OC\Files\View */
protected $rootView;
/** @var \OC\Files\Storage\Storage */
protected $storage;
protected function setUp(): void {
parent::setUp();
$userManager = \OC::$server->getUserManager();
$userManager->clearBackends();
$backend = new \Test\Util\User\Dummy();
$userManager->registerBackend($backend);
$userId = $this->getUniqueID();
$backend->createUser($userId, $userId);
$this->loginAsUser($userId);
$this->storage = new \OC\Files\Storage\Temporary([]);
\OC\Files\Filesystem::mount($this->storage, [], '/' . $userId . '/');
$this->rootView = new \OC\Files\View('');
$this->rootView->mkdir('/' . $userId);
$this->rootView->mkdir('/' . $userId . '/files');
$this->userId = $userId;
}
protected function tearDown(): void {
$this->logout();
parent::tearDown();
}
public static function dimensionsDataProvider() {
return [
[-rand(5, 100), -rand(5, 100)],
[rand(5, 100), rand(5, 100)],
[-rand(5, 100), rand(5, 100)],
[rand(5, 100), -rand(5, 100)],
];
}
/**
* Launches all the tests we have
*
* @dataProvider dimensionsDataProvider
* @requires extension imagick
*
* @param int $widthAdjustment
* @param int $heightAdjustment
*/
public function testGetThumbnail($widthAdjustment, $heightAdjustment) {
$ratio = round($this->width / $this->height, 2);
$this->maxWidth = $this->width - $widthAdjustment;
$this->maxHeight = $this->height - $heightAdjustment;
// Testing code
/*print_r("w $this->width ");
print_r("h $this->height ");
print_r("r $ratio ");*/
$preview = $this->getPreview($this->provider);
// The TXT provider uses the max dimensions to create its canvas,
// so the ratio will always be the one of the max dimension canvas
if (!$this->provider instanceof \OC\Preview\TXT) {
$this->doesRatioMatch($preview, $ratio);
}
$this->doesPreviewFit($preview);
}
/**
* Adds the test file to the filesystem
*
* @param string $fileName name of the file to create
* @param string $fileContent path to file to use for test
*
* @return string
*/
protected function prepareTestFile($fileName, $fileContent) {
$imgData = file_get_contents($fileContent);
$imgPath = '/' . $this->userId . '/files/' . $fileName;
$this->rootView->file_put_contents($imgPath, $imgData);
$scanner = $this->storage->getScanner();
$scanner->scan('');
return $imgPath;
}
/**
* Retrieves a max size thumbnail can be created
*
* @param \OC\Preview\Provider $provider
*
* @return bool|\OCP\IImage
*/
private function getPreview($provider) {
$file = new File(\OC::$server->get(IRootFolder::class), $this->rootView, $this->imgPath);
$preview = $provider->getThumbnail($file, $this->maxWidth, $this->maxHeight, $this->scalingUp);
if (get_class($this) === BitmapTest::class && $preview === null) {
$this->markTestSkipped('An error occured while operating with Imagick.');
}
$this->assertNotEquals(false, $preview);
$this->assertEquals(true, $preview->valid());
return $preview;
}
/**
* Checks if the preview ratio matches the original ratio
*
* @param \OCP\IImage $preview
* @param int $ratio
*/
private function doesRatioMatch($preview, $ratio) {
$previewRatio = round($preview->width() / $preview->height(), 2);
$this->assertEquals($ratio, $previewRatio);
}
/**
* Tests if a max size preview of smaller dimensions can be created
*
* @param \OCP\IImage $preview
*/
private function doesPreviewFit($preview) {
$maxDimRatio = round($this->maxWidth / $this->maxHeight, 2);
$previewRatio = round($preview->width() / $preview->height(), 2);
// Testing code
/*print_r("mw $this->maxWidth ");
print_r("mh $this->maxHeight ");
print_r("mr $maxDimRatio ");
$pw = $preview->width();
$ph = $preview->height();
print_r("pw $pw ");
print_r("ph $ph ");
print_r("pr $previewRatio ");*/
if ($maxDimRatio < $previewRatio) {
$this->assertLessThanOrEqual($this->maxWidth, $preview->width());
$this->assertLessThan($this->maxHeight, $preview->height());
} elseif ($maxDimRatio > $previewRatio) {
$this->assertLessThan($this->maxWidth, $preview->width());
$this->assertLessThanOrEqual($this->maxHeight, $preview->height());
} else { // Original had to be resized
$this->assertLessThanOrEqual($this->maxWidth, $preview->width());
$this->assertLessThanOrEqual($this->maxHeight, $preview->height());
}
}
}