/** * */ package smartkv.client; import static org.junit.Assert.*; import java.util.Arrays; import java.util.Collection; import java.util.Map; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.rules.ExpectedException; import smartkv.server.MapSmart; /** * @author fabiim * */ public class KeyValueDatastoreProxyTest { //TODO - laun smart, and maybe do it in verbose mode.... //XXX maybe set up tables for each method dynamically. public static KeyValueDatastoreProxy ds; private byte[] key_1 = "1".getBytes(); private byte[] value_1 = "1".getBytes(); private byte[] key_2 = "2".getBytes(); private byte[] value_2 = "2".getBytes(); @BeforeClass public static void startup(){ ds = new KeyValueProxy(0); System.out.println("here"); } @Before public void initTest(){ ds.clear(); } /** * Test method for {@link smartkv.client.KeyValueDatastoreProxy#put(java.lang.String, byte[], byte[])}. */ @Test public void testPut() { String tableName = "put"; ds.createTable(tableName); DatastoreValue val = ds.put(tableName,key_1, value_1); assertNull(val); // previous value was null. assertNull(val.data); // previous value was null. val = ds.put(tableName,key_1, value_2); //replace value, and get previous value. assertNotNull(val); //previous value is not null (should be value_1) assertArrayEquals(val.data, value_1); // previous value was value_1 DatastoreValue ds2 = ds.get(tableName,key_1); assertNotNull(ds2); assertNotNull(ds2.data); Assert.assertArrayEquals(ds2.data, value_2); // should get value 2 } /** * Test method for {@link smartkv.client.KeyValueDatastoreProxy#insert(java.lang.String, byte[], byte[])}. */ @Test public void testInsert() { String tableName = "insert"; assertFalse(ds.insert("nonExistent", key_1, value_1)); // can not insert in nonExistent table. ds.createTable(tableName); boolean inserted = ds.insert(tableName,key_1, value_1); assertTrue(inserted); assertArrayEquals(ds.get(tableName, key_1).data, value_1); inserted = ds.insert(tableName,key_1, value_2); assertTrue(inserted); assertArrayEquals(ds.get(tableName, key_1).data, value_2); //value has been replaced. } /** * Test method for {@link smartkv.client.KeyValueDatastoreProxy#get(java.lang.String, byte[])}. */ @Test public void testGet() { String tableName = "get"; ds.createTable(tableName); DatastoreValue val = ds.get(tableName, key_1); assertNull(val); // there is no key_1 yet. assertNull(val.data); // there is no key_1 yet. ds.put(tableName,key_1, value_1); val = ds.get(tableName, key_1); assertNull(ds.remove(tableName, key_2)); //entry does not exists. assertArrayEquals(val.data, value_1); } /** * Test method for {@link smartkv.client.KeyValueDatastoreProxy#remove(java.lang.String, byte[])}. */ @Test public void testRemoveStringByteArray() { String tableName = "removeStringByteArray"; ds.createTable(tableName); ds.put(tableName, key_1, value_1); DatastoreValue val =ds.remove(tableName, key_1); assertNotNull(val); assertArrayEquals(val.data, value_1); } /** * Test method for {@link smartkv.client.KeyValueDatastoreProxy#replace(java.lang.String, byte[], byte[], byte[])}. */ @Test public void testReplace() { String tableName ="replace"; ds.createTable("replace"); assertFalse(ds.replace(tableName, key_1, value_1, value_2)); assertFalse(ds.replace(tableName, key_1, value_1, value_2)); assertFalse(ds.containsKey(tableName, key_1)); ds.put(tableName, key_1, value_1); assertTrue(ds.replace(tableName, key_1, value_1, value_2)); assertArrayEquals(ds.get(tableName, key_1).data, value_2); assertTrue(ds.replace(tableName, key_1, value_2, value_1)); assertArrayEquals(ds.get(tableName, key_1).data, value_1); } /** * Test method for {@link smartkv.client.KeyValueDatastoreProxy#remove(java.lang.String, byte[], byte[])}. */ @Test public void testRemoveStringByteArrayByteArray() { String tableName = "atomicRemove"; ds.createTable(tableName); assertFalse(ds.remove(tableName,key_1, value_1)); //should not remove, key_1 is not mapped to nothing assertFalse(ds.remove(tableName,key_1, value_1));// still.. does not remove. assertFalse(ds.containsKey(tableName,key_1)); //should not contain ds.put(tableName,key_1, value_1); assertTrue(ds.remove(tableName,key_1, value_1)); assertFalse(ds.containsKey(tableName,key_1)); } /** * Test method for {@link smartkv.client.KeyValueDatastoreProxy#putIfAbsent(java.lang.String, byte[], byte[])}. */ @Test public void testPutIfAbsent() { String tableName = "putIfAbset"; ds.createTable(tableName); assertNull(ds.putIfAbsent(tableName, key_1, value_1)); assertTrue(ds.containsKey(tableName, key_1)); assertArrayEquals(ds.get(tableName, key_1).data, value_1); assertArrayEquals(ds.putIfAbsent(tableName, key_1, value_2).data, value_1); assertArrayEquals(ds.putIfAbsent(tableName, key_1, value_2).data, value_1); } /** * Test method for {@link smartkv.client.TableDataStoreProxy#clear()}. */ @Test public void testClear() { ds.clear(); assertFalse(ds.containsTable("ola")); ds.createTable("ola"); ds.put("ola", new byte[10], new byte[10]); ds.clear(); assertFalse(ds.containsKey("ola", new byte[10])); ///XXX you can do better } /** * Test method for {@link smartkv.client.TableDataStoreProxy#createTable(java.lang.String)}. */ @Test public void testCreateTableString() { assertTrue(ds.createTable("createTable")); assertFalse(ds.createTable("createTable")); } /** * Test method for {@link smartkv.client.TableDataStoreProxy#createTable(java.lang.String, long)}. */ @Test public void testCreateTableStringLong() { String tableName="table_created"; assertTrue(ds.createTable(tableName,2)); assertFalse(ds.createTable(tableName,2)); //table already existed. Should not allow creation. ds.put(tableName, key_1, value_1); ds.put(tableName, key_2, value_2); assertTrue(ds.containsKey(tableName,key_1)); assertTrue(ds.containsKey(tableName,key_2)); ds.put(tableName,"c".getBytes(), "c".getBytes()); //Removes the eldest element a since max size is 2. assertFalse(ds.containsKey(tableName, key_1)); assertTrue(ds.containsKey(tableName, key_2)); assertTrue(ds.containsKey(tableName, "c".getBytes())); } /** * Test method for {@link smartkv.client.TableDataStoreProxy#removeTable(java.lang.String)}. */ @Test public void testRemoveTable() { assertFalse(ds.removeTable("this_table_does_not_exists")); assertTrue(ds.createTable("table_to_remove")); assertTrue(ds.removeTable("table_to_remove")); } /** * Test method for {@link smartkv.client.TableDataStoreProxy#containsTable(java.lang.String)}. */ @Test public void testContainsTable() { assertTrue(ds.createTable("test_contains")); assertFalse(ds.containsTable("this_table_does_not_exists")); assertTrue(ds.containsTable("test_contains")); } /** * Test method for {@link smartkv.client.TableDataStoreProxy#clear(java.lang.String)}. */ @Test public void testClearString() { String tableName = "test_clear"; assertTrue(ds.createTable(tableName)); assertTrue(ds.insert(tableName,key_1,value_1)); Assert.assertEquals(ds.size(tableName), 1); ds.clear(tableName); Assert.assertEquals((int) ds.size(tableName), 0); } /** * Test method for {@link smartkv.client.TableDataStoreProxy#isEmpty(java.lang.String)}. */ @Test public void testIsEmpty() { String tableName= "testIsEmptyString"; ds.createTable(tableName); assertTrue(ds.isEmpty(tableName)); ds.put(tableName,key_1, value_1); assertFalse(ds.isEmpty(tableName)); } /** * Test method for {@link smartkv.client.TableDataStoreProxy#size(java.lang.String)}. */ @Test public void testSize() { ds.createTable("size"); assertEquals(ds.size("size"), 0); ds.put("size",key_1, value_1); assertEquals(ds.size("size"), 1); ds.put("size", key_2, value_1); assertEquals(ds.size("size"), 2); ds.remove("size", key_2); assertEquals(ds.size("size"), 1); ds.clear("size"); assertEquals(ds.size("size"), 0); } /** * Test method for {@link smartkv.client.TableDataStoreProxy#containsKey(java.lang.String, byte[])}. */ @Test public void testContainsKey() { String tableName = "testContainsKey"; ds.createTable(tableName); assertFalse(ds.containsKey(tableName, key_1)); ds.put(tableName,key_1, value_1); assertTrue(ds.containsKey(tableName, key_1)); } /** * Test method for {@link smartkv.client.TableDataStoreProxy#getAndIncrement(java.lang.String, java.lang.String)}. */ @Test public void testGetAndIncrement() { String tableName = "getAndIncrement"; ds.createTable(tableName); int i = ds.getAndIncrement(tableName, "1"); assertEquals(i,0); i = ds.getAndIncrement(tableName, "1"); assertEquals(i,1); ds.put(tableName, "1".getBytes(), value_1); //FIXME: document this behaviour - put override column name... assertTrue(Arrays.equals(ds.get(tableName, "1".getBytes()).data, value_1)); } @Test public void testValues(){ String tableName = "values"; ds.createTable(tableName); ds.put(tableName, key_1, value_1); ds.put(tableName, key_2, value_2); Collection<DatastoreValue> maps = ds.values(tableName); assertSame(maps.size(), 2); boolean c1=false,c2=false; for (DatastoreValue m : maps){ if (Arrays.equals(m.data, value_1)){ c1 = true; } else if (Arrays.equals(m.data, value_2)){ c2 = true; } } if (!(c1 && c2)){ fail("Not in return"); } } }