package org.infinispan.server.hotrod; import static org.infinispan.server.hotrod.test.HotRodTestingUtil.assertStatus; import static org.infinispan.server.hotrod.test.HotRodTestingUtil.k; import static org.infinispan.server.hotrod.test.HotRodTestingUtil.v; import java.lang.reflect.Method; import org.infinispan.commands.FlagAffectedCommand; import org.infinispan.commands.VisitableCommand; import org.infinispan.commons.CacheException; import org.infinispan.context.InvocationContext; import org.infinispan.context.impl.FlagBitSets; import org.infinispan.interceptors.AsyncInterceptorChain; import org.infinispan.interceptors.base.BaseCustomInterceptor; import org.testng.annotations.Test; /** * Tests if the {@link ProtocolFlag#SkipCacheLoader} flag is processed on server. * * @author Pedro Ruivo * @since 7.0 */ @Test(groups = "functional", testName = "server.hotrod.SkipCacheLoadHotRodTest") public class SkipCacheLoadHotRodTest extends HotRodSingleNodeTest { private static final int SKIP_LOADER_AND_RETURN_PREVIOUS_VALUE = join(ProtocolFlag.SkipCacheLoader.getValue(), ProtocolFlag.ForceReturnPreviousValue .getValue()); public void testPut(Method m) { FlagCheckCommandInterceptor commandInterceptor = init(); //PUT commandInterceptor.expectSkipLoadFlag = false; assertStatus(client().put(k(m), 0, 0, v(m), 0), OperationStatus.Success); commandInterceptor.expectSkipLoadFlag = true; assertStatus(client().put(k(m), 0, 0, v(m), ProtocolFlag.SkipCacheLoader.getValue()), OperationStatus.Success); assertStatus(client().put(k(m), 0, 0, v(m), SKIP_LOADER_AND_RETURN_PREVIOUS_VALUE), OperationStatus.SuccessWithPrevious); } public void testReplace(Method m) { //REPLACE FlagCheckCommandInterceptor commandInterceptor = init(); commandInterceptor.expectSkipLoadFlag = false; assertStatus(client().replace(k(m), 0, 0, v(m), 0), OperationStatus.OperationNotExecuted); commandInterceptor.expectSkipLoadFlag = false; assertStatus(client().replace(k(m), 0, 0, v(m), ProtocolFlag.SkipCacheLoader.getValue()), OperationStatus.OperationNotExecuted); assertStatus(client().replace(k(m), 0, 0, v(m), SKIP_LOADER_AND_RETURN_PREVIOUS_VALUE), OperationStatus.OperationNotExecuted); } public void testPutIfAbsent(Method m) { //PUT_IF_ABSENT FlagCheckCommandInterceptor commandInterceptor = init(); commandInterceptor.expectSkipLoadFlag = false; assertStatus(client().putIfAbsent(k(m), 0, 0, v(m), 0), OperationStatus.Success); commandInterceptor.expectSkipLoadFlag = false; assertStatus(client().putIfAbsent(k(m), 0, 0, v(m), ProtocolFlag.SkipCacheLoader.getValue()), OperationStatus.OperationNotExecuted); assertStatus(client().putIfAbsent(k(m), 0, 0, v(m), SKIP_LOADER_AND_RETURN_PREVIOUS_VALUE), OperationStatus.NotExecutedWithPrevious); } public void testReplaceIfUnmodified(Method m) { //REPLACE_IF_UNMODIFIED FlagCheckCommandInterceptor commandInterceptor = init(); commandInterceptor.expectSkipLoadFlag = false; assertStatus(client().replaceIfUnmodified(k(m), 0, 0, v(m), 0, 0), OperationStatus.KeyDoesNotExist); commandInterceptor.expectSkipLoadFlag = false; assertStatus(client().replaceIfUnmodified(k(m), 0, 0, v(m), 0, ProtocolFlag.SkipCacheLoader.getValue()), OperationStatus.KeyDoesNotExist); assertStatus(client().replaceIfUnmodified(k(m), 0, 0, v(m), 0, SKIP_LOADER_AND_RETURN_PREVIOUS_VALUE), OperationStatus.KeyDoesNotExist); } public void testGet(Method m) { //GET FlagCheckCommandInterceptor commandInterceptor = init(); commandInterceptor.expectSkipLoadFlag = false; assertStatus(client().get(k(m), 0), OperationStatus.KeyDoesNotExist); commandInterceptor.expectSkipLoadFlag = true; assertStatus(client().get(k(m), ProtocolFlag.SkipCacheLoader.getValue()), OperationStatus.KeyDoesNotExist); assertStatus(client().get(k(m), SKIP_LOADER_AND_RETURN_PREVIOUS_VALUE), OperationStatus.KeyDoesNotExist); } public void testGetWithVersion(Method m) { //GET_WITH_VERSION FlagCheckCommandInterceptor commandInterceptor = init(); commandInterceptor.expectSkipLoadFlag = false; assertStatus(client().getWithVersion(k(m), 0), OperationStatus.KeyDoesNotExist); commandInterceptor.expectSkipLoadFlag = true; assertStatus(client().getWithVersion(k(m), ProtocolFlag.SkipCacheLoader.getValue()), OperationStatus.KeyDoesNotExist); assertStatus(client().getWithVersion(k(m), SKIP_LOADER_AND_RETURN_PREVIOUS_VALUE), OperationStatus.KeyDoesNotExist); } public void testGetWithMetadata(Method m) { //GET_WITH_METADATA FlagCheckCommandInterceptor commandInterceptor = init(); commandInterceptor.expectSkipLoadFlag = false; assertStatus(client().getWithMetadata(k(m), 0), OperationStatus.KeyDoesNotExist); commandInterceptor.expectSkipLoadFlag = true; assertStatus(client().getWithMetadata(k(m), ProtocolFlag.SkipCacheLoader.getValue()), OperationStatus.KeyDoesNotExist); assertStatus(client().getWithMetadata(k(m), SKIP_LOADER_AND_RETURN_PREVIOUS_VALUE), OperationStatus.KeyDoesNotExist); } public void testRemove(Method m) { //REMOVE FlagCheckCommandInterceptor commandInterceptor = init(); commandInterceptor.expectSkipLoadFlag = false; assertStatus(client().remove(k(m), 0), OperationStatus.KeyDoesNotExist); commandInterceptor.expectSkipLoadFlag = true; assertStatus(client().remove(k(m), ProtocolFlag.SkipCacheLoader.getValue()), OperationStatus.KeyDoesNotExist); assertStatus(client().remove(k(m), SKIP_LOADER_AND_RETURN_PREVIOUS_VALUE), OperationStatus.KeyDoesNotExist); } public void testRemoveIfUnmodified(Method m) { //REMOVE_IF_UNMODIFIED FlagCheckCommandInterceptor commandInterceptor = init(); commandInterceptor.expectSkipLoadFlag = false; assertStatus(client().removeIfUnmodified(k(m), 0, 0), OperationStatus.KeyDoesNotExist); commandInterceptor.expectSkipLoadFlag = false; assertStatus(client().removeIfUnmodified(k(m), 0, ProtocolFlag.SkipCacheLoader.getValue()), OperationStatus.KeyDoesNotExist); assertStatus(client().removeIfUnmodified(k(m), 0, SKIP_LOADER_AND_RETURN_PREVIOUS_VALUE), OperationStatus.KeyDoesNotExist); } public void testContainsKey(Method m) { //CONTAINS_KEY FlagCheckCommandInterceptor commandInterceptor = init(); commandInterceptor.expectSkipLoadFlag = false; assertStatus(client().containsKey(k(m), 0), OperationStatus.KeyDoesNotExist); commandInterceptor.expectSkipLoadFlag = true; assertStatus(client().containsKey(k(m), ProtocolFlag.SkipCacheLoader.getValue()), OperationStatus.KeyDoesNotExist); assertStatus(client().containsKey(k(m), SKIP_LOADER_AND_RETURN_PREVIOUS_VALUE), OperationStatus.KeyDoesNotExist); } private FlagCheckCommandInterceptor init() { AsyncInterceptorChain interceptorChain = cacheManager.getCache(cacheName).getAdvancedCache().getAsyncInterceptorChain(); FlagCheckCommandInterceptor interceptor = interceptorChain.findInterceptorExtending(FlagCheckCommandInterceptor.class); if (interceptor != null) return interceptor; FlagCheckCommandInterceptor ci = new FlagCheckCommandInterceptor(); interceptorChain.addInterceptor(ci, 1); return ci; } private static int join(int flagId, int joinId) { return joinId | flagId; } } class FlagCheckCommandInterceptor extends BaseCustomInterceptor { volatile boolean expectSkipLoadFlag = false; protected @Override Object handleDefault(InvocationContext ctx, VisitableCommand command) throws Throwable { if (command instanceof FlagAffectedCommand) { FlagAffectedCommand flagAffectedCommand = (FlagAffectedCommand) command; boolean hasFlag = flagAffectedCommand.hasAnyFlag(FlagBitSets.SKIP_CACHE_LOAD); if (expectSkipLoadFlag && !hasFlag) { throw new CacheException("SKIP_CACHE_LOAD flag is expected!"); } else if (!expectSkipLoadFlag && hasFlag) { throw new CacheException("SKIP_CACHE_LOAD flag is *not* expected!"); } } return super.handleDefault(ctx, command); } }