]> git.mxchange.org Git - friendica.git/blob - tests/src/Core/Lock/LockTest.php
Config FollowUp
[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                 $configMock = \Mockery::mock('Friendica\Core\Config\Configuration');
31                 $this->mockApp($this->root, $configMock);
32                 $this->app
33                         ->shouldReceive('getHostname')
34                         ->andReturn('friendica.local');
35
36                 parent::setUp();
37                 $this->instance = $this->getInstance();
38                 $this->instance->releaseAll();
39         }
40
41         protected function tearDown()
42         {
43                 $this->instance->releaseAll();
44                 parent::tearDown();
45         }
46
47         /**
48          * @small
49          */
50         public function testLock() {
51                 $this->assertFalse($this->instance->isLocked('foo'));
52                 $this->assertTrue($this->instance->acquireLock('foo', 1));
53                 $this->assertTrue($this->instance->isLocked('foo'));
54                 $this->assertFalse($this->instance->isLocked('bar'));
55         }
56
57         /**
58          * @small
59          */
60         public function testDoubleLock() {
61                 $this->assertFalse($this->instance->isLocked('foo'));
62                 $this->assertTrue($this->instance->acquireLock('foo', 1));
63                 $this->assertTrue($this->instance->isLocked('foo'));
64                 // We already locked it
65                 $this->assertTrue($this->instance->acquireLock('foo', 1));
66         }
67
68         /**
69          * @small
70          */
71         public function testReleaseLock() {
72                 $this->assertFalse($this->instance->isLocked('foo'));
73                 $this->assertTrue($this->instance->acquireLock('foo', 1));
74                 $this->assertTrue($this->instance->isLocked('foo'));
75                 $this->instance->releaseLock('foo');
76                 $this->assertFalse($this->instance->isLocked('foo'));
77         }
78
79         /**
80          * @small
81          */
82         public function testReleaseAll() {
83                 $this->assertTrue($this->instance->acquireLock('foo', 1));
84                 $this->assertTrue($this->instance->acquireLock('bar', 1));
85                 $this->assertTrue($this->instance->acquireLock('nice', 1));
86
87                 $this->assertTrue($this->instance->isLocked('foo'));
88                 $this->assertTrue($this->instance->isLocked('bar'));
89                 $this->assertTrue($this->instance->isLocked('nice'));
90
91                 $this->instance->releaseAll();
92
93                 $this->assertFalse($this->instance->isLocked('foo'));
94                 $this->assertFalse($this->instance->isLocked('bar'));
95                 $this->assertFalse($this->instance->isLocked('nice'));
96         }
97
98         /**
99          * @small
100          */
101         public function testReleaseAfterUnlock() {
102                 $this->assertFalse($this->instance->isLocked('foo'));
103                 $this->assertFalse($this->instance->isLocked('bar'));
104                 $this->assertFalse($this->instance->isLocked('nice'));
105                 $this->assertTrue($this->instance->acquireLock('foo', 1));
106                 $this->assertTrue($this->instance->acquireLock('bar', 1));
107                 $this->assertTrue($this->instance->acquireLock('nice', 1));
108
109                 $this->instance->releaseLock('foo');
110
111                 $this->assertFalse($this->instance->isLocked('foo'));
112                 $this->assertTrue($this->instance->isLocked('bar'));
113                 $this->assertTrue($this->instance->isLocked('nice'));
114
115                 $this->instance->releaseAll();
116
117                 $this->assertFalse($this->instance->isLocked('bar'));
118                 $this->assertFalse($this->instance->isLocked('nice'));
119         }
120
121         /**
122          * @medium
123          */
124         function testLockTTL() {
125                 $this->markTestSkipped('taking too much time without mocking');
126
127                 $this->assertFalse($this->instance->isLocked('foo'));
128                 $this->assertFalse($this->instance->isLocked('bar'));
129
130                 // 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
131                 $this->assertTrue($this->instance->acquireLock('foo', 2, 1));
132                 $this->assertTrue($this->instance->acquireLock('bar', 2, 3));
133
134                 $this->assertTrue($this->instance->isLocked('foo'));
135                 $this->assertTrue($this->instance->isLocked('bar'));
136
137                 sleep(2);
138
139                 $this->assertFalse($this->instance->isLocked('foo'));
140                 $this->assertTrue($this->instance->isLocked('bar'));
141
142                 sleep(2);
143
144                 $this->assertFalse($this->instance->isLocked('foo'));
145                 $this->assertFalse($this->instance->isLocked('bar'));
146         }
147 }