package org.gbif.occurrence.persistence.zookeeper;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import com.google.common.collect.Lists;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.RetryNTimes;
import org.apache.curator.test.TestingServer;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class ZookeeperLockManagerTest {
private static TestingServer SERVER;
private static CuratorFramework CURATOR;
private static ZookeeperLockManager ZOO_LOCK_MGR;
@BeforeClass
public static void setUp() throws Exception {
SERVER = new TestingServer();
CURATOR = CuratorFrameworkFactory.builder().namespace("hbasePersistence").connectString(SERVER.getConnectString())
.retryPolicy(new RetryNTimes(1, 1000)).build();
CURATOR.start();
ZOO_LOCK_MGR = new ZookeeperLockManager(CURATOR);
}
@AfterClass
public static void tearDown() throws IOException {
CURATOR.close();
SERVER.stop();
}
@Test
public void testAcquireSuccess() {
UUID uuid = UUID.randomUUID();
assertTrue(ZOO_LOCK_MGR.getLock(uuid.toString()));
ZOO_LOCK_MGR.releaseLock(uuid.toString());
}
@Test
public void testAcquireFail() {
UUID uuid = UUID.randomUUID();
assertTrue(ZOO_LOCK_MGR.getLock(uuid.toString()));
assertFalse(ZOO_LOCK_MGR.getLock(uuid.toString()));
ZOO_LOCK_MGR.releaseLock(uuid.toString());
}
@Test
public void testAcquireRelease() {
UUID uuid = UUID.randomUUID();
assertTrue(ZOO_LOCK_MGR.getLock(uuid.toString()));
ZOO_LOCK_MGR.releaseLock(uuid.toString());
assertTrue(ZOO_LOCK_MGR.getLock(uuid.toString()));
ZOO_LOCK_MGR.releaseLock(uuid.toString());
}
@Test
public void testMultiThreadCompete() throws ExecutionException, InterruptedException {
UUID uuid = UUID.randomUUID();
assertTrue(ZOO_LOCK_MGR.getLock(uuid.toString()));
List<Future<Boolean>> futures = Lists.newArrayList();
for (int i=0; i < 20; i++) {
FutureTask<Boolean> future = new FutureTask<Boolean>(new LockGrabber(uuid));
future.run();
futures.add(future);
}
for (Future<Boolean> future : futures) {
assertFalse(future.get());
}
ZOO_LOCK_MGR.releaseLock(uuid.toString());
}
private class LockGrabber implements Callable<Boolean> {
private UUID uuid;
private LockGrabber(UUID uuid) {
this.uuid = uuid;
}
@Override
public Boolean call() throws Exception {
return ZOO_LOCK_MGR.getLock(uuid.toString());
}
}
}