package ezdb.leveldb; import static org.junit.Assert.*; import java.io.File; import java.nio.ByteBuffer; import java.util.Comparator; import org.iq80.leveldb.util.FileUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; import ezdb.Db; import ezdb.RangeTable; import ezdb.RawTableRow; import ezdb.Table; import ezdb.TableIterator; import ezdb.comparator.LexicographicalComparator; import ezdb.serde.IntegerSerde; import ezdb.serde.StringSerde; import ezdb.serde.VersionedSerde; import ezdb.serde.VersionedSerde.Versioned; public class TestEzLevelDb { protected static final File ROOT = FileUtils.createTempDir(TestEzLevelDb.class.getSimpleName()); protected Db ezdb; protected RangeTable<Integer, Integer, Integer> table; @Test public void testNulls() { // test nulls assertEquals(null, table.get(1)); assertEquals(null, table.get(1, 1)); assertTrue(!table.range(1).hasNext()); assertTrue(!table.range(1, 2).hasNext()); assertTrue(!table.range(1, 1, 2).hasNext()); table.delete(1); table.delete(1, 1); } @Test public void testPutGetH() { Table<Integer, Integer> table = ezdb.getTable("test-simple", IntegerSerde.get, IntegerSerde.get); table.put(1, 1); assertEquals(new Integer(1), table.get(1)); table.put(1, 2); assertEquals(new Integer(2), table.get(1)); table.close(); } @Test public void testPutGetHR() { table.put(1, 1); table.put(1, 1, 3); assertEquals(new Integer(1), table.get(1)); assertEquals(new Integer(3), table.get(1, 1)); table.put(1, 1, 4); assertEquals(new Integer(4), table.get(1, 1)); } @Test public void testRangeH() { TableIterator<Integer, Integer, Integer> it = table.range(1); table.put(1, 2); table.put(1, 1, 4); table.put(2, 1, 4); it.close(); it = table.range(1); assertEquals(new RawTableRow<Integer, Integer, Integer>(1, null, 2), it.next()); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, Integer, Integer>(1, 1, 4), it.next()); assertTrue(!it.hasNext()); it.close(); } @Test public void testRangeHR() { table.put(1, 2); table.put(1, 1, 4); TableIterator<Integer, Integer, Integer> it = table.range(1, null); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, Integer, Integer>(1, null, 2), it.next()); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, Integer, Integer>(1, 1, 4), it.next()); assertTrue(!it.hasNext()); it.close(); it = table.range(1, 1); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, Integer, Integer>(1, 1, 4), it.next()); assertTrue(!it.hasNext()); table.put(1, 2, 5); table.put(2, 2, 5); it.close(); it = table.range(1, 1); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, Integer, Integer>(1, 1, 4), it.next()); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, Integer, Integer>(1, 2, 5), it.next()); assertTrue(!it.hasNext()); it.close(); it = table.range(1, null); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, Integer, Integer>(1, null, 2), it.next()); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, Integer, Integer>(1, 1, 4), it.next()); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, Integer, Integer>(1, 2, 5), it.next()); assertTrue(!it.hasNext()); it.close(); } @Test public void testRangeHRR() { table.put(1, 2); table.put(1, 1, 4); TableIterator<Integer, Integer, Integer> it = table.range(1, null, 2); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, Integer, Integer>(1, null, 2), it.next()); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, Integer, Integer>(1, 1, 4), it.next()); assertTrue(!it.hasNext()); it.close(); it = table.range(1, 1, 2); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, Integer, Integer>(1, 1, 4), it.next()); assertTrue(!it.hasNext()); table.put(1, 2, 5); table.put(1, 3, 5); it.close(); it = table.range(1, 1, 3); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, Integer, Integer>(1, 1, 4), it.next()); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, Integer, Integer>(1, 2, 5), it.next()); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, Integer, Integer>(1, 3, 5), it.next()); assertTrue(!it.hasNext()); it.close(); } @Test public void testDeleteH() { table.put(1, 1); assertEquals(new Integer(1), table.get(1)); table.delete(1); assertEquals(null, table.get(1)); } @Test public void testDeleteHR() { table.put(1, 1); table.put(1, 1, 2); assertEquals(new Integer(1), table.get(1)); assertEquals(new Integer(2), table.get(1, 1)); table.delete(1, 1); assertEquals(new Integer(1), table.get(1)); assertEquals(null, table.get(1, 1)); } @Test public void testSortedStrings() { ezdb.deleteTable("test-range-strings"); RangeTable<Integer, String, Integer> table = ezdb.getTable( "test-range-strings", IntegerSerde.get, StringSerde.get, IntegerSerde.get); table.put(1213, "20120102-foo", 1); table.put(1213, "20120102-bar", 2); table.put(1213, "20120101-foo", 3); table.put(1213, "20120104-foo", 4); table.put(1213, "20120103-foo", 5); table.put(1212, "20120102-foo", 1); table.put(1214, "20120102-bar", 2); table.put(1213, 12345678); TableIterator<Integer, String, Integer> it = table.range(1213, "20120102", "20120103"); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, String, Integer>(1213, "20120102-bar", 2), it.next()); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, String, Integer>(1213, "20120102-foo", 1), it.next()); assertTrue(!it.hasNext()); it.close(); assertEquals(new Integer(12345678), table.get(1213)); table.close(); } @Test public void testCustomRangeComparator() { RangeTable<Integer, Integer, Integer> table = ezdb.getTable( "test-custom-range-comparator", IntegerSerde.get, IntegerSerde.get, IntegerSerde.get, new LexicographicalComparator(), new Comparator<byte[]>() { // Let's do things in reverse lexicographical order. @Override public int compare(byte[] o1, byte[] o2) { return -1 * ByteBuffer.wrap(o1).compareTo( ByteBuffer.wrap(o2)); } }); table.put(1, 1, 1); table.put(1, 2, 2); table.put(1, 3, 3); TableIterator<Integer, Integer, Integer> it = table.range(1, 3); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, Integer, Integer>(1, 3, 3), it.next()); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, Integer, Integer>(1, 2, 2), it.next()); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, Integer, Integer>(1, 1, 1), it.next()); assertTrue(!it.hasNext()); it.close(); table.close(); } @Test public void testVersionedSortedStrings() { ezdb.deleteTable("test-range-strings"); RangeTable<Integer, String, Versioned<Integer>> table = ezdb.getTable( "test-range-strings", IntegerSerde.get, StringSerde.get, new VersionedSerde<Integer>(IntegerSerde.get)); table.put(1213, "20120102-foo", new Versioned<Integer>(1, 0)); table.put(1213, "20120102-bar", new Versioned<Integer>(2, 0)); table.put(1213, "20120102-bar", new Versioned<Integer>(3, 1)); table.put(1213, "20120101-foo", new Versioned<Integer>(3, 0)); table.put(1213, "20120104-foo", new Versioned<Integer>(4, 0)); table.put(1213, "20120103-foo", new Versioned<Integer>(5, 0)); table.put(1212, "20120102-foo", new Versioned<Integer>(1, 0)); table.put(1214, "20120102-bar", new Versioned<Integer>(2, 0)); table.put(1213, new Versioned<Integer>(12345678, 0)); assertEquals(new Versioned<Integer>(1, 0), table.get(1213, "20120102-foo")); assertEquals(new Versioned<Integer>(3, 1), table.get(1213, "20120102-bar")); assertEquals(new Versioned<Integer>(12345678, 0), table.get(1213)); TableIterator<Integer, String, Versioned<Integer>> it = table.range( 1213, "20120102", "20120103"); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, String, Versioned<Integer>>(1213, "20120102-bar", new Versioned<Integer>(3, 1)), it.next()); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, String, Versioned<Integer>>(1213, "20120102-foo", new Versioned<Integer>(1, 0)), it.next()); assertTrue(!it.hasNext()); it.close(); assertEquals(new Versioned<Integer>(12345678, 0), table.get(1213)); // check how things work when iterating between null/versioned range // keys it = table.range(1213); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, String, Versioned<Integer>>(1213, null, new Versioned<Integer>(12345678, 0)), it.next()); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, String, Versioned<Integer>>(1213, "20120101-foo", new Versioned<Integer>(3, 0)), it.next()); assertTrue(it.hasNext()); assertEquals(new RawTableRow<Integer, String, Versioned<Integer>>(1213, "20120102-bar", new Versioned<Integer>(3, 1)), it.next()); // trust that everything works from here on out while (it.hasNext()) { assertEquals(new Integer(1213), it.next().getHashKey()); } it.close(); table.close(); } @Before public void before() { FileUtils.deleteRecursively(ROOT); ROOT.mkdirs(); ezdb = new EzLevelDb(ROOT); ezdb.deleteTable("test"); table = ezdb.getTable("test", IntegerSerde.get, IntegerSerde.get, IntegerSerde.get); } @After public void after() { table.close(); ezdb.deleteTable("test"); ezdb.deleteTable("test-simple"); ezdb.deleteTable("test-range-strings"); ezdb.deleteTable("test-custom-range-comparator"); ezdb.deleteTable("test-table-does-not-exist"); FileUtils.deleteRecursively(ROOT); } }