package org.infinispan.context;
import org.infinispan.commands.read.GetKeyValueCommand;
import org.infinispan.commands.write.PutKeyValueCommand;
import org.infinispan.commands.write.RemoveCommand;
import org.infinispan.commands.write.ReplaceCommand;
import org.infinispan.config.Configuration;
import org.infinispan.interceptors.base.CommandInterceptor;
import org.infinispan.test.MultipleCacheManagersTest;
import org.testng.annotations.Test;
/**
* @author Mircea Markus
* @since 5.1
*/
@Test (groups = "functional", testName = "context.SingleKeyNonTxInvocationContextTest")
public class SingleKeyNonTxInvocationContextTest extends MultipleCacheManagersTest {
private CheckInterceptor ci0;
private CheckInterceptor ci1;
@Override
protected void createCacheManagers() throws Throwable {
final Configuration c = getDefaultClusteredConfig(Configuration.CacheMode.DIST_SYNC, false);
c.fluent().hash().numOwners(1);
createCluster(c, 2);
waitForClusterToForm();
ci0 = new CheckInterceptor();
advancedCache(0).addInterceptor(ci0, 1);
ci1 = new CheckInterceptor();
advancedCache(1).addInterceptor(ci1, 1);
}
public void testPut() {
assert !ci0.putOkay && !ci1.putOkay;
cache(0).put(getKeyForCache(0), "v");
assert ci0.putOkay && !ci1.putOkay;
cache(1).put(getKeyForCache(1), "v");
assert ci0.putOkay && ci1.putOkay;
}
public void testRemove() {
assert !ci0.removeOkay && !ci1.removeOkay;
cache(0).remove(getKeyForCache(0));
assert ci0.removeOkay && !ci1.removeOkay;
cache(1).remove(getKeyForCache(1));
assert ci0.removeOkay && ci1.removeOkay;
}
public void testGet() {
assert !ci0.getOkay && !ci1.getOkay;
cache(0).get(getKeyForCache(0));
assert ci0.getOkay && !ci1.getOkay;
cache(1).get(getKeyForCache(1));
assert ci0.getOkay && ci1.getOkay;
}
public void testReplace() {
assert !ci0.replaceOkay && !ci1.replaceOkay;
cache(0).replace(getKeyForCache(0), "v");
assert ci0.replaceOkay && !ci1.replaceOkay;
cache(1).replace(getKeyForCache(1), "v");
assert ci0.replaceOkay && ci1.replaceOkay;
}
static class CheckInterceptor extends CommandInterceptor {
private boolean putOkay;
private boolean removeOkay;
private boolean getOkay;
private boolean replaceOkay;
@Override
public Object visitPutKeyValueCommand(InvocationContext ctx, PutKeyValueCommand command) throws Throwable {
if (isRightType(ctx)) putOkay = true;
return super.visitPutKeyValueCommand(ctx, command);
}
@Override
public Object visitRemoveCommand(InvocationContext ctx, RemoveCommand command) throws Throwable {
if (isRightType(ctx)) removeOkay = true;
return super.visitRemoveCommand(ctx, command);
}
@Override
public Object visitGetKeyValueCommand(InvocationContext ctx, GetKeyValueCommand command) throws Throwable {
if (isRightType(ctx)) getOkay = true;
return super.visitGetKeyValueCommand(ctx, command);
}
@Override
public Object visitReplaceCommand(InvocationContext ctx, ReplaceCommand command) throws Throwable {
if (isRightType(ctx)) replaceOkay = true;
return super.visitReplaceCommand(ctx, command);
}
private boolean isRightType(InvocationContext ctx) {
return ctx instanceof SingleKeyNonTxInvocationContext;
}
}
}