package io.teknek.nibiru.rpc;
import java.util.concurrent.TimeUnit;
import io.teknek.nibiru.BasicAbstractServerTest;
import io.teknek.nibiru.Configuration;
import io.teknek.nibiru.client.ClientException;
import io.teknek.nibiru.client.RpcClient;
import io.teknek.nibiru.coordinator.RpcCoordinator;
import io.teknek.nibiru.transport.rpc.BlockingRpc;
import io.teknek.nibiru.transport.rpc.BlockingRpcResponse;
import io.teknek.nit.NitDesc;
import io.teknek.nit.NitDesc.NitSpec;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import org.junit.Assert;
import org.junit.Test;
public class TestRpcCoordinator extends BasicAbstractServerTest {
public static final String SIMPLE_CALLABLE = "import java.util.concurrent.Callable\n" +
"public class A implements Callable {\n" +
"public Object call(){\n" +
" return 5\n" +
"}\n" +
"}\n";
public NitDesc simpleCallable(){
NitDesc d = new NitDesc();
d.setSpec(NitSpec.GROOVY_CLASS_LOADER);
d.setScript(SIMPLE_CALLABLE);
return d;
}
public static final String RETURN_OBJECT = "import java.util.concurrent.Callable\n" +
"import io.teknek.nibiru.rpc.*\n" +
"public class B implements Callable {\n" +
"public Object call(){\n" +
" SomeWhackyType v = new SomeWhackyType()\n"+
" v.setY('yo')\n"+
" return v\n" +
"}\n" +
"}\n";
public NitDesc complexReturnCallable(){
NitDesc d = new NitDesc();
d.setSpec(NitSpec.GROOVY_CLASS_LOADER);
d.setScript(RETURN_OBJECT);
return d;
}
@Test
public void test(){
RpcCoordinator coordinator = new RpcCoordinator(new Configuration());
coordinator.init();
BlockingRpc rpc = new BlockingRpc();
rpc.setTimeoutInMillis(10000);
rpc.setNitDesc(simpleCallable());
@SuppressWarnings("unchecked")
BlockingRpcResponse<Integer> r = (BlockingRpcResponse<Integer>) coordinator.processMessage(rpc);
Assert.assertEquals(new Integer(5), r.getRpcResult());
coordinator.shutdown();
}
@Test
public void endToEndTest() throws ClientException{
RpcClient rpcClient = new RpcClient("127.0.0.1", server.getConfiguration().getTransportPort(), 10000, 10000);
TypeReference<BlockingRpcResponse<Integer>> t = new TypeReference<BlockingRpcResponse<Integer>> (){};
BlockingRpcResponse<Integer> resp = rpcClient.blockingRpc(simpleCallable(), 10000, TimeUnit.MILLISECONDS, t);
Assert.assertEquals(new Integer(5), resp.getRpcResult());
}
@Test
public void complexInReturn() throws ClientException{
RpcClient rpcClient = new RpcClient("127.0.0.1", server.getConfiguration().getTransportPort(), 10000, 10000);
TypeReference<BlockingRpcResponse<SomeWhackyType>> t = new TypeReference<BlockingRpcResponse<SomeWhackyType>> (){};
BlockingRpcResponse<SomeWhackyType> resp = rpcClient.blockingRpc(complexReturnCallable(), 10000, TimeUnit.MILLISECONDS, t);
ObjectMapper om = new ObjectMapper();
Assert.assertEquals( om.convertValue( resp.getRpcResult(), SomeWhackyType.class).getY(), "yo");
Assert.assertEquals( resp.getRpcResult().getY(), "yo");
}
}