package org.infinispan.query.blackbox; import static org.infinispan.test.TestingUtil.withCacheManager; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.fail; import java.util.List; import org.apache.lucene.search.Query; import org.hibernate.search.query.dsl.QueryBuilder; import org.infinispan.Cache; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.configuration.cache.Index; import org.infinispan.configuration.cache.InterceptorConfiguration; import org.infinispan.configuration.cache.InterceptorConfiguration.Position; import org.infinispan.interceptors.base.CommandInterceptor; import org.infinispan.query.CacheQuery; import org.infinispan.query.Search; import org.infinispan.query.SearchManager; import org.infinispan.query.indexedembedded.Book; import org.infinispan.test.AbstractInfinispanTest; import org.infinispan.test.CacheManagerCallable; import org.infinispan.test.fwk.TestCacheManagerFactory; import org.testng.annotations.Test; /** * Tests whether query caches can restart without problems. * * @author Galder ZamarreƱo * @author Sanne Grinovero * @author Marko Luksa * @since 5.2 */ @Test(testName = "query.blackbox.QueryCacheRestartTest", groups = "functional") public class QueryCacheRestartTest extends AbstractInfinispanTest { public void testQueryCacheRestart() { queryCacheRestart(false); } public void testLocalQueryCacheRestart() { queryCacheRestart(true); } private void queryCacheRestart(boolean localOnly) { ConfigurationBuilder builder = new ConfigurationBuilder(); builder.indexing().index(localOnly ? Index.LOCAL : Index.ALL) .addIndexedEntity(Book.class) .addProperty("default.directory_provider", "ram") .addProperty("lucene_version", "LUCENE_CURRENT"); final NoOpInterceptor noOpInterceptor = new NoOpInterceptor(); builder.customInterceptors().addInterceptor().interceptor(noOpInterceptor).position(Position.FIRST); withCacheManager(new CacheManagerCallable(TestCacheManagerFactory.createCacheManager(builder)) { @Override public void call() { Cache<Object, Object> cache = cm.getCache(); addABook(cache); assertFindBook(cache); cache.stop(); assertCacheHasCustomInterceptor(cache, noOpInterceptor); cache.start(); //stopped cache lost all data, and in memory index is lost: re-store both //(not needed with permanent indexes and caches using a cachestore) addABook(cache); assertFindBook(cache); assertCacheHasCustomInterceptor(cache, noOpInterceptor); } protected void addABook(Cache<Object, Object> cache) { cache.put("1", new Book("Infinispan Data Grid Platform", "Francesco Marchioni and Manik Surtani", "Packt Publishing")); } }); } private void assertCacheHasCustomInterceptor(Cache<Object, Object> cache, CommandInterceptor interceptor) { for (InterceptorConfiguration interceptorConfig : cache.getCacheConfiguration().customInterceptors().interceptors()) { if (interceptor.equals(interceptorConfig.interceptor())) { return; } } fail("Expected to find interceptor " + interceptor + " among custom interceptors of cache, but it was not there."); } private static void assertFindBook(Cache<Object, Object> cache) { SearchManager searchManager = Search.getSearchManager(cache); QueryBuilder queryBuilder = searchManager.buildQueryBuilderForClass(Book.class).get(); Query luceneQuery = queryBuilder.keyword().onField("title").matching("infinispan").createQuery(); CacheQuery<Book> cacheQuery = searchManager.getQuery(luceneQuery); List<Book> list = cacheQuery.list(); assertEquals(1, list.size()); } private static class NoOpInterceptor extends CommandInterceptor { } }