3 namespace Friendica\Test\src\Core;
6 use Friendica\Core\Config\IConfiguration;
7 use Friendica\Core\Config\PreloadConfiguration;
8 use Friendica\Core\Session\ISession;
9 use Friendica\Core\StorageManager;
10 use Friendica\Database\Database;
11 use Friendica\Factory\ConfigFactory;
12 use Friendica\Model\Config\Config;
13 use Friendica\Model\Storage;
14 use Friendica\Core\Session;
15 use Friendica\Test\DatabaseTest;
16 use Friendica\Test\Util\Database\StaticDatabase;
17 use Friendica\Test\Util\VFSTrait;
18 use Friendica\Util\ConfigFileLoader;
19 use Friendica\Util\Profiler;
20 use Psr\Log\LoggerInterface;
21 use Psr\Log\NullLogger;
22 use Friendica\Test\Util\SampleStorageBackend;
24 class StorageManagerTest extends DatabaseTest
28 /** @var IConfiguration */
30 /** @var LoggerInterface */
37 public function setUp()
43 $this->logger = new NullLogger();
44 $this->dice = (new Dice())
45 ->addRules(include __DIR__ . '/../../../static/dependencies.config.php')
46 ->addRule(Database::class, ['instanceOf' => StaticDatabase::class, 'shared' => true])
47 ->addRule(ISession::class, ['instanceOf' => Session\Memory::class, 'shared' => true, 'call' => null]);
49 $profiler = \Mockery::mock(Profiler::class);
50 $profiler->shouldReceive('saveTimestamp')->withAnyArgs()->andReturn(true);
52 // load real config to avoid mocking every config-entry which is related to the Database class
53 $configFactory = new ConfigFactory();
54 $loader = new ConfigFileLoader($this->root->url());
55 $configCache = $configFactory->createCache($loader);
57 $this->dba = new StaticDatabase($configCache, $profiler, $this->logger);
59 $configModel = new Config($this->dba);
60 $this->config = new PreloadConfiguration($configCache, $configModel);
64 * Test plain instancing first
66 public function testInstance()
68 $storageManager = new StorageManager($this->dba, $this->config, $this->logger, $this->dice);
70 $this->assertInstanceOf(StorageManager::class, $storageManager);
73 public function dataStorages()
80 'userBackend' => false,
83 'name' => Storage\Database::NAME,
84 'assert' => Storage\Database::class,
85 'assertName' => Storage\Database::NAME,
86 'userBackend' => true,
89 'name' => Storage\Filesystem::NAME,
90 'assert' => Storage\Filesystem::class,
91 'assertName' => Storage\Filesystem::NAME,
92 'userBackend' => true,
95 'name' => Storage\SystemResource::NAME,
96 'assert' => Storage\SystemResource::class,
97 'assertName' => Storage\SystemResource::NAME,
98 // false here, because SystemResource isn't meant to be a user backend,
99 // it's for system resources only
100 'userBackend' => false,
106 'userBackend' => false,
112 * Test the getByName() method
114 * @dataProvider dataStorages
116 public function testGetByName($name, $assert, $assertName)
118 $storageManager = new StorageManager($this->dba, $this->config, $this->logger, $this->dice);
120 $storage = $storageManager->getByName($name);
122 if (!empty($assert)) {
123 $this->assertInstanceOf(Storage\IStorage::class, $storage);
124 $this->assertInstanceOf($assert, $storage);
125 $this->assertEquals($name, $storage::getName());
127 $this->assertNull($storage);
129 $this->assertEquals($assertName, $storage);
133 * Test the isValidBackend() method
135 * @dataProvider dataStorages
137 public function testIsValidBackend($name, $assert, $assertName, $userBackend)
139 $storageManager = new StorageManager($this->dba, $this->config, $this->logger, $this->dice);
141 $this->assertEquals($userBackend, $storageManager->isValidBackend($name));
145 * Test the method listBackends() with default setting
147 public function testListBackends()
149 $storageManager = new StorageManager($this->dba, $this->config, $this->logger, $this->dice);
151 $this->assertEquals(StorageManager::DEFAULT_BACKENDS, $storageManager->listBackends());
155 * Test the method getBackend()
157 * @dataProvider dataStorages
159 public function testGetBackend($name, $assert, $assertName, $userBackend)
161 $storageManager = new StorageManager($this->dba, $this->config, $this->logger, $this->dice);
163 $this->assertNull($storageManager->getBackend());
166 $storageManager->setBackend($name);
168 $this->assertInstanceOf($assert, $storageManager->getBackend());
173 * Test the method getBackend() with a pre-configured backend
175 * @dataProvider dataStorages
177 public function testPresetBackend($name, $assert, $assertName, $userBackend)
179 $this->config->set('storage', 'name', $name);
181 $storageManager = new StorageManager($this->dba, $this->config, $this->logger, $this->dice);
184 $this->assertInstanceOf($assert, $storageManager->getBackend());
186 $this->assertNull($storageManager->getBackend());
191 * Tests the register and unregister methods for a new backend storage class
193 * Uses a sample storage for testing
195 * @see SampleStorageBackend
197 public function testRegisterUnregisterBackends()
199 $storageManager = new StorageManager($this->dba, $this->config, $this->logger, $this->dice);
201 $this->assertTrue($storageManager->register(SampleStorageBackend::class));
203 $this->assertEquals(array_merge(StorageManager::DEFAULT_BACKENDS, [
204 'Sample Storage' => SampleStorageBackend::class,
205 ]), $storageManager->listBackends());
206 $this->assertEquals(array_merge(StorageManager::DEFAULT_BACKENDS, [
207 'Sample Storage' => SampleStorageBackend::class,
208 ]), $this->config->get('storage', 'backends'));
210 $this->assertTrue($storageManager->setBackend(SampleStorageBackend::NAME));
211 $this->assertEquals(SampleStorageBackend::NAME, $this->config->get('storage', 'name'));
213 $this->assertInstanceOf(SampleStorageBackend::class, $storageManager->getBackend());
215 $this->assertTrue($storageManager->unregister(SampleStorageBackend::class));
216 $this->assertEquals(StorageManager::DEFAULT_BACKENDS, $this->config->get('storage', 'backends'));
217 $this->assertEquals(StorageManager::DEFAULT_BACKENDS, $storageManager->listBackends());
219 $this->assertNull($storageManager->getBackend());
220 $this->assertNull($this->config->get('storage', 'name'));
224 * Test moving data to a new storage (currently testing db & filesystem)
226 * @dataProvider dataStorages
228 public function testMoveStorage($name, $assert, $assertName, $userBackend)
234 $this->loadFixture(__DIR__ . '/../../datasets/storage/database.fixture.php', $this->dba);
236 $storageManager = new StorageManager($this->dba, $this->config, $this->logger, $this->dice);
237 $storage = $storageManager->getByName($name);
238 $storageManager->move($storage);
240 $photos = $this->dba->select('photo', ['backend-ref', 'backend-class', 'id', 'data']);
242 while ($photo = $this->dba->fetch($photos)) {
244 $this->assertEmpty($photo['data']);
246 $storage = $storageManager->getByName($photo['backend-class']);
247 $data = $storage->get($photo['backend-ref']);
249 $this->assertNotEmpty($data);