package net.juniper.contrail.watchdog;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import net.juniper.contrail.watchdog.TaskWatchDog;
@RunWith(JUnit4.class)
public class TaskWatchDogTest {
private final static int TASK_COUNT = 50;
CountDownLatch latch;
@Test
public void test1() {
latch = new CountDownLatch(TASK_COUNT);
ScheduledExecutorService ex = Executors.newScheduledThreadPool(TASK_COUNT);
MonitoredTaskTest tasks[] = new MonitoredTaskTest[TASK_COUNT];
List<Future<?>> futures = new ArrayList<Future<?>>();
for (int i = 0; i < TASK_COUNT; i++) {
tasks[i] = new MonitoredTaskTest(0);
futures.add(ex.submit(tasks[i]));
}
try {
// wait for all the tasks to get blocked
latch.await();
} catch (InterruptedException e) {
assertTrue("Task interrupted " + e.getMessage(), false);
e.printStackTrace();
}
for (Future<?> future : futures) {
assertFalse(future.isDone());
}
// launch watch dogs
ScheduledExecutorService watchDogExecutor =
Executors.newScheduledThreadPool(2);
List<Future<?>> futuresAker = new ArrayList<Future<?>>();
for (Runnable aker : TaskWatchDog.values()) {
futuresAker.add(watchDogExecutor.schedule(aker, 0,
TimeUnit.SECONDS));
}
// wait for watch dogs to finish running
for (Future<?> future : futuresAker) {
try {
future.get();
} catch (InterruptedException e1) {
assertTrue("Watchdogs interrupted " + e1.getMessage(),
false);
e1.printStackTrace();
} catch (ExecutionException e2) {
assertTrue("Watchdogs execution exception " + e2.getMessage(),
false);
e2.printStackTrace();
}
}
for (Future<?> future : futuresAker) {
assertTrue(future.isDone());
}
for (TaskWatchDog aker : TaskWatchDog.values()) {
assertNotEquals(aker.monitored, null);
}
assertFalse(TaskWatchDog.getMonitoredTasks().isEmpty());
for (ConcurrentHashMap.Entry<Runnable, MonitoredTaskRecord> entry:
TaskWatchDog.getMonitoredTasks().entrySet()) {
MonitoredTaskRecord tRec = entry.getValue();
assertTrue(tRec.blocked);
}
for (MonitoredTaskTest task: tasks) {
assertTrue(TaskWatchDog.getMonitoredTasks().containsKey(task));
}
}
class MonitoredTaskTest implements Runnable {
private long timeout;
Random r;
MonitoredTaskTest(long timeout) {
this.timeout = timeout;
r = new Random();
}
@Override
public void run() {
TaskWatchDog.startMonitoring(this, "Test", timeout, TimeUnit.MILLISECONDS);
latch.countDown();
// loop forever
for (;;) {
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
}
}
}
}
}