/** * Tests that restoreMMAPV1LockerImpl works by locking a db and collection and saving + restoring. */ TEST(LockerImpl, saveAndRestoreDBAndCollection) { Locker::LockSnapshot lockInfo; MMAPV1LockerImpl locker; const ResourceId resIdDatabase(RESOURCE_DATABASE, std::string("TestDB")); const ResourceId resIdCollection(RESOURCE_COLLECTION, std::string("TestDB.collection")); // Lock some stuff. locker.lockGlobal(MODE_IX); ASSERT(LOCK_OK == locker.lock(resIdDatabase, MODE_IX)); ASSERT(LOCK_OK == locker.lock(resIdCollection, MODE_X)); locker.saveLockStateAndUnlock(&lockInfo); // Things shouldn't be locked anymore. ASSERT(locker.getLockMode(resIdDatabase) == MODE_NONE); ASSERT(locker.getLockMode(resIdCollection) == MODE_NONE); // Restore lock state. locker.restoreLockState(lockInfo); // Make sure things were re-locked. ASSERT(locker.getLockMode(resIdDatabase) == MODE_IX); ASSERT(locker.getLockMode(resIdCollection) == MODE_X); locker.unlockAll(); }
TEST(LockerImpl, ReLockNoConflict) { const ResourceId resId(RESOURCE_COLLECTION, std::string("TestDB.collection")); MMAPV1LockerImpl locker; locker.lockGlobal(MODE_IX); ASSERT(LOCK_OK == locker.lock(resId, MODE_S)); ASSERT(LOCK_OK == locker.lock(resId, MODE_X)); ASSERT(!locker.unlock(resId)); ASSERT(locker.isLockHeldForMode(resId, MODE_X)); ASSERT(locker.unlock(resId)); ASSERT(locker.isLockHeldForMode(resId, MODE_NONE)); ASSERT(locker.unlockAll()); }
TEST(LockerImpl, MMAPV1Locker) { const ResourceId resId(RESOURCE_DATABASE, std::string("TestDB")); MMAPV1LockerImpl locker; ASSERT_EQUALS(LOCK_OK, locker.lockGlobal(MODE_IX)); ASSERT_EQUALS(LOCK_OK, locker.lock(resId, MODE_X)); // Make sure the flush lock IS held Locker::LockerInfo info; locker.getLockerInfo(&info); ASSERT(!info.waitingResource.isValid()); ASSERT_EQUALS(3U, info.locks.size()); ASSERT_EQUALS(RESOURCE_GLOBAL, info.locks[0].resourceId.getType()); ASSERT_EQUALS(RESOURCE_MMAPV1_FLUSH, info.locks[1].resourceId.getType()); ASSERT_EQUALS(resId, info.locks[2].resourceId); ASSERT(locker.unlockAll()); }