aboutsummaryrefslogtreecommitdiffstats
path: root/tests/lib/Memcache/FactoryTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'tests/lib/Memcache/FactoryTest.php')
-rw-r--r--tests/lib/Memcache/FactoryTest.php139
1 files changed, 139 insertions, 0 deletions
diff --git a/tests/lib/Memcache/FactoryTest.php b/tests/lib/Memcache/FactoryTest.php
new file mode 100644
index 00000000000..e16e079349f
--- /dev/null
+++ b/tests/lib/Memcache/FactoryTest.php
@@ -0,0 +1,139 @@
+<?php
+
+/**
+ * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+namespace Test\Memcache;
+
+use OC\Memcache\Factory;
+use OC\Memcache\NullCache;
+use OCP\HintException;
+use OCP\Profiler\IProfiler;
+use Psr\Log\LoggerInterface;
+
+class Test_Factory_Available_Cache1 extends NullCache {
+ public function __construct($prefix = '') {
+ }
+
+ public static function isAvailable(): bool {
+ return true;
+ }
+}
+
+class Test_Factory_Available_Cache2 extends NullCache {
+ public function __construct($prefix = '') {
+ }
+
+ public static function isAvailable(): bool {
+ return true;
+ }
+}
+
+class Test_Factory_Unavailable_Cache1 extends NullCache {
+ public function __construct($prefix = '') {
+ }
+
+ public static function isAvailable(): bool {
+ return false;
+ }
+}
+
+class Test_Factory_Unavailable_Cache2 extends NullCache {
+ public function __construct($prefix = '') {
+ }
+
+ public static function isAvailable(): bool {
+ return false;
+ }
+}
+
+/**
+ * @group Memcache
+ */
+class FactoryTest extends \Test\TestCase {
+ public const AVAILABLE1 = '\\Test\\Memcache\\Test_Factory_Available_Cache1';
+ public const AVAILABLE2 = '\\Test\\Memcache\\Test_Factory_Available_Cache2';
+ public const UNAVAILABLE1 = '\\Test\\Memcache\\Test_Factory_Unavailable_Cache1';
+ public const UNAVAILABLE2 = '\\Test\\Memcache\\Test_Factory_Unavailable_Cache2';
+
+ public static function cacheAvailabilityProvider(): array {
+ return [
+ [
+ // local and distributed available
+ self::AVAILABLE1, self::AVAILABLE2, null,
+ self::AVAILABLE1, self::AVAILABLE2, Factory::NULL_CACHE
+ ],
+ [
+ // local and distributed null
+ null, null, null,
+ Factory::NULL_CACHE, Factory::NULL_CACHE, Factory::NULL_CACHE
+ ],
+ [
+ // local available, distributed null (most common scenario)
+ self::AVAILABLE1, null, null,
+ self::AVAILABLE1, self::AVAILABLE1, Factory::NULL_CACHE
+ ],
+ [
+ // locking cache available
+ null, null, self::AVAILABLE1,
+ Factory::NULL_CACHE, Factory::NULL_CACHE, self::AVAILABLE1
+ ],
+ [
+ // locking cache unavailable: no exception here in the factory
+ null, null, self::UNAVAILABLE1,
+ Factory::NULL_CACHE, Factory::NULL_CACHE, Factory::NULL_CACHE
+ ]
+ ];
+ }
+
+ public static function cacheUnavailableProvider(): array {
+ return [
+ [
+ // local available, distributed unavailable
+ self::AVAILABLE1, self::UNAVAILABLE1
+ ],
+ [
+ // local unavailable, distributed available
+ self::UNAVAILABLE1, self::AVAILABLE1
+ ],
+ [
+ // local and distributed unavailable
+ self::UNAVAILABLE1, self::UNAVAILABLE2
+ ],
+ ];
+ }
+
+ #[\PHPUnit\Framework\Attributes\DataProvider('cacheAvailabilityProvider')]
+ public function testCacheAvailability($localCache, $distributedCache, $lockingCache,
+ $expectedLocalCache, $expectedDistributedCache, $expectedLockingCache): void {
+ $logger = $this->getMockBuilder(LoggerInterface::class)->getMock();
+ $profiler = $this->getMockBuilder(IProfiler::class)->getMock();
+ $factory = new Factory(fn () => 'abc', $logger, $profiler, $localCache, $distributedCache, $lockingCache);
+ $this->assertTrue(is_a($factory->createLocal(), $expectedLocalCache));
+ $this->assertTrue(is_a($factory->createDistributed(), $expectedDistributedCache));
+ $this->assertTrue(is_a($factory->createLocking(), $expectedLockingCache));
+ }
+
+ #[\PHPUnit\Framework\Attributes\DataProvider('cacheUnavailableProvider')]
+ public function testCacheNotAvailableException($localCache, $distributedCache): void {
+ $this->expectException(HintException::class);
+
+ $logger = $this->getMockBuilder(LoggerInterface::class)->getMock();
+ $profiler = $this->getMockBuilder(IProfiler::class)->getMock();
+ new Factory(fn () => 'abc', $logger, $profiler, $localCache, $distributedCache);
+ }
+
+ public function testCreateInMemory(): void {
+ $logger = $this->getMockBuilder(LoggerInterface::class)->getMock();
+ $profiler = $this->getMockBuilder(IProfiler::class)->getMock();
+ $factory = new Factory(fn () => 'abc', $logger, $profiler, null, null, null);
+
+ $cache = $factory->createInMemory();
+ $cache->set('test', 48);
+
+ self::assertSame(48, $cache->get('test'));
+ }
+}