package org.deftserver.io.timeout;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.SelectableChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.spi.SelectorProvider;
import org.deftserver.web.AsyncCallback;
import org.junit.Test;
public class JMXDebuggableTimeoutManagerTest {
private final JMXDebuggableTimeoutManager tm = new JMXDebuggableTimeoutManager();
@Test
public void timeoutManagerTest() throws InterruptedException {
final long now = System.currentTimeMillis();
MockChannel c1 = new MockChannel();
MockChannel c2 = new MockChannel();
MockChannel c3 = new MockChannel();
addNopTimeout(now);
addNopTimeout(now);
addNopTimeout(now);
addNopTimeout(now+1);
addNopTimeout(now+2);
addNopTimeout(now+1000);
addNopTimeout(now+1200);
addNopTimeout(now+1400);
addNopKeepAliveTimeout(c1, now);
addNopKeepAliveTimeout(c2, now);
addNopKeepAliveTimeout(c3, now+1);
assertEquals(11, tm.getNumberOfTimeouts());
assertEquals(3, tm.getNumberOfKeepAliveTimeouts());
Thread.sleep(200);
tm.execute();
assertEquals(6, tm.getNumberOfTimeouts());
assertEquals(0, tm.getNumberOfKeepAliveTimeouts());
Thread.sleep(2000);
tm.execute();
assertEquals(0, tm.getNumberOfTimeouts());
assertEquals(0, tm.getNumberOfKeepAliveTimeouts());
}
private void addNopTimeout(long timeout) {
tm.addTimeout(new Timeout(timeout, new AsyncCallback() {
@Override public void onCallback() { /*nop*/}
}));
}
private void addNopKeepAliveTimeout(SelectableChannel channel, long timeout) {
tm.addKeepAliveTimeout(channel, new Timeout(timeout, new AsyncCallback() {
@Override public void onCallback() { /*nop*/ }
}));
}
@Test
public void addTimeoutDuringTimeoutExecution() throws InterruptedException {
final long now = System.currentTimeMillis();
addRecursiveTimeout(now);
addRecursiveTimeout(now+10);
addRecursiveTimeout(now+20);
assertEquals(3, tm.getNumberOfTimeouts());
assertEquals(0, tm.getNumberOfKeepAliveTimeouts());
Thread.sleep(50);
long ms = tm.execute();
assertTrue(ms != Long.MAX_VALUE);
assertEquals(3, tm.getNumberOfTimeouts());
assertEquals(0, tm.getNumberOfKeepAliveTimeouts());
Thread.sleep(50);
tm.execute();
Thread.sleep(50);
tm.execute();
Thread.sleep(50);
tm.execute();
assertEquals(0, tm.getNumberOfTimeouts());
assertEquals(0, tm.getNumberOfKeepAliveTimeouts());
}
private void addRecursiveTimeout(final long timeout) {
final Timeout t = new Timeout(timeout, new AsyncCallback() {
@Override public void onCallback() { addNopTimeout(System.currentTimeMillis()); }
});
tm.addTimeout(t);
}
private class MockChannel extends SelectableChannel {
@Override
public Object blockingLock() {
// TODO Auto-generated method stub
return null;
}
@Override
public SelectableChannel configureBlocking(boolean block)
throws IOException {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean isBlocking() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isRegistered() {
// TODO Auto-generated method stub
return false;
}
@Override
public SelectionKey keyFor(Selector sel) {
// TODO Auto-generated method stub
return null;
}
@Override
public SelectorProvider provider() {
// TODO Auto-generated method stub
return null;
}
@Override
public SelectionKey register(Selector sel, int ops, Object att)
throws ClosedChannelException {
// TODO Auto-generated method stub
return null;
}
@Override
public int validOps() {
// TODO Auto-generated method stub
return 0;
}
@Override
protected void implCloseChannel() throws IOException {
// TODO Auto-generated method stub
}
}
}