]> git.mxchange.org Git - friendica.git/blob - tests/src/Core/Lock/LockTest.php
wrapping up 2019.12
[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\ILock
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(true);
27         }
28
29         protected function tearDown()
30         {
31                 $this->instance->releaseAll(true);
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          * @small
128          */
129         public function testGetLocks()
130         {
131                 $this->assertTrue($this->instance->acquireLock('foo', 1));
132                 $this->assertTrue($this->instance->acquireLock('bar', 1));
133                 $this->assertTrue($this->instance->acquireLock('nice', 1));
134
135                 $this->assertTrue($this->instance->isLocked('foo'));
136                 $this->assertTrue($this->instance->isLocked('bar'));
137                 $this->assertTrue($this->instance->isLocked('nice'));
138
139                 $locks = $this->instance->getLocks();
140
141                 $this->assertContains('foo', $locks);
142                 $this->assertContains('bar', $locks);
143                 $this->assertContains('nice', $locks);
144         }
145
146         /**
147          * @small
148          */
149         public function testGetLocksWithPrefix()
150         {
151                 $this->assertTrue($this->instance->acquireLock('foo', 1));
152                 $this->assertTrue($this->instance->acquireLock('test1', 1));
153                 $this->assertTrue($this->instance->acquireLock('test2', 1));
154
155                 $this->assertTrue($this->instance->isLocked('foo'));
156                 $this->assertTrue($this->instance->isLocked('test1'));
157                 $this->assertTrue($this->instance->isLocked('test2'));
158
159                 $locks = $this->instance->getLocks('test');
160
161                 $this->assertContains('test1', $locks);
162                 $this->assertContains('test2', $locks);
163                 $this->assertNotContains('foo', $locks);
164         }
165
166         /**
167          * @medium
168          */
169         function testLockTTL()
170         {
171                 $this->markTestSkipped('taking too much time without mocking');
172
173                 $this->assertFalse($this->instance->isLocked('foo'));
174                 $this->assertFalse($this->instance->isLocked('bar'));
175
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->acquireLock('foo', 2, 1));
178                 $this->assertTrue($this->instance->acquireLock('bar', 2, 3));
179
180                 $this->assertTrue($this->instance->isLocked('foo'));
181                 $this->assertTrue($this->instance->isLocked('bar'));
182
183                 sleep(2);
184
185                 $this->assertFalse($this->instance->isLocked('foo'));
186                 $this->assertTrue($this->instance->isLocked('bar'));
187
188                 sleep(2);
189
190                 $this->assertFalse($this->instance->isLocked('foo'));
191                 $this->assertFalse($this->instance->isLocked('bar'));
192         }
193
194         /**
195          * Test if releasing a non-existing lock doesn't throw errors
196          */
197         public function testReleaseLockWithoutLock()
198         {
199                 $this->assertFalse($this->instance->isLocked('wrongLock'));
200                 $this->assertFalse($this->instance->releaseLock('wrongLock'));
201         }
202 }