package org.infinispan.persistence.jpa; import static org.testng.Assert.assertTrue; import static org.testng.AssertJUnit.assertNotNull; import org.hibernate.ejb.HibernateEntityManagerFactory; import org.infinispan.commons.marshall.StreamingMarshaller; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.container.entries.InternalCacheEntry; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.marshall.core.MarshalledEntryFactoryImpl; import org.infinispan.marshall.core.MarshalledEntryImpl; import org.infinispan.metadata.impl.InternalMetadataImpl; import org.infinispan.persistence.InitializationContextImpl; import org.infinispan.persistence.jpa.configuration.JpaStoreConfigurationBuilder; import org.infinispan.persistence.spi.AdvancedLoadWriteStore; import org.infinispan.test.AbstractInfinispanTest; import org.infinispan.test.fwk.TestCacheManagerFactory; import org.infinispan.test.fwk.TestInternalCacheEntryFactory; import org.infinispan.util.DefaultTimeService; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; /** * This is a base class containing various unit tests for each and every different CacheStore implementations. If you * need to add Cache/CacheManager tests that need to be run for each cache store/loader implementation, then use * BaseCacheStoreFunctionalTest. * * @author <a href="mailto:rtsang@redhat.com">Ray Tsang</a> * */ public abstract class AbstractJpaStoreTest extends AbstractInfinispanTest { protected static final String PERSISTENCE_UNIT_NAME = "org.infinispan.persistence.jpa"; protected EmbeddedCacheManager cm; protected AdvancedLoadWriteStore cs; //protected TransactionFactory gtf = new TransactionFactory(); protected StreamingMarshaller marshaller; protected AbstractJpaStoreTest() { // gtf.init(false, false, true, false); } protected EmbeddedCacheManager createCacheManager() { return TestCacheManagerFactory.createCacheManager(true); } protected AdvancedLoadWriteStore createCacheStore() { ConfigurationBuilder builder = new ConfigurationBuilder(); builder.persistence().addStore(JpaStoreConfigurationBuilder.class) .persistenceUnitName(PERSISTENCE_UNIT_NAME) .entityClass(getEntityClass()); JpaStore store = new JpaStore(); store.init(new InitializationContextImpl(builder.persistence().stores().get(0).create(), cm.getCache(), getMarshaller(), new DefaultTimeService(), null, new MarshalledEntryFactoryImpl(getMarshaller()))); store.start(); assertNotNull(store.getEntityManagerFactory()); assertTrue(store.getEntityManagerFactory() instanceof org.hibernate.internal.SessionFactoryImpl); return store; } protected abstract Class<?> getEntityClass(); @BeforeMethod(alwaysRun = true) public void setUp() throws Exception { try { cm = createCacheManager(); marshaller = cm.getCache().getAdvancedCache().getComponentRegistry().getCacheMarshaller(); cs = createCacheStore(); cs.clear(); } catch (Exception e) { log.warn("Error during test setup", e); throw e; } } @AfterMethod(alwaysRun = true) public void stopMarshaller() { //marshaller.stop(); if (cs != null) cs.stop(); if (cm != null) cm.stop(); } /** * @return a mock marshaller for use with the cache store impls */ protected StreamingMarshaller getMarshaller() { return marshaller; } protected MarshalledEntryImpl createEntry(Object key, Object value) { return new MarshalledEntryImpl(key, value, null, getMarshaller()); } protected MarshalledEntryImpl createEntry(Object key, Object value, long lifespan) { InternalCacheEntry ice = TestInternalCacheEntryFactory.create(key, value, lifespan); return new MarshalledEntryImpl(key, value, new InternalMetadataImpl(ice), getMarshaller()); } protected MarshalledEntryImpl createEntry(TestObject obj) { return createEntry(obj.getKey(), obj.getValue()); } }