//
// ========================================================================
// Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.util;
import static org.junit.Assert.*;
import java.net.InetAddress;
import java.util.Iterator;
import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Test;
public class InetAddressSetTest
{
@Test
public void testInetAddress() throws Exception
{
assertTrue(InetAddress.getByName("127.0.0.1").isLoopbackAddress());
assertTrue(InetAddress.getByName("::1").isLoopbackAddress());
assertTrue(InetAddress.getByName("::0.0.0.1").isLoopbackAddress());
assertTrue(InetAddress.getByName("[::1]").isLoopbackAddress());
assertTrue(InetAddress.getByName("[::0.0.0.1]").isLoopbackAddress());
assertTrue(InetAddress.getByName("[::ffff:127.0.0.1]").isLoopbackAddress());
}
@Test
public void testSingleton() throws Exception
{
InetAddressSet set = new InetAddressSet();
set.add("webtide.com");
set.add("1.2.3.4");
set.add("::abcd");
assertTrue(set.test(InetAddress.getByName("webtide.com")));
assertTrue(set.test(InetAddress.getByName(InetAddress.getByName("webtide.com").getHostAddress())));
assertTrue(set.test(InetAddress.getByName("1.2.3.4")));
assertTrue(set.test(InetAddress.getByAddress(new byte[]{(byte)1,(byte)2,(byte)3,(byte)4})));
assertTrue(set.test(InetAddress.getByAddress("hostname",new byte[]{(byte)1,(byte)2,(byte)3,(byte)4})));
assertTrue(set.test(InetAddress.getByName("::0:0:abcd")));
assertTrue(set.test(InetAddress.getByName("::abcd")));
assertTrue(set.test(InetAddress.getByName("[::abcd]")));
assertTrue(set.test(InetAddress.getByName("::ffff:1.2.3.4")));
assertFalse(set.test(InetAddress.getByName("www.google.com")));
assertFalse(set.test(InetAddress.getByName("1.2.3.5")));
assertFalse(set.test(InetAddress.getByAddress(new byte[]{(byte)1,(byte)2,(byte)3,(byte)5})));
assertFalse(set.test(InetAddress.getByAddress("webtide.com",new byte[]{(byte)1,(byte)2,(byte)3,(byte)5})));
assertFalse(set.test(InetAddress.getByName("::1.2.3.4")));
assertFalse(set.test(InetAddress.getByName("::1234")));
assertFalse(set.test(InetAddress.getByName("::abce")));
assertFalse(set.test(InetAddress.getByName("1::abcd")));
}
@Test
public void testBadSingleton() throws Exception
{
String[] tests = new String[]
{
"unknown",
"1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16",
"a.b.c.d",
"[::1",
"[xxx]",
"[:::1]",
};
InetAddressSet set = new InetAddressSet();
for (String t:tests)
{
try
{
set.add(t);
fail(t);
}
catch(IllegalArgumentException e)
{
Assert.assertThat(e.getMessage(),Matchers.containsString(t));
}
}
}
@Test
public void testCIDR() throws Exception
{
InetAddressSet set = new InetAddressSet();
set.add("10.10.0.0/16");
set.add("192.0.80.0/22");
set.add("168.0.0.80/30");
set.add("abcd:ef00::/24");
assertTrue(set.test(InetAddress.getByName("10.10.0.0")));
assertTrue(set.test(InetAddress.getByName("10.10.0.1")));
assertTrue(set.test(InetAddress.getByName("10.10.255.255")));
assertTrue(set.test(InetAddress.getByName("::ffff:10.10.0.1")));
assertTrue(set.test(InetAddress.getByName("192.0.80.0")));
assertTrue(set.test(InetAddress.getByName("192.0.83.1")));
assertTrue(set.test(InetAddress.getByName("168.0.0.80")));
assertTrue(set.test(InetAddress.getByName("168.0.0.83")));
assertTrue(set.test(InetAddress.getByName("abcd:ef00::1")));
assertTrue(set.test(InetAddress.getByName("abcd:efff::ffff")));
assertFalse(set.test(InetAddress.getByName("10.11.0.0")));
assertFalse(set.test(InetAddress.getByName("1.2.3.5")));
assertFalse(set.test(InetAddress.getByName("192.0.84.1")));
assertFalse(set.test(InetAddress.getByName("168.0.0.84")));
assertFalse(set.test(InetAddress.getByName("::10.10.0.1")));
assertFalse(set.test(InetAddress.getByName("abcd:eeff::1")));
assertFalse(set.test(InetAddress.getByName("abcd:f000::")));
set.add("255.255.255.255/32");
assertTrue(set.test(InetAddress.getByName("255.255.255.255")));
assertFalse(set.test(InetAddress.getByName("10.11.0.0")));
set.add("0.0.0.0/0");
assertTrue(set.test(InetAddress.getByName("10.11.0.0")));
}
@Test
public void testBadCIDR() throws Exception
{
String[] tests = new String[]
{
"unknown/8",
"1.2.3.4/-1",
"1.2.3.4/xxx",
"1.2.3.4/33",
"255.255.8.0/16",
"255.255.8.1/17",
"[::1]/129",
};
InetAddressSet set = new InetAddressSet();
for (String t:tests)
{
try
{
set.add(t);
fail(t);
}
catch(IllegalArgumentException e)
{
Assert.assertThat(e.getMessage(),Matchers.containsString(t));
}
}
}
@Test
public void testMinMax() throws Exception
{
InetAddressSet set = new InetAddressSet();
set.add("10.0.0.4-10.0.0.6");
set.add("10.1.0.254-10.1.1.1");
set.add("[abcd:ef::fffe]-[abcd:ef::1:1]");
assertFalse(set.test(InetAddress.getByName("10.0.0.3")));
assertTrue(set.test(InetAddress.getByName("10.0.0.4")));
assertTrue(set.test(InetAddress.getByName("10.0.0.5")));
assertTrue(set.test(InetAddress.getByName("10.0.0.6")));
assertFalse(set.test(InetAddress.getByName("10.0.0.7")));
assertFalse(set.test(InetAddress.getByName("10.1.0.253")));
assertTrue(set.test(InetAddress.getByName("10.1.0.254")));
assertTrue(set.test(InetAddress.getByName("10.1.0.255")));
assertTrue(set.test(InetAddress.getByName("10.1.1.0")));
assertTrue(set.test(InetAddress.getByName("10.1.1.1")));
assertFalse(set.test(InetAddress.getByName("10.1.1.2")));
assertFalse(set.test(InetAddress.getByName("ABCD:EF::FFFD")));
assertTrue(set.test(InetAddress.getByName("ABCD:EF::FFFE")));
assertTrue(set.test(InetAddress.getByName("ABCD:EF::FFFF")));
assertTrue(set.test(InetAddress.getByName("ABCD:EF::1:0")));
assertTrue(set.test(InetAddress.getByName("ABCD:EF::1:1")));
assertFalse(set.test(InetAddress.getByName("ABCD:EF::1:2")));
}
@Test
public void testBadMinMax() throws Exception
{
String[] tests = new String[]
{
"10.0.0.0-9.0.0.0",
"9.0.0.0-[::10.0.0.0]",
};
InetAddressSet set = new InetAddressSet();
for (String t:tests)
{
try
{
set.add(t);
fail(t);
}
catch(IllegalArgumentException e)
{
Assert.assertThat(e.getMessage(),Matchers.containsString(t));
}
}
}
@Test
public void testLegacy() throws Exception
{
InetAddressSet set = new InetAddressSet();
set.add("10.-.245-.-2");
set.add("11.11.11.127-129");
assertFalse(set.test(InetAddress.getByName("9.0.245.0")));
assertTrue(set.test(InetAddress.getByName("10.0.245.0")));
assertTrue(set.test(InetAddress.getByName("10.0.245.1")));
assertTrue(set.test(InetAddress.getByName("10.0.245.2")));
assertFalse(set.test(InetAddress.getByName("10.0.245.3")));
assertTrue(set.test(InetAddress.getByName("10.255.255.0")));
assertTrue(set.test(InetAddress.getByName("10.255.255.1")));
assertTrue(set.test(InetAddress.getByName("10.255.255.2")));
assertFalse(set.test(InetAddress.getByName("10.255.255.3")));
assertFalse(set.test(InetAddress.getByName("10.0.244.0")));
assertFalse(set.test(InetAddress.getByName("10.0.244.1")));
assertFalse(set.test(InetAddress.getByName("10.0.244.2")));
assertFalse(set.test(InetAddress.getByName("10.0.244.3")));
}
@Test
public void testBadLegacy() throws Exception
{
String[] tests = new String[]
{
"9.0-10.0",
"10.0.0--1.1",
"10.0.0-256.1",
};
InetAddressSet set = new InetAddressSet();
for (String t:tests)
{
try
{
set.add(t);
fail(t);
}
catch(IllegalArgumentException e)
{
Assert.assertThat(e.getMessage(),Matchers.containsString(t));
}
}
}
@Test
public void testRemove() throws Exception
{
InetAddressSet set = new InetAddressSet();
set.add("webtide.com");
set.add("1.2.3.4");
set.add("::abcd");
set.add("10.0.0.4-10.0.0.6");
assertTrue(set.test(InetAddress.getByName("webtide.com")));
assertTrue(set.test(InetAddress.getByName(InetAddress.getByName("webtide.com").getHostAddress())));
assertTrue(set.test(InetAddress.getByName("1.2.3.4")));
assertTrue(set.test(InetAddress.getByAddress(new byte[]{(byte)1,(byte)2,(byte)3,(byte)4})));
assertTrue(set.test(InetAddress.getByAddress("hostname",new byte[]{(byte)1,(byte)2,(byte)3,(byte)4})));
assertTrue(set.test(InetAddress.getByName("::0:0:abcd")));
assertTrue(set.test(InetAddress.getByName("::abcd")));
assertTrue(set.test(InetAddress.getByName("[::abcd]")));
assertTrue(set.test(InetAddress.getByName("::ffff:1.2.3.4")));
assertTrue(set.test(InetAddress.getByName("10.0.0.4")));
assertTrue(set.test(InetAddress.getByName("10.0.0.5")));
assertTrue(set.test(InetAddress.getByName("10.0.0.6")));
set.remove("1.2.3.4");
assertTrue(set.test(InetAddress.getByName("webtide.com")));
assertTrue(set.test(InetAddress.getByName(InetAddress.getByName("webtide.com").getHostAddress())));
assertFalse(set.test(InetAddress.getByName("1.2.3.4")));
assertFalse(set.test(InetAddress.getByAddress(new byte[]{(byte)1,(byte)2,(byte)3,(byte)4})));
assertFalse(set.test(InetAddress.getByAddress("hostname",new byte[]{(byte)1,(byte)2,(byte)3,(byte)4})));
assertTrue(set.test(InetAddress.getByName("::0:0:abcd")));
assertTrue(set.test(InetAddress.getByName("::abcd")));
assertTrue(set.test(InetAddress.getByName("[::abcd]")));
assertFalse(set.test(InetAddress.getByName("::ffff:1.2.3.4")));
assertTrue(set.test(InetAddress.getByName("10.0.0.4")));
assertTrue(set.test(InetAddress.getByName("10.0.0.5")));
assertTrue(set.test(InetAddress.getByName("10.0.0.6")));
for (Iterator<String> i=set.iterator();i.hasNext();)
{
if ("::abcd".equals(i.next()))
i.remove();
}
assertTrue(set.test(InetAddress.getByName("webtide.com")));
assertTrue(set.test(InetAddress.getByName(InetAddress.getByName("webtide.com").getHostAddress())));
assertFalse(set.test(InetAddress.getByName("1.2.3.4")));
assertFalse(set.test(InetAddress.getByAddress(new byte[]{(byte)1,(byte)2,(byte)3,(byte)4})));
assertFalse(set.test(InetAddress.getByAddress("hostname",new byte[]{(byte)1,(byte)2,(byte)3,(byte)4})));
assertFalse(set.test(InetAddress.getByName("::0:0:abcd")));
assertFalse(set.test(InetAddress.getByName("::abcd")));
assertFalse(set.test(InetAddress.getByName("[::abcd]")));
assertFalse(set.test(InetAddress.getByName("::ffff:1.2.3.4")));
assertTrue(set.test(InetAddress.getByName("10.0.0.4")));
assertTrue(set.test(InetAddress.getByName("10.0.0.5")));
assertTrue(set.test(InetAddress.getByName("10.0.0.6")));
}
}