mirror of https://github.com/apache/lucene.git
LUCENE-3738: Add random test for vints and vlongs, cleanup code and make more clear for longs
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1308117 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
b70152d24c
commit
5ab0204216
|
@ -76,7 +76,7 @@ public abstract class DataOutput {
|
||||||
*/
|
*/
|
||||||
public final void writeVInt(int i) throws IOException {
|
public final void writeVInt(int i) throws IOException {
|
||||||
while ((i & ~0x7F) != 0) {
|
while ((i & ~0x7F) != 0) {
|
||||||
writeByte((byte)((i & 0x7f) | 0x80));
|
writeByte((byte)((i & 0x7F) | 0x80));
|
||||||
i >>>= 7;
|
i >>>= 7;
|
||||||
}
|
}
|
||||||
writeByte((byte)i);
|
writeByte((byte)i);
|
||||||
|
@ -97,8 +97,8 @@ public abstract class DataOutput {
|
||||||
*/
|
*/
|
||||||
public final void writeVLong(long i) throws IOException {
|
public final void writeVLong(long i) throws IOException {
|
||||||
assert i >= 0L;
|
assert i >= 0L;
|
||||||
while ((i & ~0x7F) != 0) {
|
while ((i & ~0x7FL) != 0L) {
|
||||||
writeByte((byte)((i & 0x7f) | 0x80));
|
writeByte((byte)((i & 0x7FL) | 0x80L));
|
||||||
i >>>= 7;
|
i >>>= 7;
|
||||||
}
|
}
|
||||||
writeByte((byte)i);
|
writeByte((byte)i);
|
||||||
|
|
|
@ -19,11 +19,15 @@ package org.apache.lucene.index;
|
||||||
|
|
||||||
import org.apache.lucene.util.LuceneTestCase;
|
import org.apache.lucene.util.LuceneTestCase;
|
||||||
import org.apache.lucene.store.ByteArrayDataInput;
|
import org.apache.lucene.store.ByteArrayDataInput;
|
||||||
|
import org.apache.lucene.store.ByteArrayDataOutput;
|
||||||
import org.apache.lucene.store.DataInput;
|
import org.apache.lucene.store.DataInput;
|
||||||
import org.apache.lucene.store.IndexInput;
|
import org.apache.lucene.store.IndexInput;
|
||||||
import org.apache.lucene.store.IndexOutput;
|
import org.apache.lucene.store.IndexOutput;
|
||||||
import org.apache.lucene.store.RAMDirectory;
|
import org.apache.lucene.store.RAMDirectory;
|
||||||
|
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
public class TestIndexInput extends LuceneTestCase {
|
public class TestIndexInput extends LuceneTestCase {
|
||||||
|
@ -74,6 +78,41 @@ public class TestIndexInput extends LuceneTestCase {
|
||||||
(byte) 0x01, // guard value
|
(byte) 0x01, // guard value
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static final int COUNT = RANDOM_MULTIPLIER * 65536;
|
||||||
|
static int[] INTS;
|
||||||
|
static long[] LONGS;
|
||||||
|
static byte[] RANDOM_TEST_BYTES;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void beforeClass() throws IOException {
|
||||||
|
INTS = new int[COUNT];
|
||||||
|
LONGS = new long[COUNT];
|
||||||
|
RANDOM_TEST_BYTES = new byte[COUNT * (5 + 4 + 9 + 8)];
|
||||||
|
final ByteArrayDataOutput bdo = new ByteArrayDataOutput(RANDOM_TEST_BYTES);
|
||||||
|
for (int i = 0; i < COUNT; i++) {
|
||||||
|
final int i1 = INTS[i] = random.nextInt();
|
||||||
|
bdo.writeVInt(i1);
|
||||||
|
bdo.writeInt(i1);
|
||||||
|
|
||||||
|
final long l1;
|
||||||
|
if (rarely()) {
|
||||||
|
// a long with lots of zeroes at the end
|
||||||
|
l1 = LONGS[i] = ((long) Math.abs(random.nextInt())) << 32;
|
||||||
|
} else {
|
||||||
|
l1 = LONGS[i] = Math.abs(random.nextLong());
|
||||||
|
}
|
||||||
|
bdo.writeVLong(l1);
|
||||||
|
bdo.writeLong(l1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void afterClass() {
|
||||||
|
INTS = null;
|
||||||
|
LONGS = null;
|
||||||
|
RANDOM_TEST_BYTES = null;
|
||||||
|
}
|
||||||
|
|
||||||
private void checkReads(DataInput is, Class<? extends Exception> expectedEx) throws IOException {
|
private void checkReads(DataInput is, Class<? extends Exception> expectedEx) throws IOException {
|
||||||
assertEquals(128,is.readVInt());
|
assertEquals(128,is.readVInt());
|
||||||
assertEquals(16383,is.readVInt());
|
assertEquals(16383,is.readVInt());
|
||||||
|
@ -117,28 +156,49 @@ public class TestIndexInput extends LuceneTestCase {
|
||||||
assertEquals(1L, is.readVLong()); // guard value
|
assertEquals(1L, is.readVLong()); // guard value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void checkRandomReads(DataInput is) throws IOException {
|
||||||
|
for (int i = 0; i < COUNT; i++) {
|
||||||
|
assertEquals(INTS[i], is.readVInt());
|
||||||
|
assertEquals(INTS[i], is.readInt());
|
||||||
|
assertEquals(LONGS[i], is.readVLong());
|
||||||
|
assertEquals(LONGS[i], is.readLong());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// this test only checks BufferedIndexInput because MockIndexInput extends BufferedIndexInput
|
// this test only checks BufferedIndexInput because MockIndexInput extends BufferedIndexInput
|
||||||
public void testBufferedIndexInputRead() throws IOException {
|
public void testBufferedIndexInputRead() throws IOException {
|
||||||
final IndexInput is = new MockIndexInput(READ_TEST_BYTES);
|
IndexInput is = new MockIndexInput(READ_TEST_BYTES);
|
||||||
checkReads(is, IOException.class);
|
checkReads(is, IOException.class);
|
||||||
is.close();
|
is.close();
|
||||||
|
is = new MockIndexInput(RANDOM_TEST_BYTES);
|
||||||
|
checkRandomReads(is);
|
||||||
|
is.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
// this test checks the raw IndexInput methods as it uses RAMIndexInput which extends IndexInput directly
|
// this test checks the raw IndexInput methods as it uses RAMIndexInput which extends IndexInput directly
|
||||||
public void testRawIndexInputRead() throws IOException {
|
public void testRawIndexInputRead() throws IOException {
|
||||||
final RAMDirectory dir = new RAMDirectory();
|
final RAMDirectory dir = new RAMDirectory();
|
||||||
final IndexOutput os = dir.createOutput("foo", newIOContext(random));
|
IndexOutput os = dir.createOutput("foo", newIOContext(random));
|
||||||
os.writeBytes(READ_TEST_BYTES, READ_TEST_BYTES.length);
|
os.writeBytes(READ_TEST_BYTES, READ_TEST_BYTES.length);
|
||||||
os.close();
|
os.close();
|
||||||
final IndexInput is = dir.openInput("foo", newIOContext(random));
|
IndexInput is = dir.openInput("foo", newIOContext(random));
|
||||||
checkReads(is, IOException.class);
|
checkReads(is, IOException.class);
|
||||||
is.close();
|
is.close();
|
||||||
|
|
||||||
|
os = dir.createOutput("bar", newIOContext(random));
|
||||||
|
os.writeBytes(RANDOM_TEST_BYTES, RANDOM_TEST_BYTES.length);
|
||||||
|
os.close();
|
||||||
|
is = dir.openInput("bar", newIOContext(random));
|
||||||
|
checkRandomReads(is);
|
||||||
|
is.close();
|
||||||
dir.close();
|
dir.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testByteArrayDataInput() throws IOException {
|
public void testByteArrayDataInput() throws IOException {
|
||||||
final ByteArrayDataInput is = new ByteArrayDataInput(READ_TEST_BYTES);
|
ByteArrayDataInput is = new ByteArrayDataInput(READ_TEST_BYTES);
|
||||||
checkReads(is, RuntimeException.class);
|
checkReads(is, RuntimeException.class);
|
||||||
|
is = new ByteArrayDataInput(RANDOM_TEST_BYTES);
|
||||||
|
checkRandomReads(is);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue