]> git.mxchange.org Git - friendica.git/blob - tests/src/Core/Lock/LockTest.php
Refactor Cache/Lock to DICE
[friendica.git] / tests / src / Core / Lock / LockTest.php
1 <?php
2
3 namespace Friendica\Test\src\Core\Lock;
4
5 use Friendica\Test\MockedTest;
6
7 abstract class LockTest extends MockedTest
8 {
9         /**
10          * @var int Start time of the mock (used for time operations)
11          */
12         protected $startTime = 1417011228;
13
14         /**
15          * @var \Friendica\Core\Lock\ILockDriver
16          */
17         protected $instance;
18
19         abstract protected function getInstance();
20
21         protected function setUp()
22         {
23                 parent::setUp();
24
25                 $this->instance = $this->getInstance();
26                 $this->instance->releaseAll();
27         }
28
29         protected function tearDown()
30         {
31                 $this->instance->releaseAll();
32                 parent::tearDown();
33         }
34
35         /**
36          * @small
37          */
38         public function testLock()
39         {
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'));
44         }
45
46         /**
47          * @small
48          */
49         public function testDoubleLock()
50         {
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));
56         }
57
58         /**
59          * @small
60          */
61         public function testReleaseLock()
62         {
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'));
68         }
69
70         /**
71          * @small
72          */
73         public function testReleaseAll()
74         {
75                 $this->assertTrue($this->instance->acquireLock('foo', 1));
76                 $this->assertTrue($this->instance->acquireLock('bar', 1));
77                 $this->assertTrue($this->instance->acquireLock('nice', 1));
78
79                 $this->assertTrue($this->instance->isLocked('foo'));
80                 $this->assertTrue($this->instance->isLocked('bar'));
81                 $this->assertTrue($this->instance->isLocked('nice'));
82
83                 $this->assertTrue($this->instance->releaseAll());
84
85                 $this->assertFalse($this->instance->isLocked('foo'));
86                 $this->assertFalse($this->instance->isLocked('bar'));
87                 $this->assertFalse($this->instance->isLocked('nice'));
88         }
89
90         /**
91          * @small
92          */
93         public function testReleaseAfterUnlock()
94         {
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));
101
102                 $this->assertTrue($this->instance->releaseLock('foo'));
103
104                 $this->assertFalse($this->instance->isLocked('foo'));
105                 $this->assertTrue($this->instance->isLocked('bar'));
106                 $this->assertTrue($this->instance->isLocked('nice'));
107
108                 $this->assertTrue($this->instance->releaseAll());
109
110                 $this->assertFalse($this->instance->isLocked('bar'));
111                 $this->assertFalse($this->instance->isLocked('nice'));
112         }
113
114         /**
115          * @small
116          */
117         public function testReleaseWitTTL()
118         {
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'));
124         }
125
126         /**
127          * @medium
128          */
129         function testLockTTL()
130         {
131                 $this->markTestSkipped('taking too much time without mocking');
132
133                 $this->assertFalse($this->instance->isLocked('foo'));
134                 $this->assertFalse($this->instance->isLocked('bar'));
135
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));
139
140                 $this->assertTrue($this->instance->isLocked('foo'));
141                 $this->assertTrue($this->instance->isLocked('bar'));
142
143                 sleep(2);
144
145                 $this->assertFalse($this->instance->isLocked('foo'));
146                 $this->assertTrue($this->instance->isLocked('bar'));
147
148                 sleep(2);
149
150                 $this->assertFalse($this->instance->isLocked('foo'));
151                 $this->assertFalse($this->instance->isLocked('bar'));
152         }
153 }