123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- <?php
- /**
- * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors
- * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
- * SPDX-License-Identifier: AGPL-3.0-only
- */
- 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): void {
- $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());
- }
- }
- }
|