package student.web.internal.tests; import static org.junit.Assert.*; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.junit.After; import org.junit.Before; import org.junit.Test; import student.web.ApplicationPersistentMap; import student.web.SharedPersistentMap; import student.web.internal.tests.support.CircularClass; public class ApplicationPersistenceMapTest { private static final String TEST_ELEMENT = "TestElement"; Stub stub = new Stub(); private static class Stub { public Object toPersist = "Foo"; public boolean equals(Object o) { if(o instanceof Stub) { if(((Stub)o).toPersist.equals(toPersist)) return true; } return false; } public int hashCode() { return toPersist.hashCode(); } } ApplicationPersistentMap<Stub> localAppStore; @Before public void setupLocalAppStore() throws InterruptedException { localAppStore = new ApplicationPersistentMap<Stub>("LocalUnitTestApp",Stub.class); } @After public void clearLocalAppStore() { localAppStore.clear(); assertTrue(localAppStore.isEmpty()); assertEquals(localAppStore.size(),0); assertEquals(localAppStore.keySet().size(),0); assertEquals(localAppStore.values().size(),0); assertEquals(localAppStore.entrySet().size(),0); } @Test public void testApplicationPersistenceMap() { assertNotNull(localAppStore); } @Test public void testSize() { localAppStore.put(TEST_ELEMENT, stub); assertEquals(localAppStore.size(),1); assertTrue(localAppStore.keySet().contains(TEST_ELEMENT)); assertEquals(localAppStore.entrySet().size(),1); } @Test public void testIsEmpty() { localAppStore.put(TEST_ELEMENT, stub); assertFalse(localAppStore.isEmpty()); } @Test public void testContainsKey() { assertFalse(localAppStore.containsKey(TEST_ELEMENT)); localAppStore.put(TEST_ELEMENT, stub); assertTrue(localAppStore.containsKey(TEST_ELEMENT)); } @Test public void testContainsValue() { localAppStore.put(TEST_ELEMENT, stub); assertTrue(localAppStore.containsValue(stub)); } @Test public void testGet() { localAppStore.put(TEST_ELEMENT, stub); Stub localStub = localAppStore.get(TEST_ELEMENT); assertEquals(stub,localStub); } @Test public void testPut() { localAppStore.put(TEST_ELEMENT, stub); assertTrue(localAppStore.containsKey(TEST_ELEMENT)); assertTrue(localAppStore.containsValue(stub)); } @Test public void testRemove() { localAppStore.put(TEST_ELEMENT, stub); localAppStore.remove(TEST_ELEMENT); assertFalse(localAppStore.containsKey(TEST_ELEMENT)); assertFalse(localAppStore.containsValue(stub)); assertEquals(localAppStore.size(),0); } @Test public void testPutAll() { Map<String,Stub> toInsert = new HashMap<String, Stub>(); toInsert.put("test1",stub); toInsert.put("test2", stub); toInsert.put("test3", stub); localAppStore.putAll(toInsert); assertEquals(localAppStore.size(),3); } @Test public void testClear() { localAppStore.put("test1", stub); localAppStore.put("test2", stub); assertEquals(localAppStore.size(),2); localAppStore.clear(); assertEquals(localAppStore.size(),0); } @Test public void testKeySet() { localAppStore.put("test1", stub); localAppStore.put("test2", stub); localAppStore.put("test2", stub); assertEquals(localAppStore.keySet().size(),2); assertTrue(localAppStore.containsKey("test1")); assertTrue(localAppStore.containsKey("test2")); } @Test public void testValues() { localAppStore.put("test1", stub); localAppStore.put("test2", stub); localAppStore.put("test2", stub); assertEquals(localAppStore.keySet().size(),2); assertTrue(localAppStore.containsValue(stub)); assertTrue(localAppStore.values().contains(stub)); assertEquals(localAppStore.values().size(),1); } @Test public void testEntrySet() { localAppStore.put("test1", stub); localAppStore.put("test2", stub); for(Entry<String,Stub> entry : localAppStore.entrySet()) { assertTrue(entry.getKey().startsWith("test")); assertEquals(entry.getValue(),stub); } assertEquals(localAppStore.entrySet().size(),2); } private static class Stub2 { public Object toPersist = "Bar"; public boolean equals(Object o) { if(o instanceof Stub) { if(((Stub)o).toPersist.equals(toPersist)) return true; } return false; } public int hashCode() { return toPersist.hashCode(); } } private Stub2 stub2 = new Stub2(); @Test public void testMultipleMaps() { ApplicationPersistentMap<Stub2> stub2Map = new ApplicationPersistentMap<Stub2>("LocalUnitTestApp",Stub2.class); stub2Map.put("test1", stub2); localAppStore.put("test2", stub); assertEquals(localAppStore.size(),2); assertEquals(stub2Map.size(),2); assertEquals(localAppStore.get("test1"),null); assertEquals(stub2Map.get("test2"),null); } @Test public void testMultipleSnapshotKeySet() { ApplicationPersistentMap<Stub2> stub2Map = new ApplicationPersistentMap<Stub2>("LocalUnitTestApp",Stub2.class); stub2Map.put("test1", stub2); localAppStore.put("test2", stub); Set<String> keyset1 = localAppStore.keySet(); Set<String> keyset2 = stub2Map.keySet(); localAppStore.clear(); stub2Map.clear(); assertEquals(keyset1.size(),2); assertEquals(keyset2.size(),2); assertEquals(localAppStore.size(),0); assertEquals(stub2Map.size(),0); assertEquals(localAppStore.keySet().size(),0); assertEquals(stub2Map.keySet().size(),0); } public void restoreTestData( String fileName, String oldFileName ) throws IOException { // FileUtils.copyFileToDirectory(new File("data/test/"+fileName), new // File("data/shared")); // FileUtils.copyFile(new File("data/test/" + oldFileName), new File( // "data/shared/" + fileName)); try { File f1 = new File( "data/test/" + oldFileName ); File f2 = new File( "data/app/testApp/" + fileName ); InputStream in = new FileInputStream( f1 ); // For Append the file. // OutputStream out = new FileOutputStream(f2,true); // For Overwrite the file. OutputStream out = new FileOutputStream( f2 ); byte[] buf = new byte[1024]; int len; while ( ( len = in.read( buf ) ) > 0 ) { out.write( buf, 0, len ); } in.close(); out.close(); } catch ( FileNotFoundException ex ) { System.out.println( ex.getMessage() + " in the specified directory." ); System.exit( 0 ); } catch ( IOException e ) { System.out.println( e.getMessage() ); } } @Test public void circularReferencePut() { ApplicationPersistentMap<CircularClass> pMap = new ApplicationPersistentMap<CircularClass>( "testApp",CircularClass.class ); CircularClass class1 = new CircularClass(); CircularClass class2 = new CircularClass(); pMap.put( "class1", class1 ); pMap.put( "class2", class2 ); class1.ref = class2; class2.ref = class1; pMap.put( "class1", class1 ); pMap.put( "class2", class2 ); assertEquals( class1.ref, class2 ); assertEquals( class2.ref, class1 ); pMap.clear(); } @Test public void circularReferenceGet() { try { restoreTestData( "class1-00.dataxml","class1-00-app.dataxml" ); restoreTestData( "class2-00.dataxml", "class2-00-app.dataxml" ); } catch ( IOException e ) { e.printStackTrace(); assertTrue( false ); } ApplicationPersistentMap<CircularClass> pMap = new ApplicationPersistentMap<CircularClass>( "testApp",CircularClass.class ); CircularClass class1 = pMap.get( "class1" ); CircularClass class2 = pMap.get( "class2" ); assertEquals(class2,class1.ref); assertEquals(class1,class2.ref); pMap.clear(); } }