Path: blob/master/src/infrastructure/storage/__tests__/AphrontIsolatedDatabaseConnectionTestCase.php
12241 views
<?php12final class AphrontIsolatedDatabaseConnectionTestCase3extends PhabricatorTestCase {45protected function getPhabricatorTestCaseConfiguration() {6return array(7// We disable this here because this test is unique (it is testing that8// isolation actually occurs) and must establish a live connection to the9// database to verify that.10self::PHABRICATOR_TESTCONFIG_ISOLATE_LISK => false,11);12}1314public function testIsolation() {15// This will fail if the connection isn't isolated.16queryfx(17$this->newIsolatedConnection(),18'INSERT INVALID SYNTAX');1920$this->assertTrue(true);21}2223public function testInsertGeneratesID() {24$conn = $this->newIsolatedConnection();2526queryfx($conn, 'INSERT');27$id1 = $conn->getInsertID();2829queryfx($conn, 'INSERT');30$id2 = $conn->getInsertID();3132$this->assertTrue((bool)$id1, pht('ID1 exists.'));33$this->assertTrue((bool)$id2, pht('ID2 exists.'));34$this->assertTrue(35$id1 != $id2,36pht("IDs '%s' and '%s' are distinct.", $id1, $id2));37}3839public function testDeletePermitted() {40$conn = $this->newIsolatedConnection();41queryfx($conn, 'DELETE');4243$this->assertTrue(true);44}4546public function testTransactionStack() {47$conn = $this->newIsolatedConnection();48$conn->openTransaction();49queryfx($conn, 'INSERT');50$conn->saveTransaction();51$this->assertEqual(52array(53'START TRANSACTION',54'INSERT',55'COMMIT',56),57$conn->getQueryTranscript());5859$conn = $this->newIsolatedConnection();60$conn->openTransaction();61queryfx($conn, 'INSERT 1');62$conn->openTransaction();63queryfx($conn, 'INSERT 2');64$conn->killTransaction();65$conn->openTransaction();66queryfx($conn, 'INSERT 3');67$conn->openTransaction();68queryfx($conn, 'INSERT 4');69$conn->saveTransaction();70$conn->saveTransaction();71$conn->openTransaction();72queryfx($conn, 'INSERT 5');73$conn->killTransaction();74queryfx($conn, 'INSERT 6');75$conn->saveTransaction();7677$this->assertEqual(78array(79'START TRANSACTION',80'INSERT 1',81'SAVEPOINT Aphront_Savepoint_1',82'INSERT 2',83'ROLLBACK TO SAVEPOINT Aphront_Savepoint_1',84'SAVEPOINT Aphront_Savepoint_1',85'INSERT 3',86'SAVEPOINT Aphront_Savepoint_2',87'INSERT 4',88'SAVEPOINT Aphront_Savepoint_1',89'INSERT 5',90'ROLLBACK TO SAVEPOINT Aphront_Savepoint_1',91'INSERT 6',92'COMMIT',93),94$conn->getQueryTranscript());95}9697public function testTransactionRollback() {98$check = array();99100$phid = new HarbormasterScratchTable();101$phid->openTransaction();102for ($ii = 0; $ii < 3; $ii++) {103$key = $this->generateTestData();104105$obj = new HarbormasterScratchTable();106$obj->setData($key);107$obj->save();108109$check[] = $key;110}111$phid->killTransaction();112113foreach ($check as $key) {114$this->assertNoSuchRow($key);115}116}117118private function newIsolatedConnection() {119$config = array();120return new AphrontIsolatedDatabaseConnection($config);121}122123private function generateTestData() {124return Filesystem::readRandomCharacters(20);125}126127private function assertNoSuchRow($data) {128try {129$row = id(new HarbormasterScratchTable())->loadOneWhere(130'data = %s',131$data);132$this->assertEqual(133null,134$row,135pht('Expect fake row to exist only in isolation.'));136} catch (AphrontConnectionQueryException $ex) {137// If we can't connect to the database, conclude that the isolated138// connection actually is isolated. Philosophically, this perhaps allows139// us to claim this test does not depend on the database?140}141}142143}144145146