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
|
<?php
abstract class LockManagerIntegrationTestBase extends MediaWikiIntegrationTestCase {
/** @var string */
protected $class;
/** @var LockManager */
protected $managerA;
/** @var LockManager */
protected $managerB;
/**
* @param string $threadName
* @return LockManager
*/
abstract protected function getManager( $threadName );
protected function setUp(): void {
$this->managerA = $this->getManager( 'A' );
$this->managerB = $this->getManager( 'B' );
$this->class = get_class( $this->managerA );
}
public function testLockUnlockEx() {
$managerA = $this->managerA;
$managerB = $this->managerB;
$rand = wfRandomString();
$path = "unit_testing://resource/$rand/photo.jpeg";
$status = $managerA->lock( [ $path ], LockManager::LOCK_EX );
$this->assertStatusGood( $status, "Lock (outer) succeeded ({$this->class})." );
$status = $managerA->lock( [ $path ], LockManager::LOCK_EX );
$this->assertStatusGood( $status, "Lock (inner) succeeded ({$this->class})." );
$status = $managerB->lock( [ $path ], LockManager::LOCK_EX );
$this->assertStatusNotGood( $status, "Lock (EX) conflicted ({$this->class})." );
$status = $managerB->lock( [ $path ], LockManager::LOCK_SH );
$this->assertStatusNotGood( $status, "Lock (SH) conflicted ({$this->class})." );
$status = $managerA->unlock( [ $path ], LockManager::LOCK_EX );
$this->assertStatusGood( $status, "Unlock (inner) succeeded ({$this->class})." );
$status = $managerB->lock( [ $path ], LockManager::LOCK_EX );
$this->assertStatusNotGood( $status, "Lock still conflicted ({$this->class})." );
$status = $managerB->lock( [ $path ], LockManager::LOCK_SH );
$this->assertStatusNotGood( $status, "Lock still conflicted ({$this->class})." );
$status = $managerA->unlock( [ $path ], LockManager::LOCK_EX );
$this->assertStatusGood( $status, "Unlock (outer) succeeded ({$this->class})." );
$status = $managerB->lock( [ $path ], LockManager::LOCK_EX );
$this->assertStatusGood( $status, "Lock now succeeded ({$this->class})." );
$status = $managerB->unlock( [ $path ], LockManager::LOCK_EX );
$this->assertStatusGood( $status, "Unlock succeeded ({$this->class})." );
}
public function testLockUnlockSh() {
$managerA = $this->managerA;
$managerB = $this->managerB;
$rand = wfRandomString();
$path = "unit_testing://resource/$rand/file.png";
$status = $managerA->lock( [ $path ], LockManager::LOCK_SH );
$this->assertStatusGood( $status, "Lock (outer) succeeded ({$this->class})." );
$status = $managerA->lock( [ $path ], LockManager::LOCK_SH );
$this->assertStatusGood( $status, "Lock (inner) succeeded ({$this->class})." );
$status = $managerB->lock( [ $path ], LockManager::LOCK_EX );
$this->assertStatusNotGood( $status, "Lock (EX) conflicted ({$this->class})." );
$status = $managerB->lock( [ $path ], LockManager::LOCK_SH );
$this->assertStatusGood( $status, "Lock (SH) obtained ({$this->class})." );
$status = $managerB->lock( [ $path ], LockManager::LOCK_EX );
$this->assertStatusNotGood( $status, "Lock upgrade (EX) conflicted ({$this->class})." );
$status = $managerA->unlock( [ $path ], LockManager::LOCK_SH );
$this->assertStatusGood( $status, "Unlock (inner) succeeded ({$this->class})." );
$status = $managerB->lock( [ $path ], LockManager::LOCK_EX );
$this->assertStatusNotGood( $status, "Lock (EX) still conflicted ({$this->class})." );
$status = $managerA->unlock( [ $path ], LockManager::LOCK_SH );
$this->assertStatusGood( $status, "Unlock (outer) succeeded ({$this->class})." );
$status = $managerB->lock( [ $path ], LockManager::LOCK_EX );
$this->assertStatusGood( $status, "Lock upgrade (EX) now obtained ({$this->class})." );
$status = $managerB->unlock( [ $path ], LockManager::LOCK_EX );
$this->assertStatusGood( $status, "Unlock (EX) succeeded ({$this->class})." );
$status = $managerB->unlock( [ $path ], LockManager::LOCK_SH );
$this->assertStatusGood( $status, "Unlock (SH) succeeded ({$this->class})." );
}
}
|