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