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
|
<?php
declare(strict_types=1);
namespace malkusch\lock\Tests\mutex;
use malkusch\lock\exception\LockReleaseException;
use malkusch\lock\exception\TimeoutException;
use malkusch\lock\mutex\MemcachedMutex;
use PHPUnit\Framework\Attributes\RequiresPhpExtension;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
/**
* Please provide the environment variable MEMCACHE_HOST.
*
* @requires extension memcached
*/
#[RequiresPhpExtension('memcached')]
class MemcachedMutexTest extends TestCase
{
/** @var \Memcached&MockObject */
protected $memcached;
/** @var MemcachedMutex */
private $mutex;
#[\Override]
protected function setUp(): void
{
parent::setUp();
$this->memcached = $this->createMock(\Memcached::class);
$this->mutex = new MemcachedMutex('test', $this->memcached, 1);
}
/**
* Tests failing to acquire the lock within the timeout.
*/
public function testFailAcquireLock(): void
{
$this->expectException(TimeoutException::class);
$this->memcached->expects(self::atLeastOnce())
->method('add')
->with('lock_test', true, 2)
->willReturn(false);
$this->mutex->synchronized(static function (): void {
self::fail('execution is not expected');
});
}
/**
* Tests failing to release a lock.
*/
public function testFailReleasingLock(): void
{
$this->expectException(LockReleaseException::class);
$this->memcached->expects(self::once())
->method('add')
->with('lock_test', true, 2)
->willReturn(true);
$this->memcached->expects(self::once())
->method('delete')
->with('lock_test')
->willReturn(false);
$this->mutex->synchronized(static function (): void {});
}
}
|