2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715;
10 import static org.hamcrest.CoreMatchers.instanceOf;
11 import static org.hamcrest.MatcherAssert.assertThat;
12 import static org.junit.Assert.assertArrayEquals;
13 import static org.junit.Assert.assertEquals;
14 import static org.junit.Assert.assertNotEquals;
15 import static org.junit.Assert.assertSame;
16 import static org.junit.Assert.assertThrows;
17 import static org.mockito.Mockito.doAnswer;
18 import static org.mockito.Mockito.doReturn;
19 import static org.mockito.Mockito.mock;
21 import com.google.common.net.InetAddresses;
22 import java.net.Inet4Address;
23 import java.net.Inet6Address;
24 import java.net.InetAddress;
25 import java.net.UnknownHostException;
27 import org.junit.Test;
29 public class IetfInetUtilTest {
31 public void testIpv4Address() {
32 final Ipv4AddressNoZone ipv4Address = new Ipv4AddressNoZone("192.168.1.1");
33 final Ipv4Prefix ipv4Prefix = new Ipv4Prefix("192.0.2.1/24");
34 final IpAddress ipAddress = new IpAddress(ipv4Address);
35 final IpPrefix ipPrefix = new IpPrefix(ipv4Prefix);
37 assertEquals(ipv4Prefix, ipPrefix.getIpv4Prefix());
38 assertEquals(ipAddress, new IpAddress(ipv4Address));
42 public void testIpv6Address() {
43 final Ipv6AddressNoZone ipv6Address = new Ipv6AddressNoZone("ABCD:EF01:2345:6789:ABCD:EF01:2345:6789");
44 final Ipv6Prefix ipv6Prefix = new Ipv6Prefix("ff00::/8");
45 final IpAddress ipAddress = new IpAddress(ipv6Address);
46 final IpPrefix ipPrefix = new IpPrefix(ipv6Prefix);
48 assertEquals(ipv6Prefix, ipPrefix.getIpv6Prefix());
49 assertEquals(ipAddress, new IpAddress(ipv6Address));
53 public void testAddressToString() {
54 assertEquals(new Ipv4Prefix("1.2.3.4/8"), IetfInetUtil.ipv4PrefixFor(new Ipv4Address("1.2.3.4%1"), 8));
55 assertEquals(new Ipv6Prefix("ff00::/8"), IetfInetUtil.ipv6PrefixFor(new Ipv6Address("ff00::%bar"), 8));
59 public void testIpv4ZoneStripping() {
60 final Ipv4AddressNoZone noZone = new Ipv4AddressNoZone("1.2.3.4");
61 assertSame(noZone, IetfInetUtil.ipv4AddressNoZoneFor(noZone));
63 final Ipv4Address withoutZone = new Ipv4Address(noZone);
64 final Ipv4AddressNoZone stripped = IetfInetUtil.ipv4AddressNoZoneFor(withoutZone);
65 assertSame(withoutZone.getValue(), stripped.getValue());
67 assertEquals(noZone, IetfInetUtil.ipv4AddressNoZoneFor(new Ipv4Address("1.2.3.4%1")));
71 public void testIpv6ZoneStripping() {
72 final Ipv6AddressNoZone noZone = new Ipv6AddressNoZone("ff00::");
73 assertSame(noZone, IetfInetUtil.ipv6AddressNoZoneFor(noZone));
75 final Ipv6Address withoutZone = new Ipv6Address(noZone);
76 final Ipv6AddressNoZone stripped = IetfInetUtil.ipv6AddressNoZoneFor(withoutZone);
77 assertSame(withoutZone.getValue(), stripped.getValue());
79 assertEquals(noZone, IetfInetUtil.ipv6AddressNoZoneFor(new Ipv6Address("ff00::%1")));
83 public void testIpToBytesAndBack() {
84 assertV4Equals("1.2.3.4");
85 assertV4Equals("12.23.34.45");
86 assertV4Equals("255.254.253.252");
87 assertV4Equals("128.16.0.127");
89 assertV4Equals("1.2.3.4", "%5");
90 assertV4Equals("12.23.34.45", "%5");
91 assertV4Equals("255.254.253.252", "%5");
92 assertV4Equals("128.16.0.127", "%5");
94 assertEquals(new IpAddress(new Ipv4Address("1.2.3.4")),
95 IetfInetUtil.ipAddressFor(IetfInetUtil.ipv4AddressBytes(new Ipv4Address("1.2.3.4"))));
96 assertNotEquals(new IpAddress(new Ipv4Address("2.3.4.5")),
97 IetfInetUtil.ipAddressFor(IetfInetUtil.ipv4AddressBytes(new Ipv4Address("1.2.3.4"))));
99 assertEquals(new IpAddress(new Ipv6Address("fe80::2002:b3ff:fe1e:8329")),
100 IetfInetUtil.ipAddressFor(IetfInetUtil.ipv6AddressBytes(new Ipv6Address("FE80::2002:B3FF:FE1E:8329"))));
101 assertNotEquals(new IpAddress(new Ipv6Address("feff::2002:b3ff:fe1e:8329")),
102 IetfInetUtil.ipAddressFor(IetfInetUtil.ipv6AddressBytes(new Ipv6Address("FE80::2002:B3FF:FE1E:8329"))));
104 assertEquals(new IpAddress(new Ipv4Address("1.2.3.4")),
105 IetfInetUtil.ipAddressFor(IetfInetUtil.inetAddressFor(new IpAddress(new Ipv4Address("1.2.3.4")))));
106 assertNotEquals(new IpAddress(new Ipv4Address("2.3.4.5")),
107 IetfInetUtil.ipAddressFor(IetfInetUtil.inetAddressFor(new IpAddress(new Ipv4Address("1.2.3.4")))));
109 assertEquals(new IpAddress(new Ipv6Address("fe80::2002:b3ff:fe1e:8329")),
110 IetfInetUtil.ipAddressFor(IetfInetUtil.inetAddressFor(
111 new IpAddress(new Ipv6Address("FE80::2002:B3FF:FE1E:8329")))));
112 assertNotEquals(new IpAddress(new Ipv6Address("FEFF::2002:B3FF:FE1E:8329")),
113 IetfInetUtil.ipAddressFor(IetfInetUtil.inetAddressFor(
114 new IpAddress(new Ipv6Address("FE80::2002:B3FF:FE1E:8329")))));
118 public void illegalArrayLengthForAddressTest() {
119 final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
120 () -> IetfInetUtil.ipAddressFor(new byte[] { 0, 0, 0 }));
121 assertEquals("Invalid array length 3", ex.getMessage());
125 public void unhandledAddressTest() {
126 final InetAddress adr = mock(InetAddress.class);
127 doReturn("testAddress").when(adr).toString();
128 final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
129 () -> IetfInetUtil.ipAddressFor(adr));
130 assertEquals("Unhandled address testAddress", ex.getMessage());
134 public void illegalArrayLengthforPrefixTest() {
135 final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
136 () -> IetfInetUtil.ipPrefixFor(new byte[] { 0, 0, 0 }, 0));
137 assertEquals("Invalid array length 3", ex.getMessage());
141 public void illegalAddressforPrefixTest() {
142 final InetAddress adr = mock(InetAddress.class);
143 doReturn("testAddress").when(adr).toString();
145 final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
146 () -> IetfInetUtil.ipPrefixFor(adr, 0));
147 assertEquals("Unhandled address testAddress", ex.getMessage());
151 public void ipv4Tests() {
152 assertEquals("1.2.3.4", IetfInetUtil.ipv4AddressFrom(new Ipv4Prefix("1.2.3.4/16")).getValue());
153 final var ipv4address = new Ipv4Address("1.2.3.4");
154 final var ipAddress = new IpAddress(ipv4address);
155 assertEquals("1.2.3.4/32", IetfInetUtil.ipv4PrefixFor(IetfInetUtil.ipv4AddressBytes(ipv4address)).getValue());
156 assertEquals("1.2.3.4/32", IetfInetUtil.ipv4PrefixFor(IetfInetUtil.inetAddressFor(ipAddress)).getValue());
157 assertEquals("1.2.3.4/32", IetfInetUtil.ipv4PrefixFor(ipv4address).getValue());
158 assertEquals("1.2.3.4/16", IetfInetUtil.ipv4PrefixFor(ipv4address, 16).getValue());
160 assertEquals("0.0.0.0/0",
161 IetfInetUtil.ipv4PrefixForShort(IetfInetUtil.ipv4AddressBytes(ipv4address), 0).getValue());
162 assertEquals("1.2.3.4/32",
163 IetfInetUtil.ipv4PrefixForShort(IetfInetUtil.ipv4AddressBytes(ipv4address), 32).getValue());
164 assertEquals("0.0.0.0/0",
165 IetfInetUtil.ipv4PrefixForShort(IetfInetUtil.ipv4AddressBytes(ipv4address), 0, 0).getValue());
166 assertEquals("1.2.3.4/32",
167 IetfInetUtil.ipv4PrefixForShort(IetfInetUtil.ipv4AddressBytes(ipv4address), 0, 32).getValue());
168 assertEquals("2.3.4.5/32", IetfInetUtil.ipv4PrefixForShort(new byte[] { 1, 2, 3, 4, 5 }, 1, 32).getValue());
169 assertEquals("1.0.0.0/1", IetfInetUtil.ipv4PrefixForShort(new byte[] { 1, 2, 3, 4, 5 }, 0, 1).getValue());
171 final var ipv4Prefix = new Ipv4Prefix("1.2.3.4/16");
172 assertEquals("1.2.3.4", IetfInetUtil.splitIpv4Prefix(ipv4Prefix).getKey().getValue());
173 assertEquals((Integer) 16, IetfInetUtil.splitIpv4Prefix(ipv4Prefix).getValue());
174 assertArrayEquals(new byte[] { 1,2,3,4,16 }, IetfInetUtil.ipv4PrefixToBytes(ipv4Prefix));
178 public void ipv6Tests() {
179 assertEquals("::0", IetfInetUtil.ipv6AddressFrom(new Ipv6Prefix("::0/128")).getValue());
180 final var ipv6address = new Ipv6Address("::0");
181 final var ipAddress = new IpAddress(ipv6address);
183 assertEquals("::/128", IetfInetUtil.ipv6PrefixFor(IetfInetUtil.ipv6AddressBytes(ipv6address)).getValue());
184 assertEquals("::/128", IetfInetUtil.ipv6PrefixFor(IetfInetUtil.inetAddressFor(ipAddress)).getValue());
185 assertEquals("::0/128", IetfInetUtil.ipv6PrefixFor(ipv6address).getValue());
186 assertEquals("::0/16", IetfInetUtil.ipv6PrefixFor(ipv6address, 16).getValue());
188 assertEquals("::0/0",
189 IetfInetUtil.ipv6PrefixForShort(IetfInetUtil.ipv6AddressBytes(ipv6address), 0).getValue());
190 assertEquals("::/64",
191 IetfInetUtil.ipv6PrefixForShort(IetfInetUtil.ipv6AddressBytes(ipv6address), 64).getValue());
192 assertEquals("::0/0",
193 IetfInetUtil.ipv6PrefixForShort(IetfInetUtil.ipv6AddressBytes(ipv6address), 0, 0).getValue());
194 assertEquals("::/32",
195 IetfInetUtil.ipv6PrefixForShort(IetfInetUtil.ipv6AddressBytes(ipv6address), 0, 32).getValue());
197 assertEquals(Map.entry(new Ipv6Address("::"), 32), IetfInetUtil.splitIpv6Prefix(new Ipv6Prefix("::/32")));
198 assertArrayEquals(new byte[] { 0, 10, 0, 0, 0, 0, 0, 0, 0, 11, 0, 12, 0, 13, 0, 14, 64 },
199 IetfInetUtil.ipv6PrefixToBytes(new Ipv6Prefix("A::B:C:D:E/64")));
201 // verify that an IPv4-mapped IPv6 address gets parsed as an IPv6 address
202 assertEquals("::ffff:ab0:eb", IetfInetUtil.ipv6AddressFor(
203 new byte[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (byte) 0xff, (byte) 0xff, 0x0a, (byte) 0xb0, 0, (byte) 0xeb})
208 public void prefixTest() {
209 assertEquals(new IpPrefix(new Ipv4Prefix("0.0.0.0/16")),
210 IetfInetUtil.ipPrefixFor(IetfInetUtil.inetAddressFor(new IpAddress(new Ipv4Address("0.0.0.0"))), 16));
211 assertEquals(new IpPrefix(new Ipv6Prefix("::/64")),
212 IetfInetUtil.ipPrefixFor(IetfInetUtil.inetAddressFor(new IpAddress(new Ipv6Address("::"))), 64));
214 assertEquals(new IpPrefix(new Ipv4Prefix("0.0.0.0/16")),
215 IetfInetUtil.ipPrefixFor(new byte[] { 0, 0, 0, 0 }, 16));
216 assertEquals(new IpPrefix(new Ipv6Prefix("::/64")),
217 IetfInetUtil.ipPrefixFor(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 64));
221 public void inetAddressTest() {
222 assertThat(IetfInetUtil.inetAddressFor(new IpAddress(new Ipv4Address("1.2.3.4"))),
223 instanceOf(Inet4Address.class));
224 assertThat(IetfInetUtil.inetAddressFor(new IpAddress(new Ipv6Address("FE80::2002:B3FF:FE1E:8329"))),
225 instanceOf(Inet6Address.class));
229 public void inet4AddressForWithExceptionTest() {
230 final Ipv4Address ipClass = mock(Ipv4Address.class);
231 doReturn("testClass").when(ipClass).toString();
233 throw new UnknownHostException();
234 }).when(ipClass).getValue();
236 final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
237 () -> IetfInetUtil.inet4AddressFor(ipClass));
238 assertEquals("Invalid address testClass", ex.getMessage());
242 public void inet6AddressForWithExceptionTest() {
243 final Ipv6Address ipClass = mock(Ipv6Address.class);
244 doReturn("testClass").when(ipClass).toString();
246 throw new UnknownHostException();
247 }).when(ipClass).getValue();
249 final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
250 () -> IetfInetUtil.inet6AddressFor(ipClass));
251 assertEquals("Invalid address testClass", ex.getMessage());
255 public void testIpv4AddressForBits() {
256 assertEquals("1.2.3.4", IetfInetUtil.ipv4AddressFor(0x01020304).getValue());
257 assertEquals("255.255.255.255", IetfInetUtil.ipv4AddressFor(0xFFFFFFFF).getValue());
261 public void testIpv4AddressBits() {
262 assertEquals(0x01020304, IetfInetUtil.ipv4AddressBits(new Ipv4Address("1.2.3.4")));
263 assertEquals(0xFFFFFFFF, IetfInetUtil.ipv4AddressBits(new Ipv4Address("255.255.255.255")));
267 public void testIpv4AddressNoZoneBits() {
268 assertEquals(0x01020304, IetfInetUtil.ipv4AddressNoZoneBits(new Ipv4AddressNoZone("1.2.3.4")));
269 assertEquals(0xFFFFFFFF, IetfInetUtil.ipv4AddressNoZoneBits(new Ipv4AddressNoZone("255.255.255.255")));
272 private static void assertV4Equals(final String literal, final String append) {
273 final byte[] expected = InetAddresses.forString(literal).getAddress();
274 final byte[] actual = IetfInetUtil.ipv4AddressBytes(new Ipv4Address(literal + append));
275 assertArrayEquals(expected, actual);
278 private static void assertV4Equals(final String literal) {
279 assertV4Equals(literal, "");