1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
<?php
namespace Illuminate\Tests\Integration\Cache;
use Exception;
use Illuminate\Support\Facades\Cache;
use Orchestra\Testbench\Attributes\WithConfig;
use Orchestra\Testbench\TestCase;
#[WithConfig('cache.default', 'file')]
class FileCacheLockTest extends TestCase
{
public function testLocksCanBeAcquiredAndReleased()
{
Cache::lock('foo')->forceRelease();
$lock = Cache::lock('foo', 10);
$this->assertTrue($lock->get());
$this->assertFalse(Cache::lock('foo', 10)->get());
$lock->release();
$lock = Cache::lock('foo', 10);
$this->assertTrue($lock->get());
$this->assertFalse(Cache::lock('foo', 10)->get());
Cache::lock('foo')->release();
}
public function testLocksCanBlockForSeconds()
{
Cache::lock('foo')->forceRelease();
$this->assertSame('taylor', Cache::lock('foo', 10)->block(1, function () {
return 'taylor';
}));
Cache::lock('foo')->forceRelease();
$this->assertTrue(Cache::lock('foo', 10)->block(1));
}
public function testConcurrentLocksAreReleasedSafely()
{
Cache::lock('foo')->forceRelease();
$firstLock = Cache::lock('foo', 1);
$this->assertTrue($firstLock->get());
sleep(2);
$secondLock = Cache::lock('foo', 10);
$this->assertTrue($secondLock->get());
$firstLock->release();
$this->assertFalse(Cache::lock('foo')->get());
}
public function testLocksWithFailedBlockCallbackAreReleased()
{
Cache::lock('foo')->forceRelease();
$firstLock = Cache::lock('foo', 10);
try {
$firstLock->block(1, function () {
throw new Exception('failed');
});
} catch (Exception) {
// Not testing the exception, just testing the lock
// is released regardless of the how the exception
// thrown by the callback was handled.
}
$secondLock = Cache::lock('foo', 1);
$this->assertTrue($secondLock->get());
}
public function testLocksCanBeReleasedUsingOwnerToken()
{
Cache::lock('foo')->forceRelease();
$firstLock = Cache::lock('foo', 10);
$this->assertTrue($firstLock->get());
$owner = $firstLock->owner();
$secondLock = Cache::store('file')->restoreLock('foo', $owner);
$secondLock->release();
$this->assertTrue(Cache::lock('foo')->get());
}
public function testOwnerStatusCanBeCheckedAfterRestoringLock()
{
Cache::lock('foo')->forceRelease();
$firstLock = Cache::lock('foo', 10);
$this->assertTrue($firstLock->get());
$owner = $firstLock->owner();
$secondLock = Cache::store('file')->restoreLock('foo', $owner);
$this->assertTrue($secondLock->isOwnedByCurrentProcess());
}
public function testOtherOwnerDoesNotOwnLockAfterRestore()
{
Cache::lock('foo')->forceRelease();
$firstLock = Cache::lock('foo', 10);
$this->assertTrue($firstLock->get());
$secondLock = Cache::store('file')->restoreLock('foo', 'other_owner');
$this->assertFalse($secondLock->isOwnedByCurrentProcess());
}
}
|