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