package org.infinispan.query.continuous; import static org.testng.AssertJUnit.assertEquals; import java.util.Map; import org.infinispan.configuration.cache.CacheMode; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.query.Search; import org.infinispan.query.api.continuous.ContinuousQuery; import org.infinispan.query.dsl.Query; import org.infinispan.query.dsl.QueryFactory; import org.infinispan.query.test.Person; import org.infinispan.test.MultipleCacheManagersTest; import org.testng.annotations.Test; /** * Base class for continuous query tests with multiple caches. * * @author vjuranek * @since 8.0 */ @Test(groups = "functional") public abstract class AbstractCQMultipleCachesTest extends MultipleCacheManagersTest { protected final int NUM_NODES = 3; protected final int NUM_OWNERS = NUM_NODES - 1; protected abstract CacheMode getCacheMode(); public AbstractCQMultipleCachesTest() { cleanup = CleanupPhase.AFTER_METHOD; } @Override protected void createCacheManagers() { ConfigurationBuilder c = buildConfiguration(); createCluster(c, NUM_NODES); waitForClusterToForm(); } protected ConfigurationBuilder buildConfiguration() { ConfigurationBuilder c = getDefaultClusteredCacheConfig(getCacheMode(), false); c.clustering().hash().numOwners(NUM_OWNERS); return c; } protected CallCountingCQResultListener<Object, Object> createContinuousQuery() { QueryFactory qf = Search.getQueryFactory(cache(0)); Query query = qf.from(Person.class) .having("age").lte(30) .build(); CallCountingCQResultListener<Object, Object> listener = new CallCountingCQResultListener<>(); ContinuousQuery<Object, Object> cq = Search.getContinuousQuery(cache(0)); cq.addContinuousQueryListener(query, listener); return listener; } public void testContinuousQueryMultipleCaches() { for (int i = 0; i < 2; i++) { Person value = new Person(); value.setName("John"); value.setAge(22); cache(i).put(i, value); } CallCountingCQResultListener<Object, Object> listener = createContinuousQuery(); final Map<Object, Integer> joined = listener.getJoined(); final Map<Object, Integer> left = listener.getLeft(); assertEquals(2, joined.size()); assertEquals(0, left.size()); joined.clear(); for (int i = 0; i < 2; i++) { Person value = new Person(); value.setName("John"); value.setAge(40); cache(i).put(i, value); } assertEquals(0, joined.size()); assertEquals(2, left.size()); left.clear(); for (int i = 0; i < 10; i++) { Person value = new Person(); value.setName("John"); value.setAge(i + 25); cache(0).put(i, value); } assertEquals(6, joined.size()); assertEquals(0, left.size()); for (int i = 0; i < 6; i++) { assertEquals(1, joined.get(i).intValue()); } joined.clear(); cache(0).clear(); assertEquals(0, joined.size()); assertEquals(6, left.size()); for (int i = 0; i < 6; i++) { assertEquals(1, left.get(i).intValue()); } left.clear(); } public void testCQCacheLeavesAndJoins() { CallCountingCQResultListener<Object, Object> listener = createContinuousQuery(); final Map<Object, Integer> joined = listener.getJoined(); final Map<Object, Integer> left = listener.getLeft(); assertEquals(0, joined.size()); assertEquals(0, left.size()); for (int i = 0; i < 2; i++) { Person value = new Person(); value.setName("John"); value.setAge(40); cache(i).put(i, value); } assertEquals(0, joined.size()); assertEquals(0, left.size()); for (int i = 0; i < 10; i++) { Person value = new Person(); value.setName("John"); value.setAge(i + 25); cache(0).put(i, value); if (i == 4) killMember(1); } assertEquals(6, joined.size()); assertEquals(0, left.size()); for (int i = 0; i < 6; i++) { assertEquals(1, joined.get(i).intValue()); } joined.clear(); cache(0).clear(); assertEquals(0, joined.size()); assertEquals(6, left.size()); left.clear(); for (int i = 0; i < 10; i++) { Person value = new Person(); value.setName("John"); value.setAge(i + 25); cache(0).put(i, value); if (i == 4) addClusterEnabledCacheManager(buildConfiguration()); } assertEquals(6, joined.size()); assertEquals(0, left.size()); for (int i = 0; i < 6; i++) { assertEquals(1, joined.get(i).intValue()); } joined.clear(); } }