]> git.mxchange.org Git - friendica.git/blob - tests/src/Core/Lock/LockTest.php
Merge pull request #6104 from nupplaphil/friendica-6101
[friendica.git] / tests / src / Core / Lock / LockTest.php
1 <?php
2
3 namespace Friendica\Test\src\Core\Lock;
4
5 use Friendica\BaseObject;
6 use Friendica\Core\Config;
7 use Friendica\Test\DatabaseTest;
8
9 abstract class LockTest extends DatabaseTest
10 {
11         /**
12          * @var \Friendica\Core\Lock\ILockDriver
13          */
14         protected $instance;
15
16         abstract protected function getInstance();
17
18         protected function setUp()
19         {
20                 parent::setUp();
21                 $this->instance = $this->getInstance();
22                 $this->instance->releaseAll();
23
24                 // Reusable App object
25                 $this->app = BaseObject::getApp();
26
27                 // Default config
28                 Config::set('config', 'hostname', 'localhost');
29                 Config::set('system', 'throttle_limit_day', 100);
30                 Config::set('system', 'throttle_limit_week', 100);
31                 Config::set('system', 'throttle_limit_month', 100);
32                 Config::set('system', 'theme', 'system_theme');
33         }
34
35         protected function tearDown()
36         {
37                 parent::tearDown();
38                 $this->instance->releaseAll();
39         }
40
41         /**
42          * @small
43          */
44         public function testLock() {
45                 $this->assertFalse($this->instance->isLocked('foo'));
46                 $this->assertTrue($this->instance->acquireLock('foo', 1));
47                 $this->assertTrue($this->instance->isLocked('foo'));
48                 $this->assertFalse($this->instance->isLocked('bar'));
49         }
50
51         /**
52          * @small
53          */
54         public function testDoubleLock() {
55                 $this->assertFalse($this->instance->isLocked('foo'));
56                 $this->assertTrue($this->instance->acquireLock('foo', 1));
57                 $this->assertTrue($this->instance->isLocked('foo'));
58                 // We already locked it
59                 $this->assertTrue($this->instance->acquireLock('foo', 1));
60         }
61
62         /**
63          * @small
64          */
65         public function testReleaseLock() {
66                 $this->assertFalse($this->instance->isLocked('foo'));
67                 $this->assertTrue($this->instance->acquireLock('foo', 1));
68                 $this->assertTrue($this->instance->isLocked('foo'));
69                 $this->instance->releaseLock('foo');
70                 $this->assertFalse($this->instance->isLocked('foo'));
71         }
72
73         /**
74          * @small
75          */
76         public function testReleaseAll() {
77                 $this->assertTrue($this->instance->acquireLock('foo', 1));
78                 $this->assertTrue($this->instance->acquireLock('bar', 1));
79                 $this->assertTrue($this->instance->acquireLock('nice', 1));
80
81                 $this->assertTrue($this->instance->isLocked('foo'));
82                 $this->assertTrue($this->instance->isLocked('bar'));
83                 $this->assertTrue($this->instance->isLocked('nice'));
84
85                 $this->instance->releaseAll();
86
87                 $this->assertFalse($this->instance->isLocked('foo'));
88                 $this->assertFalse($this->instance->isLocked('bar'));
89                 $this->assertFalse($this->instance->isLocked('nice'));
90         }
91
92         /**
93          * @small
94          */
95         public function testReleaseAfterUnlock() {
96                 $this->assertFalse($this->instance->isLocked('foo'));
97                 $this->assertFalse($this->instance->isLocked('bar'));
98                 $this->assertFalse($this->instance->isLocked('nice'));
99                 $this->assertTrue($this->instance->acquireLock('foo', 1));
100                 $this->assertTrue($this->instance->acquireLock('bar', 1));
101                 $this->assertTrue($this->instance->acquireLock('nice', 1));
102
103                 $this->instance->releaseLock('foo');
104
105                 $this->assertFalse($this->instance->isLocked('foo'));
106                 $this->assertTrue($this->instance->isLocked('bar'));
107                 $this->assertTrue($this->instance->isLocked('nice'));
108
109                 $this->instance->releaseAll();
110
111                 $this->assertFalse($this->instance->isLocked('bar'));
112                 $this->assertFalse($this->instance->isLocked('nice'));
113         }
114
115         /**
116          * @medium
117          */
118         function testLockTTL() {
119                 $this->markTestSkipped('taking too much time without mocking');
120
121                 $this->assertFalse($this->instance->isLocked('foo'));
122                 $this->assertFalse($this->instance->isLocked('bar'));
123
124                 // 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
125                 $this->assertTrue($this->instance->acquireLock('foo', 2, 1));
126                 $this->assertTrue($this->instance->acquireLock('bar', 2, 3));
127
128                 $this->assertTrue($this->instance->isLocked('foo'));
129                 $this->assertTrue($this->instance->isLocked('bar'));
130
131                 sleep(2);
132
133                 $this->assertFalse($this->instance->isLocked('foo'));
134                 $this->assertTrue($this->instance->isLocked('bar'));
135
136                 sleep(2);
137
138                 $this->assertFalse($this->instance->isLocked('foo'));
139                 $this->assertFalse($this->instance->isLocked('bar'));
140         }
141 }