X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=tests%2Fsrc%2FCore%2FLock%2FSemaphoreLockTest.php;h=87d8b2cd2f59595eeed51422037e92a2f5caa01a;hb=c8344886fde31afe26c43669169ac1fc655eaba7;hp=7b9b03d728103a0c86c1ea4b59a0b769b436d20e;hpb=6b7dfd0c712bc89de955a735fcbca60dc973d71d;p=friendica.git diff --git a/tests/src/Core/Lock/SemaphoreLockTest.php b/tests/src/Core/Lock/SemaphoreLockTest.php index 7b9b03d728..87d8b2cd2f 100644 --- a/tests/src/Core/Lock/SemaphoreLockTest.php +++ b/tests/src/Core/Lock/SemaphoreLockTest.php @@ -1,34 +1,57 @@ . + * + */ namespace Friendica\Test\src\Core\Lock; use Dice\Dice; use Friendica\App; -use Friendica\BaseObject; -use Friendica\Core\Config\Configuration; +use Friendica\Core\Config\IConfig; +use Friendica\Core\Config\JitConfig; use Friendica\Core\Lock\SemaphoreLock; +use Friendica\DI; +use Mockery; +use Mockery\MockInterface; class SemaphoreLockTest extends LockTest { - public function setUp() + protected function setUp(): void { - parent::setUp(); - - $dice = \Mockery::mock(Dice::class)->makePartial(); + /** @var MockInterface|Dice $dice */ + $dice = Mockery::mock(Dice::class)->makePartial(); - $app = \Mockery::mock(App::class); + $app = Mockery::mock(App::class); $app->shouldReceive('getHostname')->andReturn('friendica.local'); $dice->shouldReceive('create')->with(App::class)->andReturn($app); - $configMock = \Mockery::mock(Configuration::class); + $configMock = Mockery::mock(JitConfig::class); $configMock ->shouldReceive('get') - ->with('system', 'temppath', NULL, false) + ->with('system', 'temppath') ->andReturn('/tmp/'); - $dice->shouldReceive('create')->with(Configuration::class)->andReturn($configMock); + $dice->shouldReceive('create')->with(IConfig::class)->andReturn($configMock); // @todo Because "get_temppath()" is using static methods, we have to initialize the BaseObject - BaseObject::setDependencyInjection($dice); + DI::init($dice); + + parent::setUp(); } protected function getInstance() @@ -36,9 +59,57 @@ class SemaphoreLockTest extends LockTest return new SemaphoreLock(); } - function testLockTTL() + /** + * @doesNotPerformAssertions + */ + public function testLockTTL() + { + self::markTestSkipped("Semaphore doesn't work with TTL"); + } + + /** + * Test if semaphore locking works even when trying to release locks, where the file exists + * but it shouldn't harm locking + */ + public function testMissingFileNotOverriding() + { + $file = get_temppath() . '/test.sem'; + touch($file); + + self::assertTrue(file_exists($file)); + self::assertFalse($this->instance->release('test', false)); + self::assertTrue(file_exists($file)); + } + + /** + * Test overriding semaphore release with already set semaphore + * This test proves that semaphore locks cannot get released by other instances except themselves + * + * Check for Bug https://github.com/friendica/friendica/issues/7298#issuecomment-521996540 + * + * @see https://github.com/friendica/friendica/issues/7298#issuecomment-521996540 + */ + public function testMissingFileOverriding() + { + $file = get_temppath() . '/test.sem'; + touch($file); + + self::assertTrue(file_exists($file)); + self::assertFalse($this->instance->release('test', true)); + self::assertTrue(file_exists($file)); + } + + /** + * Test acquire lock even the semaphore file exists, but isn't used + */ + public function testOverrideSemFile() { - // Semaphore doesn't work with TTL - return true; + $file = get_temppath() . '/test.sem'; + touch($file); + + self::assertTrue(file_exists($file)); + self::assertTrue($this->instance->acquire('test')); + self::assertTrue($this->instance->isLocked('test')); + self::assertTrue($this->instance->release('test')); } }