package org.jgroups.tests; import org.jgroups.Address; import org.jgroups.Global; import org.jgroups.stack.IpAddress; import org.jgroups.stack.IpAddressUUID; import org.jgroups.util.ByteArrayDataInputStream; import org.jgroups.util.ByteArrayDataOutputStream; import org.jgroups.util.StackType; import org.jgroups.util.Util; import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.*; @Test(groups=Global.FUNCTIONAL,singleThreaded=true) public class IpAddressTest { IpAddress a, b, c, d, e, f, g, h, i, j, k; @BeforeClass void setUp() throws Exception { StackType type=Util.getIpStackType(); if(type == StackType.IPv6) { a=new IpAddress("::1", 5555); b=new IpAddress("::1", 5555); d=new IpAddress("::1", 5556); e=new IpAddress("::1", 5555); f=new IpAddress("2001:0db8:0000:0000:0000:002e:0370:2334", 80); g=new IpAddress("2001:0db8:0000:0000:0000:002e:0370:2334", 8080); h=new IpAddress("ff0e::3:4:5", 5555); j=new IpAddressUUID("::1", 5555); k=new IpAddressUUID("::1", 5555); } else { a=new IpAddress("localhost", 5555); b=new IpAddress("localhost", 5555); d=new IpAddress("localhost", 5556); e=new IpAddress("127.0.0.1", 5555); f=new IpAddress("www.ibm.com", 80); g=new IpAddress("www.ibm.com", 8080); h=new IpAddress("224.0.0.1", 5555); j=new IpAddressUUID("localhost", 5555); k=new IpAddressUUID("localhost", 5555); } c=b; } public void testConstructor() throws Exception { IpAddress tmp=new IpAddress("192.168.1.5:7800"); assert tmp.getPort() == 7800; assert tmp.getIpAddress().equals(InetAddress.getByName("192.168.1.5")); tmp=new IpAddress("10.1.2.3"); assert tmp.getPort() == 0; assert tmp.getIpAddress().equals(InetAddress.getByName("10.1.2.3")); tmp=new IpAddress("fe80::21b:21ff:fe07:a3b0:6000"); assert tmp.getPort() == 6000; assert tmp.getIpAddress().equals(InetAddress.getByName("fe80::21b:21ff:fe07:a3b0")); tmp=new IpAddressUUID(7500); assert tmp.getPort() == 7500; } public void testUnknownAddress() { try { IpAddress tmp=new IpAddress("idontknow.com", 55); assert false : "should throw an UnknownHostException for " + tmp; } catch(UnknownHostException e1) { } } public void testCopy() { IpAddress tmp=a.copy(); assert tmp.equals(a); tmp=j.copy(); assert tmp.equals(j); } public void testEquality() throws Exception { Assert.assertEquals(a, b); Assert.assertEquals(c, b); Assert.assertEquals(a, e); Assert.assertEquals(c, e); assert !j.equals(k); assert !k.equals(j); assert a.equals(j); assert j.equals(a); IpAddress tmp=new IpAddressUUID("localhost", 5555); assert !tmp.equals(j); } public static void testEqualityWithDnsRoundRobin() throws UnknownHostException { IpAddress x1, x2, x3; StackType type=Util.getIpStackType(); String tmp=type == StackType.IPv6? "::1" : "127.0.0.1"; InetAddress addr=InetAddress.getByName(tmp); byte[] rawAddr=addr.getAddress(); InetAddress inet1=InetAddress.getByAddress("MyHost1", rawAddr); InetAddress inet2=InetAddress.getByAddress("MyHost2", rawAddr); InetAddress inet3=InetAddress.getByAddress("MyHost3", rawAddr); Assert.assertEquals(inet1, inet2); x1=new IpAddress(inet1, 5555); x2=new IpAddress(inet2, 5555); x3=new IpAddress(inet3, 5555); Assert.assertEquals(x1, x2); Assert.assertEquals(x3, x1); Set<Address> s=new HashSet<>(); Collections.addAll(s, x1, x2, x3); System.out.println("s=" + s); Assert.assertEquals(1, s.size()); Map<Address,String> m=new HashMap<>(); m.put(x1, "Bela"); m.put(x2, "Michelle"); m.put(x3, "Nicole"); Assert.assertEquals(1, m.size()); Assert.assertEquals("Nicole", m.get(x1)); } public void testInequality() throws Exception { IpAddress tmp=null; assert !a.equals(d); assert !c.equals(d); assert !a.equals(f); assert !e.equals(f); assert !f.equals(g); assert !(a.equals(tmp)); tmp=new IpAddressUUID("localhost", 5555); assert a.equals(tmp); assert tmp.equals(a); } public void testSameHost() throws Exception { assert Util.sameHost(a, b); assert Util.sameHost(a, c); assert Util.sameHost(a, d); assert Util.sameHost(a, e); assert Util.sameHost(f, g); } public void testNotSameHost() throws Exception { assert !Util.sameHost(a, f); assert !Util.sameHost(e, f); assert !Util.sameHost(e, null); assert !Util.sameHost(null, null); } public void testCompareTo() throws UnknownHostException { Assert.assertEquals(0, a.compareTo(b)); assert a.compareTo(d) < 0; assert d.compareTo(a) > 0; assert j.compareTo(k) != 0; IpAddressUUID tmp=new IpAddressUUID("localhost", 5556); assert tmp.compareTo(j) != 0; tmp=new IpAddressUUID("localhost", 5555); assert tmp.compareTo(j) != 0; assert tmp.compareTo(a) == 0; assert a.compareTo(tmp) == 0; } public void testCompareTime() { final int NUM=1000000; _testCompareTime(a, a, NUM); _testCompareTime(a, b, NUM); _testCompareTime(a, c, NUM); _testCompareTime(a, d, NUM); } private static void _testCompareTime(IpAddress one, IpAddress two, int num) { int rc=-99; long start=System.currentTimeMillis(), stop; for(int x=0; x < num; x++) { rc=one.compareTo(two); } stop=System.currentTimeMillis(); long diff=stop-start; System.out.printf("calling compareTo(%s, %s) %d times took %d ms, result=%d\n", one, two, num, diff, rc); } public void testHashcode() { int hcode_a=a.hashCode(); int hcode_b=b.hashCode(); Assert.assertEquals(hcode_a, hcode_b); int hc_j=j.hashCode(), hc_k=k.hashCode(); assert hc_j == hc_k; assert a.hashCode() == j.hashCode(); Map<Address,Integer> map=new HashMap<>(); map.put(j, 1); map.put(k, 2); System.out.println("map = " + map); assert map.size() == 2; map.put(a, 22); assert map.size() == 2; Integer val=map.get(a); assert val != null && val == 22; val=map.get(j); assert val != null && val == 22; map.put(j, 50); assert map.size() == 2; val=map.get(a); assert val != null && val == 50; } public void testHashcodeTime() { int hash=-1; final int NUM=10000000; long start=System.currentTimeMillis(), stop; for(int x=0; x < NUM; x++) { hash=a.hashCode(); } stop=System.currentTimeMillis(); long diff=stop-start; System.out.println("taking the hash code of " + a + "(" + hash + ") took " + diff + "ms"); } public static void testIPv6WithStreamable() throws Exception { IpAddress ip=new IpAddress("fe80:0:0:0:21b:21ff:fe07:a3b0", 5555); ByteArrayOutputStream bos=new ByteArrayOutputStream(); DataOutputStream dos=new DataOutputStream(bos); byte[] buf=null; ByteArrayInputStream bis=null; DataInputStream dis; System.out.println("-- address is " + ip); ip.writeTo(dos); buf=bos.toByteArray(); bis=new ByteArrayInputStream(buf); dis=new DataInputStream(bis); IpAddress ip2=new IpAddress(); ip2.readFrom(dis); Assert.assertEquals(ip, ip2); } public void testStreamable() throws Exception { ByteArrayOutputStream bos=new ByteArrayOutputStream(); DataOutputStream oos=new DataOutputStream(bos); byte[] buf=null; ByteArrayInputStream bis=null; DataInputStream ois; IpAddress a2, b2, x, x2, y, y2; x=createStackConformantAddress(5555); y=createStackConformantAddress(1111); a.writeTo(oos); b.writeTo(oos); x.writeTo(oos); y.writeTo(oos); buf=bos.toByteArray(); bis=new ByteArrayInputStream(buf); ois=new DataInputStream(bis); a2=new IpAddress(); a2.readFrom(ois); b2=new IpAddress(); b2.readFrom(ois); x2=new IpAddress(); x2.readFrom(ois); y2=new IpAddress(); y2.readFrom(ois); Assert.assertEquals(a, a2); Assert.assertEquals(b, b2); assert y2.getIpAddress() != null; Assert.assertEquals(1111, y2.getPort()); ByteArrayDataOutputStream out=new ByteArrayDataOutputStream(); j.writeTo(out); k.writeTo(out); ByteArrayDataInputStream in=new ByteArrayDataInputStream(out.buffer(), 0, out.position()); IpAddressUUID tmp=new IpAddressUUID(); tmp.readFrom(in); assert tmp.equals(j); tmp=new IpAddressUUID(); tmp.readFrom(in); assert tmp.equals(k); } public static void testStreamableWithHighPort() throws Exception { ByteArrayOutputStream bos=new ByteArrayOutputStream(); DataOutputStream oos=new DataOutputStream(bos); byte[] buf=null; ByteArrayInputStream bis=null; DataInputStream dis; IpAddress x, x2; x=createStackConformantAddress(65535); x.writeTo(oos); buf=bos.toByteArray(); bis=new ByteArrayInputStream(buf); dis=new DataInputStream(bis); x2=new IpAddress(); x2.readFrom(dis); System.out.println("x: " + x + ", x2: " + x2); assert x2.getPort() > 0; Assert.assertEquals(x.getPort(), x2.getPort()); } public void testStreamableAdditionalData() throws Exception { ByteArrayOutputStream bos=new ByteArrayOutputStream(); DataOutputStream oos=new DataOutputStream(bos); byte[] buf=null; ByteArrayInputStream bis=null; DataInputStream ois; IpAddress a2, b2, c2, d2, e2, f2, g2, h2; a.writeTo(oos); b.writeTo(oos); c.writeTo(oos); d.writeTo(oos); e.writeTo(oos); f.writeTo(oos); g.writeTo(oos); h.writeTo(oos); buf=bos.toByteArray(); bis=new ByteArrayInputStream(buf); ois=new DataInputStream(bis); a2=new IpAddress(); a2.readFrom(ois); b2=new IpAddress(); b2.readFrom(ois); c2=new IpAddress(); c2.readFrom(ois); d2=new IpAddress(); d2.readFrom(ois); e2=new IpAddress(); e2.readFrom(ois); f2=new IpAddress(); f2.readFrom(ois); g2=new IpAddress(); g2.readFrom(ois); h2=new IpAddress(); h2.readFrom(ois); Assert.assertEquals(b2, c2); Assert.assertEquals(a, a2); Assert.assertEquals(b, b2); Assert.assertEquals(c, c2); Assert.assertEquals(d, d2); Assert.assertEquals(e, e2); Assert.assertEquals(f, f2); Assert.assertEquals(g, g2); Assert.assertEquals(h, h2); } private static IpAddress createStackConformantAddress(int port) throws UnknownHostException { StackType type=Util.getIpStackType(); if(type == StackType.IPv6) return new IpAddress("::1", port); else return new IpAddress("127.0.0.1", port); } }