|
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\I18n\Time; |
@@ -104,6 +106,53 @@ public function testSave(): void |
104 | 106 | $this->assertTrue($this->handler->save(self::$key1, 'value')); |
105 | 107 | } |
106 | 108 |
|
| 109 | + public function testLockOperations(): void |
| 110 | + { |
| 111 | + $handler = $this->handler; |
| 112 | + |
| 113 | + $this->assertInstanceOf(LockStoreProviderInterface::class, $handler); |
| 114 | + |
| 115 | + $store = $handler->lockStore(); |
| 116 | + |
| 117 | + $this->assertInstanceOf(LockStoreInterface::class, $store); |
| 118 | + $this->assertTrue($store->acquireLock(self::$key1, 'owner1', 60)); |
| 119 | + $this->assertFalse($store->acquireLock(self::$key1, 'owner2', 60)); |
| 120 | + $this->assertSame('owner1', $store->getLockOwner(self::$key1)); |
| 121 | + $this->assertFalse($store->releaseLock(self::$key1, 'owner2')); |
| 122 | + $this->assertFalse($store->refreshLock(self::$key1, 'owner2', 120)); |
| 123 | + $this->assertTrue($store->refreshLock(self::$key1, 'owner1', 120)); |
| 124 | + $this->assertTrue($store->releaseLock(self::$key1, 'owner1')); |
| 125 | + $this->assertNull($store->getLockOwner(self::$key1)); |
| 126 | + $this->assertTrue($store->acquireLock(self::$key1, 'owner1', 60)); |
| 127 | + $this->assertTrue($store->forceReleaseLock(self::$key1)); |
| 128 | + $this->assertNull($store->getLockOwner(self::$key1)); |
| 129 | + $this->assertTrue($store->forceReleaseLock(self::$key1)); |
| 130 | + } |
| 131 | + |
| 132 | + /** |
| 133 | + * This test waits for 2 seconds before reacquiring the lock. |
| 134 | + * |
| 135 | + * @timeLimit 2.5 |
| 136 | + */ |
| 137 | + public function testExpiredLockCanBeAcquiredByNewOwner(): void |
| 138 | + { |
| 139 | + $handler = $this->handler; |
| 140 | + |
| 141 | + $this->assertInstanceOf(LockStoreProviderInterface::class, $handler); |
| 142 | + |
| 143 | + $store = $handler->lockStore(); |
| 144 | + |
| 145 | + $this->assertTrue($store->acquireLock(self::$key1, 'owner1', 1)); |
| 146 | + |
| 147 | + CLI::wait(2); |
| 148 | + |
| 149 | + $this->assertTrue($store->acquireLock(self::$key1, 'owner2', 60)); |
| 150 | + $this->assertSame('owner2', $store->getLockOwner(self::$key1)); |
| 151 | + $this->assertFalse($store->releaseLock(self::$key1, 'owner1')); |
| 152 | + $this->assertFalse($store->refreshLock(self::$key1, 'owner1', 120)); |
| 153 | + $this->assertTrue($store->releaseLock(self::$key1, 'owner2')); |
| 154 | + } |
| 155 | + |
107 | 156 | public function testSavePermanent(): void |
108 | 157 | { |
109 | 158 | $this->assertTrue($this->handler->save(self::$key1, 'value', 0)); |
@@ -200,11 +249,18 @@ public function testPing(): void |
200 | 249 |
|
201 | 250 | public function testReconnect(): void |
202 | 251 | { |
| 252 | + $handler = $this->handler; |
| 253 | + |
| 254 | + $this->assertInstanceOf(LockStoreProviderInterface::class, $handler); |
| 255 | + |
| 256 | + $lockStore = $handler->lockStore(); |
| 257 | + |
203 | 258 | $this->handler->save(self::$key1, 'value'); |
204 | 259 | $this->assertSame('value', $this->handler->get(self::$key1)); |
205 | 260 |
|
206 | 261 | $this->assertTrue($this->handler->reconnect()); |
207 | 262 |
|
208 | 263 | $this->assertSame('value', $this->handler->get(self::$key1)); |
| 264 | + $this->assertNotSame($lockStore, $handler->lockStore()); |
209 | 265 | } |
210 | 266 | } |
0 commit comments