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->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->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->instance->releaseAll();
116 $this->assertFalse($this->instance->isLocked('bar'));
117 $this->assertFalse($this->instance->isLocked('nice'));
123 function testLockTTL() {
124 $this->markTestSkipped('taking too much time without mocking');
126 $this->assertFalse($this->instance->isLocked('foo'));
127 $this->assertFalse($this->instance->isLocked('bar'));
129 // 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
130 $this->assertTrue($this->instance->acquireLock('foo', 2, 1));
131 $this->assertTrue($this->instance->acquireLock('bar', 2, 3));
133 $this->assertTrue($this->instance->isLocked('foo'));
134 $this->assertTrue($this->instance->isLocked('bar'));
138 $this->assertFalse($this->instance->isLocked('foo'));
139 $this->assertTrue($this->instance->isLocked('bar'));
143 $this->assertFalse($this->instance->isLocked('foo'));
144 $this->assertFalse($this->instance->isLocked('bar'));