3 namespace Friendica\Test\src\Core\Lock;
5 use Friendica\Test\MockedTest;
7 abstract class LockTest extends MockedTest
10 * @var int Start time of the mock (used for time operations)
12 protected $startTime = 1417011228;
15 * @var \Friendica\Core\Lock\ILockDriver
19 abstract protected function getInstance();
21 protected function setUp()
25 $this->instance = $this->getInstance();
26 $this->instance->releaseAll();
29 protected function tearDown()
31 $this->instance->releaseAll();
38 public function testLock()
40 $this->assertFalse($this->instance->isLocked('foo'));
41 $this->assertTrue($this->instance->acquireLock('foo', 1));
42 $this->assertTrue($this->instance->isLocked('foo'));
43 $this->assertFalse($this->instance->isLocked('bar'));
49 public function testDoubleLock()
51 $this->assertFalse($this->instance->isLocked('foo'));
52 $this->assertTrue($this->instance->acquireLock('foo', 1));
53 $this->assertTrue($this->instance->isLocked('foo'));
54 // We already locked it
55 $this->assertTrue($this->instance->acquireLock('foo', 1));
61 public function testReleaseLock()
63 $this->assertFalse($this->instance->isLocked('foo'));
64 $this->assertTrue($this->instance->acquireLock('foo', 1));
65 $this->assertTrue($this->instance->isLocked('foo'));
66 $this->instance->releaseLock('foo');
67 $this->assertFalse($this->instance->isLocked('foo'));
73 public function testReleaseAll()
75 $this->assertTrue($this->instance->acquireLock('foo', 1));
76 $this->assertTrue($this->instance->acquireLock('bar', 1));
77 $this->assertTrue($this->instance->acquireLock('nice', 1));
79 $this->assertTrue($this->instance->isLocked('foo'));
80 $this->assertTrue($this->instance->isLocked('bar'));
81 $this->assertTrue($this->instance->isLocked('nice'));
83 $this->assertTrue($this->instance->releaseAll());
85 $this->assertFalse($this->instance->isLocked('foo'));
86 $this->assertFalse($this->instance->isLocked('bar'));
87 $this->assertFalse($this->instance->isLocked('nice'));
93 public function testReleaseAfterUnlock()
95 $this->assertFalse($this->instance->isLocked('foo'));
96 $this->assertFalse($this->instance->isLocked('bar'));
97 $this->assertFalse($this->instance->isLocked('nice'));
98 $this->assertTrue($this->instance->acquireLock('foo', 1));
99 $this->assertTrue($this->instance->acquireLock('bar', 1));
100 $this->assertTrue($this->instance->acquireLock('nice', 1));
102 $this->assertTrue($this->instance->releaseLock('foo'));
104 $this->assertFalse($this->instance->isLocked('foo'));
105 $this->assertTrue($this->instance->isLocked('bar'));
106 $this->assertTrue($this->instance->isLocked('nice'));
108 $this->assertTrue($this->instance->releaseAll());
110 $this->assertFalse($this->instance->isLocked('bar'));
111 $this->assertFalse($this->instance->isLocked('nice'));
117 public function testReleaseWitTTL()
119 $this->assertFalse($this->instance->isLocked('test'));
120 $this->assertTrue($this->instance->acquireLock('test', 1, 10));
121 $this->assertTrue($this->instance->isLocked('test'));
122 $this->assertTrue($this->instance->releaseLock('test'));
123 $this->assertFalse($this->instance->isLocked('test'));
129 function testLockTTL()
131 $this->markTestSkipped('taking too much time without mocking');
133 $this->assertFalse($this->instance->isLocked('foo'));
134 $this->assertFalse($this->instance->isLocked('bar'));
136 // 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
137 $this->assertTrue($this->instance->acquireLock('foo', 2, 1));
138 $this->assertTrue($this->instance->acquireLock('bar', 2, 3));
140 $this->assertTrue($this->instance->isLocked('foo'));
141 $this->assertTrue($this->instance->isLocked('bar'));
145 $this->assertFalse($this->instance->isLocked('foo'));
146 $this->assertTrue($this->instance->isLocked('bar'));
150 $this->assertFalse($this->instance->isLocked('foo'));
151 $this->assertFalse($this->instance->isLocked('bar'));