123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- <?php
- /**
- * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors
- * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
- namespace Test\Files\Storage\Wrapper;
- class EncodingTest extends \Test\Files\Storage\Storage {
- public const NFD_NAME = 'ümlaut';
- public const NFC_NAME = 'ümlaut';
- /**
- * @var \OC\Files\Storage\Temporary
- */
- private $sourceStorage;
- protected function setUp(): void {
- parent::setUp();
- $this->sourceStorage = new \OC\Files\Storage\Temporary([]);
- $this->instance = new \OC\Files\Storage\Wrapper\Encoding([
- 'storage' => $this->sourceStorage
- ]);
- }
- protected function tearDown(): void {
- $this->sourceStorage->cleanUp();
- parent::tearDown();
- }
- public function directoryProvider() {
- $a = parent::directoryProvider();
- $a[] = [self::NFC_NAME];
- return $a;
- }
- public function fileNameProvider() {
- $a = parent::fileNameProvider();
- $a[] = [self::NFD_NAME . '.txt'];
- return $a;
- }
- public function copyAndMoveProvider() {
- $a = parent::copyAndMoveProvider();
- $a[] = [self::NFD_NAME . '.txt', self::NFC_NAME . '-renamed.txt'];
- return $a;
- }
- public function accessNameProvider() {
- return [
- [self::NFD_NAME],
- [self::NFC_NAME],
- ];
- }
- /**
- * @dataProvider accessNameProvider
- */
- public function testFputEncoding($accessName): void {
- $this->sourceStorage->file_put_contents(self::NFD_NAME, 'bar');
- $this->assertEquals('bar', $this->instance->file_get_contents($accessName));
- }
- /**
- * @dataProvider accessNameProvider
- */
- public function testFopenReadEncoding($accessName): void {
- $this->sourceStorage->file_put_contents(self::NFD_NAME, 'bar');
- $fh = $this->instance->fopen($accessName, 'r');
- $data = fgets($fh);
- fclose($fh);
- $this->assertEquals('bar', $data);
- }
- /**
- * @dataProvider accessNameProvider
- */
- public function testFopenOverwriteEncoding($accessName): void {
- $this->sourceStorage->file_put_contents(self::NFD_NAME, 'bar');
- $fh = $this->instance->fopen($accessName, 'w');
- $data = fputs($fh, 'test');
- fclose($fh);
- $data = $this->sourceStorage->file_get_contents(self::NFD_NAME);
- $this->assertEquals('test', $data);
- $this->assertFalse($this->sourceStorage->file_exists(self::NFC_NAME));
- }
- /**
- * @dataProvider accessNameProvider
- */
- public function testFileExistsEncoding($accessName): void {
- $this->sourceStorage->file_put_contents(self::NFD_NAME, 'bar');
- $this->assertTrue($this->instance->file_exists($accessName));
- }
- /**
- * @dataProvider accessNameProvider
- */
- public function testUnlinkEncoding($accessName): void {
- $this->sourceStorage->file_put_contents(self::NFD_NAME, 'bar');
- $this->assertTrue($this->instance->unlink($accessName));
- $this->assertFalse($this->sourceStorage->file_exists(self::NFC_NAME));
- $this->assertFalse($this->sourceStorage->file_exists(self::NFD_NAME));
- }
- public function testNfcHigherPriority(): void {
- $this->sourceStorage->file_put_contents(self::NFC_NAME, 'nfc');
- $this->sourceStorage->file_put_contents(self::NFD_NAME, 'nfd');
- $this->assertEquals('nfc', $this->instance->file_get_contents(self::NFC_NAME));
- }
- public function encodedDirectoriesProvider() {
- return [
- [self::NFD_NAME, self::NFC_NAME],
- [self::NFD_NAME . '/' . self::NFD_NAME, self::NFC_NAME . '/' . self::NFC_NAME],
- [self::NFD_NAME . '/' . self::NFC_NAME . '/' . self::NFD_NAME, self::NFC_NAME . '/' . self::NFC_NAME . '/' . self::NFC_NAME],
- ];
- }
- /**
- * @dataProvider encodedDirectoriesProvider
- */
- public function testOperationInsideDirectory($sourceDir, $accessDir): void {
- $this->sourceStorage->mkdir($sourceDir);
- $this->instance->file_put_contents($accessDir . '/test.txt', 'bar');
- $this->assertTrue($this->instance->file_exists($accessDir . '/test.txt'));
- $this->assertEquals('bar', $this->instance->file_get_contents($accessDir . '/test.txt'));
- $this->sourceStorage->file_put_contents($sourceDir . '/' . self::NFD_NAME, 'foo');
- $this->assertTrue($this->instance->file_exists($accessDir . '/' . self::NFC_NAME));
- $this->assertEquals('foo', $this->instance->file_get_contents($accessDir . '/' . self::NFC_NAME));
- // try again to make it use cached path
- $this->assertEquals('bar', $this->instance->file_get_contents($accessDir . '/test.txt'));
- $this->assertTrue($this->instance->file_exists($accessDir . '/test.txt'));
- $this->assertEquals('foo', $this->instance->file_get_contents($accessDir . '/' . self::NFC_NAME));
- $this->assertTrue($this->instance->file_exists($accessDir . '/' . self::NFC_NAME));
- }
- public function testCacheExtraSlash(): void {
- $this->sourceStorage->file_put_contents(self::NFD_NAME, 'foo');
- $this->assertEquals(3, $this->instance->file_put_contents(self::NFC_NAME, 'bar'));
- $this->assertEquals('bar', $this->instance->file_get_contents(self::NFC_NAME));
- clearstatcache();
- $this->assertEquals(5, $this->instance->file_put_contents('/' . self::NFC_NAME, 'baric'));
- $this->assertEquals('baric', $this->instance->file_get_contents(self::NFC_NAME));
- clearstatcache();
- $this->assertEquals(8, $this->instance->file_put_contents('/' . self::NFC_NAME, 'barbaric'));
- $this->assertEquals('barbaric', $this->instance->file_get_contents('//' . self::NFC_NAME));
- }
- public function sourceAndTargetDirectoryProvider() {
- return [
- [self::NFC_NAME . '1', self::NFC_NAME . '2'],
- [self::NFD_NAME . '1', self::NFC_NAME . '2'],
- [self::NFC_NAME . '1', self::NFD_NAME . '2'],
- [self::NFD_NAME . '1', self::NFD_NAME . '2'],
- ];
- }
- /**
- * @dataProvider sourceAndTargetDirectoryProvider
- */
- public function testCopyAndMoveEncodedFolder($sourceDir, $targetDir): void {
- $this->sourceStorage->mkdir($sourceDir);
- $this->sourceStorage->mkdir($targetDir);
- $this->sourceStorage->file_put_contents($sourceDir . '/test.txt', 'bar');
- $this->assertTrue($this->instance->copy(self::NFC_NAME . '1/test.txt', self::NFC_NAME . '2/test.txt'));
- $this->assertTrue($this->instance->file_exists(self::NFC_NAME . '1/test.txt'));
- $this->assertTrue($this->instance->file_exists(self::NFC_NAME . '2/test.txt'));
- $this->assertEquals('bar', $this->instance->file_get_contents(self::NFC_NAME . '2/test.txt'));
- $this->assertTrue($this->instance->rename(self::NFC_NAME . '1/test.txt', self::NFC_NAME . '2/test2.txt'));
- $this->assertFalse($this->instance->file_exists(self::NFC_NAME . '1/test.txt'));
- $this->assertTrue($this->instance->file_exists(self::NFC_NAME . '2/test2.txt'));
- $this->assertEquals('bar', $this->instance->file_get_contents(self::NFC_NAME . '2/test2.txt'));
- }
- /**
- * @dataProvider sourceAndTargetDirectoryProvider
- */
- public function testCopyAndMoveFromStorageEncodedFolder($sourceDir, $targetDir): void {
- $this->sourceStorage->mkdir($sourceDir);
- $this->sourceStorage->mkdir($targetDir);
- $this->sourceStorage->file_put_contents($sourceDir . '/test.txt', 'bar');
- $this->assertTrue($this->instance->copyFromStorage($this->instance, self::NFC_NAME . '1/test.txt', self::NFC_NAME . '2/test.txt'));
- $this->assertTrue($this->instance->file_exists(self::NFC_NAME . '1/test.txt'));
- $this->assertTrue($this->instance->file_exists(self::NFC_NAME . '2/test.txt'));
- $this->assertEquals('bar', $this->instance->file_get_contents(self::NFC_NAME . '2/test.txt'));
- $this->assertTrue($this->instance->moveFromStorage($this->instance, self::NFC_NAME . '1/test.txt', self::NFC_NAME . '2/test2.txt'));
- $this->assertFalse($this->instance->file_exists(self::NFC_NAME . '1/test.txt'));
- $this->assertTrue($this->instance->file_exists(self::NFC_NAME . '2/test2.txt'));
- $this->assertEquals('bar', $this->instance->file_get_contents(self::NFC_NAME . '2/test2.txt'));
- }
- public function testNormalizedDirectoryEntriesOpenDir(): void {
- $this->sourceStorage->mkdir('/test');
- $this->sourceStorage->mkdir('/test/' . self::NFD_NAME);
- $this->assertTrue($this->instance->file_exists('/test/' . self::NFC_NAME));
- $this->assertTrue($this->instance->file_exists('/test/' . self::NFD_NAME));
- $dh = $this->instance->opendir('/test');
- $content = [];
- while (($file = readdir($dh)) !== false) {
- if ($file != '.' and $file != '..') {
- $content[] = $file;
- }
- }
- $this->assertCount(1, $content);
- $this->assertEquals(self::NFC_NAME, $content[0]);
- }
- public function testNormalizedDirectoryEntriesGetDirectoryContent(): void {
- $this->sourceStorage->mkdir('/test');
- $this->sourceStorage->mkdir('/test/' . self::NFD_NAME);
- $this->assertTrue($this->instance->file_exists('/test/' . self::NFC_NAME));
- $this->assertTrue($this->instance->file_exists('/test/' . self::NFD_NAME));
- $content = iterator_to_array($this->instance->getDirectoryContent('/test'));
- $this->assertCount(1, $content);
- $this->assertEquals(self::NFC_NAME, $content[0]['name']);
- }
- public function testNormalizedGetMetaData(): void {
- $this->sourceStorage->mkdir('/test');
- $this->sourceStorage->mkdir('/test/' . self::NFD_NAME);
- $entry = $this->instance->getMetaData('/test/' . self::NFC_NAME);
- $this->assertEquals(self::NFC_NAME, $entry['name']);
- $entry = $this->instance->getMetaData('/test/' . self::NFD_NAME);
- $this->assertEquals(self::NFC_NAME, $entry['name']);
- }
- }
|