package org.infinispan.tx.recovery;
import static org.infinispan.configuration.cache.RecoveryConfiguration.DEFAULT_RECOVERY_INFO_CACHE;
import static org.infinispan.tx.recovery.RecoveryTestUtil.rm;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
import org.infinispan.Cache;
import org.infinispan.commons.CacheConfigurationException;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.Configuration;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.test.SingleCacheManagerTest;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.infinispan.transaction.xa.recovery.RecoveryAwareRemoteTransaction;
import org.infinispan.transaction.xa.recovery.RecoveryInfoKey;
import org.infinispan.transaction.xa.recovery.RecoveryManagerImpl;
import org.testng.annotations.Test;
/**
* @author Mircea.Markus@jboss.com
* @since 5.0
*/
@Test (groups = "functional", testName = "tx.recovery.RecoveryConfigTest")
public class RecoveryConfigTest extends SingleCacheManagerTest {
@Override
protected EmbeddedCacheManager createCacheManager() throws Exception {
return TestCacheManagerFactory.fromXml("configs/recovery-enabled-config.xml");
}
@Test(expectedExceptions = CacheConfigurationException.class)
public void testRecoveryAndAsyncCaches() {
//Note: this configuration uses Xa Enlistment (see configs/recovery-enabled-config.xml).
Configuration defaultConfig = cacheManager.getDefaultCacheConfiguration();
ConfigurationBuilder builder = new ConfigurationBuilder().read(defaultConfig);
builder.clustering().cacheMode(CacheMode.REPL_ASYNC);
builder.transaction().recovery().enable();
//it should throw an exception when try to build this configuration.
builder.build();
}
public void testRecoveryWithCacheConfigured() {
Configuration withRecoveryAndCache = cacheManager.getCache("withRecoveryAndCache").getCacheConfiguration();
assertTrue(withRecoveryAndCache.transaction().recovery().enabled(), "Recovery is supposed to be enabled.");
assertEquals(withRecoveryAndCache.transaction().recovery().recoveryInfoCacheName(), "noRecovery", "Wrong recovery cache name.");
RecoveryManagerImpl recoveryManager = rm(cacheManager.getCache("withRecoveryAndCache"));
assertNotNull(recoveryManager, "RecoveryManager should be *not* null when recovery is enabled.");
Cache<RecoveryInfoKey, RecoveryAwareRemoteTransaction> preparedTransactions = (Cache<RecoveryInfoKey, RecoveryAwareRemoteTransaction>) recoveryManager.getInDoubtTransactionsMap();
assertEquals(preparedTransactions.getName(), "noRecovery", "Wrong recovery cache name.");
}
public void testRecoveryWithDefaultCache() {
Configuration recoveryDefaultCache = cacheManager.getCache("withRecoveryDefaultCache").getCacheConfiguration();
assertTrue(recoveryDefaultCache.transaction().recovery().enabled(), "Recovery is supposed to be enabled.");
assertEquals(recoveryDefaultCache.transaction().recovery().recoveryInfoCacheName(), DEFAULT_RECOVERY_INFO_CACHE, "Wrong recovery cache name.");
RecoveryManagerImpl recoveryManager = rm(cacheManager.getCache("withRecoveryDefaultCache"));
assertNotNull(recoveryManager, "RecoveryManager should be *not* null when recovery is enabled.");
Cache<RecoveryInfoKey, RecoveryAwareRemoteTransaction> preparedTransactions = (Cache<RecoveryInfoKey, RecoveryAwareRemoteTransaction>) recoveryManager.getInDoubtTransactionsMap();
assertEquals(preparedTransactions.getName(), DEFAULT_RECOVERY_INFO_CACHE, "Wrong recovery cache name.");
}
public void testNoRecovery() {
Configuration noRecovery = cacheManager.getCache("noRecovery").getCacheConfiguration();
assertFalse(noRecovery.transaction().recovery().enabled(), "Recovery is supposed to be disabled");
assertNull(rm(cacheManager.getCache("noRecovery")), "RecoveryManager should be null when recovery is disabled");
assertEquals(noRecovery.transaction().recovery().recoveryInfoCacheName(), "someName", "Wrong recovery cache name.");
}
}