package org.infinispan.client.hotrod; import static org.infinispan.server.hotrod.test.HotRodTestingUtil.hotRodCacheConfiguration; import static org.infinispan.test.TestingUtil.k; import static org.testng.AssertJUnit.assertEquals; import java.lang.reflect.Method; import java.net.SocketTimeoutException; import org.infinispan.client.hotrod.exceptions.HotRodClientException; import org.infinispan.client.hotrod.test.HotRodClientTestingUtil; import org.infinispan.client.hotrod.test.SingleHotRodServerTest; import org.infinispan.commands.write.PutKeyValueCommand; import org.infinispan.commons.marshall.Marshaller; import org.infinispan.commons.marshall.WrappedByteArray; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.context.InvocationContext; import org.infinispan.interceptors.base.CommandInterceptor; import org.infinispan.interceptors.impl.EntryWrappingInterceptor; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.marshall.core.JBossMarshaller; import org.infinispan.server.hotrod.HotRodServer; import org.infinispan.server.hotrod.configuration.HotRodServerConfigurationBuilder; import org.infinispan.test.fwk.TestCacheManagerFactory; import org.testng.Assert; import org.testng.annotations.Test; /** * Tests the behaviour of the client upon a socket timeout exception * and any invocation after that. * * @author Galder ZamarreƱo * @since 4.2 */ @Test(groups = "functional", testName = "client.hotrod.SocketTimeoutErrorTest") public class SocketTimeoutErrorTest extends SingleHotRodServerTest { @Override protected EmbeddedCacheManager createCacheManager() throws Exception { ConfigurationBuilder builder = new ConfigurationBuilder(); builder.customInterceptors().addInterceptor().interceptor( new TimeoutInducingInterceptor()).after(EntryWrappingInterceptor.class); return TestCacheManagerFactory.createCacheManager(hotRodCacheConfiguration(builder)); } @Override protected HotRodServer createHotRodServer() { HotRodServerConfigurationBuilder builder = new HotRodServerConfigurationBuilder(); builder.workerThreads(6); // TODO: Remove workerThreads configuration when ISPN-5083 implemented return HotRodClientTestingUtil.startHotRodServer(cacheManager, builder); } @Override protected RemoteCacheManager getRemoteCacheManager() { org.infinispan.client.hotrod.configuration.ConfigurationBuilder builder = new org.infinispan.client.hotrod.configuration.ConfigurationBuilder(); builder.addServer().host("127.0.0.1").port(hotrodServer.getPort()); builder.socketTimeout(2000); builder.maxRetries(0); return new RemoteCacheManager(builder.build()); } public void testErrorWhileDoingPut(Method m) throws Exception { RemoteCache<String, Integer> cache = remoteCacheManager.getCache(); cache.put(k(m), 1); assertEquals(1, cache.get(k(m)).intValue()); try { cache.put("FailFailFail", 2); Assert.fail("No exception was thrown."); } catch (HotRodClientException e) { // ignore assert e.getCause() instanceof SocketTimeoutException; } cache.put("dos", 2); assertEquals(2, cache.get("dos").intValue()); } public static class TimeoutInducingInterceptor extends CommandInterceptor { @Override public Object visitPutKeyValueCommand(InvocationContext ctx, PutKeyValueCommand command) throws Throwable { if (unmarshall(command.getKey()).equals("FailFailFail")) { Thread.sleep(6000); return null; } return super.visitPutKeyValueCommand(ctx, command); } private String unmarshall(Object key) throws Exception { Marshaller marshaller = new JBossMarshaller(); return (String) marshaller.objectFromByteBuffer(((WrappedByteArray) key).getBytes()); } } }