mirror of https://github.com/apache/lucene.git
LUCENE-5067: add more tests
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1587625 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
80f00226e7
commit
3944b1294a
|
@ -164,35 +164,5 @@ public class TestDirectory extends BaseDirectoryTestCase {
|
||||||
TestUtil.rm(path);
|
TestUtil.rm(path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testFsyncDoesntCreateNewFiles() throws Exception {
|
|
||||||
File path = createTempDir("nocreate");
|
|
||||||
System.out.println(path.getAbsolutePath());
|
|
||||||
Directory fsdir = new SimpleFSDirectory(path);
|
|
||||||
|
|
||||||
// write a file
|
|
||||||
IndexOutput out = fsdir.createOutput("afile", newIOContext(random()));
|
|
||||||
out.writeString("boo");
|
|
||||||
out.close();
|
|
||||||
|
|
||||||
// delete it
|
|
||||||
assertTrue(new File(path, "afile").delete());
|
|
||||||
|
|
||||||
// directory is empty
|
|
||||||
assertEquals(0, fsdir.listAll().length);
|
|
||||||
|
|
||||||
// fsync it
|
|
||||||
try {
|
|
||||||
fsdir.sync(Collections.singleton("afile"));
|
|
||||||
fail("didn't get expected exception, instead fsync created new files: " + Arrays.asList(fsdir.listAll()));
|
|
||||||
} catch (FileNotFoundException | NoSuchFileException expected) {
|
|
||||||
// ok
|
|
||||||
}
|
|
||||||
|
|
||||||
// directory is still empty
|
|
||||||
assertEquals(0, fsdir.listAll().length);
|
|
||||||
|
|
||||||
fsdir.close();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,9 +23,13 @@ import java.io.IOException;
|
||||||
import java.nio.file.NoSuchFileException;
|
import java.nio.file.NoSuchFileException;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.zip.CRC32;
|
||||||
|
|
||||||
import org.apache.lucene.index.DirectoryReader;
|
import org.apache.lucene.index.DirectoryReader;
|
||||||
import org.apache.lucene.index.IndexNotFoundException;
|
import org.apache.lucene.index.IndexNotFoundException;
|
||||||
|
import org.apache.lucene.util.IOUtils;
|
||||||
import org.apache.lucene.util.LuceneTestCase;
|
import org.apache.lucene.util.LuceneTestCase;
|
||||||
import org.apache.lucene.util.TestUtil;
|
import org.apache.lucene.util.TestUtil;
|
||||||
|
|
||||||
|
@ -38,6 +42,244 @@ public abstract class BaseDirectoryTestCase extends LuceneTestCase {
|
||||||
* path, else it can ignore it. */
|
* path, else it can ignore it. */
|
||||||
protected abstract Directory getDirectory(File path) throws IOException;
|
protected abstract Directory getDirectory(File path) throws IOException;
|
||||||
|
|
||||||
|
// first some basic tests for the directory api
|
||||||
|
|
||||||
|
public void testCopy() throws Exception {
|
||||||
|
Directory source = getDirectory(createTempDir("testCopy"));
|
||||||
|
Directory dest = newDirectory();
|
||||||
|
|
||||||
|
IndexOutput output = source.createOutput("foobar", newIOContext(random()));
|
||||||
|
int numBytes = random().nextInt(20000);
|
||||||
|
byte bytes[] = new byte[numBytes];
|
||||||
|
random().nextBytes(bytes);
|
||||||
|
output.writeBytes(bytes, bytes.length);
|
||||||
|
output.close();
|
||||||
|
|
||||||
|
source.copy(dest, "foobar", "foobaz", newIOContext(random()));
|
||||||
|
assertTrue(slowFileExists(dest, "foobaz"));
|
||||||
|
|
||||||
|
IndexInput input = dest.openInput("foobaz", newIOContext(random()));
|
||||||
|
byte bytes2[] = new byte[numBytes];
|
||||||
|
input.readBytes(bytes2, 0, bytes2.length);
|
||||||
|
assertEquals(input.length(), numBytes);
|
||||||
|
input.close();
|
||||||
|
|
||||||
|
assertArrayEquals(bytes, bytes2);
|
||||||
|
|
||||||
|
IOUtils.close(source, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCopyDestination() throws Exception {
|
||||||
|
Directory source = newDirectory();
|
||||||
|
Directory dest = getDirectory(createTempDir("testCopyDestination"));
|
||||||
|
|
||||||
|
IndexOutput output = source.createOutput("foobar", newIOContext(random()));
|
||||||
|
int numBytes = random().nextInt(20000);
|
||||||
|
byte bytes[] = new byte[numBytes];
|
||||||
|
random().nextBytes(bytes);
|
||||||
|
output.writeBytes(bytes, bytes.length);
|
||||||
|
output.close();
|
||||||
|
|
||||||
|
source.copy(dest, "foobar", "foobaz", newIOContext(random()));
|
||||||
|
assertTrue(slowFileExists(dest, "foobaz"));
|
||||||
|
|
||||||
|
IndexInput input = dest.openInput("foobaz", newIOContext(random()));
|
||||||
|
byte bytes2[] = new byte[numBytes];
|
||||||
|
input.readBytes(bytes2, 0, bytes2.length);
|
||||||
|
assertEquals(input.length(), numBytes);
|
||||||
|
input.close();
|
||||||
|
|
||||||
|
assertArrayEquals(bytes, bytes2);
|
||||||
|
|
||||||
|
IOUtils.close(source, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: are these semantics really needed by lucene? can we just throw exception?
|
||||||
|
public void testCopyOverwrite() throws Exception {
|
||||||
|
Directory source = getDirectory(createTempDir("testCopyOverwrite"));
|
||||||
|
Directory dest = newDirectory();
|
||||||
|
|
||||||
|
// we are double-writing intentionally, because thats the api
|
||||||
|
if (dest instanceof MockDirectoryWrapper) {
|
||||||
|
((MockDirectoryWrapper) dest).setPreventDoubleWrite(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
IndexOutput output = source.createOutput("foobar", newIOContext(random()));
|
||||||
|
int numBytes = random().nextInt(20000);
|
||||||
|
byte bytes[] = new byte[numBytes];
|
||||||
|
random().nextBytes(bytes);
|
||||||
|
output.writeBytes(bytes, bytes.length);
|
||||||
|
output.close();
|
||||||
|
|
||||||
|
// create foobaz first, it should be overwritten
|
||||||
|
IndexOutput output2 = dest.createOutput("foobaz", newIOContext(random()));
|
||||||
|
output2.writeString("bogus!");
|
||||||
|
output2.close();
|
||||||
|
|
||||||
|
source.copy(dest, "foobar", "foobaz", newIOContext(random()));
|
||||||
|
assertTrue(slowFileExists(dest, "foobaz"));
|
||||||
|
|
||||||
|
IndexInput input = dest.openInput("foobaz", newIOContext(random()));
|
||||||
|
byte bytes2[] = new byte[numBytes];
|
||||||
|
input.readBytes(bytes2, 0, bytes2.length);
|
||||||
|
assertEquals(input.length(), numBytes);
|
||||||
|
input.close();
|
||||||
|
|
||||||
|
assertArrayEquals(bytes, bytes2);
|
||||||
|
|
||||||
|
IOUtils.close(source, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDeleteFile() throws Exception {
|
||||||
|
Directory dir = getDirectory(createTempDir("testDeleteFile"));
|
||||||
|
dir.createOutput("foo.txt", IOContext.DEFAULT).close();
|
||||||
|
dir.deleteFile("foo.txt");
|
||||||
|
assertEquals(0, dir.listAll().length);
|
||||||
|
dir.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testByte() throws Exception {
|
||||||
|
Directory dir = getDirectory(createTempDir("testByte"));
|
||||||
|
IndexOutput output = dir.createOutput("byte", newIOContext(random()));
|
||||||
|
output.writeByte((byte)128);
|
||||||
|
output.close();
|
||||||
|
|
||||||
|
IndexInput input = dir.openInput("byte", newIOContext(random()));
|
||||||
|
assertEquals(1, input.length());
|
||||||
|
assertEquals((byte)128, input.readByte());
|
||||||
|
input.close();
|
||||||
|
dir.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testShort() throws Exception {
|
||||||
|
Directory dir = getDirectory(createTempDir("testShort"));
|
||||||
|
IndexOutput output = dir.createOutput("short", newIOContext(random()));
|
||||||
|
output.writeShort((short)-20);
|
||||||
|
output.close();
|
||||||
|
|
||||||
|
IndexInput input = dir.openInput("short", newIOContext(random()));
|
||||||
|
assertEquals(2, input.length());
|
||||||
|
assertEquals((short)-20, input.readShort());
|
||||||
|
input.close();
|
||||||
|
dir.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testInt() throws Exception {
|
||||||
|
Directory dir = getDirectory(createTempDir("testInt"));
|
||||||
|
IndexOutput output = dir.createOutput("int", newIOContext(random()));
|
||||||
|
output.writeInt(-500);
|
||||||
|
output.close();
|
||||||
|
|
||||||
|
IndexInput input = dir.openInput("int", newIOContext(random()));
|
||||||
|
assertEquals(4, input.length());
|
||||||
|
assertEquals(-500, input.readInt());
|
||||||
|
input.close();
|
||||||
|
dir.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testLong() throws Exception {
|
||||||
|
Directory dir = getDirectory(createTempDir("testLong"));
|
||||||
|
IndexOutput output = dir.createOutput("long", newIOContext(random()));
|
||||||
|
output.writeLong(-5000);
|
||||||
|
output.close();
|
||||||
|
|
||||||
|
IndexInput input = dir.openInput("long", newIOContext(random()));
|
||||||
|
assertEquals(8, input.length());
|
||||||
|
assertEquals(-5000L, input.readLong());
|
||||||
|
input.close();
|
||||||
|
dir.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testString() throws Exception {
|
||||||
|
Directory dir = getDirectory(createTempDir("testString"));
|
||||||
|
IndexOutput output = dir.createOutput("string", newIOContext(random()));
|
||||||
|
output.writeString("hello!");
|
||||||
|
output.close();
|
||||||
|
|
||||||
|
IndexInput input = dir.openInput("string", newIOContext(random()));
|
||||||
|
assertEquals("hello!", input.readString());
|
||||||
|
assertEquals(7, input.length());
|
||||||
|
input.close();
|
||||||
|
dir.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testVInt() throws Exception {
|
||||||
|
Directory dir = getDirectory(createTempDir("testVInt"));
|
||||||
|
IndexOutput output = dir.createOutput("vint", newIOContext(random()));
|
||||||
|
output.writeVInt(500);
|
||||||
|
output.close();
|
||||||
|
|
||||||
|
IndexInput input = dir.openInput("vint", newIOContext(random()));
|
||||||
|
assertEquals(2, input.length());
|
||||||
|
assertEquals(500, input.readVInt());
|
||||||
|
input.close();
|
||||||
|
dir.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testVLong() throws Exception {
|
||||||
|
Directory dir = getDirectory(createTempDir("testVLong"));
|
||||||
|
IndexOutput output = dir.createOutput("vlong", newIOContext(random()));
|
||||||
|
output.writeVLong(Long.MAX_VALUE);
|
||||||
|
output.close();
|
||||||
|
|
||||||
|
IndexInput input = dir.openInput("vlong", newIOContext(random()));
|
||||||
|
assertEquals(9, input.length());
|
||||||
|
assertEquals(Long.MAX_VALUE, input.readVLong());
|
||||||
|
input.close();
|
||||||
|
dir.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testStringSet() throws Exception {
|
||||||
|
Directory dir = getDirectory(createTempDir("testStringSet"));
|
||||||
|
IndexOutput output = dir.createOutput("stringset", newIOContext(random()));
|
||||||
|
output.writeStringSet(asSet("test1", "test2"));
|
||||||
|
output.close();
|
||||||
|
|
||||||
|
IndexInput input = dir.openInput("stringset", newIOContext(random()));
|
||||||
|
assertEquals(16, input.length());
|
||||||
|
assertEquals(asSet("test1", "test2"), input.readStringSet());
|
||||||
|
input.close();
|
||||||
|
dir.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testStringMap() throws Exception {
|
||||||
|
Map<String,String> m = new HashMap<>();
|
||||||
|
m.put("test1", "value1");
|
||||||
|
m.put("test2", "value2");
|
||||||
|
|
||||||
|
Directory dir = getDirectory(createTempDir("testStringMap"));
|
||||||
|
IndexOutput output = dir.createOutput("stringmap", newIOContext(random()));
|
||||||
|
output.writeStringStringMap(m);
|
||||||
|
output.close();
|
||||||
|
|
||||||
|
IndexInput input = dir.openInput("stringmap", newIOContext(random()));
|
||||||
|
assertEquals(30, input.length());
|
||||||
|
assertEquals(m, input.readStringStringMap());
|
||||||
|
input.close();
|
||||||
|
dir.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: fold in some of the testing of o.a.l.index.TestIndexInput in here!
|
||||||
|
public void testChecksum() throws Exception {
|
||||||
|
CRC32 expected = new CRC32();
|
||||||
|
int numBytes = random().nextInt(20000);
|
||||||
|
byte bytes[] = new byte[numBytes];
|
||||||
|
random().nextBytes(bytes);
|
||||||
|
expected.update(bytes);
|
||||||
|
|
||||||
|
Directory dir = getDirectory(createTempDir("testChecksum"));
|
||||||
|
IndexOutput output = dir.createOutput("checksum", newIOContext(random()));
|
||||||
|
output.writeBytes(bytes, 0, bytes.length);
|
||||||
|
output.close();
|
||||||
|
|
||||||
|
ChecksumIndexInput input = dir.openChecksumInput("checksum", newIOContext(random()));
|
||||||
|
input.skipBytes(numBytes);
|
||||||
|
|
||||||
|
assertEquals(expected.getValue(), input.getChecksum());
|
||||||
|
input.close();
|
||||||
|
dir.close();
|
||||||
|
}
|
||||||
|
|
||||||
/** Make sure directory throws AlreadyClosedException if
|
/** Make sure directory throws AlreadyClosedException if
|
||||||
* you try to createOutput after closing. */
|
* you try to createOutput after closing. */
|
||||||
public void testDetectClose() throws Throwable {
|
public void testDetectClose() throws Throwable {
|
||||||
|
@ -197,14 +439,6 @@ public abstract class BaseDirectoryTestCase extends LuceneTestCase {
|
||||||
dir.close();
|
dir.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testDeleteFile() throws Exception {
|
|
||||||
Directory dir = getDirectory(createTempDir("testDeleteFile"));
|
|
||||||
dir.createOutput("foo.txt", IOContext.DEFAULT).close();
|
|
||||||
dir.deleteFile("foo.txt");
|
|
||||||
assertEquals(0, dir.listAll().length);
|
|
||||||
dir.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
// LUCENE-3382 -- make sure we get exception if the directory really does not exist.
|
// LUCENE-3382 -- make sure we get exception if the directory really does not exist.
|
||||||
public void testNoDir() throws Throwable {
|
public void testNoDir() throws Throwable {
|
||||||
File tempDir = createTempDir("doesnotexist");
|
File tempDir = createTempDir("doesnotexist");
|
||||||
|
@ -395,5 +629,44 @@ public abstract class BaseDirectoryTestCase extends LuceneTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// this test backdoors the directory via the filesystem. so it must actually use the filesystem
|
||||||
|
// TODO: somehow change this test to
|
||||||
|
public void testFsyncDoesntCreateNewFiles() throws Exception {
|
||||||
|
File path = createTempDir("nocreate");
|
||||||
|
Directory fsdir = getDirectory(path);
|
||||||
|
|
||||||
|
// this test backdoors the directory via the filesystem. so it must be an FSDir (for now)
|
||||||
|
// TODO: figure a way to test this better/clean it up. E.g. we should be testing for FileSwitchDir,
|
||||||
|
// if its using two FSdirs and so on
|
||||||
|
if (fsdir instanceof FSDirectory == false) {
|
||||||
|
fsdir.close();
|
||||||
|
assumeTrue("test only works for FSDirectory subclasses", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// write a file
|
||||||
|
IndexOutput out = fsdir.createOutput("afile", newIOContext(random()));
|
||||||
|
out.writeString("boo");
|
||||||
|
out.close();
|
||||||
|
|
||||||
|
// delete it
|
||||||
|
assertTrue(new File(path, "afile").delete());
|
||||||
|
|
||||||
|
// directory is empty
|
||||||
|
assertEquals(0, fsdir.listAll().length);
|
||||||
|
|
||||||
|
// fsync it
|
||||||
|
try {
|
||||||
|
fsdir.sync(Collections.singleton("afile"));
|
||||||
|
fail("didn't get expected exception, instead fsync created new files: " + Arrays.asList(fsdir.listAll()));
|
||||||
|
} catch (FileNotFoundException | NoSuchFileException expected) {
|
||||||
|
// ok
|
||||||
|
}
|
||||||
|
|
||||||
|
// directory is still empty
|
||||||
|
assertEquals(0, fsdir.listAll().length);
|
||||||
|
|
||||||
|
fsdir.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue