package com.diodesoftware.scb.clipboard; import com.diodesoftware.util.MockTimeGetter; import com.diodesoftware.scb.ClipUtil; import java.util.List; import java.util.ArrayList; import junit.framework.TestCase; public class LockMasterTest extends TestCase { private LockMaster lockMaster; private MockTimeGetter timeGetter; private List<String> sessions = new ArrayList<String>(); private static final String URI_A = "/uri/a/"; private static final String URI_B = "/uri/b/"; public LockMasterTest(String s){ super(s); } public void setUp() throws Exception{ lockMaster = new LockMaster(); timeGetter = new MockTimeGetter(); timeGetter.setTime(System.currentTimeMillis()); lockMaster.setTimeGetter(timeGetter); } private String newSession(){ String s = ClipUtil.genString(10); while(sessions.contains(s)){ s = ClipUtil.genString(10); } return s; } public void testFirstViewer() throws Exception{ String sessionA = newSession(); int currentStatus = lockMaster.getStatus(sessionA, URI_A); assertEquals("Expected UNLOCKED", LockMaster.UNLOCKED, currentStatus); currentStatus = lockMaster.getLock(sessionA, URI_A); assertEquals("Expected HAS_KEY", LockMaster.HAS_KEY, currentStatus); currentStatus = lockMaster.getStatus(sessionA, URI_A); assertEquals("Does not have KEY", LockMaster.HAS_KEY, currentStatus); lockMaster.returnLock(sessionA, URI_A); currentStatus = lockMaster.getStatus(sessionA, URI_A); assertEquals("Should not have key", LockMaster.UNLOCKED, currentStatus); } public void testTimeout() throws Exception{ String sessionA = newSession(); lockMaster.getLock(sessionA, URI_A); lockMaster.cleanOldLocks(); int status = lockMaster.getStatus(sessionA, URI_A); assertEquals("Should still have lock", LockMaster.HAS_KEY, status); //Move time ahead; long newTime = System.currentTimeMillis() + LockMaster.EXPIRY_TIME; timeGetter.setTime(newTime); lockMaster.cleanOldLocks(); status = lockMaster.getStatus(sessionA, URI_A); assertEquals("Should have lost lock", LockMaster.UNLOCKED, status); } public void testSecondViewer() throws Exception{ String sessionA = newSession(); String sessionB = newSession(); lockMaster.getLock(sessionA, URI_A); int bStatus = lockMaster.getStatus(sessionB, URI_A); assertEquals("Should be locked", LockMaster.LOCKED, bStatus); bStatus = lockMaster.getLock(sessionB, URI_A); assertEquals("Should not get locked on locked uri", LockMaster.LOCKED, bStatus); lockMaster.returnLock(sessionA, URI_A); bStatus = lockMaster.getStatus(sessionB, URI_A); assertEquals("Should be unlocked", LockMaster.UNLOCKED, bStatus); bStatus = lockMaster.getLock(sessionB, URI_A); assertEquals("Should have lock", LockMaster.HAS_KEY, bStatus); int aStatus = lockMaster.getLock(sessionA, URI_A); assertEquals("Should be locked out", LockMaster.LOCKED, aStatus); aStatus = lockMaster.getLock(sessionA, URI_B); assertEquals("Should have lock on different URI", LockMaster.HAS_KEY, aStatus); } }