package org.infinispan.remoting.rpc;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertTrue;
import static org.testng.AssertJUnit.fail;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.infinispan.commands.ReplicableCommand;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.remoting.RemoteException;
import org.infinispan.remoting.responses.Response;
import org.infinispan.remoting.responses.SuccessfulResponse;
import org.infinispan.remoting.transport.Address;
import org.infinispan.test.MultipleCacheManagersTest;
import org.testng.annotations.Test;
/**
* @author William Burns
* @author anistor@redhat.com
* @since 5.3
*/
@Test(testName = "remoting.rpc.RpcManagerCustomReplicableCommandTest", groups = "functional")
public class RpcManagerCustomReplicableCommandTest extends MultipleCacheManagersTest {
protected static final String TEST_CACHE = "testCache";
protected static final String EXPECTED_RETURN_VALUE = "the-return-value";
@Override
protected void createCacheManagers() throws Throwable {
ConfigurationBuilder builder = getDefaultClusteredCacheConfig(CacheMode.REPL_SYNC, true);
createClusteredCaches(2, TEST_CACHE, builder);
}
protected ReplicableCommand createReplicableCommandForTest(Object arg) {
return new CustomReplicableCommand(arg);
}
/**
* Test to make sure that invokeRemotely returns the result from the remote side.
*/
public void testInvokeRemotely() {
RpcManager rpcManager = cache(0, "testCache").getAdvancedCache().getRpcManager();
ReplicableCommand command = createReplicableCommandForTest(EXPECTED_RETURN_VALUE);
Map<Address, Response> remoteResponses = rpcManager.invokeRemotely(null, command, rpcManager.getDefaultRpcOptions(true));
log.tracef("Responses were: %s", remoteResponses);
assertEquals(1, remoteResponses.size());
Response response = remoteResponses.values().iterator().next();
assertNotNull(response);
assertTrue(response.isValid());
assertTrue(response.isSuccessful());
assertTrue(response instanceof SuccessfulResponse);
Object value = ((SuccessfulResponse) response).getResponseValue();
assertEquals(EXPECTED_RETURN_VALUE, value);
}
/**
* Test to make sure that invokeRemotely results in a RemoteException.
*/
public void testInvokeRemotelyWithRemoteException() {
RpcManager rpcManager = cache(0, "testCache").getAdvancedCache().getRpcManager();
ReplicableCommand command = createReplicableCommandForTest(new IllegalArgumentException("exception!"));
try {
rpcManager.invokeRemotely(null, command, rpcManager.getDefaultRpcOptions(true));
fail("Expected RemoteException not thrown");
} catch (RemoteException e) {
assertTrue(e.getCause() instanceof IllegalArgumentException);
assertEquals("exception!", e.getCause().getMessage());
} catch (Exception ex) {
fail("Expected exception not thrown but instead we got : " + ex);
}
}
/**
* Test to make sure that invokeRemotely with a ResponseMode argument returns the result from the remote side.
*/
public void testInvokeRemotelyWithResponseMode() {
RpcManager rpcManager = cache(0, "testCache").getAdvancedCache().getRpcManager();
ReplicableCommand command = createReplicableCommandForTest(EXPECTED_RETURN_VALUE);
RpcOptions rpcOptions = rpcManager.getRpcOptionsBuilder(ResponseMode.SYNCHRONOUS_IGNORE_LEAVERS)
.timeout(5000, TimeUnit.MILLISECONDS).build();
Map<Address, Response> remoteResponses = rpcManager.invokeRemotely(null, command, rpcOptions);
log.tracef("Responses were: %s", remoteResponses);
assertEquals(1, remoteResponses.size());
Response response = remoteResponses.values().iterator().next();
assertNotNull(response);
assertTrue(response.isValid());
assertTrue(response.isSuccessful());
assertTrue(response instanceof SuccessfulResponse);
Object value = ((SuccessfulResponse) response).getResponseValue();
assertEquals(EXPECTED_RETURN_VALUE, value);
}
/**
* Test to make sure that invokeRemotely with a ResponseMode argument returns the result from the remote side.
*/
public void testInvokeRemotelyWithResponseModeWithRemoteException() {
RpcManager rpcManager = cache(0, "testCache").getAdvancedCache().getRpcManager();
ReplicableCommand command = createReplicableCommandForTest(new IllegalArgumentException("exception!"));
try {
RpcOptions rpcOptions = rpcManager.getRpcOptionsBuilder(ResponseMode.SYNCHRONOUS_IGNORE_LEAVERS)
.timeout(5000, TimeUnit.MILLISECONDS).build();
rpcManager.invokeRemotely(null, command, rpcOptions);
fail("Expected RemoteException not thrown");
} catch (RemoteException e) {
assertTrue(e.getCause() instanceof IllegalArgumentException);
assertEquals("exception!", e.getCause().getMessage());
} catch (Exception ex) {
fail("Expected exception not thrown but instead we got : " + ex);
}
}
}