Move AbstractIetfInetUtil 81/105981/3
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 15 May 2023 23:29:28 +0000 (01:29 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 16 May 2023 01:50:06 +0000 (03:50 +0200)
As a first step in eliminating IetfInetUtil, move AbstractIetfInetUtil
and its tests.

JIRA: MDSAL-826
Change-Id: If558e9fc17f801097b868e8bb5ff261b241c3a2e
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
model/ietf/ietf-type-util/src/main/java/org/opendaylight/mdsal/model/ietf/util/Ipv4Utils.java
model/ietf/ietf-type-util/src/main/java/org/opendaylight/mdsal/model/ietf/util/Ipv6Utils.java
model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/AbstractIetfInetUtilTest.java [deleted file]
model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/IpClass.java [deleted file]
model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/IpUtil.java [deleted file]
model/ietf/rfc6991-ietf-inet-types/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/AbstractIetfInetUtil.java [moved from model/ietf/ietf-type-util/src/main/java/org/opendaylight/mdsal/model/ietf/util/AbstractIetfInetUtil.java with 75% similarity]
model/ietf/rfc6991-ietf-inet-types/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IetfInetUtil.java
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

index 50b843eb90f30aa3831c8b950506d7b032c8e3b3..891e740570b8f0f9004709e53845c625e286a8fe 100644 (file)
@@ -9,24 +9,22 @@ package org.opendaylight.mdsal.model.ietf.util;
 
 import static com.google.common.base.Preconditions.checkArgument;
 
-import com.google.common.annotations.Beta;
 import org.eclipse.jdt.annotation.NonNull;
 
 /**
- * IPv4 address parsing for ietf-inet-types ipv4-address. This is an internal implementation class, not meant to be
- * exposed in any shape or form to the outside world, as the code relies on the fact that the strings presented to it
- * have been previously validated to conform to the regular expressions defined in the YANG model.
+ * IPv4 address parsing for {@code ietf-inet-types} ipv4-address. This is an internal implementation class, not meant to
+ * be used directly in any shape or form to the outside world, as the code relies on the fact that the strings presented
+ * to it have been previously validated to conform to the regular expressions defined in the YANG model.
  */
-@Beta
 public final class Ipv4Utils {
-    static final int INET4_LENGTH = 4;
+    public static final int INET4_LENGTH = 4;
 
     private Ipv4Utils() {
         // Hidden on purpose
     }
 
-    static void fillIpv4Bytes(final byte @NonNull[] bytes, final int byteStart, final String str, final int strStart,
-            final int strLimit) {
+    public static void fillIpv4Bytes(final byte @NonNull[] bytes, final int byteStart, final String str,
+            final int strStart, final int strLimit) {
         int out = byteStart;
         int val = 0;
         for (int i = strStart; i < strLimit; ++i) {
@@ -73,7 +71,7 @@ public final class Ipv4Utils {
         return sb.toString();
     }
 
-    static void appendIpv4String(final StringBuilder sb, final byte @NonNull[] bytes) {
+    public static void appendIpv4String(final StringBuilder sb, final byte @NonNull[] bytes) {
         checkArgument(bytes.length == INET4_LENGTH, "IPv4 address length is 4 bytes");
 
         sb.append(Byte.toUnsignedInt(bytes[0]));
index 9d42d3a42f8724f57f3413bfedea523b7600aeb4..8ffd0066cc99feaffa15a5af1122c36eed4995b8 100644 (file)
@@ -10,44 +10,43 @@ package org.opendaylight.mdsal.model.ietf.util;
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Verify.verify;
 
-import com.google.common.annotations.Beta;
 import java.util.Arrays;
 import java.util.HexFormat;
 import org.eclipse.jdt.annotation.NonNull;
 
 /**
- * IPv6 address parsing for ietf-inet-types ipv6-address and ipv6-prefix. This is an internal implementation
- * class, not meant to be exposed in any shape or form to the outside world, as the code relies on the fact that
- * the strings presented to it have been previously validated to conform to the regular expressions defined in
- * the YANG model.
- */
-/*
- * v6 routines added by Anton Ivanov on 14.6.2015
- * revised by Robert Varga
+ * IPv6 address parsing for {@code ietf-inet-types} ipv6-address and ipv6-prefix. This is an internal implementation
+ * class, not meant to be used directly in any shape or form to the outside world, as the code relies on the fact that
+ * the strings presented to it have been previously validated to conform to the regular expressions defined in the YANG
+ * model.
  *
- * BIG FAT WARNING!!!
- * Read all of the following before you touch any v6 code or decide to
- * optimize it by invoking a "simple" Guava call
+ * <p>
+ * IPv6 routines added by Anton Ivanov on 14.6.2015, revised by Robert Varga
  *
- * Java IPv6 is fundamentally broken and Google libraries do not fix it.
- * 1. Java will allways implicitly rewrite v4 mapped into v6 as a v4 address
- *      and there is absolutely no way to override this behaviour
- * 2. Guava libraries cannot parse non-canonical IPv6. They will throw an
- *      exception. Even if they did, they re-use the same broken java code
- *      underneath.
+ * <p>
+ * <b>BIG FAT WARNING!!!</b>
+ * Read all of the following before you touch any v6 code or decide to optimize it by invoking a "simple" Guava call.
  *
+ * <p>
+ * Java IPv6 is fundamentally broken and Google libraries do not fix it.
+ * <ol>
+ *   <li>Java will always implicitly rewrite v4 mapped into v6 as a v4 address and there is absolutely no way to
+ *       override this behaviour</li>
+ *   <li>Guava libraries cannot parse non-canonical IPv6. They will throw an exception. Even if they did, they re-use
+ *       the same broken java code underneath</li>
+ * </ol>
  * This is why we have to parse v6 by ourselves.
  *
- * The following conversion code is based on inet_cidr_pton_ipv6 in NetBSD
+ * <p>
+ * The following conversion code is based on inet_cidr_pton_ipv6 in NetBSD.
  *
- * The original BSD code is licensed under standard BSD license. While we
- * are not obliged to provide an attribution, credit where credit is due.
- * As far as why it is similar to Sun's sun.net.util please ask Sun why
- * their code has the same variable names, comments and code flow.
+ * <p>
+ * The original BSD code is licensed under standard BSD license. While we are not obliged to provide an attribution,
+ * credit where credit is due. As far as why it is similar to Sun's sun.net.util please ask Sun why their code has the
+ * same variable names, comments and code flow.
  */
-@Beta
 public final class Ipv6Utils {
-    static final int INET6_LENGTH = 16;
+    public static final int INET6_LENGTH = 16;
 
     private Ipv6Utils() {
         // Hidden on purpose
@@ -62,7 +61,7 @@ public final class Ipv6Utils {
      * @throws NullPointerException if ipv6address is null
      */
     @SuppressWarnings("checkstyle:localVariableName")
-    static void fillIpv6Bytes(final byte @NonNull[] bytes, final String str, final int strLimit) {
+    public static void fillIpv6Bytes(final byte @NonNull[] bytes, final String str, final int strLimit) {
         // Leading :: requires some special handling.
         int i = 0;
         if (str.charAt(i) == ':') {
diff --git a/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/AbstractIetfInetUtilTest.java b/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/AbstractIetfInetUtilTest.java
deleted file mode 100644 (file)
index 83c1d12..0000000
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.mdsal.model.ietf.util;
-
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertThrows;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-
-import com.google.common.net.InetAddresses;
-import java.net.Inet4Address;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import org.junit.Test;
-
-public class AbstractIetfInetUtilTest {
-    private static final IpUtil UTIL = new IpUtil();
-
-    private static void assertV4Equals(final String literal, final String append) {
-        final byte[] expected = InetAddresses.forString(literal).getAddress();
-        final byte[] actual = UTIL.ipv4AddressBytes(new IpClass(literal + append));
-        assertArrayEquals(expected, actual);
-    }
-
-    private static void assertV4Equals(final String literal) {
-        assertV4Equals(literal, "");
-    }
-
-    @Test
-    public void testIpToBytesAndBack() {
-        assertV4Equals("1.2.3.4");
-        assertV4Equals("12.23.34.45");
-        assertV4Equals("255.254.253.252");
-        assertV4Equals("128.16.0.127");
-
-        assertV4Equals("1.2.3.4", "%5");
-        assertV4Equals("12.23.34.45", "%5");
-        assertV4Equals("255.254.253.252", "%5");
-        assertV4Equals("128.16.0.127", "%5");
-
-        assertEquals(new IpClass("1.2.3.4").getValue().toLowerCase(),
-                UTIL.ipAddressFor(UTIL.ipv4AddressBytes(new IpClass("1.2.3.4"))).getValue().toLowerCase());
-        assertNotEquals(new IpClass("2.3.4.5").getValue().toLowerCase(),
-                UTIL.ipAddressFor(UTIL.ipv4AddressBytes(new IpClass("1.2.3.4"))).getValue().toLowerCase());
-
-        assertEquals(new IpClass("FE80::2002:B3FF:FE1E:8329").getValue().toLowerCase(),
-                UTIL.ipAddressFor(
-                        UTIL.ipv6AddressBytes(new IpClass("FE80::2002:B3FF:FE1E:8329"))).getValue().toLowerCase());
-        assertNotEquals(new IpClass("FEFF::2002:B3FF:FE1E:8329").getValue().toLowerCase(),
-                UTIL.ipAddressFor(
-                        UTIL.ipv6AddressBytes(new IpClass("FE80::2002:B3FF:FE1E:8329"))).getValue().toLowerCase());
-
-        assertEquals(new IpClass("1.2.3.4").getValue().toLowerCase(),
-                UTIL.ipAddressFor(UTIL.inetAddressFor(new IpClass("1.2.3.4"))).getValue().toLowerCase());
-        assertNotEquals(new IpClass("2.3.4.5").getValue().toLowerCase(),
-                UTIL.ipAddressFor(UTIL.inetAddressFor(new IpClass("1.2.3.4"))).getValue().toLowerCase());
-
-        assertEquals(new IpClass("FE80::2002:B3FF:FE1E:8329").getValue().toLowerCase(),
-                UTIL.ipAddressFor(
-                        UTIL.inetAddressFor(new IpClass("FE80::2002:B3FF:FE1E:8329"))).getValue().toLowerCase());
-        assertNotEquals(new IpClass("FEFF::2002:B3FF:FE1E:8329").getValue().toLowerCase(),
-                UTIL.ipAddressFor(
-                        UTIL.inetAddressFor(new IpClass("FE80::2002:B3FF:FE1E:8329"))).getValue().toLowerCase());
-    }
-
-    @Test
-    public void illegalArrayLengthForAddressTest() {
-        final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
-            () -> UTIL.ipAddressFor(new byte[] { 0, 0, 0 }));
-        assertEquals("Invalid array length 3", ex.getMessage());
-    }
-
-    @Test
-    public void unhandledAddressTest() {
-        final InetAddress adr = mock(InetAddress.class);
-        doReturn("testAddress").when(adr).toString();
-        final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> UTIL.ipAddressFor(adr));
-        assertEquals("Unhandled address testAddress", ex.getMessage());
-    }
-
-    @Test
-    public void illegalArrayLengthforPrefixTest() {
-        final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
-            () -> UTIL.ipPrefixFor(new byte[] { 0, 0, 0 }, 0));
-        assertEquals("Invalid array length 3", ex.getMessage());
-    }
-
-    @Test
-    public void illegalAddressforPrefixTest() {
-        final InetAddress adr = mock(InetAddress.class);
-        doReturn("testAddress").when(adr).toString();
-
-        final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
-            () -> UTIL.ipPrefixFor(adr, 0));
-        assertEquals("Unhandled address testAddress", ex.getMessage());
-    }
-
-    @Test
-    public void ipv4Tests() {
-        assertEquals("1.2.3.4", UTIL.ipv4AddressFrom(new IpClass("1.2.3.4/16")).getValue());
-        final IpClass ipClass = new IpClass("1.2.3.4");
-        assertEquals("1.2.3.4/32", UTIL.ipv4PrefixFor(UTIL.ipv4AddressBytes(ipClass)).getValue());
-        assertEquals("1.2.3.4/32", UTIL.ipv4PrefixFor(UTIL.inetAddressFor(ipClass)).getValue());
-        assertEquals("1.2.3.4/32", UTIL.ipv4PrefixFor(ipClass).getValue());
-        assertEquals("1.2.3.4/16", UTIL.ipv4PrefixFor(ipClass, 16).getValue());
-
-        assertEquals("0.0.0.0/0", UTIL.ipv4PrefixForShort(UTIL.ipv4AddressBytes(ipClass), 0).getValue());
-        assertEquals("1.2.3.4/32", UTIL.ipv4PrefixForShort(UTIL.ipv4AddressBytes(ipClass), 32).getValue());
-        assertEquals("0.0.0.0/0", UTIL.ipv4PrefixForShort(UTIL.ipv4AddressBytes(ipClass), 0, 0).getValue());
-        assertEquals("1.2.3.4/32", UTIL.ipv4PrefixForShort(UTIL.ipv4AddressBytes(ipClass), 0, 32).getValue());
-        assertEquals("2.3.4.5/32", UTIL.ipv4PrefixForShort(new byte[] { 1, 2, 3, 4, 5 }, 1, 32).getValue());
-        assertEquals("1.0.0.0/1", UTIL.ipv4PrefixForShort(new byte[] { 1, 2, 3, 4, 5 }, 0, 1).getValue());
-
-        assertEquals("1.2.3.4", UTIL.splitIpv4Prefix(new IpClass("1.2.3.4/16")).getKey().getValue());
-        assertEquals((Integer) 16, UTIL.splitIpv4Prefix(new IpClass("1.2.3.4/16")).getValue());
-        assertArrayEquals(new byte[] { 1,2,3,4,16 }, UTIL.ipv4PrefixToBytes(new IpClass("1.2.3.4/16")));
-    }
-
-    @Test
-    public void ipv6Tests() {
-        assertEquals("::0", UTIL.ipv6AddressFrom(new IpClass("::0/128")).getValue());
-        final IpClass ipClass = new IpClass("::0");
-        assertEquals("::/128", UTIL.ipv6PrefixFor(UTIL.ipv6AddressBytes(ipClass)).getValue());
-        assertEquals("::/128", UTIL.ipv6PrefixFor(UTIL.inetAddressFor(ipClass)).getValue());
-        assertEquals("::0/128", UTIL.ipv6PrefixFor(ipClass).getValue());
-        assertEquals("::0/16", UTIL.ipv6PrefixFor(ipClass, 16).getValue());
-
-        assertEquals("::0/0", UTIL.ipv6PrefixForShort(UTIL.ipv6AddressBytes(ipClass), 0).getValue());
-        assertEquals("::/64", UTIL.ipv6PrefixForShort(UTIL.ipv6AddressBytes(ipClass), 64).getValue());
-        assertEquals("::0/0", UTIL.ipv6PrefixForShort(UTIL.ipv6AddressBytes(ipClass), 0, 0).getValue());
-        assertEquals("::/32", UTIL.ipv6PrefixForShort(UTIL.ipv6AddressBytes(ipClass), 0, 32).getValue());
-
-        assertEquals("::", UTIL.splitIpv6Prefix(new IpClass("::/32")).getKey().getValue());
-        assertEquals((Integer) 32, UTIL.splitIpv6Prefix(new IpClass("::/32")).getValue());
-        assertArrayEquals(new byte[] { 0, 10, 0, 0, 0, 0, 0, 0, 0, 11, 0, 12, 0, 13, 0, 14, 64 },
-                UTIL.ipv6PrefixToBytes(new IpClass("A::B:C:D:E/64")));
-
-        // verify that an IPv4-mapped IPv6 address gets parsed as an IPv6 address
-        assertEquals("::ffff:ab0:eb", UTIL.ipv6AddressFor(
-                new byte[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (byte) 0xff, (byte) 0xff, 0x0a, (byte) 0xb0, 0, (byte) 0xeb})
-                .getValue());
-    }
-
-    @Test
-    public void prefixTest() {
-        assertEquals("0.0.0.0/16", UTIL.ipPrefixFor(UTIL.inetAddressFor(new IpClass("0.0.0.0")), 16).getValue());
-        assertEquals("::/64", UTIL.ipPrefixFor(UTIL.inetAddressFor(new IpClass("::")), 64).getValue());
-
-        assertEquals("0.0.0.0/16", UTIL.ipPrefixFor(new byte[] { 0, 0, 0, 0 }, 16).getValue());
-        assertEquals("::/64",
-            UTIL.ipPrefixFor(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 64).getValue());
-    }
-
-    @Test
-    public void inetAddressTest() {
-        assertThat(UTIL.inetAddressFor(new IpClass("1.2.3.4")), instanceOf(Inet4Address.class));
-        assertThat(UTIL.inetAddressFor(new IpClass("FE80::2002:B3FF:FE1E:8329")), instanceOf(Inet6Address.class));
-    }
-
-    @Test
-    public void inet4AddressForWithExceptionTest() {
-        final IpClass ipClass = mock(IpClass.class);
-        doReturn("testClass").when(ipClass).toString();
-        doAnswer(inv -> {
-            throw new UnknownHostException();
-        }).when(ipClass).getValue();
-
-        final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
-            () -> UTIL.inet4AddressFor(ipClass));
-        assertEquals("Invalid address testClass", ex.getMessage());
-    }
-
-    @Test
-    public void inet6AddressForWithExceptionTest() {
-        final IpClass ipClass = mock(IpClass.class);
-        doReturn("testClass").when(ipClass).toString();
-        doAnswer(inv -> {
-            throw new UnknownHostException();
-        }).when(ipClass).getValue();
-
-        final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
-            () -> UTIL.inet6AddressFor(ipClass));
-        assertEquals("Invalid address testClass", ex.getMessage());
-    }
-
-    @Test
-    public void testIpv4AddressForBits() {
-        assertEquals("1.2.3.4", UTIL.ipv4AddressFor(0x01020304).getValue());
-        assertEquals("255.255.255.255", UTIL.ipv4AddressFor(0xFFFFFFFF).getValue());
-    }
-
-    @Test
-    public void testIpv4AddressBits() {
-        assertEquals(0x01020304, UTIL.ipv4AddressBits(new IpClass("1.2.3.4")));
-        assertEquals(0xFFFFFFFF, UTIL.ipv4AddressBits(new IpClass("255.255.255.255")));
-    }
-
-    @Test
-    public void testIpv4AddressNoZoneBits() {
-        assertEquals(0x01020304, UTIL.ipv4AddressNoZoneBits(new IpClass("1.2.3.4")));
-        assertEquals(0xFFFFFFFF, UTIL.ipv4AddressNoZoneBits(new IpClass("255.255.255.255")));
-    }
-}
diff --git a/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/IpClass.java b/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/IpClass.java
deleted file mode 100644 (file)
index 3e9d644..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.mdsal.model.ietf.util;
-
-import static java.util.Objects.requireNonNull;
-
-@SuppressWarnings("checkstyle:memberName")
-public class IpClass {
-    private final String _value;
-
-    public IpClass(final String value) {
-        this._value = requireNonNull(value);
-    }
-
-    public IpClass(final IpClass template) {
-        this._value = template._value;
-    }
-
-    String getValue() {
-        return this._value;
-    }
-}
\ No newline at end of file
diff --git a/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/IpUtil.java b/model/ietf/ietf-type-util/src/test/java/org/opendaylight/mdsal/model/ietf/util/IpUtil.java
deleted file mode 100644 (file)
index e28e16f..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.mdsal.model.ietf.util;
-
-import java.util.regex.Pattern;
-import org.checkerframework.checker.regex.qual.Regex;
-
-final class IpUtil extends AbstractIetfInetUtil<IpClass, IpClass, IpClass, IpClass, IpClass, IpClass, IpClass, IpClass,
-        IpClass> {
-
-    @Regex
-    private static final String IP_V4_REGEX = "^\\d+\\.\\d+\\.\\d+\\.\\d+$";
-    private static final Pattern IP_V4_PATTERN = Pattern.compile(IP_V4_REGEX);
-
-    IpUtil() {
-        super(IpClass.class, IpClass.class, IpClass.class, IpClass.class);
-    }
-
-    @Override
-    protected IpClass ipv4Address(final IpClass addr) {
-        return addr;
-    }
-
-
-    @Override
-    protected IpClass ipv4AddressNoZone(final IpClass addr) {
-        return addr;
-    }
-
-    @Override
-    protected IpClass ipv6Address(final IpClass addr) {
-        return addr;
-    }
-
-    @Override
-    protected IpClass ipv6AddressNoZone(final IpClass addr) {
-        return addr;
-    }
-
-    @Override
-    protected IpClass ipv4Prefix(final IpClass addr) {
-        return addr;
-    }
-
-    @Override
-    protected IpClass ipv6Prefix(final IpClass addr) {
-        return addr;
-    }
-
-    @Override
-    protected String ipv4AddressString(final IpClass addr) {
-        return addr.getValue();
-    }
-
-    @Override
-    protected String ipv6AddressString(final IpClass addr) {
-        return addr.getValue();
-    }
-
-    @Override
-    protected String ipv4PrefixString(final IpClass prefix) {
-        return prefix.getValue();
-    }
-
-    @Override
-    protected String ipv6PrefixString(final IpClass prefix) {
-        return prefix.getValue();
-    }
-
-    @Override
-    protected IpClass maybeIpv4Address(final IpClass addr) {
-        return IP_V4_PATTERN.matcher(addr.getValue()).matches() ? addr : null;
-    }
-
-    @Override
-    protected IpClass maybeIpv4AddressNoZone(final IpClass addr) {
-        return maybeIpv4Address(addr);
-    }
-
-    @Override
-    protected IpClass maybeIpv6Address(final IpClass addr) {
-        return addr.getValue().indexOf(':') != -1 ? addr : null;
-    }
-
-    @Override
-    protected IpClass maybeIpv6AddressNoZone(final IpClass addr) {
-        return maybeIpv6Address(addr);
-    }
-}
\ No newline at end of file
@@ -5,7 +5,7 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-package org.opendaylight.mdsal.model.ietf.util;
+package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static java.util.Objects.requireNonNull;
@@ -21,57 +21,51 @@ import java.util.Map.Entry;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.mdsal.binding.spec.reflect.StringValueObjectFactory;
+import org.opendaylight.mdsal.model.ietf.util.Ipv4Utils;
+import org.opendaylight.mdsal.model.ietf.util.Ipv6Utils;
 
 /**
  * A set of utility methods to efficiently instantiate various ietf-inet-types DTOs.
  */
 @Beta
 @SuppressWarnings("checkstyle:classTypeParameterName")
-public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ extends A6, P6, A, ANZ, P> {
-    private final StringValueObjectFactory<A4NZ> address4NoZoneFactory;
-    private final StringValueObjectFactory<P4> prefix4Factory;
-    private final StringValueObjectFactory<A6NZ> address6NoZoneFactory;
-    private final StringValueObjectFactory<P6> prefix6Factory;
-    private final Class<A4NZ> addr4nzClass;
-    private final Class<A6NZ> addr6nzClass;
+public abstract class AbstractIetfInetUtil {
+    private final StringValueObjectFactory<Ipv4AddressNoZone> address4NoZoneFactory =
+        StringValueObjectFactory.create(Ipv4AddressNoZone.class, "0.0.0.0");
+    private final StringValueObjectFactory<Ipv4Prefix> prefix4Factory =
+        StringValueObjectFactory.create(Ipv4Prefix.class, "0.0.0.0/0");
+    private final StringValueObjectFactory<Ipv6AddressNoZone> address6NoZoneFactory =
+        StringValueObjectFactory.create(Ipv6AddressNoZone.class, "::0");
+    private final StringValueObjectFactory<Ipv6Prefix> prefix6Factory =
+        StringValueObjectFactory.create(Ipv6Prefix.class, "::0/0");
 
-    protected AbstractIetfInetUtil(final Class<A4NZ> addr4nzClass, final Class<P4> prefix4Class,
-            final Class<A6NZ> addr6nzClass, final Class<P6> prefix6Class) {
-        this.addr4nzClass = requireNonNull(addr4nzClass);
-        this.addr6nzClass = requireNonNull(addr6nzClass);
-        this.address4NoZoneFactory = StringValueObjectFactory.create(addr4nzClass, "0.0.0.0");
-        this.prefix4Factory = StringValueObjectFactory.create(prefix4Class, "0.0.0.0/0");
-        this.address6NoZoneFactory = StringValueObjectFactory.create(addr6nzClass, "::0");
-        this.prefix6Factory = StringValueObjectFactory.create(prefix6Class, "::0/0");
-    }
-
-    protected abstract @NonNull A ipv4Address(@NonNull A4NZ addr);
+    protected abstract @NonNull IpAddress ipv4Address(@NonNull Ipv4AddressNoZone addr);
 
-    protected abstract @NonNull ANZ ipv4AddressNoZone(@NonNull A4NZ addr);
+    protected abstract @NonNull IpAddressNoZone ipv4AddressNoZone(@NonNull Ipv4AddressNoZone addr);
 
-    protected abstract @NonNull A ipv6Address(@NonNull A6NZ addr);
+    protected abstract @NonNull IpAddress ipv6Address(@NonNull Ipv6AddressNoZone addr);
 
-    protected abstract @NonNull ANZ ipv6AddressNoZone(@NonNull A6NZ addr);
+    protected abstract @NonNull IpAddressNoZone ipv6AddressNoZone(@NonNull Ipv6AddressNoZone addr);
 
-    protected abstract @Nullable A4 maybeIpv4Address(@NonNull A addr);
+    protected abstract @Nullable Ipv4Address maybeIpv4Address(@NonNull IpAddress addr);
 
-    protected abstract @Nullable A4NZ maybeIpv4AddressNoZone(@NonNull ANZ addr);
+    protected abstract @Nullable Ipv4AddressNoZone maybeIpv4AddressNoZone(@NonNull IpAddressNoZone addr);
 
-    protected abstract @Nullable A6 maybeIpv6Address(@NonNull A addr);
+    protected abstract @Nullable Ipv6Address maybeIpv6Address(@NonNull IpAddress addr);
 
-    protected abstract @Nullable A6NZ maybeIpv6AddressNoZone(@NonNull ANZ addr);
+    protected abstract @Nullable Ipv6AddressNoZone maybeIpv6AddressNoZone(@NonNull IpAddressNoZone addr);
 
-    protected abstract @NonNull P ipv4Prefix(@NonNull P4 addr);
+    protected abstract @NonNull IpPrefix ipv4Prefix(@NonNull Ipv4Prefix addr);
 
-    protected abstract @NonNull P ipv6Prefix(@NonNull P6 addr);
+    protected abstract @NonNull IpPrefix ipv6Prefix(@NonNull Ipv6Prefix addr);
 
-    protected abstract @NonNull String ipv4AddressString(@NonNull A4 addr);
+    protected abstract @NonNull String ipv4AddressString(@NonNull Ipv4Address addr);
 
-    protected abstract @NonNull String ipv6AddressString(@NonNull A6 addr);
+    protected abstract @NonNull String ipv6AddressString(@NonNull Ipv6Address addr);
 
-    protected abstract @NonNull String ipv4PrefixString(@NonNull P4 prefix);
+    protected abstract @NonNull String ipv4PrefixString(@NonNull Ipv4Prefix prefix);
 
-    protected abstract @NonNull String ipv6PrefixString(@NonNull P6 prefix);
+    protected abstract @NonNull String ipv6PrefixString(@NonNull Ipv6Prefix prefix);
 
     /**
      * Create an IpAddress by interpreting input bytes as an IPv4 or IPv6 address, based on array length.
@@ -81,7 +75,7 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
      * @throws IllegalArgumentException if bytes has length different from 4 or 6
      * @throws NullPointerException if bytes is null
      */
-    public final @NonNull A ipAddressFor(final byte @NonNull[] bytes) {
+    public final @NonNull IpAddress ipAddressFor(final byte @NonNull[] bytes) {
         return switch (bytes.length) {
             case Ipv4Utils.INET4_LENGTH -> ipv4Address(ipv4AddressFor(bytes));
             case Ipv6Utils.INET6_LENGTH -> ipv6Address(ipv6AddressFor(bytes));
@@ -89,7 +83,7 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
         };
     }
 
-    public final @NonNull A ipAddressFor(final @NonNull InetAddress addr) {
+    public final @NonNull IpAddress ipAddressFor(final @NonNull InetAddress addr) {
         requireAddress(addr);
         if (addr instanceof Inet4Address) {
             return ipv4Address(ipv4AddressFor(addr));
@@ -112,7 +106,7 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
      * @throws IllegalArgumentException if bytes has length different from 4 or 6
      * @throws NullPointerException if bytes is null
      */
-    public final @NonNull ANZ ipAddressNoZoneFor(final byte @NonNull[] bytes) {
+    public final @NonNull IpAddressNoZone ipAddressNoZoneFor(final byte @NonNull[] bytes) {
         return switch (bytes.length) {
             case Ipv4Utils.INET4_LENGTH -> ipv4AddressNoZone(ipv4AddressFor(bytes));
             case Ipv6Utils.INET6_LENGTH -> ipv6AddressNoZone(ipv6AddressFor(bytes));
@@ -120,7 +114,7 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
         };
     }
 
-    public final @NonNull ANZ ipAddressNoZoneFor(final @NonNull InetAddress addr) {
+    public final @NonNull IpAddressNoZone ipAddressNoZoneFor(final @NonNull InetAddress addr) {
         requireAddress(addr);
         if (addr instanceof Inet4Address) {
             return ipv4AddressNoZone(ipv4AddressFor(addr));
@@ -151,7 +145,7 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
      *         in range 0-32 or 0-128 respectively
      * @throws NullPointerException if bytes is null
      */
-    public final @NonNull P ipPrefixFor(final byte @NonNull[] bytes, final int mask) {
+    public final @NonNull IpPrefix ipPrefixFor(final byte @NonNull[] bytes, final int mask) {
         return switch (bytes.length) {
             case Ipv4Utils.INET4_LENGTH -> ipv4Prefix(ipv4PrefixFor(bytes, mask));
             case Ipv6Utils.INET6_LENGTH -> ipv6Prefix(ipv6PrefixFor(bytes, mask));
@@ -159,7 +153,7 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
         };
     }
 
-    public final @NonNull P ipPrefixFor(final @NonNull InetAddress addr, final int mask) {
+    public final @NonNull IpPrefix ipPrefixFor(final @NonNull InetAddress addr, final int mask) {
         requireAddress(addr);
         if (addr instanceof Inet4Address) {
             return ipv4Prefix(ipv4PrefixFor(addr, mask));
@@ -170,28 +164,28 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
         }
     }
 
-    public final @NonNull P ipPrefixFor(final @NonNull A addr) {
-        final A4 v4 = maybeIpv4Address(addr);
+    public final @NonNull IpPrefix ipPrefixFor(final @NonNull IpAddress addr) {
+        final var v4 = maybeIpv4Address(addr);
         return v4 != null ? ipv4Prefix(ipv4PrefixFor(v4)) : ipv6Prefix(ipv6PrefixFor(coerceIpv6Address(addr)));
     }
 
-    public final @NonNull P ipPrefixForNoZone(final @NonNull ANZ addr) {
-        final A4NZ v4 = maybeIpv4AddressNoZone(addr);
+    public final @NonNull IpPrefix ipPrefixForNoZone(final @NonNull IpAddressNoZone addr) {
+        final var v4 = maybeIpv4AddressNoZone(addr);
         return v4 != null ? ipv4Prefix(ipv4PrefixFor(inet4AddressForNoZone(v4)))
             : ipv6Prefix(ipv6PrefixFor(coerceIpv6AddressNoZone(addr)));
     }
 
-    public final @NonNull InetAddress inetAddressFor(final @NonNull A addr) {
-        final A4 v4 = maybeIpv4Address(addr);
+    public final @NonNull InetAddress inetAddressFor(final @NonNull IpAddress addr) {
+        final var v4 = maybeIpv4Address(addr);
         return v4 != null ? inet4AddressFor(v4) : inet6AddressFor(coerceIpv6Address(addr));
     }
 
-    public final @NonNull InetAddress inetAddressForNoZone(final @NonNull ANZ addr) {
-        final A4NZ v4 = maybeIpv4AddressNoZone(addr);
+    public final @NonNull InetAddress inetAddressForNoZone(final @NonNull IpAddressNoZone addr) {
+        final var v4 = maybeIpv4AddressNoZone(addr);
         return v4 != null ? inet4AddressForNoZone(v4) : inet6AddressForNoZone(coerceIpv6AddressNoZone(addr));
     }
 
-    public final @NonNull Inet4Address inet4AddressFor(final @NonNull A4 addr) {
+    public final @NonNull Inet4Address inet4AddressFor(final @NonNull Ipv4Address addr) {
         try {
             return (Inet4Address) InetAddress.getByAddress(ipv4AddressBytes(addr));
         } catch (UnknownHostException e) {
@@ -199,7 +193,7 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
         }
     }
 
-    public final @NonNull Inet4Address inet4AddressForNoZone(final @NonNull A4NZ addr) {
+    public final @NonNull Inet4Address inet4AddressForNoZone(final @NonNull Ipv4AddressNoZone addr) {
         try {
             return (Inet4Address) InetAddress.getByAddress(ipv4AddressNoZoneBytes(addr));
         } catch (UnknownHostException e) {
@@ -207,7 +201,7 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
         }
     }
 
-    public final @NonNull Inet6Address inet6AddressFor(final @NonNull A6 addr) {
+    public final @NonNull Inet6Address inet6AddressFor(final @NonNull Ipv6Address addr) {
         try {
             return (Inet6Address) InetAddress.getByAddress(ipv6AddressBytes(addr));
         } catch (UnknownHostException e) {
@@ -215,7 +209,7 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
         }
     }
 
-    public final @NonNull Inet6Address inet6AddressForNoZone(final @NonNull A6NZ addr) {
+    public final @NonNull Inet6Address inet6AddressForNoZone(final @NonNull Ipv6AddressNoZone addr) {
         try {
             return (Inet6Address) InetAddress.getByAddress(ipv6AddressNoZoneBytes(addr));
         } catch (UnknownHostException e) {
@@ -231,7 +225,7 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
      * @throws IllegalArgumentException if bytes has length different from 4
      * @throws NullPointerException if bytes is null
      */
-    public final @NonNull A4NZ ipv4AddressFor(final byte @NonNull[] bytes) {
+    public final @NonNull Ipv4AddressNoZone ipv4AddressFor(final byte @NonNull[] bytes) {
         return address4NoZoneFactory.newInstance(Ipv4Utils.addressString(bytes));
     }
 
@@ -243,7 +237,7 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
      * @throws IllegalArgumentException if addr is not an {@link Inet4Address}
      * @throws NullPointerException if addr is null
      */
-    public final @NonNull A4NZ ipv4AddressFor(final @NonNull InetAddress addr) {
+    public final @NonNull Ipv4AddressNoZone ipv4AddressFor(final @NonNull InetAddress addr) {
         return address4NoZoneFactory.newInstance(addressStringV4(addr));
     }
 
@@ -253,7 +247,7 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
      * @param bits 32 bits, big endian
      * @return An Ipv4AddressNoZone object
      */
-    public final @NonNull A4NZ ipv4AddressFor(final int bits) {
+    public final @NonNull Ipv4AddressNoZone ipv4AddressFor(final int bits) {
         return address4NoZoneFactory.newInstance(Ipv4Utils.addressString(bits));
     }
 
@@ -264,17 +258,17 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
      * @return An Ipv4AddressNoZone object
      * @throws NullPointerException if addr is null
      */
-    public final @NonNull A4NZ ipv4AddressNoZoneFor(final @NonNull A4 addr) {
+    public final @NonNull Ipv4AddressNoZone ipv4AddressNoZoneFor(final @NonNull Ipv4Address addr) {
         requireAddress(addr);
-        return addr4nzClass.isInstance(addr) ? addr4nzClass.cast(addr)
-                : address4NoZoneFactory.newInstance(stripZone(ipv4AddressString(addr)));
+        return addr instanceof Ipv4AddressNoZone noZone ? noZone
+             address4NoZoneFactory.newInstance(stripZone(ipv4AddressString(addr)));
     }
 
-    public final @NonNull A4NZ ipv4AddressFrom(final @NonNull P4 prefix) {
+    public final @NonNull Ipv4AddressNoZone ipv4AddressFrom(final @NonNull Ipv4Prefix prefix) {
         return prefixToAddress(address4NoZoneFactory, ipv4PrefixString(prefix));
     }
 
-    public final byte @NonNull[] ipv4AddressBytes(final @NonNull A4 addr) {
+    public final byte @NonNull[] ipv4AddressBytes(final @NonNull Ipv4Address addr) {
         /*
          * This implementation relies heavily on the input string having been validated to comply with
          * the Ipv4Address pattern, which may include a zone index.
@@ -284,13 +278,13 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
         return Ipv4Utils.addressBytes(str, percent == -1 ? str.length() : percent);
     }
 
-    public final int ipv4AddressBits(final @NonNull A4 addr) {
+    public final int ipv4AddressBits(final @NonNull Ipv4Address addr) {
         final String str = ipv4AddressString(addr);
         final int percent = str.indexOf('%');
         return Ipv4Utils.addressBits(str, percent == -1 ? str.length() : percent);
     }
 
-    public final byte @NonNull[] ipv4AddressNoZoneBytes(final @NonNull A4NZ addr) {
+    public final byte @NonNull[] ipv4AddressNoZoneBytes(final @NonNull Ipv4AddressNoZone addr) {
         /*
          * This implementation relies heavily on the input string having been validated to comply with
          * the Ipv4AddressNoZone pattern, which must not include a zone index.
@@ -299,7 +293,7 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
         return Ipv4Utils.addressBytes(str, str.length());
     }
 
-    public final int ipv4AddressNoZoneBits(final @NonNull A4NZ addr) {
+    public final int ipv4AddressNoZoneBits(final @NonNull Ipv4AddressNoZone addr) {
         final String str = ipv4AddressString(addr);
         return Ipv4Utils.addressBits(str, str.length());
     }
@@ -312,7 +306,7 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
      * @throws IllegalArgumentException if bytes has length different from 4
      * @throws NullPointerException if bytes is null
      */
-    public final @NonNull P4 ipv4PrefixFor(final byte @NonNull[] bytes) {
+    public final @NonNull Ipv4Prefix ipv4PrefixFor(final byte @NonNull[] bytes) {
         return prefix4Factory.newInstance(prefixStringV4(bytes));
     }
 
@@ -328,7 +322,7 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
      * @throws IllegalArgumentException if bytes has length different from 4 or if mask is not in range 0-32
      * @throws NullPointerException if bytes is null
      */
-    public final @NonNull P4 ipv4PrefixFor(final byte @NonNull[] address, final int mask) {
+    public final @NonNull Ipv4Prefix ipv4PrefixFor(final byte @NonNull[] address, final int mask) {
         return prefix4Factory.newInstance(prefixStringV4(address, mask));
     }
 
@@ -340,7 +334,7 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
      * @throws IllegalArgumentException if addr is not an Inet4Address
      * @throws NullPointerException if addr is null
      */
-    public final @NonNull P4 ipv4PrefixFor(final @NonNull InetAddress addr) {
+    public final @NonNull Ipv4Prefix ipv4PrefixFor(final @NonNull InetAddress addr) {
         return prefix4Factory.newInstance(addressStringV4(addr) + "/32");
     }
 
@@ -353,27 +347,27 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
      * @throws IllegalArgumentException if addr is not an Inet4Address or if mask is not in range 0-32
      * @throws NullPointerException if addr is null
      */
-    public final @NonNull P4 ipv4PrefixFor(final @NonNull InetAddress addr, final int mask) {
+    public final @NonNull Ipv4Prefix ipv4PrefixFor(final @NonNull InetAddress addr, final int mask) {
         return newIpv4Prefix(addressStringV4(addr), mask);
     }
 
-    public final @NonNull P4 ipv4PrefixFor(final @NonNull A4 addr) {
+    public final @NonNull Ipv4Prefix ipv4PrefixFor(final @NonNull Ipv4Address addr) {
         return prefix4Factory.newInstance(stripZone(ipv4AddressString(requireAddress(addr))) + "/32");
     }
 
-    public final @NonNull P4 ipv4PrefixFor(final @NonNull A4 addr, final int mask) {
+    public final @NonNull Ipv4Prefix ipv4PrefixFor(final @NonNull Ipv4Address addr, final int mask) {
         return newIpv4Prefix(stripZone(ipv4AddressString(requireAddress(addr))), mask);
     }
 
-    public final @NonNull P4 ipv4PrefixForNoZone(final @NonNull A4NZ addr) {
+    public final @NonNull Ipv4Prefix ipv4PrefixForNoZone(final @NonNull Ipv4AddressNoZone addr) {
         return prefix4Factory.newInstance(ipv4AddressString(requireAddress(addr)) + "/32");
     }
 
-    public final @NonNull P4 ipv4PrefixForNoZone(final @NonNull A4NZ addr, final int mask) {
+    public final @NonNull Ipv4Prefix ipv4PrefixForNoZone(final @NonNull Ipv4AddressNoZone addr, final int mask) {
         return newIpv4Prefix(ipv4AddressString(requireAddress(addr)), mask);
     }
 
-    public final @NonNull P4 ipv4PrefixForShort(final byte @NonNull[] address, final int mask) {
+    public final @NonNull Ipv4Prefix ipv4PrefixForShort(final byte @NonNull[] address, final int mask) {
         if (mask == 0) {
             // Easy case, reuse the template
             return prefix4Factory.getTemplate();
@@ -382,7 +376,8 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
         return v4PrefixForShort(address, 0, mask / Byte.SIZE + (mask % Byte.SIZE == 0 ? 0 : 1), mask);
     }
 
-    public final @NonNull P4 ipv4PrefixForShort(final byte @NonNull[] array, final int startOffset, final int mask) {
+    public final @NonNull Ipv4Prefix ipv4PrefixForShort(final byte @NonNull[] array, final int startOffset,
+            final int mask) {
         if (mask == 0) {
             // Easy case, reuse the template
             return prefix4Factory.getTemplate();
@@ -396,16 +391,16 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
         return percent == -1 ? str : str.substring(0, percent);
     }
 
-    private @NonNull P4 newIpv4Prefix(final String addr, final int mask) {
+    private @NonNull Ipv4Prefix newIpv4Prefix(final String addr, final int mask) {
         checkArgument(mask >= 0 && mask <= 32, "Invalid mask %s", mask);
         return prefix4Factory.newInstance(addr + '/' + mask);
     }
 
-    public final @NonNull Entry<A4NZ, Integer> splitIpv4Prefix(final @NonNull P4 prefix) {
+    public final @NonNull Entry<Ipv4AddressNoZone, Integer> splitIpv4Prefix(final @NonNull Ipv4Prefix prefix) {
         return splitPrefix(address4NoZoneFactory, ipv4PrefixString(prefix));
     }
 
-    public final byte @NonNull[] ipv4PrefixToBytes(final @NonNull P4 prefix) {
+    public final byte @NonNull[] ipv4PrefixToBytes(final @NonNull Ipv4Prefix prefix) {
         final String str = ipv4PrefixString(prefix);
         final int slash = str.lastIndexOf('/');
 
@@ -423,7 +418,7 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
      * @throws IllegalArgumentException if bytes has length different from 16
      * @throws NullPointerException if bytes is null
      */
-    public final @NonNull A6NZ ipv6AddressFor(final byte @NonNull[] bytes) {
+    public final @NonNull Ipv6AddressNoZone ipv6AddressFor(final byte @NonNull[] bytes) {
         return address6NoZoneFactory.newInstance(addressStringV6(bytes));
     }
 
@@ -435,7 +430,7 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
      * @throws IllegalArgumentException if addr is not an {@link Inet6Address}
      * @throws NullPointerException if addr is null
      */
-    public final @NonNull A6NZ ipv6AddressFor(final @NonNull InetAddress addr) {
+    public final @NonNull Ipv6AddressNoZone ipv6AddressFor(final @NonNull InetAddress addr) {
         return address6NoZoneFactory.newInstance(addressStringV6(addr));
     }
 
@@ -446,23 +441,23 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
      * @return An Ipv6AddressNoZone object
      * @throws NullPointerException if addr is null
      */
-    public final @NonNull A6NZ ipv6AddressNoZoneFor(final @NonNull A6 addr) {
+    public final @NonNull Ipv6AddressNoZone ipv6AddressNoZoneFor(final @NonNull Ipv6Address addr) {
         requireAddress(addr);
-        return addr6nzClass.isInstance(addr) ? addr6nzClass.cast(addr)
+        return addr instanceof Ipv6AddressNoZone noZone ? noZone
                 : address6NoZoneFactory.newInstance(stripZone(ipv6AddressString(addr)));
     }
 
-    public final @NonNull A6NZ ipv6AddressFrom(final @NonNull P6 prefix) {
+    public final @NonNull Ipv6AddressNoZone ipv6AddressFrom(final @NonNull Ipv6Prefix prefix) {
         return prefixToAddress(address6NoZoneFactory, ipv6PrefixString(prefix));
     }
 
-    public final byte @NonNull[] ipv6AddressBytes(final @NonNull A6 addr) {
+    public final byte @NonNull[] ipv6AddressBytes(final @NonNull Ipv6Address addr) {
         final String str = ipv6AddressString(addr);
         final int percent = str.indexOf('%');
         return ipv6StringBytes(str, percent == -1 ? str.length() : percent);
     }
 
-    public final byte @NonNull[] ipv6AddressNoZoneBytes(final @NonNull A6NZ addr) {
+    public final byte @NonNull[] ipv6AddressNoZoneBytes(final @NonNull Ipv6Address addr) {
         final String str = ipv6AddressString(addr);
         return ipv6StringBytes(str, str.length());
     }
@@ -481,7 +476,7 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
      * @throws IllegalArgumentException if bytes has length different from 16
      * @throws NullPointerException if bytes is null
      */
-    public final @NonNull P6 ipv6PrefixFor(final byte @NonNull[] bytes) {
+    public final @NonNull Ipv6Prefix ipv6PrefixFor(final byte @NonNull[] bytes) {
         return prefix6Factory.newInstance(addressStringV6(bytes) + "/128");
     }
 
@@ -496,7 +491,7 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
      * @throws IllegalArgumentException if bytes has length different from 16 or if mask is not in range 0-128
      * @throws NullPointerException if bytes is null
      */
-    public final @NonNull P6 ipv6PrefixFor(final byte @NonNull[] address, final int mask) {
+    public final @NonNull Ipv6Prefix ipv6PrefixFor(final byte @NonNull[] address, final int mask) {
         checkArgument(mask >= 0 && mask <= 128, "Invalid mask %s", mask);
         return prefix6Factory.newInstance(addressStringV6(address) + '/' + mask);
     }
@@ -509,7 +504,7 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
      * @throws IllegalArgumentException if addr is not an Inet6Address
      * @throws NullPointerException if addr is null
      */
-    public final @NonNull P6 ipv6PrefixFor(final @NonNull InetAddress addr) {
+    public final @NonNull Ipv6Prefix ipv6PrefixFor(final @NonNull InetAddress addr) {
         return prefix6Factory.newInstance(addressStringV6(addr) + "/128");
     }
 
@@ -524,32 +519,33 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
      * @throws IllegalArgumentException if addr is not an Inet6Address or if mask is not in range 0-128
      * @throws NullPointerException if addr is null
      */
-    public final @NonNull P6 ipv6PrefixFor(final @NonNull InetAddress addr, final int mask) {
+    public final @NonNull Ipv6Prefix ipv6PrefixFor(final @NonNull InetAddress addr, final int mask) {
         checkArgument(mask >= 0 && mask <= 128, "Invalid mask %s", mask);
         return prefix6Factory.newInstance(addressStringV6(addr) + '/' + mask);
     }
 
-    public final @NonNull P6 ipv6PrefixFor(final @NonNull A6 addr) {
+    public final @NonNull Ipv6Prefix ipv6PrefixFor(final @NonNull Ipv6Address addr) {
         return prefix6Factory.newInstance(stripZone(ipv6AddressString(requireAddress(addr))) + "/128");
     }
 
-    public final @NonNull P6 ipv6PrefixFor(final @NonNull A6 addr, final int mask) {
+    public final @NonNull Ipv6Prefix ipv6PrefixFor(final @NonNull Ipv6Address addr, final int mask) {
         return newIpv6Prefix(stripZone(ipv6AddressString(requireAddress(addr))), mask);
     }
 
-    public final @NonNull P6 ipv6PrefixForNoZone(final @NonNull A6NZ addr) {
+    public final @NonNull Ipv6Prefix ipv6PrefixForNoZone(final @NonNull Ipv6AddressNoZone addr) {
         return prefix6Factory.newInstance(ipv6AddressString(requireAddress(addr)) + "/128");
     }
 
-    public final @NonNull P6 ipv6PrefixForNoZone(final @NonNull A6NZ addr, final int mask) {
+    public final @NonNull Ipv6Prefix ipv6PrefixForNoZone(final @NonNull Ipv6AddressNoZone addr, final int mask) {
         return newIpv6Prefix(ipv6AddressString(requireAddress(addr)), mask);
     }
 
-    public final @NonNull P6 ipv6PrefixForShort(final byte @NonNull[] address, final int mask) {
+    public final @NonNull Ipv6Prefix ipv6PrefixForShort(final byte @NonNull[] address, final int mask) {
         return ipv6PrefixForShort(address, 0, mask);
     }
 
-    public final @NonNull P6 ipv6PrefixForShort(final byte @NonNull[] array, final int startOffset, final int mask) {
+    public final @NonNull Ipv6Prefix ipv6PrefixForShort(final byte @NonNull[] array, final int startOffset,
+            final int mask) {
         if (mask == 0) {
             // Easy case, reuse the template
             return prefix6Factory.getTemplate();
@@ -564,12 +560,12 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
         return ipv6PrefixFor(tmp, mask);
     }
 
-    private P6 newIpv6Prefix(final String addr, final int mask) {
+    private Ipv6Prefix newIpv6Prefix(final String addr, final int mask) {
         checkArgument(mask >= 0 && mask <= 128, "Invalid mask %s", mask);
         return prefix6Factory.newInstance(addr + '/' + mask);
     }
 
-    public final @NonNull Entry<A6NZ, Integer> splitIpv6Prefix(final @NonNull P6 prefix) {
+    public final @NonNull Entry<Ipv6AddressNoZone, Integer> splitIpv6Prefix(final @NonNull Ipv6Prefix prefix) {
         return splitPrefix(address6NoZoneFactory, ipv6PrefixString(prefix));
     }
 
@@ -584,7 +580,7 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
                 Integer.valueOf(str.substring(slash + 1)));
     }
 
-    public final byte @NonNull[] ipv6PrefixToBytes(final @NonNull P6 prefix) {
+    public final byte @NonNull[] ipv6PrefixToBytes(final @NonNull Ipv6Prefix prefix) {
         final String str = ipv6PrefixString(prefix);
         final byte[] bytes = new byte[Ipv6Utils.INET6_LENGTH + 1];
         final int slash = str.lastIndexOf('/');
@@ -633,7 +629,8 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
         return sb.append('/').append(mask).toString();
     }
 
-    private P4 v4PrefixForShort(final byte @NonNull[] array, final int startOffset, final int size, final int mask) {
+    private @NonNull Ipv4Prefix v4PrefixForShort(final byte @NonNull[] array, final int startOffset, final int size,
+            final int mask) {
         if (startOffset == 0 && size == Ipv4Utils.INET4_LENGTH && array.length == Ipv4Utils.INET4_LENGTH) {
             // Easy case, fall back to non-short
             return ipv4PrefixFor(array, mask);
@@ -659,14 +656,14 @@ public abstract class AbstractIetfInetUtil<A4, A4NZ extends A4, P4, A6, A6NZ ext
         return prefix4Factory.newInstance(sb.toString());
     }
 
-    private @NonNull A6 coerceIpv6Address(final @NonNull A addr) {
-        final A6 ret = maybeIpv6Address(addr);
+    private @NonNull Ipv6Address coerceIpv6Address(final @NonNull IpAddress addr) {
+        final var ret = maybeIpv6Address(addr);
         checkArgument(ret != null, "Address %s is neither IPv4 nor IPv6", addr);
         return ret;
     }
 
-    private @NonNull A6NZ coerceIpv6AddressNoZone(final @NonNull ANZ addr) {
-        final A6NZ ret = maybeIpv6AddressNoZone(addr);
+    private @NonNull Ipv6AddressNoZone coerceIpv6AddressNoZone(final @NonNull IpAddressNoZone addr) {
+        final var ret = maybeIpv6AddressNoZone(addr);
         checkArgument(ret != null, "Address %s is neither IPv4 nor IPv6", addr);
         return ret;
     }
index 7281e1318e6a1c17349f5f321a4196fc39d35163..4201217bdc1fd3e3a2af5fa07d2e58464894656e 100644 (file)
@@ -15,14 +15,12 @@ import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.mdsal.model.ietf.util.AbstractIetfInetUtil;
 
 /**
  * A set of utility methods to efficiently instantiate various ietf-inet-types DTOs.
  */
 @Beta
-public final class IetfInetUtil extends AbstractIetfInetUtil<Ipv4Address, Ipv4AddressNoZone, Ipv4Prefix, Ipv6Address,
-        Ipv6AddressNoZone, Ipv6Prefix, IpAddress, IpAddressNoZone, IpPrefix> {
+public final class IetfInetUtil extends AbstractIetfInetUtil {
     public static final @NonNull IetfInetUtil INSTANCE = new IetfInetUtil();
 
     private static final Pattern HOST_IPV4_PATTERN = Pattern.compile(
@@ -53,7 +51,7 @@ public final class IetfInetUtil extends AbstractIetfInetUtil<Ipv4Address, Ipv4Ad
     }
 
     private IetfInetUtil() {
-        super(Ipv4AddressNoZone.class, Ipv4Prefix.class, Ipv6AddressNoZone.class, Ipv6Prefix.class);
+        // Hidden on purpose
     }
 
     @Beta
index fd48a656ed15d87f70789565959d9cf101385bd1..fb9fb564975d3797f21dad2c05a81c854f60c7ea 100644 (file)
@@ -7,35 +7,37 @@
  */
 package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715;
 
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertThrows;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil.INSTANCE;
 
-import java.lang.reflect.Constructor;
+import com.google.common.net.InetAddresses;
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Map;
 import org.junit.Test;
 
 public class IetfInetUtilTest {
-
-    @Test
-    public void testIetfInetUtilConstructor() throws Exception {
-        final Constructor<IetfInetUtil> constructor = IetfInetUtil.class.getDeclaredConstructor();
-        assertFalse(constructor.isAccessible());
-        constructor.setAccessible(true);
-
-        final IetfInetUtil newInstance = constructor.newInstance();
-        assertNotNull(newInstance);
-    }
-
     @Test
     public void testIpv4Address() {
         final Ipv4AddressNoZone ipv4Address = new Ipv4AddressNoZone("192.168.1.1");
         final Ipv4Prefix ipv4Prefix = new Ipv4Prefix("192.0.2.1/24");
-        final IpAddress ipAddress = IetfInetUtil.INSTANCE.ipv4Address(ipv4Address);
-        final String ipv4AddressString = IetfInetUtil.INSTANCE.ipv4AddressString(ipv4Address);
-        final Ipv4Address maybeIpv4Address = IetfInetUtil.INSTANCE.maybeIpv4Address(new IpAddress(ipv4Address));
-        final IpPrefix ipPrefix = IetfInetUtil.INSTANCE.ipv4Prefix(ipv4Prefix);
-        final String ipv4PrefixString = IetfInetUtil.INSTANCE.ipv4PrefixString(ipv4Prefix);
+        final IpAddress ipAddress = INSTANCE.ipv4Address(ipv4Address);
+        final String ipv4AddressString = INSTANCE.ipv4AddressString(ipv4Address);
+        final Ipv4Address maybeIpv4Address = INSTANCE.maybeIpv4Address(new IpAddress(ipv4Address));
+        final IpPrefix ipPrefix = INSTANCE.ipv4Prefix(ipv4Prefix);
+        final String ipv4PrefixString = INSTANCE.ipv4PrefixString(ipv4Prefix);
 
         assertEquals(ipv4PrefixString, ipPrefix.getIpv4Prefix().getValue());
         assertNotNull(maybeIpv4Address);
@@ -47,11 +49,11 @@ public class IetfInetUtilTest {
     public void testIpv6Address() {
         final Ipv6AddressNoZone ipv6Address = new Ipv6AddressNoZone("ABCD:EF01:2345:6789:ABCD:EF01:2345:6789");
         final Ipv6Prefix ipv6Prefix = new Ipv6Prefix("ff00::/8");
-        final IpAddress ipAddress = IetfInetUtil.INSTANCE.ipv6Address(ipv6Address);
-        final String ipv6AddressString = IetfInetUtil.INSTANCE.ipv6AddressString(ipv6Address);
-        final Ipv6Address maybeIpv6Address = IetfInetUtil.INSTANCE.maybeIpv6Address(new IpAddress(ipv6Address));
-        final IpPrefix ipPrefix = IetfInetUtil.INSTANCE.ipv6Prefix(ipv6Prefix);
-        final String ipv6PrefixString = IetfInetUtil.INSTANCE.ipv6PrefixString(ipv6Prefix);
+        final IpAddress ipAddress = INSTANCE.ipv6Address(ipv6Address);
+        final String ipv6AddressString = INSTANCE.ipv6AddressString(ipv6Address);
+        final Ipv6Address maybeIpv6Address = INSTANCE.maybeIpv6Address(new IpAddress(ipv6Address));
+        final IpPrefix ipPrefix = INSTANCE.ipv6Prefix(ipv6Prefix);
+        final String ipv6PrefixString = INSTANCE.ipv6PrefixString(ipv6Prefix);
 
         assertEquals(ipv6PrefixString, ipPrefix.getIpv6Prefix().getValue());
         assertNotNull(maybeIpv6Address);
@@ -61,31 +63,225 @@ public class IetfInetUtilTest {
 
     @Test
     public void testAddressToString() {
-        assertEquals(new Ipv4Prefix("1.2.3.4/8"), IetfInetUtil.INSTANCE.ipv4PrefixFor(new Ipv4Address("1.2.3.4%1"), 8));
-        assertEquals(new Ipv6Prefix("ff00::/8"), IetfInetUtil.INSTANCE.ipv6PrefixFor(new Ipv6Address("ff00::%bar"), 8));
+        assertEquals(new Ipv4Prefix("1.2.3.4/8"), INSTANCE.ipv4PrefixFor(new Ipv4Address("1.2.3.4%1"), 8));
+        assertEquals(new Ipv6Prefix("ff00::/8"), INSTANCE.ipv6PrefixFor(new Ipv6Address("ff00::%bar"), 8));
     }
 
     @Test
     public void testIpv4ZoneStripping() {
         final Ipv4AddressNoZone noZone = new Ipv4AddressNoZone("1.2.3.4");
-        assertSame(noZone, IetfInetUtil.INSTANCE.ipv4AddressNoZoneFor(noZone));
+        assertSame(noZone, INSTANCE.ipv4AddressNoZoneFor(noZone));
 
         final Ipv4Address withoutZone = new Ipv4Address(noZone);
-        final Ipv4AddressNoZone stripped = IetfInetUtil.INSTANCE.ipv4AddressNoZoneFor(withoutZone);
+        final Ipv4AddressNoZone stripped = INSTANCE.ipv4AddressNoZoneFor(withoutZone);
         assertSame(withoutZone.getValue(), stripped.getValue());
 
-        assertEquals(noZone, IetfInetUtil.INSTANCE.ipv4AddressNoZoneFor(new Ipv4Address("1.2.3.4%1")));
+        assertEquals(noZone, INSTANCE.ipv4AddressNoZoneFor(new Ipv4Address("1.2.3.4%1")));
     }
 
     @Test
     public void testIpv6ZoneStripping() {
         final Ipv6AddressNoZone noZone = new Ipv6AddressNoZone("ff00::");
-        assertSame(noZone, IetfInetUtil.INSTANCE.ipv6AddressNoZoneFor(noZone));
+        assertSame(noZone, INSTANCE.ipv6AddressNoZoneFor(noZone));
 
         final Ipv6Address withoutZone = new Ipv6Address(noZone);
-        final Ipv6AddressNoZone stripped = IetfInetUtil.INSTANCE.ipv6AddressNoZoneFor(withoutZone);
+        final Ipv6AddressNoZone stripped = INSTANCE.ipv6AddressNoZoneFor(withoutZone);
         assertSame(withoutZone.getValue(), stripped.getValue());
 
-        assertEquals(noZone, IetfInetUtil.INSTANCE.ipv6AddressNoZoneFor(new Ipv6Address("ff00::%1")));
+        assertEquals(noZone, INSTANCE.ipv6AddressNoZoneFor(new Ipv6Address("ff00::%1")));
+    }
+
+    @Test
+    public void testIpToBytesAndBack() {
+        assertV4Equals("1.2.3.4");
+        assertV4Equals("12.23.34.45");
+        assertV4Equals("255.254.253.252");
+        assertV4Equals("128.16.0.127");
+
+        assertV4Equals("1.2.3.4", "%5");
+        assertV4Equals("12.23.34.45", "%5");
+        assertV4Equals("255.254.253.252", "%5");
+        assertV4Equals("128.16.0.127", "%5");
+
+        assertEquals(new IpAddress(new Ipv4Address("1.2.3.4")),
+            INSTANCE.ipAddressFor(INSTANCE.ipv4AddressBytes(new Ipv4Address("1.2.3.4"))));
+        assertNotEquals(new IpAddress(new Ipv4Address("2.3.4.5")),
+            INSTANCE.ipAddressFor(INSTANCE.ipv4AddressBytes(new Ipv4Address("1.2.3.4"))));
+
+        assertEquals(new IpAddress(new Ipv6Address("fe80::2002:b3ff:fe1e:8329")),
+            INSTANCE.ipAddressFor(INSTANCE.ipv6AddressBytes(new Ipv6Address("FE80::2002:B3FF:FE1E:8329"))));
+        assertNotEquals(new IpAddress(new Ipv6Address("feff::2002:b3ff:fe1e:8329")),
+            INSTANCE.ipAddressFor(INSTANCE.ipv6AddressBytes(new Ipv6Address("FE80::2002:B3FF:FE1E:8329"))));
+
+        assertEquals(new IpAddress(new Ipv4Address("1.2.3.4")),
+            INSTANCE.ipAddressFor(INSTANCE.inetAddressFor(new IpAddress(new Ipv4Address("1.2.3.4")))));
+        assertNotEquals(new IpAddress(new Ipv4Address("2.3.4.5")),
+            INSTANCE.ipAddressFor(INSTANCE.inetAddressFor(new IpAddress(new Ipv4Address("1.2.3.4")))));
+
+        assertEquals(new IpAddress(new Ipv6Address("fe80::2002:b3ff:fe1e:8329")),
+            INSTANCE.ipAddressFor(INSTANCE.inetAddressFor(
+                new IpAddress(new Ipv6Address("FE80::2002:B3FF:FE1E:8329")))));
+        assertNotEquals(new IpAddress(new Ipv6Address("FEFF::2002:B3FF:FE1E:8329")),
+            INSTANCE.ipAddressFor(INSTANCE.inetAddressFor(
+                new IpAddress(new Ipv6Address("FE80::2002:B3FF:FE1E:8329")))));
+    }
+
+    @Test
+    public void illegalArrayLengthForAddressTest() {
+        final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
+            () -> INSTANCE.ipAddressFor(new byte[] { 0, 0, 0 }));
+        assertEquals("Invalid array length 3", ex.getMessage());
+    }
+
+    @Test
+    public void unhandledAddressTest() {
+        final InetAddress adr = mock(InetAddress.class);
+        doReturn("testAddress").when(adr).toString();
+        final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
+            () -> INSTANCE.ipAddressFor(adr));
+        assertEquals("Unhandled address testAddress", ex.getMessage());
+    }
+
+    @Test
+    public void illegalArrayLengthforPrefixTest() {
+        final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
+            () -> INSTANCE.ipPrefixFor(new byte[] { 0, 0, 0 }, 0));
+        assertEquals("Invalid array length 3", ex.getMessage());
+    }
+
+    @Test
+    public void illegalAddressforPrefixTest() {
+        final InetAddress adr = mock(InetAddress.class);
+        doReturn("testAddress").when(adr).toString();
+
+        final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
+            () -> INSTANCE.ipPrefixFor(adr, 0));
+        assertEquals("Unhandled address testAddress", ex.getMessage());
     }
+
+    @Test
+    public void ipv4Tests() {
+        assertEquals("1.2.3.4", INSTANCE.ipv4AddressFrom(new Ipv4Prefix("1.2.3.4/16")).getValue());
+        final var ipv4address = new Ipv4Address("1.2.3.4");
+        final var ipAddress = new IpAddress(ipv4address);
+        assertEquals("1.2.3.4/32", INSTANCE.ipv4PrefixFor(INSTANCE.ipv4AddressBytes(ipv4address)).getValue());
+        assertEquals("1.2.3.4/32", INSTANCE.ipv4PrefixFor(INSTANCE.inetAddressFor(ipAddress)).getValue());
+        assertEquals("1.2.3.4/32", INSTANCE.ipv4PrefixFor(ipv4address).getValue());
+        assertEquals("1.2.3.4/16", INSTANCE.ipv4PrefixFor(ipv4address, 16).getValue());
+
+        assertEquals("0.0.0.0/0", INSTANCE.ipv4PrefixForShort(INSTANCE.ipv4AddressBytes(ipv4address), 0).getValue());
+        assertEquals("1.2.3.4/32", INSTANCE.ipv4PrefixForShort(INSTANCE.ipv4AddressBytes(ipv4address), 32).getValue());
+        assertEquals("0.0.0.0/0", INSTANCE.ipv4PrefixForShort(INSTANCE.ipv4AddressBytes(ipv4address), 0, 0).getValue());
+        assertEquals("1.2.3.4/32",
+            INSTANCE.ipv4PrefixForShort(INSTANCE.ipv4AddressBytes(ipv4address), 0, 32).getValue());
+        assertEquals("2.3.4.5/32", INSTANCE.ipv4PrefixForShort(new byte[] { 1, 2, 3, 4, 5 }, 1, 32).getValue());
+        assertEquals("1.0.0.0/1", INSTANCE.ipv4PrefixForShort(new byte[] { 1, 2, 3, 4, 5 }, 0, 1).getValue());
+
+        final var ipv4Prefix = new Ipv4Prefix("1.2.3.4/16");
+        assertEquals("1.2.3.4", INSTANCE.splitIpv4Prefix(ipv4Prefix).getKey().getValue());
+        assertEquals((Integer) 16, INSTANCE.splitIpv4Prefix(ipv4Prefix).getValue());
+        assertArrayEquals(new byte[] { 1,2,3,4,16 }, INSTANCE.ipv4PrefixToBytes(ipv4Prefix));
+    }
+
+    @Test
+    public void ipv6Tests() {
+        assertEquals("::0", INSTANCE.ipv6AddressFrom(new Ipv6Prefix("::0/128")).getValue());
+        final var ipv6address = new Ipv6Address("::0");
+        final var ipAddress = new IpAddress(ipv6address);
+
+        assertEquals("::/128", INSTANCE.ipv6PrefixFor(INSTANCE.ipv6AddressBytes(ipv6address)).getValue());
+        assertEquals("::/128", INSTANCE.ipv6PrefixFor(INSTANCE.inetAddressFor(ipAddress)).getValue());
+        assertEquals("::0/128", INSTANCE.ipv6PrefixFor(ipv6address).getValue());
+        assertEquals("::0/16", INSTANCE.ipv6PrefixFor(ipv6address, 16).getValue());
+
+        assertEquals("::0/0", INSTANCE.ipv6PrefixForShort(INSTANCE.ipv6AddressBytes(ipv6address), 0).getValue());
+        assertEquals("::/64", INSTANCE.ipv6PrefixForShort(INSTANCE.ipv6AddressBytes(ipv6address), 64).getValue());
+        assertEquals("::0/0", INSTANCE.ipv6PrefixForShort(INSTANCE.ipv6AddressBytes(ipv6address), 0, 0).getValue());
+        assertEquals("::/32", INSTANCE.ipv6PrefixForShort(INSTANCE.ipv6AddressBytes(ipv6address), 0, 32).getValue());
+
+        assertEquals(Map.entry(new Ipv6Address("::"), 32), INSTANCE.splitIpv6Prefix(new Ipv6Prefix("::/32")));
+        assertArrayEquals(new byte[] { 0, 10, 0, 0, 0, 0, 0, 0, 0, 11, 0, 12, 0, 13, 0, 14, 64 },
+            INSTANCE.ipv6PrefixToBytes(new Ipv6Prefix("A::B:C:D:E/64")));
+
+        // verify that an IPv4-mapped IPv6 address gets parsed as an IPv6 address
+        assertEquals("::ffff:ab0:eb", INSTANCE.ipv6AddressFor(
+                new byte[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (byte) 0xff, (byte) 0xff, 0x0a, (byte) 0xb0, 0, (byte) 0xeb})
+                .getValue());
+    }
+
+    @Test
+    public void prefixTest() {
+        assertEquals(new IpPrefix(new Ipv4Prefix("0.0.0.0/16")),
+            INSTANCE.ipPrefixFor(INSTANCE.inetAddressFor(new IpAddress(new Ipv4Address("0.0.0.0"))), 16));
+        assertEquals(new IpPrefix(new Ipv6Prefix("::/64")),
+            INSTANCE.ipPrefixFor(INSTANCE.inetAddressFor(new IpAddress(new Ipv6Address("::"))), 64));
+
+        assertEquals(new IpPrefix(new Ipv4Prefix("0.0.0.0/16")),
+            INSTANCE.ipPrefixFor(new byte[] { 0, 0, 0, 0 }, 16));
+        assertEquals(new IpPrefix(new Ipv6Prefix("::/64")),
+            INSTANCE.ipPrefixFor(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 64));
+    }
+
+    @Test
+    public void inetAddressTest() {
+        assertThat(INSTANCE.inetAddressFor(new IpAddress(new Ipv4Address("1.2.3.4"))),
+            instanceOf(Inet4Address.class));
+        assertThat(INSTANCE.inetAddressFor(new IpAddress(new Ipv6Address("FE80::2002:B3FF:FE1E:8329"))),
+            instanceOf(Inet6Address.class));
+    }
+
+    @Test
+    public void inet4AddressForWithExceptionTest() {
+        final Ipv4Address ipClass = mock(Ipv4Address.class);
+        doReturn("testClass").when(ipClass).toString();
+        doAnswer(inv -> {
+            throw new UnknownHostException();
+        }).when(ipClass).getValue();
+
+        final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
+            () -> INSTANCE.inet4AddressFor(ipClass));
+        assertEquals("Invalid address testClass", ex.getMessage());
+    }
+
+    @Test
+    public void inet6AddressForWithExceptionTest() {
+        final Ipv6Address ipClass = mock(Ipv6Address.class);
+        doReturn("testClass").when(ipClass).toString();
+        doAnswer(inv -> {
+            throw new UnknownHostException();
+        }).when(ipClass).getValue();
+
+        final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
+            () -> INSTANCE.inet6AddressFor(ipClass));
+        assertEquals("Invalid address testClass", ex.getMessage());
+    }
+
+    @Test
+    public void testIpv4AddressForBits() {
+        assertEquals("1.2.3.4", INSTANCE.ipv4AddressFor(0x01020304).getValue());
+        assertEquals("255.255.255.255", INSTANCE.ipv4AddressFor(0xFFFFFFFF).getValue());
+    }
+
+    @Test
+    public void testIpv4AddressBits() {
+        assertEquals(0x01020304, INSTANCE.ipv4AddressBits(new Ipv4Address("1.2.3.4")));
+        assertEquals(0xFFFFFFFF, INSTANCE.ipv4AddressBits(new Ipv4Address("255.255.255.255")));
+    }
+
+    @Test
+    public void testIpv4AddressNoZoneBits() {
+        assertEquals(0x01020304, INSTANCE.ipv4AddressNoZoneBits(new Ipv4AddressNoZone("1.2.3.4")));
+        assertEquals(0xFFFFFFFF, INSTANCE.ipv4AddressNoZoneBits(new Ipv4AddressNoZone("255.255.255.255")));
+    }
+
+    private static void assertV4Equals(final String literal, final String append) {
+        final byte[] expected = InetAddresses.forString(literal).getAddress();
+        final byte[] actual = INSTANCE.ipv4AddressBytes(new Ipv4Address(literal + append));
+        assertArrayEquals(expected, actual);
+    }
+
+    private static void assertV4Equals(final String literal) {
+        assertV4Equals(literal, "");
+    }
+
 }