package org.dcache.tests.util; import org.junit.Test; import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import java.net.UnknownHostException; import org.dcache.util.PortRange; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class PortRangeTest { private final int PORT = 23456; private final InetAddress HOST; public PortRangeTest() throws UnknownHostException { HOST = InetAddress.getLocalHost(); } public void assertPortRange(PortRange range, int lower, int upper) { assertEquals(range.getLower(), lower); assertEquals(range.getUpper(), upper); } public void bind(PortRange range, InetSocketAddress endpoint, int lower, int upper) throws IOException { Socket socket = new Socket(); range.bind(socket, endpoint); assertTrue("Port out of range", lower <= socket.getLocalPort() && socket.getLocalPort() <= upper); assertEquals("Bound to wrong address", socket.getLocalAddress(), endpoint.getAddress()); socket.close(); } public void bind(PortRange range, InetAddress address, int lower, int upper) throws IOException { Socket socket = new Socket(); range.bind(socket, address); assertTrue("Port out of range", lower <= socket.getLocalPort() && socket.getLocalPort() <= upper); assertEquals("Bound to wrong address", socket.getLocalAddress(), address); socket.close(); } public void bind(PortRange range, int lower, int upper) throws IOException { Socket socket = new Socket(); range.bind(socket); assertTrue("Port out of range", lower <= socket.getLocalPort() && socket.getLocalPort() <= upper); assertTrue("Bound to wrong address", socket.getLocalAddress().isAnyLocalAddress()); socket.close(); } @Test(expected=IllegalArgumentException.class) public void invalidRange1() { new PortRange(-1, 10); } @Test(expected=IllegalArgumentException.class) public void invalidRange2() { new PortRange(10, 2); } @Test(expected=IllegalArgumentException.class) public void invalidRange3() { new PortRange(2, 100000); } @Test(expected=IllegalArgumentException.class) public void invalidFormat1() { PortRange.valueOf(" "); } @Test(expected=IllegalArgumentException.class) public void invalidFormat2() { PortRange.valueOf("wewe"); } @Test(expected=IllegalArgumentException.class) public void invalidFormat4() { PortRange.valueOf("1..10"); } @Test(expected=IllegalArgumentException.class) public void invalidFormat5() { PortRange.valueOf(""); } @Test(expected=NullPointerException.class) public void invalidFormat6() { PortRange.valueOf(null); } @Test public void excludeZero() { assertPortRange(new PortRange(0,0), 0, 0); assertPortRange(new PortRange(0,1), 1, 1); assertPortRange(new PortRange(1,1), 1, 1); assertPortRange(new PortRange(1,2), 1, 2); } @Test public void valueOf() { assertPortRange(PortRange.valueOf("2323"), 2323, 2323); assertPortRange(PortRange.valueOf("0"), 0, 0); assertPortRange(PortRange.valueOf("0:0"), 0, 0); assertPortRange(PortRange.valueOf("0:1"), 1, 1); assertPortRange(PortRange.valueOf("1:1000"), 1, 1000); assertPortRange(PortRange.valueOf("1,1000"), 1, 1000); } @Test public void bind1() throws IOException { bind(new PortRange(0,0), 1, 65536); bind(new PortRange(0,0), HOST, 1, 65536); bind(new PortRange(0,0), new InetSocketAddress(HOST, 0), 1, 65536); bind(new PortRange(0,0), new InetSocketAddress(HOST, PORT), PORT, PORT); bind(new PortRange(PORT,PORT), PORT, PORT); bind(new PortRange(PORT,PORT), HOST, PORT, PORT); bind(new PortRange(PORT,PORT), new InetSocketAddress(HOST, 0), PORT, PORT); bind(new PortRange(PORT+1,PORT+2), new InetSocketAddress(HOST, PORT), PORT, PORT); } }