package org.jgroups.tests; import org.jgroups.Global; import org.jgroups.protocols.relay.RELAY2; import org.jgroups.protocols.relay.SiteMaster; import org.jgroups.protocols.relay.SiteUUID; import org.jgroups.util.ExtendedUUID; import org.jgroups.util.FlagsUUID; import org.jgroups.util.UUID; import org.jgroups.util.Util; import org.testng.annotations.Test; import java.util.Arrays; import java.util.HashMap; import java.util.Map; /** * Tests {@link ExtendedUUID} * @author Bela Ban * @since 3.5 */ @Test(groups=Global.FUNCTIONAL) public class ExtendedUUIDTest { public void testCreation() { ExtendedUUID uuid=ExtendedUUID.randomUUID("A").setFlag(RELAY2.site_master_flag); System.out.println("uuid = " + uuid); } public void testFlags() { ExtendedUUID uuid=ExtendedUUID.randomUUID("A").setFlag(RELAY2.site_master_flag).setFlag((short)2).setFlag((short)4); System.out.println("uuid = " + uuid); assert uuid.isFlagSet(RELAY2.site_master_flag); assert uuid.isFlagSet((short)2); assert uuid.isFlagSet((short)4); uuid.clearFlag((short)2); assert !uuid.isFlagSet((short)2); } public void testFlags2() throws Exception { FlagsUUID uuid=FlagsUUID.randomUUID("A").setFlag(RELAY2.site_master_flag).setFlag((short)2).setFlag((short)4); System.out.println("uuid = " + uuid); assert uuid.isFlagSet(RELAY2.site_master_flag); assert uuid.isFlagSet((short)2); assert uuid.isFlagSet((short)4); uuid.clearFlag((short)2); assert !uuid.isFlagSet((short)2); byte[] buf=Util.streamableToByteBuffer(uuid); FlagsUUID uuid2=Util.streamableFromByteBuffer(FlagsUUID.class, buf, 0, buf.length); assert uuid.equals(uuid2); } public void testPut() throws Exception { ExtendedUUID uuid=ExtendedUUID.randomUUID("A").put("name", Util.objectToByteBuffer("Bela")) .put("age",Util.objectToByteBuffer(49)).put("bool",Util.objectToByteBuffer(true)); assert uuid.keyExists("name"); assert uuid.keyExists("bool"); byte[] val=uuid.get("age"); assert Util.objectFromByteBuffer(val).equals(49); } public void testAddContents() throws Exception { ExtendedUUID a=ExtendedUUID.randomUUID("A").setFlag((short)1); a.put("name",Util.stringToBytes("Bela")).put("age",Util.objectToByteBuffer(49)).put("bool",Util.objectToByteBuffer(true)); ExtendedUUID b=ExtendedUUID.randomUUID("B").setFlag((short)2).setFlag((short)4); b.put("one",null).put("two",Util.stringToBytes("two")).put("name", Util.stringToBytes("Michelle")); a.addContents(b); for(short flag: Arrays.asList((short)1,(short)2, (short)4)) assert a.isFlagSet(flag); for(String key: Arrays.asList("name", "age", "bool", "one", "two")) assert a.keyExists(key); assert Util.bytesToString(a.get("two")).equals("two"); assert Util.bytesToString(a.get("name")).equals("Bela"); } public void testRemove() throws Exception { ExtendedUUID uuid=ExtendedUUID.randomUUID("A"); byte[] val=Util.objectToByteBuffer("tmp"); for(int i=1; i <= 10; i++) uuid.put(String.valueOf(i), val); byte[] tmp=uuid.remove(String.valueOf(5)); assert tmp != null && Arrays.equals(tmp, val); tmp=uuid.get(String.valueOf(5)); assert tmp == null; tmp=uuid.get(String.valueOf(7)); assert tmp != null && Arrays.equals(tmp, val); uuid.remove(String.valueOf(7)); assert uuid.keyExists(String.valueOf(8)); } public void testResize() throws Exception { ExtendedUUID uuid=ExtendedUUID.randomUUID("A"); byte[] val=Util.objectToByteBuffer("tmp"); for(int i=1000; i <= 1005; i++) { uuid.put(String.valueOf(i), val); assert uuid.keyExists(String.valueOf(i)); } } public void testResizeBeyond255() throws Exception { ExtendedUUID uuid=ExtendedUUID.randomUUID("A"); byte[] val=Util.objectToByteBuffer("tmp"); for(int i=1; i <= 0xff; i++) uuid.put(String.valueOf(i), val); try { uuid.put(String.valueOf(256), val); assert false : " should have thrown an exception"; } catch(ArrayIndexOutOfBoundsException ex) { System.out.println("got exception as expected: " + ex); } } public void testCopy() throws Exception { ExtendedUUID uuid=ExtendedUUID.randomUUID("A").setFlag((short)16).setFlag((short)32); uuid.put("name", Util.objectToByteBuffer("Bela")) .put("age",Util.objectToByteBuffer(49)) .put("bool",Util.objectToByteBuffer(true)); ExtendedUUID uuid2=new ExtendedUUID(uuid); assert uuid.getMostSignificantBits() == uuid2.getMostSignificantBits(); assert uuid.getLeastSignificantBits() == uuid2.getLeastSignificantBits(); assert uuid2.isFlagSet((short)16) && uuid2.isFlagSet((short)32); assert uuid2.length() == 3; for(String key: Arrays.asList("name", "age", "bool")) assert uuid2.keyExists(key); } public void testMarshalling() throws Exception { ExtendedUUID uuid=ExtendedUUID.randomUUID("A").setFlag((short)16).setFlag((short)32); uuid.put("name", Util.objectToByteBuffer("Bela")) .put("age",Util.objectToByteBuffer(49)) .put("bool",Util.objectToByteBuffer(true)); int size=uuid.serializedSize(); byte[] buffer=Util.streamableToByteBuffer(uuid); assert size == buffer.length : "expected size of " + size + ", but got " + buffer.length; ExtendedUUID uuid2=Util.streamableFromByteBuffer(ExtendedUUID.class, buffer); assert uuid2.isFlagSet((short)16); assert uuid2.isFlagSet((short)32); for(String key: Arrays.asList("name", "age", "bool")) assert uuid2.keyExists(key); } public void testMarshallingNullHashMap() throws Exception { ExtendedUUID uuid=ExtendedUUID.randomUUID("A"); int size=uuid.serializedSize(); byte[] buffer=Util.streamableToByteBuffer(uuid); assert size == buffer.length : "expected size of " + size + ", but got " + buffer.length; Util.streamableFromByteBuffer(ExtendedUUID.class, buffer); } public void testMarshallingLargeValues() throws Exception { ExtendedUUID uuid=ExtendedUUID.randomUUID("A"); for(int i=1; i <= 5; i++) uuid.put(String.valueOf(i), new byte[250]); System.out.println("uuid = " + uuid); int size=uuid.serializedSize(); byte[] buffer=Util.streamableToByteBuffer(uuid); assert size == buffer.length : "expected size of " + size + ", but got " + buffer.length; ExtendedUUID uuid2=Util.streamableFromByteBuffer(ExtendedUUID.class, buffer); System.out.println("uuid2 = " + uuid2); for(int i=1; i <= 5; i++) { byte[] val=uuid.get(String.valueOf(i)); assert val != null && val.length == 250; } } public void testmarshallingWithNullValues() throws Exception { ExtendedUUID uuid=ExtendedUUID.randomUUID("A"); byte[] value=Util.objectToByteBuffer("Bela"); for(int i=1; i <= 5; i++) uuid.put(String.valueOf(i), i % 2 == 0? value : null); int size=uuid.serializedSize(); byte[] buffer=Util.streamableToByteBuffer(uuid); assert size == buffer.length : "expected size of " + size + ", but got " + buffer.length; ExtendedUUID uuid2=Util.streamableFromByteBuffer(ExtendedUUID.class, buffer); for(int i=1; i <= 5; i++) { byte[] val=uuid.get(String.valueOf(i)); boolean null_val=i % 2 != 0; if(null_val) assert val == null; else assert val != null && val.length == value.length; } } public void testMarshallingWithRemoval() throws Exception { ExtendedUUID uuid=ExtendedUUID.randomUUID("A"); byte[] value=Util.objectToByteBuffer("Bela"); for(int i=1; i <= 10; i++) uuid.put(String.valueOf(i), value); assert uuid.length() == 10; for(int i=1; i <= 10; i++) if(i % 2 == 0) uuid.remove(String.valueOf(i)); assert uuid.length() == 5; int size=uuid.serializedSize(); byte[] buffer=Util.streamableToByteBuffer(uuid); assert size == buffer.length : "expected size of " + size + ", but got " + buffer.length; ExtendedUUID uuid2=Util.streamableFromByteBuffer(ExtendedUUID.class, buffer); assert uuid2.length() == 5; for(int i=1; i <= 10; i++) { boolean exists=i % 2 != 0; assert uuid2.keyExists(String.valueOf(i)) == exists; } } public void testSiteMaster() { SiteMaster sm1=new SiteMaster("sfo"), sm2=new SiteMaster("nyc"), sm3=new SiteMaster("sfo"); assert !sm1.equals(sm2); assert sm1.equals(sm3); assert sm1.compareTo(sm3) == 0; long hc1=sm1.hashCode(), hc2=sm2.hashCode(), hc3=sm3.hashCode(); assert hc1 == hc3; assert hc1 != hc2; Map<SiteMaster,Integer> map=new HashMap<>(3); map.put(sm1, 1); map.put(sm2, 2); map.put(sm3, 3); System.out.println("map = " + map); assert map.size() == 2; assert map.get(sm3) == 3; assert map.get(sm1) == 3; assert map.get(sm2) == 2; } public void testSiteUUID() throws Exception { UUID a=(UUID)Util.createRandomAddress("A"), b=(UUID)Util.createRandomAddress("B"); SiteUUID sa=new SiteUUID(a, "sm-a", "sfo"); SiteUUID sb=new SiteUUID(b, "b", "lon") .put(Util.stringToBytes("id"),Util.objectToByteBuffer(322649)).setFlag(RELAY2.can_become_site_master_flag); System.out.println("sb = " + sb); assert sa.getName().equals("sm-a"); assert sa.getSite().equals("sfo"); SiteUUID copy=(SiteUUID)sb.copy(); assert copy.equals(sb); assert copy.getName().equals(sb.getName()); assert copy.getSite().equals(sb.getSite()); } }