package org.ovirt.engine.core.bll.lock; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.util.HashMap; import java.util.Map; import java.util.Set; import org.junit.Before; import org.junit.Test; import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.utils.lock.EngineLock; public class InMemoryLockManagerTest { private static final String ERROR1 = "Error1"; private static final String ERROR2 = "Error2"; private static final String ERROR3 = "Error3"; private EngineLock updateLock1; private EngineLock updateLock2; private EngineLock updateLock3; private EngineLock lockLock1; private EngineLock lockLock2; private EngineLock updateAndLockLock; private EngineLock failLockLock; private String updateGuid; private String lockGuid; private InMemoryLockManager lockManager = new InMemoryLockManager(); @Before public void setup() { updateGuid = Guid.newGuid().toString(); lockGuid = Guid.newGuid().toString(); Map<String, Pair<String, String>> updateRegionsMap = new HashMap<>(); updateRegionsMap.put(updateGuid, new Pair<>("1", ERROR1)); updateLock1 = new EngineLock(); updateLock1.setSharedLocks(updateRegionsMap); lockLock1 = new EngineLock(); lockLock1.setExclusiveLocks(updateRegionsMap); Map<String, Pair<String, String>> lockedRegionsMap = new HashMap<>(); lockedRegionsMap.put(lockGuid, new Pair<>("2", ERROR2)); lockLock2 = new EngineLock(); lockLock2.setExclusiveLocks(lockedRegionsMap); updateLock2 = new EngineLock(); updateLock2.setSharedLocks(lockedRegionsMap); updateAndLockLock = new EngineLock(); updateAndLockLock.setSharedLocks(updateRegionsMap); updateAndLockLock.setExclusiveLocks(lockedRegionsMap); failLockLock = new EngineLock(); failLockLock.setExclusiveLocks(updateRegionsMap); Map<String, Pair<String, String>> updateRegionsMap2 = new HashMap<>(); updateRegionsMap2.put(updateGuid, new Pair<>("1", ERROR3)); updateLock3 = new EngineLock(); updateLock3.setSharedLocks(updateRegionsMap2); } @Test public void checkAcquireLockSuccess() { assertTrue(lockManager.acquireLock(updateLock1).getFirst()); assertTrue(lockManager.acquireLock(lockLock2).getFirst()); lockManager.releaseLock(lockLock2); assertTrue(lockManager.acquireLock(updateLock2).getFirst()); lockManager.releaseLock(updateLock1); lockManager.releaseLock(updateLock2); assertTrue(lockManager.acquireLock(updateAndLockLock).getFirst()); lockManager.releaseLock(updateAndLockLock); assertTrue(lockManager.acquireLock(updateLock1).getFirst()); assertTrue(lockManager.releaseLock(updateGuid + "1")); assertTrue(lockManager.showAllLocks().isEmpty()); } @Test public void checkAcquireLockFailure() { assertTrue(lockManager.acquireLock(updateLock1).getFirst()); assertFalse(lockManager.acquireLock(lockLock1).getFirst()); lockManager.releaseLock(updateLock1); assertTrue(lockManager.acquireLock(lockLock1).getFirst()); lockManager.releaseLock(lockLock1); assertTrue(lockManager.acquireLock(updateAndLockLock).getFirst()); Pair<Boolean, Set<String>> lockResult = lockManager.acquireLock(lockLock1); assertFalse(lockResult.getFirst()); assertTrue(lockResult.getSecond().contains(ERROR1)); assertEquals(1, lockResult.getSecond().size()); lockResult = lockManager.acquireLock(updateLock2); assertFalse(lockResult.getFirst()); assertTrue(lockResult.getSecond().contains(ERROR2)); assertEquals(1, lockResult.getSecond().size()); lockManager.releaseLock(updateAndLockLock); assertTrue(lockManager.acquireLock(lockLock1).getFirst()); assertTrue(lockManager.acquireLock(updateLock2).getFirst()); lockManager.releaseLock(lockLock1); lockManager.releaseLock(updateLock2); assertTrue(lockManager.acquireLock(updateAndLockLock).getFirst()); assertTrue(lockManager.acquireLock(updateLock3).getFirst()); lockResult = lockManager.acquireLock(failLockLock); assertFalse(lockResult.getFirst()); assertTrue(lockResult.getSecond().contains(ERROR1)); assertTrue(lockResult.getSecond().contains(ERROR3)); assertEquals(2, lockResult.getSecond().size()); lockManager.releaseLock(updateAndLockLock); lockManager.releaseLock(updateLock3); } @Test public void checkClear() { assertTrue(lockManager.acquireLock(lockLock1).getFirst()); assertTrue(lockManager.acquireLock(lockLock2).getFirst()); lockManager.clear(); assertTrue(lockManager.acquireLock(lockLock1).getFirst()); assertTrue(lockManager.acquireLock(lockLock2).getFirst()); lockManager.clear(); } @Test public void checkShowLocks() { assertTrue(lockManager.acquireLock(lockLock1).getFirst()); assertTrue(lockManager.acquireLock(lockLock2).getFirst()); assertEquals(2, lockManager.showAllLocks().size()); lockManager.clear(); assertTrue(lockManager.showAllLocks().isEmpty()); } }