package org.jacorb.test.nio;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Properties;
import org.jacorb.test.harness.ORBTestCase;
import org.jacorb.test.harness.TestUtils;
import org.jacorb.util.SelectorManager;
import org.jacorb.util.SelectorRequest;
import org.jacorb.util.SelectorRequestCallback;
import org.junit.Assume;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* FrameworkClientTest.java
*
* Tests for corect operation of the Transport Current framework
*/
public class NIOTimerTest extends ORBTestCase
{
private int expected_[] = new int[5];
private int order_[] = new int[5];
private long requestInitTime_ = 0;
private final int acceptableDelta_ = 30; // millis
private SelectorManager selectorManager_;
private long requestDuration_[] = new long[5]; // millis
private long actualDuration_[] = new long[5];
private long delta_[] = new long[5];
private int index_ = 0;
private Object lockObj_[] = new Object[5];
private class TimerCallback extends SelectorRequestCallback
{
private int id;
public TimerCallback (int id)
{
this.id = id;
}
@Override
public boolean call (SelectorRequest request)
{
order_[index_] = id;
index_ ++;
actualDuration_[id] = (System.nanoTime() - requestInitTime_) / 1000000;
delta_[id] = actualDuration_[id] > requestDuration_[id] ?
actualDuration_[id] - requestDuration_[id] :
requestDuration_[id] - actualDuration_[id];
synchronized (lockObj_)
{
lockObj_[id].notify();
}
return false;
}
}
@BeforeClass
public static void beforeClassSetUp() throws Exception
{
Assume.assumeFalse(TestUtils.isSSLEnabled);
}
@Before
public void setUp() throws Exception
{
requestDuration_[0] = 500;
requestDuration_[1] = 2000;
requestDuration_[2] = 700;
requestDuration_[3] = 1500;
requestDuration_[4] = 1000;
expected_[0] = 0;
expected_[1] = 2;
expected_[2] = 4;
expected_[3] = 3;
expected_[4] = 1;
selectorManager_ = ((org.jacorb.orb.ORB)orb).getSelectorManager ();
for (int i = 0; i < 5; i++)
{
lockObj_[i] = new Object();
}
}
@Override
protected void patchORBProperties(Properties props) throws Exception
{
props.setProperty ("jacorb.connection.nonblocking", "on");
}
@Test
public void testTimer() throws Exception
{
try
{
requestInitTime_ = System.nanoTime();
SelectorRequest selectorRequest[] = new SelectorRequest[5];
for (int i = 0; i < 5; i++)
{
selectorRequest[i] =
new SelectorRequest (new TimerCallback(i),
requestInitTime_ +
requestDuration_[i] * 1000000);
selectorManager_.add (selectorRequest[i]);
}
for (int i = 0; i < 5; i++)
{
selectorRequest[i].waitOnCompletion (Long.MAX_VALUE);
}
synchronized (lockObj_[1])
{
lockObj_[1].wait(2*requestDuration_[1]);
}
long maxDelta = 0;
boolean inorder = true;
for (int i = 0; i < 5; i++)
{
maxDelta = delta_[i] > maxDelta ? delta_[i] : maxDelta;
if (order_[i] != expected_[i])
{
inorder = false;
}
}
assertTrue (maxDelta <= acceptableDelta_);
assertTrue (inorder);
}
catch (InterruptedException ex)
{
fail ("InterruptedException");
}
}
}