aboutsummaryrefslogtreecommitdiffstats
path: root/tests/lib/TempManagerTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'tests/lib/TempManagerTest.php')
-rw-r--r--tests/lib/TempManagerTest.php196
1 files changed, 196 insertions, 0 deletions
diff --git a/tests/lib/TempManagerTest.php b/tests/lib/TempManagerTest.php
new file mode 100644
index 00000000000..ee7778c7e88
--- /dev/null
+++ b/tests/lib/TempManagerTest.php
@@ -0,0 +1,196 @@
+<?php
+
+/**
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace Test;
+
+use bantu\IniGetWrapper\IniGetWrapper;
+use OC\TempManager;
+use OCP\Files;
+use OCP\IConfig;
+use Psr\Log\LoggerInterface;
+
+class TempManagerTest extends \Test\TestCase {
+ protected $baseDir = null;
+
+ protected function setUp(): void {
+ parent::setUp();
+
+ $this->baseDir = $this->getManager()->getTempBaseDir() . $this->getUniqueID('/oc_tmp_test');
+ if (!is_dir($this->baseDir)) {
+ mkdir($this->baseDir);
+ }
+ }
+
+ protected function tearDown(): void {
+ if ($this->baseDir !== null) {
+ Files::rmdirr($this->baseDir);
+ }
+ $this->baseDir = null;
+ parent::tearDown();
+ }
+
+ /**
+ * @param ?LoggerInterface $logger
+ * @param ?IConfig $config
+ * @return \OC\TempManager
+ */
+ protected function getManager($logger = null, $config = null) {
+ if (!$logger) {
+ $logger = $this->createMock(LoggerInterface::class);
+ }
+ if (!$config) {
+ $config = $this->createMock(IConfig::class);
+ $config->method('getSystemValue')
+ ->with('tempdirectory', null)
+ ->willReturn('/tmp');
+ }
+ $iniGetWrapper = $this->createMock(IniGetWrapper::class);
+ $manager = new TempManager($logger, $config, $iniGetWrapper);
+ if ($this->baseDir) {
+ $manager->overrideTempBaseDir($this->baseDir);
+ }
+ return $manager;
+ }
+
+ public function testGetFile(): void {
+ $manager = $this->getManager();
+ $file = $manager->getTemporaryFile('txt');
+ $this->assertStringEndsWith('.txt', $file);
+ $this->assertTrue(is_file($file));
+ $this->assertTrue(is_writable($file));
+
+ file_put_contents($file, 'bar');
+ $this->assertEquals('bar', file_get_contents($file));
+ }
+
+ public function testGetFolder(): void {
+ $manager = $this->getManager();
+ $folder = $manager->getTemporaryFolder();
+ $this->assertStringEndsWith('/', $folder);
+ $this->assertTrue(is_dir($folder));
+ $this->assertTrue(is_writable($folder));
+
+ file_put_contents($folder . 'foo.txt', 'bar');
+ $this->assertEquals('bar', file_get_contents($folder . 'foo.txt'));
+ }
+
+ public function testCleanFiles(): void {
+ $manager = $this->getManager();
+ $file1 = $manager->getTemporaryFile('txt');
+ $file2 = $manager->getTemporaryFile('txt');
+ $this->assertTrue(file_exists($file1));
+ $this->assertTrue(file_exists($file2));
+
+ $manager->clean();
+
+ $this->assertFalse(file_exists($file1));
+ $this->assertFalse(file_exists($file2));
+ }
+
+ public function testCleanFolder(): void {
+ $manager = $this->getManager();
+ $folder1 = $manager->getTemporaryFolder();
+ $folder2 = $manager->getTemporaryFolder();
+ touch($folder1 . 'foo.txt');
+ touch($folder1 . 'bar.txt');
+ $this->assertTrue(file_exists($folder1));
+ $this->assertTrue(file_exists($folder2));
+ $this->assertTrue(file_exists($folder1 . 'foo.txt'));
+ $this->assertTrue(file_exists($folder1 . 'bar.txt'));
+
+ $manager->clean();
+
+ $this->assertFalse(file_exists($folder1));
+ $this->assertFalse(file_exists($folder2));
+ $this->assertFalse(file_exists($folder1 . 'foo.txt'));
+ $this->assertFalse(file_exists($folder1 . 'bar.txt'));
+ }
+
+ public function testCleanOld(): void {
+ $manager = $this->getManager();
+ $oldFile = $manager->getTemporaryFile('txt');
+ $newFile = $manager->getTemporaryFile('txt');
+ $folder = $manager->getTemporaryFolder();
+ $nonOcFile = $this->baseDir . '/foo.txt';
+ file_put_contents($nonOcFile, 'bar');
+
+ $past = time() - 2 * 3600;
+ touch($oldFile, $past);
+ touch($folder, $past);
+ touch($nonOcFile, $past);
+
+ $manager2 = $this->getManager();
+ $manager2->cleanOld();
+ $this->assertFalse(file_exists($oldFile));
+ $this->assertFalse(file_exists($folder));
+ $this->assertTrue(file_exists($nonOcFile));
+ $this->assertTrue(file_exists($newFile));
+ }
+
+ public function testLogCantCreateFile(): void {
+ $this->markTestSkipped('TODO: Disable because fails on drone');
+
+ $logger = $this->createMock(LoggerInterface::class);
+ $manager = $this->getManager($logger);
+ chmod($this->baseDir, 0500);
+ $logger->expects($this->once())
+ ->method('warning')
+ ->with($this->stringContains('Can not create a temporary file in directory'));
+ $this->assertFalse($manager->getTemporaryFile('txt'));
+ }
+
+ public function testLogCantCreateFolder(): void {
+ $this->markTestSkipped('TODO: Disable because fails on drone');
+
+ $logger = $this->createMock(LoggerInterface::class);
+ $manager = $this->getManager($logger);
+ chmod($this->baseDir, 0500);
+ $logger->expects($this->once())
+ ->method('warning')
+ ->with($this->stringContains('Can not create a temporary folder in directory'));
+ $this->assertFalse($manager->getTemporaryFolder());
+ }
+
+ public function testGenerateTemporaryPathWithPostfix(): void {
+ $logger = $this->createMock(LoggerInterface::class);
+ $tmpManager = self::invokePrivate(
+ $this->getManager($logger),
+ 'generateTemporaryPath',
+ ['postfix']
+ );
+
+ $this->assertStringEndsWith('.postfix', $tmpManager);
+ }
+
+ public function testGenerateTemporaryPathTraversal(): void {
+ $logger = $this->createMock(LoggerInterface::class);
+ $tmpManager = self::invokePrivate(
+ $this->getManager($logger),
+ 'generateTemporaryPath',
+ ['../Traversal\\../FileName']
+ );
+
+ $this->assertStringEndsNotWith('./Traversal\\../FileName', $tmpManager);
+ $this->assertStringEndsWith('.Traversal..FileName', $tmpManager);
+ }
+
+ public function testGetTempBaseDirFromConfig(): void {
+ $dir = $this->getManager()->getTemporaryFolder();
+
+ $config = $this->createMock(IConfig::class);
+ $config->expects($this->once())
+ ->method('getSystemValue')
+ ->with('tempdirectory', null)
+ ->willReturn($dir);
+
+ $this->baseDir = null; // prevent override
+ $tmpManager = $this->getManager(null, $config);
+
+ $this->assertEquals($dir, $tmpManager->getTempBaseDir());
+ }
+}