public function testCounters()
 {
     $obj = new HarbormasterObject();
     $conn_w = $obj->establishConnection('w');
     // Test that the counter bascially behaves as expected.
     $this->assertEqual(1, LiskDAO::loadNextCounterID($conn_w, 'a'));
     $this->assertEqual(2, LiskDAO::loadNextCounterID($conn_w, 'a'));
     $this->assertEqual(3, LiskDAO::loadNextCounterID($conn_w, 'a'));
     // This first insert is primarily a test that the previous LAST_INSERT_ID()
     // value does not bleed into the creation of a new counter.
     $this->assertEqual(1, LiskDAO::loadNextCounterID($conn_w, 'b'));
     $this->assertEqual(2, LiskDAO::loadNextCounterID($conn_w, 'b'));
     // These inserts alternate database connections. Since unit tests are
     // transactional by default, we need to break out of them or we'll deadlock
     // since the transactions don't normally close until we exit the test.
     LiskDAO::endIsolateAllLiskEffectsToTransactions();
     try {
         $conn_1 = $obj->establishConnection('w', $force_new = true);
         $conn_2 = $obj->establishConnection('w', $force_new = true);
         $this->assertEqual(1, LiskDAO::loadNextCounterID($conn_1, 'z'));
         $this->assertEqual(2, LiskDAO::loadNextCounterID($conn_2, 'z'));
         $this->assertEqual(3, LiskDAO::loadNextCounterID($conn_1, 'z'));
         $this->assertEqual(4, LiskDAO::loadNextCounterID($conn_2, 'z'));
         $this->assertEqual(5, LiskDAO::loadNextCounterID($conn_1, 'z'));
         LiskDAO::beginIsolateAllLiskEffectsToTransactions();
     } catch (Exception $ex) {
         LiskDAO::beginIsolateAllLiskEffectsToTransactions();
         throw $ex;
     }
 }
 public function testReadableTransactions()
 {
     // TODO: When we have semi-durable fixtures, use those instead. This is
     // extremely hacky.
     LiskDAO::endIsolateAllLiskEffectsToTransactions();
     try {
         $data = Filesystem::readRandomCharacters(32);
         $obj = new HarbormasterScratchTable();
         $obj->openTransaction();
         $obj->setData($data);
         $obj->save();
         $loaded = id(new HarbormasterScratchTable())->loadOneWhere('data = %s', $data);
         $obj->killTransaction();
         $this->assertEqual(true, $loaded !== null, "Reads inside transactions should have transaction visibility.");
         LiskDAO::beginIsolateAllLiskEffectsToTransactions();
     } catch (Exception $ex) {
         LiskDAO::beginIsolateAllLiskEffectsToTransactions();
         throw $ex;
     }
 }
 protected function didRunOneTest($test)
 {
     $config = $this->getComputedConfiguration();
     if ($config[self::PHABRICATOR_TESTCONFIG_BUILD_STORAGE_FIXTURES]) {
         LiskDAO::endIsolateAllLiskEffectsToTransactions();
     }
 }