package org.infinispan.lucene; import static org.infinispan.lucene.CacheTestSupport.assertTextIsFoundInIds; import static org.infinispan.lucene.CacheTestSupport.writeTextToIndex; import java.io.IOException; import java.util.Arrays; import java.util.List; import org.apache.lucene.store.Directory; import org.apache.lucene.store.IOContext; import org.apache.lucene.store.IndexOutput; import org.infinispan.Cache; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.lucene.directory.DirectoryBuilder; import org.infinispan.lucene.impl.DirectoryExtensions; import org.infinispan.lucene.readlocks.DistributedSegmentReadLocker; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.test.SingleCacheManagerTest; import org.infinispan.test.fwk.TestCacheManagerFactory; import org.testng.AssertJUnit; import org.testng.annotations.Test; /** * Tests covering InfinispanDirectory simple use cases, like: * - InfinispanDirectory object initialization with illegal arguments. * - InfinispanDirectory object initialization with proper arguments. * - Tests are added testing the touchFile, fileModified, renameFile methods. * * @author Anna Manukyan */ @Test(groups = "functional", testName = "lucene.InfinispanDirectoryTest") public class InfinispanDirectoryTest extends SingleCacheManagerTest { @Override protected EmbeddedCacheManager createCacheManager() throws Exception { ConfigurationBuilder configuration = CacheTestSupport.createLocalCacheConfiguration(); return TestCacheManagerFactory.createCacheManager(configuration); } @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "chunkSize must be a positive integer") public void testInitWithInvalidChunkSize() { Cache cache = cacheManager.getCache(); DirectoryBuilder.newDirectoryInstance(cache, cache, cache, "index") .overrideSegmentReadLocker(new DistributedSegmentReadLocker(cache, cache, cache, "index", -1)) .chunkSize(0); } @Test(expectedExceptions = IllegalArgumentException.class) public void testInitWithInvalidCache() { Cache cache = cacheManager.getCache(); DirectoryBuilder.newDirectoryInstance(null, cache, cache, "indexName"); } @Test(expectedExceptions = IllegalArgumentException.class) public void testInitWithInvalidChunkCache() { Cache cache = cacheManager.getCache(); DirectoryBuilder.newDirectoryInstance(cache, null, cache, "indexName"); } @Test(expectedExceptions = IllegalArgumentException.class) public void testInitWithInvalidIndexName() { Cache cache = cacheManager.getCache(); DirectoryBuilder.newDirectoryInstance(cache, cache, cache, null); } @Test(expectedExceptions = IllegalArgumentException.class) public void testInitWithInvalidLockFactory() { Cache cache = cacheManager.getCache(); DirectoryBuilder.newDirectoryInstance(cache, cache, cache, "indexName") .overrideWriteLocker(null); } @Test(expectedExceptions = IllegalArgumentException.class) public void testInitWithInvalidSegmentReadLocker() { Cache cache = cacheManager.getCache(); DirectoryBuilder.newDirectoryInstance(cache, cache, cache, "indexName") .overrideSegmentReadLocker(null); } @Test public void testRenameFile() throws Exception { Directory dir = null; try { Cache cache = cacheManager.getCache(); String fileName = "testfile.txt"; String newFileName = "newtestfile.txt"; dir = DirectoryBuilder.newDirectoryInstance(cache, cache, cache, "indexName").create(); createFile(fileName, dir); ((DirectoryExtensions) dir).renameFile(fileName, newFileName); List<String> files = Arrays.asList(dir.listAll()); assert !files.contains(fileName); assert files.contains(newFileName); } finally { if (dir != null) dir.close(); } } @Test public void testFileLength() throws IOException { Directory dir = null; try { dir = DirectoryBuilder.newDirectoryInstance(cache, cache, cache, "indexName").create(); AssertJUnit.assertEquals(0, dir.fileLength("nonExistentFile.txt")); } finally { if (dir != null) dir.close(); } } private void createFile(final String fileName, final Directory dir) throws IOException { IndexOutput io = null; try { io = dir.createOutput(fileName, IOContext.DEFAULT); io.writeByte((byte) 66); io.writeByte((byte) 69); } finally { io.close(); } } private void verifyDir(final Directory dir, final String expectedIndexName) throws IOException { DirectoryExtensions infDir = (DirectoryExtensions) dir; AssertJUnit.assertEquals(expectedIndexName, infDir.getIndexName()); writeTextToIndex(dir, 0, "hi all"); assertTextIsFoundInIds(dir, "hi", 0); writeTextToIndex(dir, 1, "all together"); assertTextIsFoundInIds(dir, "all", 0, 1); } }