package org.infinispan.persistence.remote; import static org.infinispan.server.hotrod.test.HotRodTestingUtil.hotRodCacheConfiguration; import static org.testng.AssertJUnit.assertNull; import static org.testng.AssertJUnit.assertTrue; import org.infinispan.client.hotrod.test.HotRodClientTestingUtil; import org.infinispan.commons.marshall.StreamingMarshaller; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.configuration.global.GlobalConfigurationBuilder; import org.infinispan.eviction.EvictionStrategy; import org.infinispan.factories.GlobalComponentRegistry; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.persistence.BaseStoreTest; import org.infinispan.persistence.remote.configuration.RemoteStoreConfigurationBuilder; import org.infinispan.persistence.spi.AdvancedLoadWriteStore; import org.infinispan.persistence.spi.PersistenceException; import org.infinispan.server.hotrod.HotRodServer; import org.infinispan.test.TestingUtil; import org.infinispan.test.fwk.TestCacheManagerFactory; import org.infinispan.util.TimeService; import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; /** * @author Mircea.Markus@jboss.com * @author Tristan Tarrant * @since 5.2 */ @Test(testName = "persistence.remote.RemoteStoreRawValuesTest", groups = "functional") public class RemoteStoreRawValuesTest extends BaseStoreTest { private static final String REMOTE_CACHE = "remote-cache"; private EmbeddedCacheManager localCacheManager; private HotRodServer hrServer; @Override protected AdvancedLoadWriteStore createStore() throws Exception { ConfigurationBuilder localBuilder = TestCacheManagerFactory.getDefaultCacheConfiguration(false); localBuilder.eviction().maxEntries(100).strategy(EvictionStrategy.UNORDERED) .expiration().wakeUpInterval(10L); localCacheManager = TestCacheManagerFactory.createCacheManager( new GlobalConfigurationBuilder().defaultCacheName(REMOTE_CACHE), hotRodCacheConfiguration(localBuilder)); localCacheManager.getCache(REMOTE_CACHE); GlobalComponentRegistry gcr = localCacheManager.getGlobalComponentRegistry(); gcr.registerComponent(timeService, TimeService.class); gcr.rewire(); localCacheManager.getCache(REMOTE_CACHE).getAdvancedCache().getComponentRegistry().rewire(); hrServer = HotRodClientTestingUtil.startHotRodServer(localCacheManager); ConfigurationBuilder builder = TestCacheManagerFactory.getDefaultCacheConfiguration(false); RemoteStoreConfigurationBuilder storeConfigurationBuilder = builder .persistence() .addStore(RemoteStoreConfigurationBuilder.class) .rawValues(true) .remoteCacheName(REMOTE_CACHE); storeConfigurationBuilder .addServer() .host(hrServer.getHost()) .port(hrServer.getPort()); RemoteStore remoteStore = new RemoteStore(); remoteStore.init(createContext(builder.build())); return remoteStore; } @Override protected StreamingMarshaller getMarshaller() { return localCacheManager.getCache(REMOTE_CACHE).getAdvancedCache().getComponentRegistry().getCacheMarshaller(); } @Override @AfterMethod public void tearDown() { HotRodClientTestingUtil.killServers(hrServer); TestingUtil.killCacheManagers(localCacheManager); } @Override protected boolean storePurgesAllExpired() { return false; } @Override public void testLoadAll() throws PersistenceException { } @Override public void testReplaceExpiredEntry() throws Exception { cl.write(marshalledEntry(internalCacheEntry("k1", "v1", 100l))); // Hot Rod does not support milliseconds, so 100ms is rounded to the nearest second, // and so data is stored for 1 second here. Adjust waiting time accordingly. timeService.advance(1101); assertNull(cl.load("k1")); long start = System.currentTimeMillis(); cl.write(marshalledEntry(internalCacheEntry("k1", "v2", 100l))); assertTrue(cl.load("k1").getValue().equals("v2") || TestingUtil.moreThanDurationElapsed(start, 100)); } }