d107eca3cf00fff86971f76449602fc8e21dbc50
[Packages/TYPO3.CMS.git] / typo3 / sysext / core / Tests / Unit / Locking / LockFactoryTest.php
1 <?php
2 namespace TYPO3\CMS\Core\Tests\Unit\Locking;
3
4 /*
5 * This file is part of the TYPO3 CMS project.
6 *
7 * It is free software; you can redistribute it and/or modify it under
8 * the terms of the GNU General Public License, either version 2
9 * of the License, or any later version.
10 *
11 * For the full copyright and license information, please read the
12 * LICENSE.txt file that was distributed with this source code.
13 *
14 * The TYPO3 project - inspiring people to share!
15 */
16
17 use TYPO3\CMS\Core\Locking\Exception\LockCreateException;
18 use TYPO3\CMS\Core\Locking\FileLockStrategy;
19 use TYPO3\CMS\Core\Locking\LockFactory;
20 use TYPO3\CMS\Core\Locking\LockingStrategyInterface;
21 use TYPO3\CMS\Core\Locking\SemaphoreLockStrategy;
22 use TYPO3\CMS\Core\Tests\Unit\Locking\Fixtures\DummyLock;
23
24 /**
25 * Testcase for \TYPO3\CMS\Core\Locking\LockFactory
26 */
27 class LockFactoryTest extends \TYPO3\Components\TestingFramework\Core\UnitTestCase
28 {
29 /**
30 * @var LockFactory|\PHPUnit_Framework_MockObject_MockObject|\TYPO3\Components\TestingFramework\Core\AccessibleObjectInterface
31 */
32 protected $mockFactory;
33
34 /**
35 * Set up the tests
36 */
37 protected function setUp()
38 {
39 $this->mockFactory = $this->getAccessibleMock(LockFactory::class, ['dummy']);
40 }
41
42 /**
43 * @test
44 */
45 public function addLockingStrategyAddsTheClassNameToTheInternalArray()
46 {
47 $this->mockFactory->addLockingStrategy(DummyLock::class);
48 $this->assertArrayHasKey(DummyLock::class, $this->mockFactory->_get('lockingStrategy'));
49 }
50
51 /**
52 * @test
53 */
54 public function addLockingStrategyThrowsExceptionIfInterfaceIsNotImplemented()
55 {
56 $this->expectException(\InvalidArgumentException::class);
57 $this->expectExceptionCode(1425990198);
58
59 $this->mockFactory->addLockingStrategy(\stdClass::class);
60 }
61
62 /**
63 * @test
64 */
65 public function getLockerReturnsExpectedClass()
66 {
67 $this->mockFactory->_set('lockingStrategy', [FileLockStrategy::class => true, DummyLock::class => true]);
68 $locker = $this->mockFactory->createLocker('id', LockingStrategyInterface::LOCK_CAPABILITY_EXCLUSIVE | LockingStrategyInterface::LOCK_CAPABILITY_SHARED);
69 $this->assertInstanceOf(FileLockStrategy::class, $locker);
70 }
71
72 /**
73 * @test
74 */
75 public function getLockerReturnsClassWithHighestPriority()
76 {
77 $this->mockFactory->_set('lockingStrategy', [SemaphoreLockStrategy::class => true, DummyLock::class => true]);
78 $locker = $this->mockFactory->createLocker('id');
79 $this->assertInstanceOf(DummyLock::class, $locker);
80 }
81
82 /**
83 * @test
84 */
85 public function getLockerThrowsExceptionIfNoMatchFound()
86 {
87 $this->expectException(LockCreateException::class);
88 $this->expectExceptionCode(1425990190);
89
90 $this->mockFactory->createLocker('id', 32);
91 }
92 }