package org.infinispan.persistence; import org.infinispan.commons.CacheConfigurationException; import org.infinispan.commons.configuration.BuiltBy; import org.infinispan.commons.configuration.ConfigurationFor; import org.infinispan.commons.configuration.ConfiguredBy; import org.infinispan.commons.configuration.attributes.AttributeSet; import org.infinispan.commons.persistence.Store; import org.infinispan.configuration.cache.AbstractStoreConfigurationBuilder; import org.infinispan.configuration.cache.AsyncStoreConfiguration; import org.infinispan.configuration.cache.CacheMode; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.configuration.cache.PersistenceConfigurationBuilder; import org.infinispan.configuration.cache.SingletonStoreConfiguration; import org.infinispan.persistence.dummy.DummyInMemoryStore; import org.infinispan.persistence.dummy.DummyInMemoryStoreConfiguration; import org.infinispan.persistence.dummy.DummyInMemoryStoreConfigurationBuilder; import org.infinispan.test.fwk.TestCacheManagerFactory; import org.testng.annotations.Test; /** * Unit test for ensuring that {@link AbstractStoreConfigurationBuilder#validate()} fails when expected. * * @author Ryan Emerson * @since 9.0 */ @Test(groups = "unit", testName = "persistence.StoreConfigurationValidationTest") public class StoreConfigurationValidationTest { @Test(expectedExceptions = CacheConfigurationException.class, expectedExceptionsMessageRegExp = ".* NonSharedDummyInMemoryStore cannot be shared") public void testExceptionOnNonSharableStore() { ConfigurationBuilder builder = TestCacheManagerFactory.getDefaultCacheConfiguration(false); builder.persistence() .addStore(NonSharedDummyStoreConfigurationBuilder.class) .shared(true) .validate(); } @Test(expectedExceptions = CacheConfigurationException.class, expectedExceptionsMessageRegExp = ".* It is not possible for a store to be transactional in a non-transactional cache. ") public void testTxStoreInNonTxCache() { ConfigurationBuilder builder = TestCacheManagerFactory.getDefaultCacheConfiguration(false); builder.persistence() .addStore(DummyInMemoryStoreConfigurationBuilder.class) .transactional(true) .validate(); } @Test(expectedExceptions = CacheConfigurationException.class, expectedExceptionsMessageRegExp = ".* It is not possible for a store to be transactional when passivation is enabled. ") public void testTxStoreInPassivatedCache() { ConfigurationBuilder builder = TestCacheManagerFactory.getDefaultCacheConfiguration(true); builder.persistence() .passivation(true) .addStore(DummyInMemoryStoreConfigurationBuilder.class) .transactional(true) .validate(); } @Test(expectedExceptions = CacheConfigurationException.class, expectedExceptionsMessageRegExp = ".* Cannot enable 'fetchPersistentState' in invalidation caches!") public void testFetchPersistentStateInInvalidationMode() { ConfigurationBuilder builder = TestCacheManagerFactory.getDefaultCacheConfiguration(false); builder.clustering() .cacheMode(CacheMode.INVALIDATION_SYNC) .persistence() .addStore(DummyInMemoryStoreConfigurationBuilder.class) .fetchPersistentState(true) .validate(); } @Store @ConfiguredBy(NonSharedDummyStoreConfiguration.class) static class NonSharedDummyInMemoryStore extends DummyInMemoryStore { public NonSharedDummyInMemoryStore() { super(); } } @BuiltBy(NonSharedDummyStoreConfigurationBuilder.class) @ConfigurationFor(NonSharedDummyInMemoryStore.class) static class NonSharedDummyStoreConfiguration extends DummyInMemoryStoreConfiguration { public static AttributeSet attributeDefinitionSet() { return new AttributeSet(NonSharedDummyStoreConfiguration.class, DummyInMemoryStoreConfiguration.attributeDefinitionSet()); } NonSharedDummyStoreConfiguration(AttributeSet attributes, AsyncStoreConfiguration async, SingletonStoreConfiguration singletonStore) { super(attributes, async, singletonStore); } } public static class NonSharedDummyStoreConfigurationBuilder extends AbstractStoreConfigurationBuilder<NonSharedDummyStoreConfiguration, NonSharedDummyStoreConfigurationBuilder> { public NonSharedDummyStoreConfigurationBuilder(PersistenceConfigurationBuilder builder) { super(builder, NonSharedDummyStoreConfiguration.attributeDefinitionSet()); } @Override public NonSharedDummyStoreConfiguration create() { return new NonSharedDummyStoreConfiguration(attributes.protect(), async.create(), singletonStore.create()); } @Override public NonSharedDummyStoreConfigurationBuilder self() { return this; } } }