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\ILock
19 abstract protected function getInstance();
21 protected function setUp()
25 $this->instance = $this->getInstance();
26 $this->instance->releaseAll(true);
29 protected function tearDown()
31 $this->instance->releaseAll(true);
38 public function testLock()
40 $this->assertFalse($this->instance->isLocked('foo'));
41 $this->assertTrue($this->instance->acquire('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->acquire('foo', 1));
53 $this->assertTrue($this->instance->isLocked('foo'));
54 // We already locked it
55 $this->assertTrue($this->instance->acquire('foo', 1));
61 public function testReleaseLock()
63 $this->assertFalse($this->instance->isLocked('foo'));
64 $this->assertTrue($this->instance->acquire('foo', 1));
65 $this->assertTrue($this->instance->isLocked('foo'));
66 $this->instance->release('foo');
67 $this->assertFalse($this->instance->isLocked('foo'));
73 public function testReleaseAll()
75 $this->assertTrue($this->instance->acquire('foo', 1));
76 $this->assertTrue($this->instance->acquire('bar', 1));
77 $this->assertTrue($this->instance->acquire('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->acquire('foo', 1));
99 $this->assertTrue($this->instance->acquire('bar', 1));
100 $this->assertTrue($this->instance->acquire('nice', 1));
102 $this->assertTrue($this->instance->release('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->acquire('test', 1, 10));
121 $this->assertTrue($this->instance->isLocked('test'));
122 $this->assertTrue($this->instance->release('test'));
123 $this->assertFalse($this->instance->isLocked('test'));
129 public function testGetLocks()
131 $this->assertTrue($this->instance->acquire('foo', 1));
132 $this->assertTrue($this->instance->acquire('bar', 1));
133 $this->assertTrue($this->instance->acquire('nice', 1));
135 $this->assertTrue($this->instance->isLocked('foo'));
136 $this->assertTrue($this->instance->isLocked('bar'));
137 $this->assertTrue($this->instance->isLocked('nice'));
139 $locks = $this->instance->getLocks();
141 $this->assertContains('foo', $locks);
142 $this->assertContains('bar', $locks);
143 $this->assertContains('nice', $locks);
149 public function testGetLocksWithPrefix()
151 $this->assertTrue($this->instance->acquire('foo', 1));
152 $this->assertTrue($this->instance->acquire('test1', 1));
153 $this->assertTrue($this->instance->acquire('test2', 1));
155 $this->assertTrue($this->instance->isLocked('foo'));
156 $this->assertTrue($this->instance->isLocked('test1'));
157 $this->assertTrue($this->instance->isLocked('test2'));
159 $locks = $this->instance->getLocks('test');
161 $this->assertContains('test1', $locks);
162 $this->assertContains('test2', $locks);
163 $this->assertNotContains('foo', $locks);
169 function testLockTTL()
171 $this->markTestSkipped('taking too much time without mocking');
173 $this->assertFalse($this->instance->isLocked('foo'));
174 $this->assertFalse($this->instance->isLocked('bar'));
176 // 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
177 $this->assertTrue($this->instance->acquire('foo', 2, 1));
178 $this->assertTrue($this->instance->acquire('bar', 2, 3));
180 $this->assertTrue($this->instance->isLocked('foo'));
181 $this->assertTrue($this->instance->isLocked('bar'));
185 $this->assertFalse($this->instance->isLocked('foo'));
186 $this->assertTrue($this->instance->isLocked('bar'));
190 $this->assertFalse($this->instance->isLocked('foo'));
191 $this->assertFalse($this->instance->isLocked('bar'));
195 * Test if releasing a non-existing lock doesn't throw errors
197 public function testReleaseLockWithoutLock()
199 $this->assertFalse($this->instance->isLocked('wrongLock'));
200 $this->assertFalse($this->instance->release('wrongLock'));