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