package org.infinispan.spring.support.embedded;
import static org.testng.AssertJUnit.assertEquals;
import org.infinispan.Cache;
import org.infinispan.lifecycle.ComponentStatus;
import org.infinispan.spring.InfinispanDefaultCacheFactoryBean;
import org.infinispan.test.AbstractInfinispanTest;
import org.infinispan.test.CacheManagerCallable;
import org.infinispan.test.TestingUtil;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.testng.AssertJUnit;
import org.testng.annotations.Test;
/**
* <p>
* Test {@link InfinispanDefaultCacheFactoryBean}.
* </p>
*
* @author <a href="mailto:olaf DOT bergner AT gmx DOT de">Olaf Bergner</a>
*
*/
@Test(testName = "spring.support.InfinispanDefaultCacheFactoryBeanTest", groups = "unit")
public class InfinispanDefaultCacheFactoryBeanTest extends AbstractInfinispanTest {
/**
* Test method for
* {@link org.infinispan.spring.support.InfinispanDefaultCacheFactoryBean#afterPropertiesSet()}.
*
* @throws Exception
*/
@Test(expectedExceptions = IllegalStateException.class)
public final void afterPropertiesSetShouldThrowAnIllegalStateExceptionIfNoCacheContainerHasBeenSet()
throws Exception {
final InfinispanDefaultCacheFactoryBean<Object, Object> objectUnderTest = new InfinispanDefaultCacheFactoryBean<Object, Object>();
objectUnderTest.afterPropertiesSet();
}
/**
* Test method for
* {@link org.infinispan.spring.support.InfinispanDefaultCacheFactoryBean#getObject()}.
*/
@Test
public final void infinispanDefaultCacheFactoryBeanShouldProduceANonNullInfinispanCache() {
final InfinispanDefaultCacheFactoryBean<Object, Object> objectUnderTest = new InfinispanDefaultCacheFactoryBean<Object, Object>();
TestingUtil.withCacheManager(new CacheManagerCallable(TestCacheManagerFactory.createCacheManager()) {
@Override
public void call() {
try {
objectUnderTest.setInfinispanCacheContainer(cm);
objectUnderTest.afterPropertiesSet();
final Cache<Object, Object> cache = objectUnderTest.getObject();
AssertJUnit.assertNotNull(
"InfinispanDefaultCacheFactoryBean should have produced a proper Infinispan cache. "
+ "However, it produced a null Infinispan cache.", cache);
objectUnderTest.destroy();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
});
}
/**
* Test method for
* {@link org.infinispan.spring.support.InfinispanDefaultCacheFactoryBean#getObjectType()}.
*/
@Test
public final void getObjectTypeShouldReturnTheMostDerivedTypeOfTheProducedInfinispanCache() {
final InfinispanDefaultCacheFactoryBean<Object, Object> objectUnderTest = new InfinispanDefaultCacheFactoryBean<Object, Object>();
TestingUtil.withCacheManager(new CacheManagerCallable(TestCacheManagerFactory.createCacheManager()) {
@Override
public void call() {
try {
objectUnderTest.setInfinispanCacheContainer(cm);
objectUnderTest.afterPropertiesSet();
assertEquals(
"getObjectType() should have returned the produced Infinispan cache's most derived type. "
+ "However, it returned a more generic type.", objectUnderTest.getObject()
.getClass(), objectUnderTest.getObjectType());
objectUnderTest.destroy();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
});
}
/**
* Test method for
* {@link org.infinispan.spring.support.InfinispanDefaultCacheFactoryBean#isSingleton()}.
*/
@Test
public final void infinispanDefaultCacheFactoryBeanShouldDeclareItselfToBeSingleton() {
final InfinispanDefaultCacheFactoryBean<Object, Object> objectUnderTest = new InfinispanDefaultCacheFactoryBean<Object, Object>();
AssertJUnit.assertTrue(
"InfinispanDefaultCacheFactoryBean should declare itself to produce a singleton. However, it didn't.",
objectUnderTest.isSingleton());
}
/**
* Test method for
* {@link org.infinispan.spring.support.InfinispanDefaultCacheFactoryBean#destroy()}.
*/
@Test
public final void infinispanDefaultCacheFactoryBeanShouldStopTheCreatedInfinispanCacheWhenItIsDestroyed() {
final InfinispanDefaultCacheFactoryBean<Object, Object> objectUnderTest = new InfinispanDefaultCacheFactoryBean<Object, Object>();
TestingUtil.withCacheManager(new CacheManagerCallable(TestCacheManagerFactory.createCacheManager()) {
@Override
public void call() {
try {
objectUnderTest.setInfinispanCacheContainer(cm);
objectUnderTest.afterPropertiesSet();
final Cache<Object, Object> cache = objectUnderTest.getObject();
objectUnderTest.destroy();
AssertJUnit.assertEquals(
"InfinispanDefaultCacheFactoryBean should have stopped the created Infinispan cache when being destroyed. "
+ "However, the created Infinispan is not yet terminated.",
ComponentStatus.TERMINATED, cache.getStatus());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
});
}
}