3 namespace Friendica\Test\src\Core\Lock;
5 use Friendica\Core\Logger;
6 use Friendica\Test\MockedTest;
7 use Friendica\Test\Util\AppMockTrait;
8 use Friendica\Test\Util\VFSTrait;
9 use Psr\Log\NullLogger;
11 abstract class LockTest extends MockedTest
17 * @var int Start time of the mock (used for time operations)
19 protected $startTime = 1417011228;
22 * @var \Friendica\Core\Lock\ILockDriver
26 abstract protected function getInstance();
28 protected function setUp()
30 // Reusable App object
32 $this->mockApp($this->root);
34 ->shouldReceive('getHostname')
35 ->andReturn('friendica.local');
37 Logger::init(new NullLogger());
40 $this->instance = $this->getInstance();
41 $this->instance->releaseAll();
44 protected function tearDown()
46 $this->instance->releaseAll();
53 public function testLock() {
54 $this->assertFalse($this->instance->isLocked('foo'));
55 $this->assertTrue($this->instance->acquireLock('foo', 1));
56 $this->assertTrue($this->instance->isLocked('foo'));
57 $this->assertFalse($this->instance->isLocked('bar'));
63 public function testDoubleLock() {
64 $this->assertFalse($this->instance->isLocked('foo'));
65 $this->assertTrue($this->instance->acquireLock('foo', 1));
66 $this->assertTrue($this->instance->isLocked('foo'));
67 // We already locked it
68 $this->assertTrue($this->instance->acquireLock('foo', 1));
74 public function testReleaseLock() {
75 $this->assertFalse($this->instance->isLocked('foo'));
76 $this->assertTrue($this->instance->acquireLock('foo', 1));
77 $this->assertTrue($this->instance->isLocked('foo'));
78 $this->instance->releaseLock('foo');
79 $this->assertFalse($this->instance->isLocked('foo'));
85 public function testReleaseAll() {
86 $this->assertTrue($this->instance->acquireLock('foo', 1));
87 $this->assertTrue($this->instance->acquireLock('bar', 1));
88 $this->assertTrue($this->instance->acquireLock('nice', 1));
90 $this->assertTrue($this->instance->isLocked('foo'));
91 $this->assertTrue($this->instance->isLocked('bar'));
92 $this->assertTrue($this->instance->isLocked('nice'));
94 $this->assertTrue($this->instance->releaseAll());
96 $this->assertFalse($this->instance->isLocked('foo'));
97 $this->assertFalse($this->instance->isLocked('bar'));
98 $this->assertFalse($this->instance->isLocked('nice'));
104 public function testReleaseAfterUnlock() {
105 $this->assertFalse($this->instance->isLocked('foo'));
106 $this->assertFalse($this->instance->isLocked('bar'));
107 $this->assertFalse($this->instance->isLocked('nice'));
108 $this->assertTrue($this->instance->acquireLock('foo', 1));
109 $this->assertTrue($this->instance->acquireLock('bar', 1));
110 $this->assertTrue($this->instance->acquireLock('nice', 1));
112 $this->assertTrue($this->instance->releaseLock('foo'));
114 $this->assertFalse($this->instance->isLocked('foo'));
115 $this->assertTrue($this->instance->isLocked('bar'));
116 $this->assertTrue($this->instance->isLocked('nice'));
118 $this->assertTrue($this->instance->releaseAll());
120 $this->assertFalse($this->instance->isLocked('bar'));
121 $this->assertFalse($this->instance->isLocked('nice'));
127 public function testReleaseWitTTL()
129 $this->assertFalse($this->instance->isLocked('test'));
130 $this->assertTrue($this->instance->acquireLock('test', 1, 10));
131 $this->assertTrue($this->instance->isLocked('test'));
132 $this->assertTrue($this->instance->releaseLock('test'));
133 $this->assertFalse($this->instance->isLocked('test'));
139 function testLockTTL() {
140 $this->markTestSkipped('taking too much time without mocking');
142 $this->assertFalse($this->instance->isLocked('foo'));
143 $this->assertFalse($this->instance->isLocked('bar'));
145 // 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
146 $this->assertTrue($this->instance->acquireLock('foo', 2, 1));
147 $this->assertTrue($this->instance->acquireLock('bar', 2, 3));
149 $this->assertTrue($this->instance->isLocked('foo'));
150 $this->assertTrue($this->instance->isLocked('bar'));
154 $this->assertFalse($this->instance->isLocked('foo'));
155 $this->assertTrue($this->instance->isLocked('bar'));
159 $this->assertFalse($this->instance->isLocked('foo'));
160 $this->assertFalse($this->instance->isLocked('bar'));