diff --git a/tests/framework/mutex/DbMutexTest.php b/tests/framework/mutex/DbMutexTest.php new file mode 100644 index 00000000000..3392c9ac549 --- /dev/null +++ b/tests/framework/mutex/DbMutexTest.php @@ -0,0 +1,72 @@ +mockApplication([ + 'components' => [ + 'db' => [ + 'class' => Connection::class, + 'dsn' => 'sqlite::memory:', + ], + ], + ]); + } + + public function testDbPropertyDefaultValue(): void + { + $mutex = $this->getMockForAbstractClass('yii\mutex\DbMutex'); + $this->assertInstanceOf(Connection::class, $mutex->db); + } + + public function testDbPropertyResolvesFromApplicationComponent(): void + { + $mutex = $this->getMockForAbstractClass('yii\mutex\DbMutex'); + $this->assertSame(Yii::$app->db, $mutex->db); + } + + public function testDbPropertyAcceptsConnectionObject(): void + { + $connection = new Connection(['dsn' => 'sqlite::memory:']); + $mutex = $this->getMockForAbstractClass('yii\mutex\DbMutex', [['db' => $connection]]); + $this->assertSame($connection, $mutex->db); + } + + public function testDbPropertyAcceptsConfigArray(): void + { + $mutex = $this->getMockForAbstractClass('yii\mutex\DbMutex', [[ + 'db' => [ + 'class' => Connection::class, + 'dsn' => 'sqlite::memory:', + ], + ]]); + $this->assertInstanceOf(Connection::class, $mutex->db); + } + + public function testThrowsExceptionForInvalidDb(): void + { + $this->expectException(InvalidConfigException::class); + $this->getMockForAbstractClass('yii\mutex\DbMutex', [['db' => 'nonExistingComponent']]); + } +} diff --git a/tests/framework/mutex/MutexTest.php b/tests/framework/mutex/MutexTest.php new file mode 100644 index 00000000000..16d7dd2ef79 --- /dev/null +++ b/tests/framework/mutex/MutexTest.php @@ -0,0 +1,79 @@ +assertTrue($mutex->acquire('test')); + $this->assertTrue($mutex->isAcquired('test')); + $this->assertTrue($mutex->release('test')); + $this->assertFalse($mutex->isAcquired('test')); + } + + public function testAcquireSameLockTwiceReturnsFalse(): void + { + $mutex = new DumbMutex(); + $this->assertTrue($mutex->acquire('test')); + $this->assertFalse($mutex->acquire('test')); + $mutex->release('test'); + } + + public function testReleaseUnacquiredLockReturnsFalse(): void + { + $mutex = new DumbMutex(); + $this->assertFalse($mutex->release('test')); + } + + public function testIsAcquiredReturnsFalseForUnknownLock(): void + { + $mutex = new DumbMutex(); + $this->assertFalse($mutex->isAcquired('nonexistent')); + } + + public function testAutoReleaseIsEnabledByDefault(): void + { + $mutex = new DumbMutex(); + $this->assertTrue($mutex->autoRelease); + } + + public function testAutoReleaseCanBeDisabled(): void + { + $mutex = new DumbMutex(['autoRelease' => false]); + $this->assertFalse($mutex->autoRelease); + } + + public function testAcquireSkipsAcquireLockWhenAlreadyHeld(): void + { + $mutex = new DumbMutex(); + $mutex->acquire('test'); + + $countBefore = count($mutex->attemptsTime); + $mutex->acquire('test'); + $this->assertCount($countBefore, $mutex->attemptsTime); + + $mutex->release('test'); + } +} diff --git a/tests/framework/mutex/OracleMutexTest.php b/tests/framework/mutex/OracleMutexTest.php new file mode 100644 index 00000000000..01a6ca34cc3 --- /dev/null +++ b/tests/framework/mutex/OracleMutexTest.php @@ -0,0 +1,115 @@ +createMock(Connection::class); + $db->method('__get')->willReturnMap([ + ['driverName', 'oci'], + ]); + + $this->mockApplication([ + 'components' => [ + 'db' => $db, + ], + ]); + + $mutex = new OracleMutex(['db' => $db]); + $this->assertSame($db, $mutex->db); + } + + public function testInitSucceedsWithOdbcDriver(): void + { + $db = $this->createMock(Connection::class); + $db->method('__get')->willReturnMap([ + ['driverName', 'odbc'], + ]); + + $this->mockApplication([ + 'components' => [ + 'db' => $db, + ], + ]); + + $mutex = new OracleMutex(['db' => $db]); + $this->assertSame($db, $mutex->db); + } + + public function testDefaultProperties(): void + { + $db = $this->createMock(Connection::class); + $db->method('__get')->willReturnMap([ + ['driverName', 'oci'], + ]); + + $this->mockApplication(); + + $mutex = new OracleMutex(['db' => $db]); + $this->assertSame(OracleMutex::MODE_X, $mutex->lockMode); + $this->assertFalse($mutex->releaseOnCommit); + } + + public function testCustomProperties(): void + { + $db = $this->createMock(Connection::class); + $db->method('__get')->willReturnMap([ + ['driverName', 'oci'], + ]); + + $this->mockApplication(); + + $mutex = new OracleMutex([ + 'db' => $db, + 'lockMode' => OracleMutex::MODE_NL, + 'releaseOnCommit' => true, + ]); + $this->assertSame(OracleMutex::MODE_NL, $mutex->lockMode); + $this->assertTrue($mutex->releaseOnCommit); + } + + /** + * @dataProvider invalidDriverProvider + */ + public function testThrowsExceptionForInvalidDrivers(string $driverName): void + { + $db = $this->createMock(Connection::class); + $db->method('__get')->willReturnMap([ + ['driverName', $driverName], + ]); + + $this->mockApplication(); + + $this->expectException(InvalidConfigException::class); + $this->expectExceptionMessage('In order to use OracleMutex connection must be configured to use Oracle database.'); + new OracleMutex(['db' => $db]); + } + + public static function invalidDriverProvider(): array + { + return [ + 'mysql' => ['mysql'], + 'pgsql' => ['pgsql'], + 'sqlite' => ['sqlite'], + 'sqlsrv' => ['sqlsrv'], + ]; + } +}