--- /dev/null
+<?php
+
+// Copyright (C) 2010-2024, the Friendica project
+// SPDX-FileCopyrightText: 2010-2024 the Friendica project
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+namespace Friendica\Test;
+
+use Friendica\Core\Lock\Capability\ICanLock;
+use Friendica\Test\MockedTestCase;
+
+abstract class LockTestCase extends MockedTestCase
+{
+ /**
+ * @var int Start time of the mock (used for time operations)
+ */
+ protected $startTime = 1417011228;
+
+ /**
+ * @var ICanLock
+ */
+ protected $instance;
+
+ abstract protected function getInstance();
+
+ protected function setUp(): void
+ {
+ parent::setUp();
+
+ $this->instance = $this->getInstance();
+ $this->instance->releaseAll(true);
+ }
+
+ protected function tearDown(): void
+ {
+ $this->instance->releaseAll(true);
+ parent::tearDown();
+ }
+
+ /**
+ * @small
+ */
+ public function testLock()
+ {
+ self::assertFalse($this->instance->isLocked('foo'));
+ self::assertTrue($this->instance->acquire('foo', 1));
+ self::assertTrue($this->instance->isLocked('foo'));
+ self::assertFalse($this->instance->isLocked('bar'));
+ }
+
+ /**
+ * @small
+ */
+ public function testDoubleLock()
+ {
+ self::assertFalse($this->instance->isLocked('foo'));
+ self::assertTrue($this->instance->acquire('foo', 1));
+ self::assertTrue($this->instance->isLocked('foo'));
+ // We already locked it
+ self::assertTrue($this->instance->acquire('foo', 1));
+ }
+
+ /**
+ * @small
+ */
+ public function testReleaseLock()
+ {
+ self::assertFalse($this->instance->isLocked('foo'));
+ self::assertTrue($this->instance->acquire('foo', 1));
+ self::assertTrue($this->instance->isLocked('foo'));
+ $this->instance->release('foo');
+ self::assertFalse($this->instance->isLocked('foo'));
+ }
+
+ /**
+ * @small
+ */
+ public function testReleaseAll()
+ {
+ self::assertTrue($this->instance->acquire('foo', 1));
+ self::assertTrue($this->instance->acquire('bar', 1));
+ self::assertTrue($this->instance->acquire('nice', 1));
+
+ self::assertTrue($this->instance->isLocked('foo'));
+ self::assertTrue($this->instance->isLocked('bar'));
+ self::assertTrue($this->instance->isLocked('nice'));
+
+ self::assertTrue($this->instance->releaseAll());
+
+ self::assertFalse($this->instance->isLocked('foo'));
+ self::assertFalse($this->instance->isLocked('bar'));
+ self::assertFalse($this->instance->isLocked('nice'));
+ }
+
+ /**
+ * @small
+ */
+ public function testReleaseAfterUnlock()
+ {
+ self::assertFalse($this->instance->isLocked('foo'));
+ self::assertFalse($this->instance->isLocked('bar'));
+ self::assertFalse($this->instance->isLocked('nice'));
+ self::assertTrue($this->instance->acquire('foo', 1));
+ self::assertTrue($this->instance->acquire('bar', 1));
+ self::assertTrue($this->instance->acquire('nice', 1));
+
+ self::assertTrue($this->instance->release('foo'));
+
+ self::assertFalse($this->instance->isLocked('foo'));
+ self::assertTrue($this->instance->isLocked('bar'));
+ self::assertTrue($this->instance->isLocked('nice'));
+
+ self::assertTrue($this->instance->releaseAll());
+
+ self::assertFalse($this->instance->isLocked('bar'));
+ self::assertFalse($this->instance->isLocked('nice'));
+ }
+
+ /**
+ * @small
+ */
+ public function testReleaseWitTTL()
+ {
+ self::assertFalse($this->instance->isLocked('test'));
+ self::assertTrue($this->instance->acquire('test', 1, 10));
+ self::assertTrue($this->instance->isLocked('test'));
+ self::assertTrue($this->instance->release('test'));
+ self::assertFalse($this->instance->isLocked('test'));
+ }
+
+ /**
+ * @small
+ */
+ public function testGetLocks()
+ {
+ self::assertTrue($this->instance->acquire('foo', 1));
+ self::assertTrue($this->instance->acquire('bar', 1));
+ self::assertTrue($this->instance->acquire('nice', 1));
+
+ self::assertTrue($this->instance->isLocked('foo'));
+ self::assertTrue($this->instance->isLocked('bar'));
+ self::assertTrue($this->instance->isLocked('nice'));
+
+ $locks = $this->instance->getLocks();
+
+ self::assertContains('foo', $locks);
+ self::assertContains('bar', $locks);
+ self::assertContains('nice', $locks);
+ }
+
+ /**
+ * @small
+ */
+ public function testGetLocksWithPrefix()
+ {
+ self::assertTrue($this->instance->acquire('foo', 1));
+ self::assertTrue($this->instance->acquire('test1', 1));
+ self::assertTrue($this->instance->acquire('test2', 1));
+
+ self::assertTrue($this->instance->isLocked('foo'));
+ self::assertTrue($this->instance->isLocked('test1'));
+ self::assertTrue($this->instance->isLocked('test2'));
+
+ $locks = $this->instance->getLocks('test');
+
+ self::assertContains('test1', $locks);
+ self::assertContains('test2', $locks);
+ self::assertNotContains('foo', $locks);
+ }
+
+ /**
+ * @medium
+ */
+ public function testLockTTL()
+ {
+ static::markTestSkipped('taking too much time without mocking');
+
+ self::assertFalse($this->instance->isLocked('foo'));
+ self::assertFalse($this->instance->isLocked('bar'));
+
+ // TODO [nupplaphil] - Because of the Datetime-Utils for the database, we have to wait a FULL second between the checks to invalidate the db-locks/cache
+ self::assertTrue($this->instance->acquire('foo', 2, 1));
+ self::assertTrue($this->instance->acquire('bar', 2, 3));
+
+ self::assertTrue($this->instance->isLocked('foo'));
+ self::assertTrue($this->instance->isLocked('bar'));
+
+ sleep(2);
+
+ self::assertFalse($this->instance->isLocked('foo'));
+ self::assertTrue($this->instance->isLocked('bar'));
+
+ sleep(2);
+
+ self::assertFalse($this->instance->isLocked('foo'));
+ self::assertFalse($this->instance->isLocked('bar'));
+ }
+
+ /**
+ * Test if releasing a non-existing lock doesn't throw errors
+ */
+ public function testReleaseLockWithoutLock()
+ {
+ self::assertFalse($this->instance->isLocked('wrongLock'));
+ self::assertFalse($this->instance->release('wrongLock'));
+ }
+}
use Friendica\Core\Cache\Type\APCuCache;
use Friendica\Core\Lock\Type\CacheLock;
+use Friendica\Test\LockTestCase;
/**
* @group APCU
*/
-class APCuCacheLockTest extends LockTest
+class APCuCacheLockTest extends LockTestCase
{
protected function setUp(): void
{
protected function getInstance()
{
- return new \Friendica\Core\Lock\Type\CacheLock(new APCuCache('localhost'));
+ return new CacheLock(new APCuCache('localhost'));
}
}
use Friendica\Core\Cache\Type\ArrayCache;
use Friendica\Core\Lock\Type\CacheLock;
+use Friendica\Test\LockTestCase;
-class ArrayCacheLockTest extends LockTest
+class ArrayCacheLockTest extends LockTestCase
{
protected function getInstance()
{
- return new \Friendica\Core\Lock\Type\CacheLock(new ArrayCache('localhost'));
+ return new CacheLock(new ArrayCache('localhost'));
}
/**
namespace Friendica\Test\src\Core\Lock;
use Friendica\Core\Lock\Type\DatabaseLock;
+use Friendica\Test\LockTestCase;
use Friendica\Test\Util\CreateDatabaseTrait;
-class DatabaseLockDriverTest extends LockTest
+class DatabaseLockDriverTest extends LockTestCase
{
use CreateDatabaseTrait;
+++ /dev/null
-<?php
-
-// Copyright (C) 2010-2024, the Friendica project
-// SPDX-FileCopyrightText: 2010-2024 the Friendica project
-//
-// SPDX-License-Identifier: AGPL-3.0-or-later
-
-namespace Friendica\Test\src\Core\Lock;
-
-use Friendica\Core\Lock\Capability\ICanLock;
-use Friendica\Test\MockedTestCase;
-
-abstract class LockTest extends MockedTestCase
-{
- /**
- * @var int Start time of the mock (used for time operations)
- */
- protected $startTime = 1417011228;
-
- /**
- * @var ICanLock
- */
- protected $instance;
-
- abstract protected function getInstance();
-
- protected function setUp(): void
- {
- parent::setUp();
-
- $this->instance = $this->getInstance();
- $this->instance->releaseAll(true);
- }
-
- protected function tearDown(): void
- {
- $this->instance->releaseAll(true);
- parent::tearDown();
- }
-
- /**
- * @small
- */
- public function testLock()
- {
- self::assertFalse($this->instance->isLocked('foo'));
- self::assertTrue($this->instance->acquire('foo', 1));
- self::assertTrue($this->instance->isLocked('foo'));
- self::assertFalse($this->instance->isLocked('bar'));
- }
-
- /**
- * @small
- */
- public function testDoubleLock()
- {
- self::assertFalse($this->instance->isLocked('foo'));
- self::assertTrue($this->instance->acquire('foo', 1));
- self::assertTrue($this->instance->isLocked('foo'));
- // We already locked it
- self::assertTrue($this->instance->acquire('foo', 1));
- }
-
- /**
- * @small
- */
- public function testReleaseLock()
- {
- self::assertFalse($this->instance->isLocked('foo'));
- self::assertTrue($this->instance->acquire('foo', 1));
- self::assertTrue($this->instance->isLocked('foo'));
- $this->instance->release('foo');
- self::assertFalse($this->instance->isLocked('foo'));
- }
-
- /**
- * @small
- */
- public function testReleaseAll()
- {
- self::assertTrue($this->instance->acquire('foo', 1));
- self::assertTrue($this->instance->acquire('bar', 1));
- self::assertTrue($this->instance->acquire('nice', 1));
-
- self::assertTrue($this->instance->isLocked('foo'));
- self::assertTrue($this->instance->isLocked('bar'));
- self::assertTrue($this->instance->isLocked('nice'));
-
- self::assertTrue($this->instance->releaseAll());
-
- self::assertFalse($this->instance->isLocked('foo'));
- self::assertFalse($this->instance->isLocked('bar'));
- self::assertFalse($this->instance->isLocked('nice'));
- }
-
- /**
- * @small
- */
- public function testReleaseAfterUnlock()
- {
- self::assertFalse($this->instance->isLocked('foo'));
- self::assertFalse($this->instance->isLocked('bar'));
- self::assertFalse($this->instance->isLocked('nice'));
- self::assertTrue($this->instance->acquire('foo', 1));
- self::assertTrue($this->instance->acquire('bar', 1));
- self::assertTrue($this->instance->acquire('nice', 1));
-
- self::assertTrue($this->instance->release('foo'));
-
- self::assertFalse($this->instance->isLocked('foo'));
- self::assertTrue($this->instance->isLocked('bar'));
- self::assertTrue($this->instance->isLocked('nice'));
-
- self::assertTrue($this->instance->releaseAll());
-
- self::assertFalse($this->instance->isLocked('bar'));
- self::assertFalse($this->instance->isLocked('nice'));
- }
-
- /**
- * @small
- */
- public function testReleaseWitTTL()
- {
- self::assertFalse($this->instance->isLocked('test'));
- self::assertTrue($this->instance->acquire('test', 1, 10));
- self::assertTrue($this->instance->isLocked('test'));
- self::assertTrue($this->instance->release('test'));
- self::assertFalse($this->instance->isLocked('test'));
- }
-
- /**
- * @small
- */
- public function testGetLocks()
- {
- self::assertTrue($this->instance->acquire('foo', 1));
- self::assertTrue($this->instance->acquire('bar', 1));
- self::assertTrue($this->instance->acquire('nice', 1));
-
- self::assertTrue($this->instance->isLocked('foo'));
- self::assertTrue($this->instance->isLocked('bar'));
- self::assertTrue($this->instance->isLocked('nice'));
-
- $locks = $this->instance->getLocks();
-
- self::assertContains('foo', $locks);
- self::assertContains('bar', $locks);
- self::assertContains('nice', $locks);
- }
-
- /**
- * @small
- */
- public function testGetLocksWithPrefix()
- {
- self::assertTrue($this->instance->acquire('foo', 1));
- self::assertTrue($this->instance->acquire('test1', 1));
- self::assertTrue($this->instance->acquire('test2', 1));
-
- self::assertTrue($this->instance->isLocked('foo'));
- self::assertTrue($this->instance->isLocked('test1'));
- self::assertTrue($this->instance->isLocked('test2'));
-
- $locks = $this->instance->getLocks('test');
-
- self::assertContains('test1', $locks);
- self::assertContains('test2', $locks);
- self::assertNotContains('foo', $locks);
- }
-
- /**
- * @medium
- */
- public function testLockTTL()
- {
- static::markTestSkipped('taking too much time without mocking');
-
- self::assertFalse($this->instance->isLocked('foo'));
- self::assertFalse($this->instance->isLocked('bar'));
-
- // TODO [nupplaphil] - Because of the Datetime-Utils for the database, we have to wait a FULL second between the checks to invalidate the db-locks/cache
- self::assertTrue($this->instance->acquire('foo', 2, 1));
- self::assertTrue($this->instance->acquire('bar', 2, 3));
-
- self::assertTrue($this->instance->isLocked('foo'));
- self::assertTrue($this->instance->isLocked('bar'));
-
- sleep(2);
-
- self::assertFalse($this->instance->isLocked('foo'));
- self::assertTrue($this->instance->isLocked('bar'));
-
- sleep(2);
-
- self::assertFalse($this->instance->isLocked('foo'));
- self::assertFalse($this->instance->isLocked('bar'));
- }
-
- /**
- * Test if releasing a non-existing lock doesn't throw errors
- */
- public function testReleaseLockWithoutLock()
- {
- self::assertFalse($this->instance->isLocked('wrongLock'));
- self::assertFalse($this->instance->release('wrongLock'));
- }
-}
use Friendica\Core\Cache\Type\MemcacheCache;
use Friendica\Core\Config\Capability\IManageConfigValues;
use Friendica\Core\Lock\Type\CacheLock;
+use Friendica\Test\LockTestCase;
use Mockery;
/**
* @requires extension Memcache
* @group MEMCACHE
*/
-class MemcacheCacheLockTest extends LockTest
+class MemcacheCacheLockTest extends LockTestCase
{
protected function getInstance()
{
try {
$cache = new MemcacheCache($host, $configMock);
- $lock = new \Friendica\Core\Lock\Type\CacheLock($cache);
+ $lock = new CacheLock($cache);
} catch (Exception $e) {
static::markTestSkipped('Memcache is not available');
}
use Friendica\Core\Cache\Type\MemcachedCache;
use Friendica\Core\Config\Capability\IManageConfigValues;
use Friendica\Core\Lock\Type\CacheLock;
+use Friendica\Test\LockTestCase;
use Mockery;
use Psr\Log\NullLogger;
* @requires extension memcached
* @group MEMCACHED
*/
-class MemcachedCacheLockTest extends LockTest
+class MemcachedCacheLockTest extends LockTestCase
{
protected function getInstance()
{
use Friendica\Core\Cache\Type\RedisCache;
use Friendica\Core\Config\Capability\IManageConfigValues;
use Friendica\Core\Lock\Type\CacheLock;
+use Friendica\Test\LockTestCase;
use Mockery;
/**
* @requires extension redis
* @group REDIS
*/
-class RedisCacheLockTest extends LockTest
+class RedisCacheLockTest extends LockTestCase
{
protected function getInstance()
{
try {
$cache = new RedisCache($host, $configMock);
- $lock = new \Friendica\Core\Lock\Type\CacheLock($cache);
+ $lock = new CacheLock($cache);
} catch (Exception $e) {
static::markTestSkipped('Redis is not available. Error: ' . $e->getMessage());
}
use Friendica\Core\Config\Capability\IManageConfigValues;
use Friendica\Core\Config\Model\ReadOnlyFileConfig;
use Friendica\Core\Config\ValueObject\Cache;
+use Friendica\Core\Lock\Type\SemaphoreLock;
use Friendica\Core\System;
use Friendica\DI;
+use Friendica\Test\LockTestCase;
use Mockery;
use Mockery\MockInterface;
-class SemaphoreLockTest extends LockTest
+class SemaphoreLockTest extends LockTestCase
{
protected function setUp(): void
{
protected function getInstance()
{
- return new \Friendica\Core\Lock\Type\SemaphoreLock();
+ return new SemaphoreLock();
}
/**