/* * JBoss, Home of Professional Open Source * Copyright 2010 Red Hat Inc. and/or its affiliates and other * contributors as indicated by the @author tags. All rights reserved. * See the copyright.txt in the distribution for a full listing of * individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.infinispan.lucene; import static org.infinispan.lucene.CacheTestSupport.assertTextIsFoundInIds; import static org.infinispan.lucene.CacheTestSupport.writeTextToIndex; import static org.infinispan.lucene.CacheTestSupport.optimizeIndex; import java.io.IOException; import org.infinispan.Cache; import org.infinispan.manager.CacheContainer; import org.infinispan.test.TestingUtil; import org.infinispan.util.concurrent.ConcurrentHashSet; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; /** * Verifies the Index can be spread across three different caches; * this is useful so that each cache can be configured independently * to better match the intended usage (like avoiding a CacheStore for volatile locking data). * * @author Sanne Grinovero */ @SuppressWarnings("unchecked") @Test(groups = "functional", testName = "lucene.DirectoryOnMultipleCachesTest") public class DirectoryOnMultipleCachesTest { private CacheContainer cacheManager; private Cache metadataCache; private Cache chunkCache; private Cache lockCache; @BeforeClass(alwaysRun = true) public void createBeforeClass() { cacheManager = CacheTestSupport.createLocalCacheManager(); metadataCache = cacheManager.getCache("metadata"); chunkCache = cacheManager.getCache("chunks"); lockCache = cacheManager.getCache("locks"); } @Test public void testRunningOnMultipleCaches() throws IOException { assert metadataCache != chunkCache; assert chunkCache != lockCache; assert lockCache != metadataCache; InfinispanDirectory dir = new InfinispanDirectory(metadataCache, chunkCache, lockCache, "testingIndex", 100); writeTextToIndex(dir, 0, "hello world"); assertTextIsFoundInIds(dir, "hello", 0); writeTextToIndex(dir, 1, "hello solar system"); assertTextIsFoundInIds(dir, "hello", 0, 1); assertTextIsFoundInIds(dir, "system", 1); optimizeIndex(dir); assertTextIsFoundInIds(dir, "hello", 0, 1); dir.close(); } @Test(dependsOnMethods="testRunningOnMultipleCaches") public void verifyIntendedChunkCachesUsage() { int chunks = 0; for (Object key : chunkCache.keySet()) { chunks++; assert key.getClass().equals(ChunkCacheKey.class); Object value = chunkCache.get(key); assert byte[].class.equals(value.getClass()); } assert chunks != 0; } @Test(dependsOnMethods="testRunningOnMultipleCaches") public void verifyIntendedLockCachesUsage() { //all locks should be cleared now, so if any value is left it should be equal to one. for (Object key : lockCache.keySet()) { assert key.getClass().equals(FileReadLockKey.class); assert lockCache.get(key).equals(1); } } @Test(dependsOnMethods="testRunningOnMultipleCaches") public void verifyIntendedMetadataCachesUsage() { int metadata = 0; int filelists = 0; for (Object key : metadataCache.keySet()) { Object value = metadataCache.get(key); if (key.getClass().equals(org.infinispan.lucene.FileListCacheKey.class)) { filelists++; assert value.getClass().equals(ConcurrentHashSet.class); } else if (key.getClass().equals(FileCacheKey.class)) { metadata++; assert value.getClass().equals(FileMetadata.class); } else { assert false : "unexpected type of key in metadata cache: " + key.getClass(); } } assert filelists == 1; assert metadata != 0; } @AfterClass(alwaysRun = true) public void afterClass() { TestingUtil.killCacheManagers(cacheManager); } }