/** * */ package smartkv.client; import static org.junit.Assert.*; import java.util.Arrays; import java.util.Collection; import java.util.Map; import java.util.Map.Entry; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; /** * @author fabiim * */ public class KeyValueColumnDatastoreProxyTest { //TODO - laun smart, and maybe do it in verbose mode.... //XXX maybe set up tables for each method dynamically. public static KeyValueColumnDatastoreProxy ds; private byte[] key_1 = "1".getBytes(); private Map<String,byte[]> value_1 = Maps.newHashMap(ImmutableMap.of("1", "1".getBytes(), "2", "2".getBytes())); private byte[] key_2 = "2".getBytes(); private Map<String,byte[]> value_2 = Maps.newHashMap(ImmutableMap.of("4", "4".getBytes(), "3", "3".getBytes())); private byte[] key_3 = "3".getBytes(); private Map<String,byte[]> value_3 = Maps.newHashMap(ImmutableMap.of("5", "5".getBytes(), "6", "6".getBytes())); @BeforeClass public static void startup(){ ds = new ColumnProxy(0); System.out.println("here"); } @Before public void initTest(){ ds.clear(); } @Test public void testSetColumn(){ String tableName = "setColumn"; assertFalse(ds.setColumn(tableName, key_2, "whatever", new byte[1])); //table does not exits. ds.createTable(tableName); assertFalse(ds.setColumn(tableName, key_2, "whatever", new byte[1])); //key does not exist ds.put(tableName, key_1, value_1); assertFalse(ds.setColumn(tableName, key_2, "whatever", new byte[1])); //key (column) does not exist String k_to_change = value_1.keySet().iterator().next(); assertTrue(ds.setColumn(tableName, key_1, k_to_change, "weChangedThisValue".getBytes())); Map<String,byte[]> val = ds.getValue(tableName, key_1); assertTrue(Arrays.equals(val.get(k_to_change), "weChangedThisValue".getBytes())); } @Test public void testGetColumn(){ String tableName = "getColumn"; ds.createTable(tableName); Map<String,byte[]>map = Maps.newHashMap(ImmutableMap.of("1" ,"1".getBytes())); ds.put(tableName, key_1, map); assertTrue(Arrays.equals(ds.getColumn(tableName, key_1, "1" ),"1".getBytes())); ds.setColumn(tableName, key_1, "1","2".getBytes()); assertTrue(Arrays.equals(ds.getColumn(tableName, key_1, "1"),"2".getBytes())); } /** * Test method for {@link smartkv.client.KeyValueDatastoreProxy#put(java.lang.String, byte[], byte[])}. */ @Test public void testPut() { String tableName = "put"; ds.createTable(tableName); Map<String,byte[]> val = ds.put(tableName,key_1, value_1); assertNull(val); // 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) assertMapAreEqual(val,value_1); assertMapAreEqual(ds.getValue(tableName, key_1), value_2); } private boolean areByteArrayValueMapEqual(Map<?, byte[]> a, Map<?, byte[]> b) { if (a.size() == b.size() ){ for (Entry<?, byte[]> en : a.entrySet()){ if (b.containsKey(en.getKey()) && Arrays.equals(en.getValue(), b.get(en.getKey()))){ continue; } return false; } return true; } return false; } private void assertMapAreEqual(final Map<?,byte[]> a , final Map<?,byte[]> b){ assertTrue(areByteArrayValueMapEqual(a,b)); } /** * 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); assertMapAreEqual(ds.getValue(tableName, key_1), value_1); inserted = ds.insert(tableName,key_1, value_2); assertTrue(inserted); assertMapAreEqual(ds.getValue(tableName, key_1), 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); Map<String,byte[]> val = ds.getValue(tableName, key_1); assertNull(val); // there is no key_1 yet. ds.put(tableName,key_1, value_1); val = ds.getValue(tableName, key_1); assertNull(ds.removeValue(tableName, key_2)); //entry does not exists. for (Entry<String, byte[]> m : val.entrySet()){ System.out.println(m.getKey() + "-" + Arrays.toString(m.getValue())); System.out.println( m.getKey() + "-" + Arrays.toString(value_1.get(m.getKey()))); } assertMapAreEqual(val, 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); Map<String,byte[]> val =ds.removeValue(tableName, key_1); assertNotNull(val); assertMapAreEqual(val, 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)); assertMapAreEqual(ds.getValue(tableName, key_1), value_2); assertTrue(ds.replace(tableName, key_1, value_2, value_1)); assertMapAreEqual(ds.getValue(tableName, key_1), 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)); assertMapAreEqual(ds.getValue(tableName, key_1), value_1); assertMapAreEqual(ds.putIfAbsent(tableName, key_1, value_2), value_1); assertMapAreEqual(ds.putIfAbsent(tableName, key_1, value_2), 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", key_1, value_1); 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,key_3, value_3); //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.removeValue("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... //assertMapAreEqual(ds.getValue(tableName, "1".getBytes()), 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); ds.put(tableName, key_3, value_3); Collection<Map<String,byte[]>> maps = ds.valueS(tableName); assertSame(maps.size(), 3); boolean c1=false,c2=false,c3=false; for (Map<String,byte[]> m : maps){ if (areByteArrayValueMapEqual(m, value_1)){ c1 = true; } else if (areByteArrayValueMapEqual(m, value_2)){ c2 = true; } else if (areByteArrayValueMapEqual(m, value_3)){ c3 = true; } } if (!(c1 && c2&& c3)){ fail("Not in map"); } } }