package org.infinispan.replication; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertNull; import static org.testng.AssertJUnit.fail; import org.infinispan.AdvancedCache; import org.infinispan.context.Flag; import org.infinispan.distribution.BaseDistFunctionalTest; import org.infinispan.transaction.LockingMode; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import javax.transaction.Transaction; /** * Verifies the Flags affect both local and remote nodes. * * @author Sanne Grinovero <sanne@hibernate.org> (C) 2011 Red Hat Inc. * @since 4.2.1 */ @Test(groups = "functional", testName = FlagsReplicationTest.TEST_NAME) public class FlagsReplicationTest extends BaseDistFunctionalTest<Object, String> { static final String TEST_NAME = "replication.FlagsReplicationTest"; static final String DATA_PROVIDER = TEST_NAME + ".dataprovider"; private final Integer one = 1; private final String key = TEST_NAME; public FlagsReplicationTest() { transactional = true; cacheName = TEST_NAME; cleanup = CleanupPhase.AFTER_METHOD; lockingMode = LockingMode.PESSIMISTIC; lockTimeout = 1; } @DataProvider(name = DATA_PROVIDER) public Object[][] createTestConfigurations() { return new Object[][] { { true, true }, { false, false }, { false, true }, { true, false }, }; } @Test(dataProvider = DATA_PROVIDER) public void testScenario(boolean cache1IsOwner, boolean cache2IsOwner) throws Throwable { log.tracef("Start cache1IsOwner = %s, cache2IsOwner %s", cache1IsOwner, cache2IsOwner); AdvancedCache cache1 = (cache1IsOwner ? getFirstOwner(key) : getFirstNonOwner(key)).getAdvancedCache(); AdvancedCache cache2 = (cache2IsOwner ? getFirstOwner(key) : getFirstNonOwner(key)).getAdvancedCache(); assertNull(cache1.put(key, one)); log.trace("About to try to acquire a lock."); cache2.getTransactionManager().begin(); if (! cache2.lock(key)) { fail("Could not acquire lock"); } Transaction tx2 = cache2.getTransactionManager().suspend(); cache1.getTransactionManager().begin(); boolean locked = cache1.withFlags(Flag.ZERO_LOCK_ACQUISITION_TIMEOUT, Flag.FAIL_SILENTLY).lock(key); assertFalse(locked); Object removed = cache1.withFlags(Flag.SKIP_LOCKING).remove(key); assertEquals(one, removed); Transaction tx1 = cache1.getTransactionManager().suspend(); cache2.getTransactionManager().resume(tx2); cache2.getTransactionManager().commit(); cache1.getTransactionManager().resume(tx1); cache1.getTransactionManager().commit(); assertNull(cache2.get(key)); log.tracef("End cache1IsOwner = %s, cache2IsOwner %s", cache1IsOwner, cache2IsOwner); } }