package voldemort.collections; import java.util.Iterator; import java.util.Map; import java.util.NoSuchElementException; import junit.framework.TestCase; import voldemort.client.MockStoreClientFactory; import voldemort.client.StoreClient; import voldemort.client.StoreClientFactory; import voldemort.serialization.Serializer; import voldemort.serialization.json.JsonTypeSerializer; import voldemort.versioning.ObsoleteVersionException; import voldemort.versioning.Versioned; /** * Unit tests for voldemort stack implementation. */ public class TestVStack extends TestCase { private static StoreClientFactory storeFactory; static { Serializer<Object> keySerializer = new JsonTypeSerializer("{\"value\": \"string\", \"id\" : \"int32\"}"); Serializer<Object> valueSerializer = new JsonTypeSerializer("{\"id\":\"int32\"," + "\"nextId\":\"int32\"," + "\"previousId\":\"int32\"," + "\"stable\":\"boolean\"," + "\"value\":\"string\"}"); storeFactory = new MockStoreClientFactory(keySerializer, valueSerializer, null); } public void testHappyPath() { StoreClient<Map<String, Object>, Map<String, Object>> storeClient = storeFactory.getStoreClient("test"); VStack<String, String> stack = new VStack<String, String>("stack", storeClient); // empty? assertTrue(stack.isEmpty()); assertEquals(0, stack.size()); // test add stack.add("world"); assertEquals("world", stack.peek()); assertEquals(1, stack.size()); assertFalse(stack.isEmpty()); assertTrue(stack.offer("hello")); assertEquals(2, stack.size()); assertEquals("world", stack.getById(1)); stack.add("goodbye"); assertEquals(3, stack.size()); assertEquals("hello", stack.getById(2)); // test iterator String[] strArray = new String[] { "goodbye", "hello", "world" }; int i = 0; for(String word: stack) { assertEquals(strArray[i], word); i++; } // test ListIterator i = 0; MappedListIterator<Integer, Versioned<String>> it = stack.listIterator(); while(it.hasNext()) { assertEquals(strArray[i], it.next().getValue()); i++; } while(it.hasPrevious()) { i--; assertEquals(strArray[i], it.previous().getValue()); } // previousListIterator it = stack.previousListIterator(1); i = 3; while(it.hasPrevious()) { i--; assertEquals(strArray[i], it.previous().getValue()); } // nextId, previousId, lastId, getById it = stack.listIterator(); String s1 = it.next().getValue(); assertEquals(s1, stack.getById(it.previousId())); assertEquals(s1, stack.getById(stack.listIterator().nextId())); String s2 = it.next().getValue(); Integer id = it.lastId(); assertEquals(s2, stack.getById(id)); } public void testErrors() throws Exception { StoreClient<Map<String, Object>, Map<String, Object>> storeClient = storeFactory.getStoreClient("test"); VStack<String, String> stack = new VStack<String, String>("stack2", storeClient); stack.add("world"); stack.add("hello"); try { stack.getById(2); TestCase.fail("expected IndexOutOfBoundsException"); } catch(IndexOutOfBoundsException e) {} try { stack.add(null); TestCase.fail("expected NullPointerException"); } catch(NullPointerException npe) {} } public void testSetGetById() throws Exception { StoreClient<Map<String, Object>, Map<String, Object>> storeClient = storeFactory.getStoreClient("test"); VStack<String, String> stack = new VStack<String, String>("stack3", storeClient); // 3 2 1 stack.add("1"); stack.add("2"); stack.add("3"); assertEquals(3, stack.size()); VListIterator<String> it = stack.listIterator(0); assertNull(it.previousId()); String s = it.next().getValue(); assertEquals("3", s); // 4 2 1 it.setValue("4"); assertEquals("4", it.previous().getValue()); assertEquals("4", it.next().getValue()); assertEquals("2", it.next().getValue()); assertEquals("1", it.next().getValue()); Versioned<String> vs = it.previous(); assertEquals("1", vs.getValue()); // 4 1 5 it.set(new Versioned<String>("5", vs.getVersion())); assertEquals("5", it.next().getValue()); assertEquals(3, stack.size()); try { it.set(new Versioned<String>("6", vs.getVersion())); TestCase.fail("expected ObsoleteVersionException"); } catch(ObsoleteVersionException e) {} assertNull(it.nextId()); Integer id = it.previousId(); stack.setById(id, "7"); assertEquals("7", stack.getById(id)); } public void testEmptyStack() throws Exception { StoreClient<Map<String, Object>, Map<String, Object>> storeClient = storeFactory.getStoreClient("test"); VStack<String, String> stack = new VStack<String, String>("stack4", storeClient); assertEquals(0, stack.size()); Iterator<String> it = stack.iterator(); assertFalse(it.hasNext()); try { it.next(); TestCase.fail("expected NoSuchElementException"); } catch(NoSuchElementException e) {} } }