package org.infinispan.tx;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.fail;
import org.infinispan.commands.remote.recovery.TxCompletionNotificationCommand;
import org.infinispan.commands.tx.RollbackCommand;
import org.infinispan.commands.tx.VersionedPrepareCommand;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.test.MultipleCacheManagersTest;
import org.infinispan.transaction.LockingMode;
import org.infinispan.util.mocks.ControlledCommandFactory;
import org.testng.annotations.Test;
@Test(groups = "functional", testName = "tx.TxCompletionForRolledBackTxOptTest")
public class TxCompletionForRolledBackTxOptTest extends MultipleCacheManagersTest {
@Override
protected void createCacheManagers() throws Throwable {
ConfigurationBuilder dcc = getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, true);
dcc.clustering().hash().numOwners(1).transaction().lockingMode(LockingMode.OPTIMISTIC);
createCluster(dcc, 3);
waitForClusterToForm();
advancedCache(2).addInterceptor(new RollbackBeforePrepareTest.FailPrepareInterceptor(), 1);
}
public void testTxCompletionNotSentForRollback() throws Throwable {
ControlledCommandFactory cf = ControlledCommandFactory.registerControlledCommandFactory(cache(1), null);
tm(0).begin();
Object k1 = getKeyForCache(1);
Object k2 = getKeyForCache(2);
cache(0).put(k1, k1);
cache(0).put(k2, k2);
try {
tm(0).commit();
fail();
} catch (Throwable t) {
log.debugf("Got expected exception", t);
}
assertNotLocked(k1);
assertNotLocked(k2);
assertNull(cache(0).get(k1));
assertNull(cache(0).get(k2));
assertEquals(cf.received(VersionedPrepareCommand.class), 1);
assertEquals(cf.received(RollbackCommand.class), 1);
assertEquals(cf.received(TxCompletionNotificationCommand.class), 0);
}
}