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