package org.infinispan.lock.singlelock; import static org.testng.Assert.assertEquals; import javax.transaction.HeuristicMixedException; import javax.transaction.HeuristicRollbackException; import javax.transaction.NotSupportedException; import javax.transaction.RollbackException; import javax.transaction.SystemException; import org.infinispan.commands.tx.CommitCommand; 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.BeforeMethod; import org.testng.annotations.Test; /** * @author Mircea Markus * @since 5.1 */ @Test(groups = "functional", testName = "lock.singlelock.NoPrepareRpcForPessimisticTransactionsTest") public class NoPrepareRpcForPessimisticTransactionsTest extends MultipleCacheManagersTest { private Object k1; private ControlledCommandFactory commandFactory; @Override protected void createCacheManagers() throws Throwable { final ConfigurationBuilder c = getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, true); c .transaction().lockingMode(LockingMode.PESSIMISTIC) .clustering() .hash().numOwners(1) .l1().disable(); createCluster(c, 2); waitForClusterToForm(); k1 = getKeyForCache(1); commandFactory = ControlledCommandFactory.registerControlledCommandFactory(cache(1), CommitCommand.class); } @BeforeMethod void clearStats() { commandFactory.remoteCommandsReceived.set(0); } public void testSingleGetOnPut() throws Exception { Operation o = new Operation() { @Override public void execute() { cache(0).put(k1, "v0"); } }; runtTest(o); } public void testSingleGetOnRemove() throws Exception { Operation o = new Operation() { @Override public void execute() { cache(0).remove(k1); } }; runtTest(o); } private void runtTest(Operation o) throws NotSupportedException, SystemException, RollbackException, HeuristicMixedException, HeuristicRollbackException { log.trace("Here is where the fun starts.."); tm(0).begin(); o.execute(); assertKeyLockedCorrectly(k1); assertEquals(commandFactory.remoteCommandsReceived.get(), 2, "2 = cluster get + lock"); tm(0).commit(); eventually(new Condition() { @Override public boolean isSatisfied() throws Exception { //prepare + tx completion notification return commandFactory.remoteCommandsReceived.get() == 4; } }); } private interface Operation { void execute(); } }