package org.limewire.nio.timeout;
import java.util.concurrent.ScheduledExecutorService;
import org.limewire.nio.NIODispatcher;
import org.limewire.nio.NIOTestUtils;
import org.limewire.nio.observer.Shutdownable;
import org.limewire.util.BaseTestCase;
public class NIOWatchdogTest extends BaseTestCase {
public NIOWatchdogTest(String name) {
super(name);
}
private static ScheduledExecutorService executor = NIODispatcher.instance().getScheduledExecutorService();
public void testActivate() throws Exception {
MyShutdownable shutdownable = new MyShutdownable();
StalledUploadWatchdog watchdog = new StalledUploadWatchdog(50, executor);
assertFalse(shutdownable.shutdown);
Thread.sleep(50);
NIOTestUtils.waitForNIO();
assertFalse(shutdownable.shutdown);
watchdog.activate(shutdownable);
Thread.sleep(30);
assertFalse(shutdownable.shutdown);
Thread.sleep(20);
NIOTestUtils.waitForNIO();
assertTrue(shutdownable.shutdown);
// reactivate
shutdownable.shutdown = false;
watchdog.activate(shutdownable);
Thread.sleep(50);
NIOTestUtils.waitForNIO();
assertTrue(shutdownable.shutdown);
// activate for never
watchdog = new StalledUploadWatchdog(Long.MAX_VALUE, executor);
shutdownable.shutdown = false;
watchdog.activate(shutdownable);
Thread.sleep(100); // if it were broken would overflow and execute right away
NIOTestUtils.waitForNIO();
assertFalse(shutdownable.shutdown);
watchdog.deactivate();
}
public void testDeactivate() throws Exception {
MyShutdownable shutdownable = new MyShutdownable();
StalledUploadWatchdog watchdog = new StalledUploadWatchdog(50, executor);
watchdog.activate(shutdownable);
watchdog.deactivate();
Thread.sleep(50);
NIOTestUtils.waitForNIO();
assertFalse(shutdownable.shutdown);
watchdog.deactivate();
assertFalse(shutdownable.shutdown);
}
public void testActivateOnNIOThread() throws Exception {
final MyShutdownable shutdownable = new MyShutdownable();
final StalledUploadWatchdog watchdog = new StalledUploadWatchdog(1000, executor);
NIODispatcher.instance().getScheduledExecutorService().submit(new Runnable() {
public void run() {
watchdog.activate(shutdownable);
}
});
NIOTestUtils.waitForNIO();
Thread.sleep(50);
assertFalse(shutdownable.shutdown);
NIODispatcher.instance().getScheduledExecutorService().submit(new Runnable() {
public void run() {
watchdog.deactivate();
}
});
NIOTestUtils.waitForNIO();
assertFalse(shutdownable.shutdown);
}
private class MyShutdownable implements Shutdownable {
private volatile boolean shutdown;
public void shutdown() {
this.shutdown = true;
}
}
}