3 namespace Friendica\Test\src\Core\Lock;
5 use Friendica\Test\MockedTest;
6 use Friendica\Test\Util\AppMockTrait;
7 use Friendica\Test\Util\VFSTrait;
9 abstract class LockTest extends MockedTest
15 * @var int Start time of the mock (used for time operations)
17 protected $startTime = 1417011228;
20 * @var \Friendica\Core\Lock\ILockDriver
24 abstract protected function getInstance();
26 protected function setUp()
28 // Reusable App object
30 $this->mockApp($this->root);
32 ->shouldReceive('getHostname')
33 ->andReturn('friendica.local');
36 $this->instance = $this->getInstance();
37 $this->instance->releaseAll();
40 protected function tearDown()
42 $this->instance->releaseAll();
49 public function testLock() {
50 $this->assertFalse($this->instance->isLocked('foo'));
51 $this->assertTrue($this->instance->acquireLock('foo', 1));
52 $this->assertTrue($this->instance->isLocked('foo'));
53 $this->assertFalse($this->instance->isLocked('bar'));
59 public function testDoubleLock() {
60 $this->assertFalse($this->instance->isLocked('foo'));
61 $this->assertTrue($this->instance->acquireLock('foo', 1));
62 $this->assertTrue($this->instance->isLocked('foo'));
63 // We already locked it
64 $this->assertTrue($this->instance->acquireLock('foo', 1));
70 public function testReleaseLock() {
71 $this->assertFalse($this->instance->isLocked('foo'));
72 $this->assertTrue($this->instance->acquireLock('foo', 1));
73 $this->assertTrue($this->instance->isLocked('foo'));
74 $this->instance->releaseLock('foo');
75 $this->assertFalse($this->instance->isLocked('foo'));
81 public function testReleaseAll() {
82 $this->assertTrue($this->instance->acquireLock('foo', 1));
83 $this->assertTrue($this->instance->acquireLock('bar', 1));
84 $this->assertTrue($this->instance->acquireLock('nice', 1));
86 $this->assertTrue($this->instance->isLocked('foo'));
87 $this->assertTrue($this->instance->isLocked('bar'));
88 $this->assertTrue($this->instance->isLocked('nice'));
90 $this->assertTrue($this->instance->releaseAll());
92 $this->assertFalse($this->instance->isLocked('foo'));
93 $this->assertFalse($this->instance->isLocked('bar'));
94 $this->assertFalse($this->instance->isLocked('nice'));
100 public function testReleaseAfterUnlock() {
101 $this->assertFalse($this->instance->isLocked('foo'));
102 $this->assertFalse($this->instance->isLocked('bar'));
103 $this->assertFalse($this->instance->isLocked('nice'));
104 $this->assertTrue($this->instance->acquireLock('foo', 1));
105 $this->assertTrue($this->instance->acquireLock('bar', 1));
106 $this->assertTrue($this->instance->acquireLock('nice', 1));
108 $this->assertTrue($this->instance->releaseLock('foo'));
110 $this->assertFalse($this->instance->isLocked('foo'));
111 $this->assertTrue($this->instance->isLocked('bar'));
112 $this->assertTrue($this->instance->isLocked('nice'));
114 $this->assertTrue($this->instance->releaseAll());
116 $this->assertFalse($this->instance->isLocked('bar'));
117 $this->assertFalse($this->instance->isLocked('nice'));
123 public function testReleaseWitTTL()
125 $this->assertFalse($this->instance->isLocked('test'));
126 $this->assertTrue($this->instance->acquireLock('test', 1, 10));
127 $this->assertTrue($this->instance->isLocked('test'));
128 $this->assertTrue($this->instance->releaseLock('test'));
129 $this->assertFalse($this->instance->isLocked('test'));
135 function testLockTTL() {
136 $this->markTestSkipped('taking too much time without mocking');
138 $this->assertFalse($this->instance->isLocked('foo'));
139 $this->assertFalse($this->instance->isLocked('bar'));
141 // 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
142 $this->assertTrue($this->instance->acquireLock('foo', 2, 1));
143 $this->assertTrue($this->instance->acquireLock('bar', 2, 3));
145 $this->assertTrue($this->instance->isLocked('foo'));
146 $this->assertTrue($this->instance->isLocked('bar'));
150 $this->assertFalse($this->instance->isLocked('foo'));
151 $this->assertTrue($this->instance->isLocked('bar'));
155 $this->assertFalse($this->instance->isLocked('foo'));
156 $this->assertFalse($this->instance->isLocked('bar'));