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