package org.infinispan.api; import static org.testng.AssertJUnit.assertEquals; import java.util.LinkedList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicBoolean; import org.infinispan.Cache; import org.infinispan.configuration.cache.CacheMode; import org.infinispan.configuration.cache.Configuration; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.factories.ComponentRegistry; import org.infinispan.factories.GlobalComponentRegistry; import org.infinispan.lifecycle.AbstractModuleLifecycle; import org.infinispan.lifecycle.ModuleLifecycle; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.test.MultipleCacheManagersTest; import org.infinispan.test.TestingUtil; import org.testng.annotations.Test; /** * @author Mircea Markus * @since 5.2 */ @Test(groups = "functional", testName = "api.StartCacheFromListenerTest") public class StartCacheFromListenerTest extends MultipleCacheManagersTest { @Override protected void createCacheManagers() throws Throwable { addClusterEnabledCacheManager(); addClusterEnabledCacheManager(); ConfigurationBuilder dcc = getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, true); manager(0).defineConfiguration("some", dcc.build()); manager(0).defineConfiguration("cacheStarting", dcc.build()); manager(0).defineConfiguration("cacheStarted", dcc.build()); } final AtomicBoolean cacheStartingInvoked = new AtomicBoolean(false); public void testSingleInvocation() { final EmbeddedCacheManager cacheManager = manager(0); GlobalComponentRegistry registry = (GlobalComponentRegistry) TestingUtil.extractField(cacheManager, "globalComponentRegistry"); List<ModuleLifecycle> lifecycles = new LinkedList<ModuleLifecycle>(); TestingUtil.replaceField(lifecycles, "moduleLifecycles", registry, GlobalComponentRegistry.class); lifecycles.add(new AbstractModuleLifecycle() { @Override public void cacheStarting(ComponentRegistry cr, Configuration configuration, String cacheName) { log.debug("StartCacheFromListenerTest.cacheStarting"); if (!cacheStartingInvoked.get()) { cacheStartingInvoked.set(true); Future<Cache> fork = fork(new Callable<Cache>() { @Override public Cache call() throws Exception { try { return cacheManager.getCache("cacheStarting"); } catch (Exception e) { log.error("Got", e); throw e; } } }); try { log.debug("About to wait in get"); Cache cache = fork.get(); cache.put("k", "v"); log.debug("returned from get!"); } catch (InterruptedException e) { log.error("Interrupted while waiting for the cache to start"); } catch (ExecutionException e) { log.error("Failed to start cache", e); } } } }); log.debug("StartCacheFromListenerTest.testSingleInvocation1"); Cache<Object, Object> some = cacheManager.getCache("some"); log.debug("StartCacheFromListenerTest.testSingleInvocation2"); some.put("k", "v"); assertEquals("v", cacheManager.getCache("cacheStarting").get("k")); } }