package org.infinispan.api;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
import javax.transaction.Transaction;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.test.MultipleCacheManagersTest;
import org.infinispan.util.concurrent.IsolationLevel;
import org.testng.annotations.Test;
/**
* Test the condition described here: {@link org.infinispan.interceptors.distribution.TxDistributionInterceptor#ignorePreviousValueOnBackup}.
*
* @author Mircea Markus
* @since 5.2
*/
@Test (groups = "functional", testName = "api.ReplaceWithValueChangedTest")
public class ReplaceWithValueChangedTest extends MultipleCacheManagersTest {
@Override
protected void createCacheManagers() throws Throwable {
ConfigurationBuilder builder = getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, true);
builder.locking().isolationLevel(IsolationLevel.READ_COMMITTED);
createClusteredCaches(2, builder);
}
public void testReplace1() throws Throwable {
Object k1 = getKeyForCache(0);
cache(0).put(k1, "v1");
tm(0).begin();
assertEquals("v1", cache(0).replace(k1, "v2"));
Transaction suspendedTx = tm(0).suspend();
cache(0).remove(k1);
assertNull(cache(0).get(k1));
assertNull(cache(1).get(k1));
log.trace("Here it begins");
suspendedTx.commit();
assertEquals("v2", cache(0).get(k1));
assertEquals("v2", cache(1).get(k1));
}
public void testReplace2() throws Throwable {
Object k1 = getKeyForCache(0);
cache(0).put(k1, "v1");
tm(0).begin();
assertEquals("v1", cache(0).replace(k1, "v2"));
Transaction suspendedTx = tm(0).suspend();
cache(0).put(k1, "v3");
assertEquals(cache(0).get(k1), "v3");
assertEquals(cache(1).get(k1), "v3");
suspendedTx.commit();
assertEquals("v2", cache(0).get(k1));
assertEquals("v2", cache(1).get(k1));
}
public void testPutIfAbsent() throws Throwable {
Object k1 = getKeyForCache(0);
tm(0).begin();
assertNull(cache(0).putIfAbsent(k1, "v1"));
Transaction suspendedTx = tm(0).suspend();
cache(0).put(k1, "v2");
assertEquals(cache(0).get(k1), "v2");
assertEquals(cache(1).get(k1), "v2");
suspendedTx.commit();
assertEquals("v1", cache(0).get(k1));
assertEquals("v1", cache(1).get(k1));
}
public void testConditionalRemove() throws Throwable {
Object k1 = getKeyForCache(0);
cache(0).put(k1, "v1");
tm(0).begin();
assertTrue(cache(0).remove(k1, "v1"));
Transaction suspendedTx = tm(0).suspend();
cache(0).put(k1, "v2");
assertEquals(cache(0).get(k1), "v2");
assertEquals(cache(1).get(k1), "v2");
log.trace("here it is");
suspendedTx.commit();
assertNull(cache(0).get(k1));
assertNull(cache(1).get(k1));
}
}