aboutsummaryrefslogtreecommitdiffstats
path: root/apps/settings/tests/SetupChecks/AppDirsWithDifferentOwnerTest.php
blob: 423f932dcf50987f9a6308771cafdfa60f7c7700 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?php

declare(strict_types=1);

/**
 * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
 * SPDX-License-Identifier: AGPL-3.0-or-later
 */
namespace OCA\Settings\Tests\SetupChecks;

use OCA\Settings\SetupChecks\AppDirsWithDifferentOwner;
use OCP\IL10N;
use Test\TestCase;

class AppDirsWithDifferentOwnerTest extends TestCase {
	private IL10N $l10n;
	private AppDirsWithDifferentOwner $check;

	/**
	 * Holds a list of directories created during tests.
	 *
	 * @var array
	 */
	private $dirsToRemove = [];

	protected function setUp(): void {
		parent::setUp();

		$this->l10n = $this->createMock(IL10N::class);
		$this->l10n->expects($this->any())
			->method('t')
			->willReturnCallback(function ($message, array $replace) {
				return vsprintf($message, $replace);
			});
		$this->check = new AppDirsWithDifferentOwner(
			$this->l10n,
		);
	}

	/**
	 * Setups a temp directory and some subdirectories.
	 * Then calls the 'getAppDirsWithDifferentOwner' method.
	 * The result is expected to be empty since
	 * there are no directories with different owners than the current user.
	 *
	 * @return void
	 */
	public function testAppDirectoryOwnersOk(): void {
		$tempDir = tempnam(sys_get_temp_dir(), 'apps') . 'dir';
		mkdir($tempDir);
		mkdir($tempDir . DIRECTORY_SEPARATOR . 'app1');
		mkdir($tempDir . DIRECTORY_SEPARATOR . 'app2');
		$this->dirsToRemove[] = $tempDir . DIRECTORY_SEPARATOR . 'app1';
		$this->dirsToRemove[] = $tempDir . DIRECTORY_SEPARATOR . 'app2';
		$this->dirsToRemove[] = $tempDir;
		\OC::$APPSROOTS = [
			[
				'path' => $tempDir,
				'url' => '/apps',
				'writable' => true,
			],
		];
		$this->assertSame(
			[],
			$this->invokePrivate($this->check, 'getAppDirsWithDifferentOwner', [posix_getuid()])
		);
	}

	/**
	 * Calls the check for a none existing app root that is marked as not writable.
	 * It's expected that no error happens since the check shouldn't apply.
	 *
	 * @return void
	 */
	public function testAppDirectoryOwnersNotWritable(): void {
		$tempDir = tempnam(sys_get_temp_dir(), 'apps') . 'dir';
		\OC::$APPSROOTS = [
			[
				'path' => $tempDir,
				'url' => '/apps',
				'writable' => false,
			],
		];
		$this->assertSame(
			[],
			$this->invokePrivate($this->check, 'getAppDirsWithDifferentOwner', [posix_getuid()])
		);
	}

	/**
	 * Removes directories created during tests.
	 *
	 * @after
	 * @return void
	 */
	public function removeTestDirectories() {
		foreach ($this->dirsToRemove as $dirToRemove) {
			rmdir($dirToRemove);
		}
		$this->dirsToRemove = [];
	}
}