TEST(LockManagerTest, TxError) { LockManager lm; LockManager::LockStatus status; Transaction tx(1); // release a lock on a resource we haven't locked lm.acquire(&tx, kShared, 2); status = lm.release(&tx, kShared, 1); // this is in error ASSERT(LockManager::kLockResourceNotFound == status); status = lm.release(&tx, kShared, 2); ASSERT(LockManager::kLockReleased == status); // release a record we've locked in a different mode lm.acquire(&tx, kShared, 1); status = lm.release(&tx, kExclusive, 1); // this is in error ASSERT(LockManager::kLockModeNotFound == status); status = lm.release(&tx, kShared, 1); ASSERT(LockManager::kLockReleased == status); lm.acquire(&tx, kExclusive, 1); status = lm.release(&tx, kShared, 1); // this is in error ASSERT(LockManager::kLockModeNotFound == status); status = lm.release(&tx, kExclusive, 1); ASSERT(LockManager::kLockReleased == status); // attempt to acquire on a transaction that aborted try { lm.abort(&tx); } catch (const LockManager::AbortException& err) { } try { lm.acquire(&tx, kShared, 1); // error ASSERT(false); } catch (const LockManager::AbortException& error) { } }