namespace Friendica\Test\src\Core\Lock;
-use Friendica\App;
+use Friendica\BaseObject;
use Friendica\Core\Config;
-use PHPUnit\Framework\TestCase;
+use Friendica\Test\DatabaseTest;
-abstract class LockTest extends TestCase
+abstract class LockTest extends DatabaseTest
{
/**
* @var \Friendica\Core\Lock\ILockDriver
protected function setUp()
{
- global $a;
parent::setUp();
$this->instance = $this->getInstance();
+ $this->instance->releaseAll();
// Reusable App object
- $this->app = new App(__DIR__.'/../');
- $a = $this->app;
+ $this->app = BaseObject::getApp();
// Default config
Config::set('config', 'hostname', 'localhost');
Config::set('system', 'theme', 'system_theme');
}
+ protected function tearDown()
+ {
+ parent::tearDown();
+ $this->instance->releaseAll();
+ }
+
+ /**
+ * @small
+ */
public function testLock() {
- $this->instance->acquireLock('foo', 1);
+ $this->assertFalse($this->instance->isLocked('foo'));
+ $this->assertTrue($this->instance->acquireLock('foo', 1));
$this->assertTrue($this->instance->isLocked('foo'));
$this->assertFalse($this->instance->isLocked('bar'));
}
+ /**
+ * @small
+ */
public function testDoubleLock() {
- $this->instance->acquireLock('foo', 1);
+ $this->assertFalse($this->instance->isLocked('foo'));
+ $this->assertTrue($this->instance->acquireLock('foo', 1));
$this->assertTrue($this->instance->isLocked('foo'));
// We already locked it
$this->assertTrue($this->instance->acquireLock('foo', 1));
}
+ /**
+ * @small
+ */
public function testReleaseLock() {
- $this->instance->acquireLock('foo', 1);
+ $this->assertFalse($this->instance->isLocked('foo'));
+ $this->assertTrue($this->instance->acquireLock('foo', 1));
$this->assertTrue($this->instance->isLocked('foo'));
$this->instance->releaseLock('foo');
$this->assertFalse($this->instance->isLocked('foo'));
}
+ /**
+ * @small
+ */
public function testReleaseAll() {
- $this->instance->acquireLock('foo', 1);
- $this->instance->acquireLock('bar', 1);
- $this->instance->acquireLock('nice', 1);
+ $this->assertTrue($this->instance->acquireLock('foo', 1));
+ $this->assertTrue($this->instance->acquireLock('bar', 1));
+ $this->assertTrue($this->instance->acquireLock('nice', 1));
+
+ $this->assertTrue($this->instance->isLocked('foo'));
+ $this->assertTrue($this->instance->isLocked('bar'));
+ $this->assertTrue($this->instance->isLocked('nice'));
$this->instance->releaseAll();
$this->assertFalse($this->instance->isLocked('nice'));
}
+ /**
+ * @small
+ */
public function testReleaseAfterUnlock() {
- $this->instance->acquireLock('foo', 1);
- $this->instance->acquireLock('bar', 1);
- $this->instance->acquireLock('nice', 1);
+ $this->assertFalse($this->instance->isLocked('foo'));
+ $this->assertFalse($this->instance->isLocked('bar'));
+ $this->assertFalse($this->instance->isLocked('nice'));
+ $this->assertTrue($this->instance->acquireLock('foo', 1));
+ $this->assertTrue($this->instance->acquireLock('bar', 1));
+ $this->assertTrue($this->instance->acquireLock('nice', 1));
$this->instance->releaseLock('foo');
+ $this->assertFalse($this->instance->isLocked('foo'));
+ $this->assertTrue($this->instance->isLocked('bar'));
+ $this->assertTrue($this->instance->isLocked('nice'));
+
$this->instance->releaseAll();
$this->assertFalse($this->instance->isLocked('bar'));
- $this->assertFalse($this->instance->isLocked('#/$%ยง'));
+ $this->assertFalse($this->instance->isLocked('nice'));
+ }
+
+ /**
+ * @medium
+ */
+ function testLockTTL() {
+ $this->assertFalse($this->instance->isLocked('foo'));
+ $this->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
+ $this->assertTrue($this->instance->acquireLock('foo', 2, 1));
+ $this->assertTrue($this->instance->acquireLock('bar', 2, 3));
+
+ $this->assertTrue($this->instance->isLocked('foo'));
+ $this->assertTrue($this->instance->isLocked('bar'));
+
+ sleep(2);
+
+ $this->assertFalse($this->instance->isLocked('foo'));
+ $this->assertTrue($this->instance->isLocked('bar'));
+
+ sleep(2);
+
+ $this->assertFalse($this->instance->isLocked('foo'));
+ $this->assertFalse($this->instance->isLocked('bar'));
}
-}
\ No newline at end of file
+}