You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
271 lines
7.4 KiB
271 lines
7.4 KiB
<?php
|
|
|
|
/**
|
|
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
|
|
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
*/
|
|
namespace Test\Files\Mount;
|
|
|
|
use OC\Files\Mount\ObjectHomeMountProvider;
|
|
use OC\Files\ObjectStore\PrimaryObjectStoreConfig;
|
|
use OCP\App\IAppManager;
|
|
use OCP\Files\ObjectStore\IObjectStore;
|
|
use OCP\Files\Storage\IStorageFactory;
|
|
use OCP\IConfig;
|
|
use OCP\IUser;
|
|
|
|
class ObjectHomeMountProviderTest extends \Test\TestCase {
|
|
/** @var ObjectHomeMountProvider */
|
|
protected $provider;
|
|
|
|
/** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */
|
|
protected $config;
|
|
|
|
/** @var IUser|\PHPUnit\Framework\MockObject\MockObject */
|
|
protected $user;
|
|
|
|
/** @var IStorageFactory|\PHPUnit\Framework\MockObject\MockObject */
|
|
protected $loader;
|
|
|
|
protected function setUp(): void {
|
|
parent::setUp();
|
|
|
|
$this->config = $this->createMock(IConfig::class);
|
|
$this->user = $this->createMock(IUser::class);
|
|
$this->loader = $this->createMock(IStorageFactory::class);
|
|
|
|
$objectStoreConfig = new PrimaryObjectStoreConfig($this->config, $this->createMock(IAppManager::class));
|
|
$this->provider = new ObjectHomeMountProvider($objectStoreConfig);
|
|
}
|
|
|
|
public function testSingleBucket(): void {
|
|
$this->config->method('getSystemValue')
|
|
->willReturnCallback(function ($key, $default) {
|
|
if ($key === 'objectstore') {
|
|
return [
|
|
'class' => 'Test\Files\Mount\FakeObjectStore',
|
|
'arguments' => [
|
|
'foo' => 'bar'
|
|
],
|
|
];
|
|
} else {
|
|
return $default;
|
|
}
|
|
});
|
|
|
|
$mount = $this->provider->getHomeMountForUser($this->user, $this->loader);
|
|
$arguments = $this->invokePrivate($mount, 'arguments');
|
|
|
|
$objectStore = $arguments['objectstore'];
|
|
$this->assertInstanceOf(FakeObjectStore::class, $objectStore);
|
|
$this->assertEquals(['foo' => 'bar', 'multibucket' => false], $objectStore->getArguments());
|
|
}
|
|
|
|
public function testMultiBucket(): void {
|
|
$this->config->method('getSystemValue')
|
|
->willReturnCallback(function ($key, $default) {
|
|
if ($key === 'objectstore_multibucket') {
|
|
return [
|
|
'class' => 'Test\Files\Mount\FakeObjectStore',
|
|
'arguments' => [
|
|
'foo' => 'bar'
|
|
],
|
|
];
|
|
} else {
|
|
return $default;
|
|
}
|
|
});
|
|
|
|
$this->user->method('getUID')
|
|
->willReturn('uid');
|
|
$this->loader->expects($this->never())->method($this->anything());
|
|
|
|
$this->config->method('getUserValue')
|
|
->willReturn(null);
|
|
|
|
$this->config
|
|
->method('setUserValue')
|
|
->with(
|
|
$this->equalTo('uid'),
|
|
$this->equalTo('homeobjectstore'),
|
|
$this->equalTo('bucket'),
|
|
$this->equalTo('49'),
|
|
$this->equalTo(null)
|
|
);
|
|
|
|
$mount = $this->provider->getHomeMountForUser($this->user, $this->loader);
|
|
$arguments = $this->invokePrivate($mount, 'arguments');
|
|
|
|
$objectStore = $arguments['objectstore'];
|
|
$this->assertInstanceOf(FakeObjectStore::class, $objectStore);
|
|
$this->assertEquals(['foo' => 'bar', 'bucket' => 49, 'multibucket' => true], $objectStore->getArguments());
|
|
}
|
|
|
|
public function testMultiBucketWithPrefix(): void {
|
|
$this->config->method('getSystemValue')
|
|
->willReturnCallback(function ($key, $default) {
|
|
if ($key === 'objectstore_multibucket') {
|
|
return [
|
|
'class' => 'Test\Files\Mount\FakeObjectStore',
|
|
'arguments' => [
|
|
'foo' => 'bar',
|
|
'bucket' => 'myBucketPrefix',
|
|
],
|
|
];
|
|
} else {
|
|
return $default;
|
|
}
|
|
});
|
|
|
|
$this->user->method('getUID')
|
|
->willReturn('uid');
|
|
$this->loader->expects($this->never())->method($this->anything());
|
|
|
|
$this->config
|
|
->method('getUserValue')
|
|
->willReturn(null);
|
|
|
|
$this->config->expects($this->once())
|
|
->method('setUserValue')
|
|
->with(
|
|
$this->equalTo('uid'),
|
|
$this->equalTo('homeobjectstore'),
|
|
$this->equalTo('bucket'),
|
|
$this->equalTo('myBucketPrefix49'),
|
|
$this->equalTo(null)
|
|
);
|
|
|
|
$mount = $this->provider->getHomeMountForUser($this->user, $this->loader);
|
|
$arguments = $this->invokePrivate($mount, 'arguments');
|
|
|
|
$objectStore = $arguments['objectstore'];
|
|
$this->assertInstanceOf(FakeObjectStore::class, $objectStore);
|
|
$this->assertEquals(['foo' => 'bar', 'bucket' => 'myBucketPrefix49', 'multibucket' => true], $objectStore->getArguments());
|
|
}
|
|
|
|
public function testMultiBucketBucketAlreadySet(): void {
|
|
$this->config->method('getSystemValue')
|
|
->willReturnCallback(function ($key, $default) {
|
|
if ($key === 'objectstore_multibucket') {
|
|
return [
|
|
'class' => 'Test\Files\Mount\FakeObjectStore',
|
|
'arguments' => [
|
|
'foo' => 'bar',
|
|
'bucket' => 'myBucketPrefix',
|
|
],
|
|
];
|
|
} else {
|
|
return $default;
|
|
}
|
|
});
|
|
|
|
$this->user->method('getUID')
|
|
->willReturn('uid');
|
|
$this->loader->expects($this->never())->method($this->anything());
|
|
|
|
$this->config
|
|
->method('getUserValue')
|
|
->willReturnCallback(function ($uid, $app, $key, $default) {
|
|
if ($uid === 'uid' && $app === 'homeobjectstore' && $key === 'bucket') {
|
|
return 'awesomeBucket1';
|
|
} else {
|
|
return $default;
|
|
}
|
|
});
|
|
|
|
$this->config->expects($this->never())
|
|
->method('setUserValue');
|
|
|
|
$mount = $this->provider->getHomeMountForUser($this->user, $this->loader);
|
|
$arguments = $this->invokePrivate($mount, 'arguments');
|
|
|
|
$objectStore = $arguments['objectstore'];
|
|
$this->assertInstanceOf(FakeObjectStore::class, $objectStore);
|
|
$this->assertEquals(['foo' => 'bar', 'bucket' => 'awesomeBucket1', 'multibucket' => true], $objectStore->getArguments());
|
|
}
|
|
|
|
public function testMultiBucketConfigFirst(): void {
|
|
$this->config->method('getSystemValue')
|
|
->willReturnCallback(function ($key, $default) {
|
|
if ($key === 'objectstore_multibucket') {
|
|
return [
|
|
'class' => 'Test\Files\Mount\FakeObjectStore',
|
|
'arguments' => [
|
|
'foo' => 'bar',
|
|
'bucket' => 'myBucketPrefix',
|
|
],
|
|
];
|
|
} else {
|
|
return $default;
|
|
}
|
|
});
|
|
|
|
$this->user->method('getUID')
|
|
->willReturn('uid');
|
|
$this->loader->expects($this->never())->method($this->anything());
|
|
|
|
$mount = $this->provider->getHomeMountForUser($this->user, $this->loader);
|
|
$this->assertInstanceOf('OC\Files\Mount\MountPoint', $mount);
|
|
}
|
|
|
|
public function testMultiBucketConfigFirstFallBackSingle(): void {
|
|
$this->config
|
|
->method('getSystemValue')->willReturnMap([
|
|
['objectstore_multibucket', null, null],
|
|
['objectstore', null, [
|
|
'class' => 'Test\Files\Mount\FakeObjectStore',
|
|
'arguments' => [
|
|
'foo' => 'bar',
|
|
'bucket' => 'myBucketPrefix',
|
|
],
|
|
]],
|
|
]);
|
|
|
|
$this->user->method('getUID')
|
|
->willReturn('uid');
|
|
$this->loader->expects($this->never())->method($this->anything());
|
|
|
|
$mount = $this->provider->getHomeMountForUser($this->user, $this->loader);
|
|
$this->assertInstanceOf('OC\Files\Mount\MountPoint', $mount);
|
|
}
|
|
|
|
public function testNoObjectStore(): void {
|
|
$this->config->method('getSystemValue')
|
|
->willReturnCallback(function ($key, $default) {
|
|
return $default;
|
|
});
|
|
|
|
$mount = $this->provider->getHomeMountForUser($this->user, $this->loader);
|
|
$this->assertNull($mount);
|
|
}
|
|
}
|
|
|
|
class FakeObjectStore implements IObjectStore {
|
|
public function __construct(
|
|
private array $arguments,
|
|
) {
|
|
}
|
|
|
|
public function getArguments() {
|
|
return $this->arguments;
|
|
}
|
|
|
|
public function getStorageId() {
|
|
}
|
|
|
|
public function readObject($urn) {
|
|
}
|
|
|
|
public function writeObject($urn, $stream, ?string $mimetype = null) {
|
|
}
|
|
|
|
public function deleteObject($urn) {
|
|
}
|
|
|
|
public function objectExists($urn) {
|
|
}
|
|
|
|
public function copyObject($from, $to) {
|
|
}
|
|
}
|