package org.infinispan.replication; import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.any; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import org.infinispan.AdvancedCache; import org.infinispan.commands.ReplicableCommand; import org.infinispan.configuration.cache.CacheMode; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.context.Flag; import org.infinispan.remoting.inboundhandler.DeliverOrder; import org.infinispan.remoting.rpc.ResponseMode; import org.infinispan.remoting.rpc.RpcManager; import org.infinispan.remoting.rpc.RpcManagerImpl; import org.infinispan.remoting.transport.Transport; import org.infinispan.test.MultipleCacheManagersTest; import org.infinispan.test.TestingUtil; import org.infinispan.test.fwk.CleanupAfterMethod; import org.infinispan.util.ReplicatedControlledConsistentHashFactory; import org.testng.annotations.Test; /** * Tests for FORCE_ASYNCHRONOUS and FORCE_SYNCHRONOUS flags. * * @author Tomas Sykora * @author anistor@redhat.com */ @Test(testName = "replication.ForceSyncAsyncFlagsTest", groups = "functional") @CleanupAfterMethod public class ForceSyncAsyncFlagsTest extends MultipleCacheManagersTest { @Override protected void createCacheManagers() { // each test will create the needed caches } public void testForceAsyncFlagUsage() throws Exception { ConfigurationBuilder builder = getDefaultClusteredCacheConfig(CacheMode.REPL_SYNC, false); builder.clustering().hash().numSegments(1).consistentHashFactory(new ReplicatedControlledConsistentHashFactory(0)); createClusteredCaches(2, "replSync", builder); AdvancedCache<String, String> cache1 = this.<String, String>cache(0, "replSync").getAdvancedCache(); cache(1, "replSync").getAdvancedCache(); Transport originalTransport = TestingUtil.extractGlobalComponent(cache1.getCacheManager(), Transport.class); RpcManagerImpl rpcManager = (RpcManagerImpl) TestingUtil.extractComponent(cache1, RpcManager.class); Transport mockTransport = spy(originalTransport); rpcManager.setTransport(mockTransport); // check that the replication call was sync cache1.put("k", "v"); verify(mockTransport).invokeRemotelyAsync(isNull(), any(ReplicableCommand.class), eq(ResponseMode.SYNCHRONOUS_IGNORE_LEAVERS), anyLong(), isNull(), any(DeliverOrder.class), anyBoolean()); reset(mockTransport); // verify FORCE_ASYNCHRONOUS flag on SYNC cache cache1.withFlags(Flag.FORCE_ASYNCHRONOUS).put("k", "v"); verify(mockTransport).invokeRemotelyAsync(isNull(), any(ReplicableCommand.class), eq(ResponseMode.ASYNCHRONOUS), anyLong(), isNull(), any(DeliverOrder.class), anyBoolean()); } public void testForceSyncFlagUsage() throws Exception { ConfigurationBuilder builder = getDefaultClusteredCacheConfig(CacheMode.REPL_ASYNC, false); builder.clustering().hash().numSegments(1).consistentHashFactory(new ReplicatedControlledConsistentHashFactory(0)); createClusteredCaches(2, "replAsync", builder); AdvancedCache<String, String> cache1 = this.<String, String>cache(0, "replAsync").getAdvancedCache(); cache(1, "replAsync").getAdvancedCache(); Transport originalTransport = TestingUtil.extractGlobalComponent(cache1.getCacheManager(), Transport.class); RpcManagerImpl rpcManager = (RpcManagerImpl) TestingUtil.extractComponent(cache1, RpcManager.class); Transport mockTransport = spy(originalTransport); rpcManager.setTransport(mockTransport); cache1.put("k", "v"); verify(mockTransport).invokeRemotelyAsync(isNull(), any(ReplicableCommand.class), eq(ResponseMode.ASYNCHRONOUS), anyLong(), isNull(), any(DeliverOrder.class), anyBoolean()); reset(mockTransport); // verify FORCE_SYNCHRONOUS flag on ASYNC cache cache1.withFlags(Flag.FORCE_SYNCHRONOUS).put("k", "v"); verify(mockTransport).invokeRemotelyAsync(isNull(), any(ReplicableCommand.class), eq(ResponseMode.SYNCHRONOUS_IGNORE_LEAVERS), anyLong(), isNull(), any(DeliverOrder.class), anyBoolean()); } }