package com.opower.updater; import org.junit.Test; import org.kiji.schema.KijiURI; import org.kiji.schema.util.ZooKeeperTest; import java.util.concurrent.TimeUnit; import static org.junit.Assert.fail; /** * Tests for {@link com.opower.updater.ZookeeperUpdaterLocker}. * * @author felix.trepanier */ public class TestZookeeperUpdaterLocker extends ZooKeeperTest { private static final int MAX_WAIT_TIME = 100; private static final TimeUnit MAX_WAIT_TIME_UNIT = TimeUnit.MILLISECONDS; @Test public void testLockCantBeAcquiredIfInUsed() throws Exception { final KijiURI kijiURI = KijiURI.newBuilder("kiji://" + getZKAddress() + "/instance").build(); ZookeeperUpdaterLocker lockerA = new ZookeeperUpdaterLocker(); ZookeeperUpdaterLocker lockerB = new ZookeeperUpdaterLocker(); // lockerA gets the lock UpdaterLocker.AcquiredLock lockA = lockerA.acquireLock(kijiURI, MAX_WAIT_TIME, MAX_WAIT_TIME_UNIT); // lockerB must not acquire the lock try { lockerB.acquireLock(kijiURI, MAX_WAIT_TIME, MAX_WAIT_TIME_UNIT); fail(); } catch (LockNotAcquiredException ex) { // ok! } // lockerA releases the lock lockA.release(); // lockerB gets it UpdaterLocker.AcquiredLock lockB = lockerB.acquireLock(kijiURI, MAX_WAIT_TIME, MAX_WAIT_TIME_UNIT); lockB.release(); } @Test public void testLockingOnDifferentInstances() throws Exception { ZookeeperUpdaterLocker lockerA = new ZookeeperUpdaterLocker(); ZookeeperUpdaterLocker lockerB = new ZookeeperUpdaterLocker(); // Both locker should obtain a lock. UpdaterLocker.AcquiredLock lockA = lockerA.acquireLock(KijiURI.newBuilder("kiji://" + getZKAddress() + "/A").build(), MAX_WAIT_TIME, MAX_WAIT_TIME_UNIT); UpdaterLocker.AcquiredLock lockB = lockerB.acquireLock(KijiURI.newBuilder("kiji://" + getZKAddress() + "/B").build(), MAX_WAIT_TIME, MAX_WAIT_TIME_UNIT); lockA.release(); lockB.release(); } }