Integrate AbstractIetfInetUtil
[mdsal.git] / model / ietf / rfc6991-ietf-inet-types / src / test / java / org / opendaylight / yang / gen / v1 / urn / ietf / params / xml / ns / yang / ietf / inet / types / rev130715 / IetfInetUtilTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715;
9
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;
20
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;
26 import java.util.Map;
27 import org.junit.Test;
28
29 public class IetfInetUtilTest {
30     @Test
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);
36
37         assertEquals(ipv4Prefix, ipPrefix.getIpv4Prefix());
38         assertEquals(ipAddress, new IpAddress(ipv4Address));
39     }
40
41     @Test
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);
47
48         assertEquals(ipv6Prefix, ipPrefix.getIpv6Prefix());
49         assertEquals(ipAddress, new IpAddress(ipv6Address));
50     }
51
52     @Test
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));
56     }
57
58     @Test
59     public void testIpv4ZoneStripping() {
60         final Ipv4AddressNoZone noZone = new Ipv4AddressNoZone("1.2.3.4");
61         assertSame(noZone, IetfInetUtil.ipv4AddressNoZoneFor(noZone));
62
63         final Ipv4Address withoutZone = new Ipv4Address(noZone);
64         final Ipv4AddressNoZone stripped = IetfInetUtil.ipv4AddressNoZoneFor(withoutZone);
65         assertSame(withoutZone.getValue(), stripped.getValue());
66
67         assertEquals(noZone, IetfInetUtil.ipv4AddressNoZoneFor(new Ipv4Address("1.2.3.4%1")));
68     }
69
70     @Test
71     public void testIpv6ZoneStripping() {
72         final Ipv6AddressNoZone noZone = new Ipv6AddressNoZone("ff00::");
73         assertSame(noZone, IetfInetUtil.ipv6AddressNoZoneFor(noZone));
74
75         final Ipv6Address withoutZone = new Ipv6Address(noZone);
76         final Ipv6AddressNoZone stripped = IetfInetUtil.ipv6AddressNoZoneFor(withoutZone);
77         assertSame(withoutZone.getValue(), stripped.getValue());
78
79         assertEquals(noZone, IetfInetUtil.ipv6AddressNoZoneFor(new Ipv6Address("ff00::%1")));
80     }
81
82     @Test
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");
88
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");
93
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"))));
98
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"))));
103
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")))));
108
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")))));
115     }
116
117     @Test
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());
122     }
123
124     @Test
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());
131     }
132
133     @Test
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());
138     }
139
140     @Test
141     public void illegalAddressforPrefixTest() {
142         final InetAddress adr = mock(InetAddress.class);
143         doReturn("testAddress").when(adr).toString();
144
145         final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
146             () -> IetfInetUtil.ipPrefixFor(adr, 0));
147         assertEquals("Unhandled address testAddress", ex.getMessage());
148     }
149
150     @Test
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());
159
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());
170
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));
175     }
176
177     @Test
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);
182
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());
187
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());
196
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")));
200
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})
204                 .getValue());
205     }
206
207     @Test
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));
213
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));
218     }
219
220     @Test
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));
226     }
227
228     @Test
229     public void inet4AddressForWithExceptionTest() {
230         final Ipv4Address ipClass = mock(Ipv4Address.class);
231         doReturn("testClass").when(ipClass).toString();
232         doAnswer(inv -> {
233             throw new UnknownHostException();
234         }).when(ipClass).getValue();
235
236         final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
237             () -> IetfInetUtil.inet4AddressFor(ipClass));
238         assertEquals("Invalid address testClass", ex.getMessage());
239     }
240
241     @Test
242     public void inet6AddressForWithExceptionTest() {
243         final Ipv6Address ipClass = mock(Ipv6Address.class);
244         doReturn("testClass").when(ipClass).toString();
245         doAnswer(inv -> {
246             throw new UnknownHostException();
247         }).when(ipClass).getValue();
248
249         final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
250             () -> IetfInetUtil.inet6AddressFor(ipClass));
251         assertEquals("Invalid address testClass", ex.getMessage());
252     }
253
254     @Test
255     public void testIpv4AddressForBits() {
256         assertEquals("1.2.3.4", IetfInetUtil.ipv4AddressFor(0x01020304).getValue());
257         assertEquals("255.255.255.255", IetfInetUtil.ipv4AddressFor(0xFFFFFFFF).getValue());
258     }
259
260     @Test
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")));
264     }
265
266     @Test
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")));
270     }
271
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);
276     }
277
278     private static void assertV4Equals(final String literal) {
279         assertV4Equals(literal, "");
280     }
281 }