package se.sics.kompics;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.concurrent.Semaphore;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import se.sics.gvod.net.NatNetworkControl;
import se.sics.gvod.net.events.PortAllocRequest;
import se.sics.gvod.address.Address;
import se.sics.gvod.net.VodMsgFrameDecoder;
import se.sics.gvod.net.NettyInit;
import se.sics.gvod.net.NettyNetwork;
import se.sics.gvod.net.Transport;
import se.sics.gvod.timer.ScheduleTimeout;
import se.sics.gvod.timer.Timer;
import se.sics.gvod.timer.java.JavaTimer;
/**
* Unit test for simple App.
*/
public class PortAllocTest
extends TestCase {
private static final Logger logger = LoggerFactory.getLogger(PortAllocTest.class);
private boolean testStatus = true;
/**
* Create the test case
*
* @param testName name of the test case
*/
public PortAllocTest(String testName) {
super(testName);
}
/**
* @return the suite of tests being tested
*/
public static Test suite() {
return new TestSuite(PortAllocTest.class);
}
public static void setTestObj(PortAllocTest testObj) {
TestStClientComponent.testObj = testObj;
}
public static class TestStClientComponent extends ComponentDefinition {
private Component netty;
private Component timer;
private static PortAllocTest testObj = null;
private Address self;
public TestStClientComponent() {
timer = create(JavaTimer.class);
netty = create(NettyNetwork.class);
subscribe(handleStart, control);
subscribe(handleMsgTimeout, timer.getPositive(Timer.class));
subscribe(handlePortAllocResponse, netty.getPositive(NatNetworkControl.class));
// subscribe(handlePortBindResponse, netty.getPositive(NatNetworkControl.class));
InetAddress addr = null;
int port = 13478;
try {
addr = InetAddress.getLocalHost();
} catch (UnknownHostException ex) {
logger.error("UnknownHostException");
testObj.fail();
}
self = new Address(addr, port, 1);
trigger(new NettyInit(12312, true, VodMsgFrameDecoder.class), netty.getControl());
}
public Handler<Start> handleStart = new Handler<Start>() {
public void handle(Start event) {
ScheduleTimeout st = new ScheduleTimeout(2000);
MsgTimeout mt = new MsgTimeout(st);
st.setTimeoutEvent(mt);
PortAllocRequest req = new PortAllocRequest(self.getIp(),
self.getId(), 2, Transport.UDP);
MyPortAllocResponse resp = new MyPortAllocResponse(req, new Integer(1));
req.setResponse(resp);
trigger(req, netty.getPositive(NatNetworkControl.class));
trigger(st, timer.getPositive(Timer.class));
}
};
public Handler<MyPortAllocResponse> handlePortAllocResponse = new Handler<MyPortAllocResponse>() {
@Override
public void handle(MyPortAllocResponse event) {
trigger(new Stop(), netty.getControl());
if (event.getAllocatedPorts().size() == 2) {
System.out.println("Got port alloc response!");
testObj.pass();
} else {
testObj.fail(true);
System.out.println("No port alloc response!");
}
}
};
public Handler<MsgTimeout> handleMsgTimeout = new Handler<MsgTimeout>() {
@Override
public void handle(MsgTimeout event) {
trigger(new Stop(), netty.getControl());
System.out.println("Msg timeout");
testObj.testStatus = false;
testObj.fail(true);
}
};
}
private static final int EVENT_COUNT = 1;
private static Semaphore semaphore = new Semaphore(0);
private void allTests() {
int i = 0;
runInstance();
if (testStatus == true) {
assertTrue(true);
}
}
private void runInstance() {
Kompics.createAndStart(TestStClientComponent.class, 1);
try {
PortAllocTest.semaphore.acquire(EVENT_COUNT);
System.out.println("Finished test.");
} catch (InterruptedException e) {
assert (false);
} finally {
Kompics.shutdown();
}
if (testStatus == false) {
assertTrue(false);
}
}
@org.junit.Ignore
public void testApp() {
setTestObj(this);
allTests();
}
public void pass() {
PortAllocTest.semaphore.release();
}
public void fail(boolean release) {
testStatus = false;
PortAllocTest.semaphore.release();
}
}