package org.goldenorb.server;
import static org.junit.Assert.*;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooKeeper;
import org.goldenorb.conf.OrbConfiguration;
import org.goldenorb.zookeeper.OrbZKFailure;
import org.goldenorb.zookeeper.ZookeeperUtils;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class TestJobsMonitor {
private static ZooKeeper zk;
private static String jobQueuePath;
private static String jobsInProgressPath;
private static String leaderGroupPath;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
OrbConfiguration orbConf = new OrbConfiguration(true);
orbConf.setOrbZooKeeperQuorum("localhost:21810");
zk = ZookeeperUtils.connect(orbConf.getOrbZooKeeperQuorum());
ZookeeperUtils.tryToCreateNode(zk, "/GoldenOrb");
ZookeeperUtils.tryToCreateNode(zk, "/GoldenOrb/" + orbConf.getOrbClusterName());
ZookeeperUtils.tryToCreateNode(zk, "/GoldenOrb/" + orbConf.getOrbClusterName() + "/JobsInProgress");
ZookeeperUtils.tryToCreateNode(zk, "/GoldenOrb/" + orbConf.getOrbClusterName() + "/JobQueue");
ZookeeperUtils
.tryToCreateNode(zk, "/GoldenOrb/" + orbConf.getOrbClusterName() + "/OrbTrackerLeaderGroup");
jobsInProgressPath = "/GoldenOrb/" + orbConf.getOrbClusterName() + "/JobsInProgress";
jobQueuePath = "/GoldenOrb/" + orbConf.getOrbClusterName() + "/JobQueue";
leaderGroupPath = orbConf.getOrbClusterName() + "/OrbTrackerLeaderGroup";
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
ZookeeperUtils.recursiveDelete(zk, "/GoldenOrb");
ZookeeperUtils.deleteNodeIfEmpty(zk, "/GoldenOrb");
}
@After
public void tearDown() throws Exception {
ZookeeperUtils.recursiveDelete(zk, "/GoldenOrb/Test/JobsInProgress");
ZookeeperUtils.recursiveDelete(zk, "/GoldenOrb/Test/JobQueue");
}
@SuppressWarnings("deprecation")
@Test
public void testJobQueue() throws OrbZKFailure, InterruptedException, KeeperException {
int num_nodes = 10;
for (int i = 0; i < num_nodes; i++) {
createJob(jobQueuePath);
}
CountDownLatch latch = new CountDownLatch(1);
TServer server = new TServer(latch);
String[] jobQueue = server.getJobsInQueue();
assertEquals(null, jobQueue);
new JobsMonitor(jobQueuePath, server, zk);
latch.await();
jobQueue = server.getJobsInQueue();
assertEquals(num_nodes, jobQueue.length);
latch = new CountDownLatch(3);
server.setLatcher(latch);
for (int i = 0; i < 3; i++) {
createJob(jobQueuePath);
}
latch.await();
jobQueue = server.getJobsInQueue();
assertEquals(num_nodes + 3, jobQueue.length);
latch = new CountDownLatch(3);
server.setLatcher(latch);
List<String> children = zk.getChildren(jobQueuePath, false);
for (int i = 0; i < 3; i++) {
ZookeeperUtils.deleteNodeIfEmpty(zk, jobQueuePath + "/" + children.get(3 - i));
}
latch.await();
jobQueue = server.getJobsInQueue();
assertEquals(num_nodes, jobQueue.length);
}
@SuppressWarnings("deprecation")
@Test
public void testJobsInProgress() throws OrbZKFailure, InterruptedException, KeeperException {
int num_nodes = 10;
for (int i = 0; i < num_nodes; i++) {
createJob(jobsInProgressPath);
}
CountDownLatch latch = new CountDownLatch(1);
TServer server = new TServer(latch);
String[] jobQueue = server.getJobsInProgress();
assertEquals(null, jobQueue);
new JobsMonitor(jobsInProgressPath, server, zk);
latch.await();
jobQueue = server.getJobsInProgress();
assertEquals(num_nodes, jobQueue.length);
latch = new CountDownLatch(3);
server.setLatcher(latch);
for (int i = 0; i < 3; i++) {
createJob(jobsInProgressPath);
}
latch.await();
jobQueue = server.getJobsInProgress();
assertEquals(num_nodes + 3, jobQueue.length);
latch = new CountDownLatch(3);
server.setLatcher(latch);
List<String> children = zk.getChildren(jobsInProgressPath, false);
for (int i = 0; i < 3; i++) {
ZookeeperUtils.deleteNodeIfEmpty(zk, jobsInProgressPath + "/" + children.get(3 - i));
}
latch.await();
jobQueue = server.getJobsInProgress();
assertEquals(num_nodes, jobQueue.length);
}
private void createJob(String path) throws OrbZKFailure {
ZookeeperUtils.tryToCreateNode(zk, path + "/Job", CreateMode.EPHEMERAL_SEQUENTIAL);
}
}