|
14 | 14 | namespace CodeIgniter\Cache\Handlers; |
15 | 15 |
|
16 | 16 | use CodeIgniter\Cache\CacheFactory; |
| 17 | +use CodeIgniter\Cache\LockStoreInterface; |
| 18 | +use CodeIgniter\Cache\LockStoreProviderInterface; |
17 | 19 | use CodeIgniter\CLI\CLI; |
18 | 20 | use CodeIgniter\Exceptions\BadMethodCallException; |
19 | 21 | use CodeIgniter\Exceptions\InvalidArgumentException; |
@@ -148,6 +150,53 @@ public function testSave(): void |
148 | 150 | $this->assertTrue($this->handler->save(self::$key1, 'value')); |
149 | 151 | } |
150 | 152 |
|
| 153 | + public function testLockOperations(): void |
| 154 | + { |
| 155 | + $handler = $this->handler; |
| 156 | + |
| 157 | + $this->assertInstanceOf(LockStoreProviderInterface::class, $handler); |
| 158 | + |
| 159 | + $store = $handler->lockStore(); |
| 160 | + |
| 161 | + $this->assertInstanceOf(LockStoreInterface::class, $store); |
| 162 | + $this->assertTrue($store->acquireLock(self::$key1, 'owner1', 60)); |
| 163 | + $this->assertFalse($store->acquireLock(self::$key1, 'owner2', 60)); |
| 164 | + $this->assertSame('owner1', $store->getLockOwner(self::$key1)); |
| 165 | + $this->assertFalse($store->releaseLock(self::$key1, 'owner2')); |
| 166 | + $this->assertFalse($store->refreshLock(self::$key1, 'owner2', 120)); |
| 167 | + $this->assertTrue($store->refreshLock(self::$key1, 'owner1', 120)); |
| 168 | + $this->assertTrue($store->releaseLock(self::$key1, 'owner1')); |
| 169 | + $this->assertNull($store->getLockOwner(self::$key1)); |
| 170 | + $this->assertTrue($store->acquireLock(self::$key1, 'owner1', 60)); |
| 171 | + $this->assertTrue($store->forceReleaseLock(self::$key1)); |
| 172 | + $this->assertNull($store->getLockOwner(self::$key1)); |
| 173 | + $this->assertTrue($store->forceReleaseLock(self::$key1)); |
| 174 | + } |
| 175 | + |
| 176 | + /** |
| 177 | + * This test waits for 2 seconds before reacquiring the lock. |
| 178 | + * |
| 179 | + * @timeLimit 2.5 |
| 180 | + */ |
| 181 | + public function testExpiredLockCanBeAcquiredByNewOwner(): void |
| 182 | + { |
| 183 | + $handler = $this->handler; |
| 184 | + |
| 185 | + $this->assertInstanceOf(LockStoreProviderInterface::class, $handler); |
| 186 | + |
| 187 | + $store = $handler->lockStore(); |
| 188 | + |
| 189 | + $this->assertTrue($store->acquireLock(self::$key1, 'owner1', 1)); |
| 190 | + |
| 191 | + CLI::wait(2); |
| 192 | + |
| 193 | + $this->assertTrue($store->acquireLock(self::$key1, 'owner2', 60)); |
| 194 | + $this->assertSame('owner2', $store->getLockOwner(self::$key1)); |
| 195 | + $this->assertFalse($store->releaseLock(self::$key1, 'owner1')); |
| 196 | + $this->assertFalse($store->refreshLock(self::$key1, 'owner1', 120)); |
| 197 | + $this->assertTrue($store->releaseLock(self::$key1, 'owner2')); |
| 198 | + } |
| 199 | + |
151 | 200 | public function testSavePermanent(): void |
152 | 201 | { |
153 | 202 | $this->assertTrue($this->handler->save(self::$key1, 'value', 0)); |
@@ -244,11 +293,18 @@ public function testPing(): void |
244 | 293 |
|
245 | 294 | public function testReconnect(): void |
246 | 295 | { |
| 296 | + $handler = $this->handler; |
| 297 | + |
| 298 | + $this->assertInstanceOf(LockStoreProviderInterface::class, $handler); |
| 299 | + |
| 300 | + $lockStore = $handler->lockStore(); |
| 301 | + |
247 | 302 | $this->handler->save(self::$key1, 'value'); |
248 | 303 | $this->assertSame('value', $this->handler->get(self::$key1)); |
249 | 304 |
|
250 | 305 | $this->assertTrue($this->handler->reconnect()); |
251 | 306 |
|
252 | 307 | $this->assertSame('value', $this->handler->get(self::$key1)); |
| 308 | + $this->assertNotSame($lockStore, $handler->lockStore()); |
253 | 309 | } |
254 | 310 | } |
0 commit comments