]> git.mxchange.org Git - friendica.git/blob - tests/src/Core/Lock/LockTest.php
Fixing redis cachekey
[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 use Friendica\Test\Util\AppMockTrait;
7 use Friendica\Test\Util\VFSTrait;
8
9 abstract class LockTest extends MockedTest
10 {
11         use VFSTrait;
12         use AppMockTrait;
13
14         /**
15          * @var int Start time of the mock (used for time operations)
16          */
17         protected $startTime = 1417011228;
18
19         /**
20          * @var \Friendica\Core\Lock\ILockDriver
21          */
22         protected $instance;
23
24         abstract protected function getInstance();
25
26         protected function setUp()
27         {
28                 // Reusable App object
29                 $this->setUpVfsDir();
30                 $this->mockApp($this->root);
31                 $this->app
32                         ->shouldReceive('getHostname')
33                         ->andReturn('friendica.local');
34
35                 parent::setUp();
36                 $this->instance = $this->getInstance();
37                 $this->instance->releaseAll();
38         }
39
40         protected function tearDown()
41         {
42                 $this->instance->releaseAll();
43                 parent::tearDown();
44         }
45
46         /**
47          * @small
48          */
49         public function testLock() {
50                 $this->assertFalse($this->instance->isLocked('foo'));
51                 $this->assertTrue($this->instance->acquireLock('foo', 1));
52                 $this->assertTrue($this->instance->isLocked('foo'));
53                 $this->assertFalse($this->instance->isLocked('bar'));
54         }
55
56         /**
57          * @small
58          */
59         public function testDoubleLock() {
60                 $this->assertFalse($this->instance->isLocked('foo'));
61                 $this->assertTrue($this->instance->acquireLock('foo', 1));
62                 $this->assertTrue($this->instance->isLocked('foo'));
63                 // We already locked it
64                 $this->assertTrue($this->instance->acquireLock('foo', 1));
65         }
66
67         /**
68          * @small
69          */
70         public function testReleaseLock() {
71                 $this->assertFalse($this->instance->isLocked('foo'));
72                 $this->assertTrue($this->instance->acquireLock('foo', 1));
73                 $this->assertTrue($this->instance->isLocked('foo'));
74                 $this->instance->releaseLock('foo');
75                 $this->assertFalse($this->instance->isLocked('foo'));
76         }
77
78         /**
79          * @small
80          */
81         public function testReleaseAll() {
82                 $this->assertTrue($this->instance->acquireLock('foo', 1));
83                 $this->assertTrue($this->instance->acquireLock('bar', 1));
84                 $this->assertTrue($this->instance->acquireLock('nice', 1));
85
86                 $this->assertTrue($this->instance->isLocked('foo'));
87                 $this->assertTrue($this->instance->isLocked('bar'));
88                 $this->assertTrue($this->instance->isLocked('nice'));
89
90                 $this->assertTrue($this->instance->releaseAll());
91
92                 $this->assertFalse($this->instance->isLocked('foo'));
93                 $this->assertFalse($this->instance->isLocked('bar'));
94                 $this->assertFalse($this->instance->isLocked('nice'));
95         }
96
97         /**
98          * @small
99          */
100         public function testReleaseAfterUnlock() {
101                 $this->assertFalse($this->instance->isLocked('foo'));
102                 $this->assertFalse($this->instance->isLocked('bar'));
103                 $this->assertFalse($this->instance->isLocked('nice'));
104                 $this->assertTrue($this->instance->acquireLock('foo', 1));
105                 $this->assertTrue($this->instance->acquireLock('bar', 1));
106                 $this->assertTrue($this->instance->acquireLock('nice', 1));
107
108                 $this->assertTrue($this->instance->releaseLock('foo'));
109
110                 $this->assertFalse($this->instance->isLocked('foo'));
111                 $this->assertTrue($this->instance->isLocked('bar'));
112                 $this->assertTrue($this->instance->isLocked('nice'));
113
114                 $this->assertTrue($this->instance->releaseAll());
115
116                 $this->assertFalse($this->instance->isLocked('bar'));
117                 $this->assertFalse($this->instance->isLocked('nice'));
118         }
119
120         /**
121          * @small
122          */
123         public function testReleaseWitTTL()
124         {
125                 $this->assertFalse($this->instance->isLocked('test'));
126                 $this->assertTrue($this->instance->acquireLock('test', 1, 10));
127                 $this->assertTrue($this->instance->isLocked('test'));
128                 $this->assertTrue($this->instance->releaseLock('test'));
129                 $this->assertFalse($this->instance->isLocked('test'));
130         }
131
132         /**
133          * @medium
134          */
135         function testLockTTL() {
136                 $this->markTestSkipped('taking too much time without mocking');
137
138                 $this->assertFalse($this->instance->isLocked('foo'));
139                 $this->assertFalse($this->instance->isLocked('bar'));
140
141                 // 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
142                 $this->assertTrue($this->instance->acquireLock('foo', 2, 1));
143                 $this->assertTrue($this->instance->acquireLock('bar', 2, 3));
144
145                 $this->assertTrue($this->instance->isLocked('foo'));
146                 $this->assertTrue($this->instance->isLocked('bar'));
147
148                 sleep(2);
149
150                 $this->assertFalse($this->instance->isLocked('foo'));
151                 $this->assertTrue($this->instance->isLocked('bar'));
152
153                 sleep(2);
154
155                 $this->assertFalse($this->instance->isLocked('foo'));
156                 $this->assertFalse($this->instance->isLocked('bar'));
157         }
158 }