Fix Ipv6 format compression 43/43643/3
authorAndrej Leitner <andrej.leitner@pantheon.tech>
Wed, 10 Aug 2016 15:07:15 +0000 (17:07 +0200)
committerAndrej Leitner <andrej.leitner@pantheon.sk>
Thu, 11 Aug 2016 12:04:56 +0000 (12:04 +0000)
 - removed regex and replaced with existing methods
 - altered method that compresses Ipv6Address to take it
   as argument and not to accept any string
 - used Ipv6Address instead of String
 - updated IpConversionUtilTest
 - fixed yang descriptions

Change-Id: I303d3f3c68bf463de9f017e0e65ec36adaf4e489
Signed-off-by: Andrej Leitner <andrej.leitner@pantheon.tech>
Signed-off-by: Tomas Slusny <tomas.slusny@pantheon.sk>
model/model-flow-base/src/main/yang/opendaylight-arbitrary-bitmask-fields.yang
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/common/IpConversionUtil.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6DstCase.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/cases/OfToSalIpv6SrcCase.java
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/common/IpConversionUtilTest.java

index a1fc528d4338c1194e28ff434a138fe4c7703f66..4f1692d08273772d6c55796c1140027ff152102a 100644 (file)
@@ -12,7 +12,7 @@ module opendaylight-arbitrary-bitmask-fields {
     grouping "ipv4-match-arbitrary-bitmask-fields" {
 
         leaf ipv4-source-address-no-mask {
-            description "IPv4 source address with no mask .";
+            description "IPv4 source address with no mask.";
             type inet:ipv4-address;
         }
 
@@ -22,12 +22,12 @@ module opendaylight-arbitrary-bitmask-fields {
         }
 
         leaf ipv4-source-arbitrary-bitmask {
-            description "IPv4 source address with no mask .";
+            description "Arbitrary bit mask of IPv4 source address.";
             type yang:dotted-quad;
         }
 
         leaf ipv4-destination-arbitrary-bitmask {
-            description "IPv4 destination address with no mask.";
+            description "Arbitrary bit mask of IPv4 destination address.";
             type yang:dotted-quad;
         }
     }
index ea4815a16c991df10a8bbc786ff20d30b398ea52..689f5a3fe4216102b3ba59aa61af79161512b5e9 100644 (file)
@@ -24,7 +24,6 @@ import java.util.Arrays;
 import java.util.BitSet;
 import java.util.Iterator;
 import java.util.List;
-
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
@@ -35,12 +34,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.opendaylight.ipv6.arbitrary
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-
-/**
- * Created by Martin Bobak &lt;mbobak@cisco.com&gt; on 5.3.2015.
- * v6 routines added by Anton Ivanov on 14.6.2015
- * Arbitrary masks by sai.marapareddy@gmail.com
- */
 public final class IpConversionUtil {
 
     private static final Logger LOG = LoggerFactory.getLogger(IpConversionUtil.class);
@@ -234,8 +227,6 @@ public final class IpConversionUtil {
      * @param ipv6Address - v6 Address object
      * @return - byte array of size 16. Last byte contains netmask
      */
-
-
     public static byte[] canonicalBinaryV6Address(final Ipv6Address ipv6Address) {
         /*
          * Do not modify this routine to take direct strings input!!!
@@ -243,10 +234,15 @@ public final class IpConversionUtil {
          * the input is validated via regexps in Ipv6Prefix()
          */
 
+        return canonicalBinaryV6AddressFromString(ipv6Address.getValue());
+    }
+
+
+    private static byte[] canonicalBinaryV6AddressFromString(final String ipv6Address) {
        Iterable<String> splittedV6Address = Splitter.on("%")
                 .trimResults()
                 .omitEmptyStrings()
-                .split(ipv6Address.getValue());
+                .split(ipv6Address);
         List<String> partsV6Address = Lists.newArrayList(splittedV6Address.iterator());
 
         int colonp;
@@ -363,7 +359,7 @@ public final class IpConversionUtil {
         return dst;
     }
 
-    public static String byteArrayV6AddressToString (final byte [] _binary_form) throws UnknownHostException{
+    public static String byteArrayV6AddressToString (final byte [] _binary_form) throws UnknownHostException {
         /* DO NOT DIY!!! - InetAddresses will actually print correct canonical
          * zero compressed form.
          */
@@ -762,14 +758,20 @@ public final class IpConversionUtil {
         return false;
     }
 
-    public static String compressedIpv6Format(final String ipv6Address) {
-        String compressedIpv6Address;
-        compressedIpv6Address = ipv6Address.replaceAll("((?::0+\\b){2,}):?(?!\\S*\\b\\1:0\\b)(\\S*)", "::$2");
-        return compressedIpv6Address;
+    private static String compressedIpv6FormatFromString(final String ipv6Address) {
+        try {
+            return byteArrayV6AddressToString(canonicalBinaryV6AddressFromString(ipv6Address));
+        } catch (UnknownHostException e) {
+            LOG.warn("Failed to compress IPv6 address {} because it is invalid", ipv6Address);
+            return ipv6Address;
+        }
+    }
+
+    public static Ipv6Address compressedIpv6AddressFormat(final Ipv6Address ipv6Address) {
+        return new Ipv6Address(compressedIpv6FormatFromString(ipv6Address.getValue()));
     }
 
     public static Ipv6ArbitraryMask compressedIpv6MaskFormat(final Ipv6ArbitraryMask ipv6Mask) {
-        String stringIpv6Mask = ipv6Mask.getValue();
-        return new Ipv6ArbitraryMask(compressedIpv6Format(stringIpv6Mask));
+        return new Ipv6ArbitraryMask(compressedIpv6FormatFromString(ipv6Mask.getValue()));
     }
 }
index da1272ea1ea8106ce3e772041ca451f4a2250fbe..edd0175c9a28150d221c799073f97cef9c9e1db0 100644 (file)
@@ -49,11 +49,11 @@ public class OfToSalIpv6DstCase extends ConvertorCase<Ipv6DstCase, MatchBuilder,
                     Ipv6ArbitraryMask srcIpv6Arbitrary = IpConversionUtil.compressedIpv6MaskFormat(
                             IpConversionUtil.extractIpv6AddressMask(ipv6PrefixSourceAddress));
                     setSrcIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder,
-                            srcIpv6Arbitrary, IpConversionUtil.compressedIpv6Format(ipv6SrcAddress.getValue()));
+                            srcIpv6Arbitrary, IpConversionUtil.compressedIpv6AddressFormat(ipv6SrcAddress));
                 }
                 Ipv6ArbitraryMask dstIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
                         IpConversionUtil.createIpv6ArbitraryBitMask(mask));
-                String stringIpv6DstAddress = IpConversionUtil.compressedIpv6Format(ipv6Dst.getIpv6Address().getValue());
+                Ipv6Address stringIpv6DstAddress = IpConversionUtil.compressedIpv6AddressFormat(ipv6Dst.getIpv6Address());
                 setDstIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder,
                         dstIpv6ArbitraryMask, stringIpv6DstAddress);
                 matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());
@@ -75,12 +75,12 @@ public class OfToSalIpv6DstCase extends ConvertorCase<Ipv6DstCase, MatchBuilder,
                         */
                 Ipv6ArbitraryMask dstIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
                         IpConversionUtil.createIpv6ArbitraryBitMask(mask));
-                String stringIpv6DstAddress = IpConversionUtil.compressedIpv6Format(ipv6Dst.getIpv6Address().getValue());
+                Ipv6Address stringIpv6DstAddress = IpConversionUtil.compressedIpv6AddressFormat(ipv6Dst.getIpv6Address());
                 setDstIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder,
                         dstIpv6ArbitraryMask, stringIpv6DstAddress);
                 matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());
             } else {
-                String stringIpv6DstAddress = IpConversionUtil.compressedIpv6Format(ipv6Dst.getIpv6Address().getValue());
+                Ipv6Address stringIpv6DstAddress = IpConversionUtil.compressedIpv6AddressFormat(ipv6Dst.getIpv6Address());
                 setIpv6MatchBuilderFields(ipv6MatchBuilder, mask, stringIpv6DstAddress);
                 matchBuilder.setLayer3Match(ipv6MatchBuilder.build());
             }
@@ -89,37 +89,31 @@ public class OfToSalIpv6DstCase extends ConvertorCase<Ipv6DstCase, MatchBuilder,
         return Optional.of(matchBuilder);
     }
 
-    private static void setIpv6MatchBuilderFields(final Ipv6MatchBuilder ipv6MatchBuilder, final byte[] mask, final String ipv6PrefixStr) {
+    private static void setIpv6MatchBuilderFields(final Ipv6MatchBuilder builder, final byte[] mask, final Ipv6Address prefix) {
         Ipv6Prefix ipv6Prefix;
-
         if (mask != null) {
-            ipv6Prefix = IpConversionUtil.createPrefix(new Ipv6Address(ipv6PrefixStr), mask);
+            ipv6Prefix = IpConversionUtil.createPrefix(prefix, mask);
         } else {
-            ipv6Prefix = IpConversionUtil.createPrefix(new Ipv6Address(ipv6PrefixStr));
+            ipv6Prefix = IpConversionUtil.createPrefix(prefix);
         }
-
-        ipv6MatchBuilder.setIpv6Destination(ipv6Prefix);
+        builder.setIpv6Destination(ipv6Prefix);
     }
 
-    private static void setSrcIpv6MatchArbitraryBitMaskBuilderFields(
-            final Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder,
-            final Ipv6ArbitraryMask mask, final String ipv6AddressStr) {
-        Ipv6Address ipv6Address;
+    private static void setSrcIpv6MatchArbitraryBitMaskBuilderFields(final Ipv6MatchArbitraryBitMaskBuilder builder,
+                                                                     final Ipv6ArbitraryMask mask,
+                                                                     final Ipv6Address ipv6Address) {
         if (mask != null) {
-            ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceArbitraryBitmask(mask);
+            builder.setIpv6SourceArbitraryBitmask(mask);
         }
-        ipv6Address = new Ipv6Address(ipv6AddressStr);
-        ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceAddressNoMask(ipv6Address);
+        builder.setIpv6SourceAddressNoMask(ipv6Address);
     }
 
-    private static void setDstIpv6MatchArbitraryBitMaskBuilderFields(
-            final Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder,
-            final Ipv6ArbitraryMask mask, final String ipv6AddressStr) {
-        Ipv6Address ipv6Address;
+    private static void setDstIpv6MatchArbitraryBitMaskBuilderFields(final Ipv6MatchArbitraryBitMaskBuilder builder,
+                                                                     final Ipv6ArbitraryMask mask,
+                                                                     final Ipv6Address ipv6Address) {
         if (mask != null) {
-            ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationArbitraryBitmask(mask);
+            builder.setIpv6DestinationArbitraryBitmask(mask);
         }
-        ipv6Address = new Ipv6Address(ipv6AddressStr);
-        ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationAddressNoMask(ipv6Address);
+        builder.setIpv6DestinationAddressNoMask(ipv6Address);
     }
 }
index 2cb8803f1b1753d8f524d28b88dd114424719ade..49e3e5eeaebd25fe2d8907b453c87a9c8d6819af 100644 (file)
@@ -49,11 +49,11 @@ public class OfToSalIpv6SrcCase extends ConvertorCase<Ipv6SrcCase, MatchBuilder,
                     Ipv6ArbitraryMask dstIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
                             IpConversionUtil.extractIpv6AddressMask(ipv6PrefixDestinationAddress));
                     setDstIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder,
-                            dstIpv6ArbitraryMask, IpConversionUtil.compressedIpv6Format(ipv6DstAddress.getValue()));
+                            dstIpv6ArbitraryMask, IpConversionUtil.compressedIpv6AddressFormat(ipv6DstAddress));
                 }
                 Ipv6ArbitraryMask srcIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
                         IpConversionUtil.createIpv6ArbitraryBitMask(mask));
-                String stringIpv6SrcAddress = IpConversionUtil.compressedIpv6Format(ipv6Src.getIpv6Address().getValue());
+                Ipv6Address stringIpv6SrcAddress = IpConversionUtil.compressedIpv6AddressFormat(ipv6Src.getIpv6Address());
                 setSrcIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder,
                         srcIpv6ArbitraryMask, stringIpv6SrcAddress);
                 matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());
@@ -75,12 +75,12 @@ public class OfToSalIpv6SrcCase extends ConvertorCase<Ipv6SrcCase, MatchBuilder,
                         */
                 Ipv6ArbitraryMask srcIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
                         IpConversionUtil.createIpv6ArbitraryBitMask(mask));
-                String stringIpv6SrcAddress = IpConversionUtil.compressedIpv6Format(ipv6Src.getIpv6Address().getValue());
+                Ipv6Address stringIpv6SrcAddress = IpConversionUtil.compressedIpv6AddressFormat(ipv6Src.getIpv6Address());
                 setSrcIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder,
                         srcIpv6ArbitraryMask, stringIpv6SrcAddress);
                 matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());
             } else {
-                String stringIpv6SrcAddress = IpConversionUtil.compressedIpv6Format(ipv6Src.getIpv6Address().getValue());
+                Ipv6Address stringIpv6SrcAddress = IpConversionUtil.compressedIpv6AddressFormat(ipv6Src.getIpv6Address());
                 setIpv6MatchBuilderFields(ipv6MatchBuilder, mask, stringIpv6SrcAddress);
                 matchBuilder.setLayer3Match(ipv6MatchBuilder.build());
             }
@@ -89,37 +89,31 @@ public class OfToSalIpv6SrcCase extends ConvertorCase<Ipv6SrcCase, MatchBuilder,
         return Optional.of(matchBuilder);
     }
 
-    private static void setIpv6MatchBuilderFields(final Ipv6MatchBuilder ipv6MatchBuilder, final byte[] mask, final String ipv6PrefixStr) {
+    private static void setIpv6MatchBuilderFields(final Ipv6MatchBuilder builder, final byte[] mask, final Ipv6Address prefix) {
         Ipv6Prefix ipv6Prefix;
-
         if (mask != null) {
-            ipv6Prefix = IpConversionUtil.createPrefix(new Ipv6Address(ipv6PrefixStr), mask);
+            ipv6Prefix = IpConversionUtil.createPrefix(prefix, mask);
         } else {
-            ipv6Prefix = IpConversionUtil.createPrefix(new Ipv6Address(ipv6PrefixStr));
+            ipv6Prefix = IpConversionUtil.createPrefix(prefix);
         }
-
-        ipv6MatchBuilder.setIpv6Source(ipv6Prefix);
+        builder.setIpv6Source(ipv6Prefix);
     }
 
-    private static void setSrcIpv6MatchArbitraryBitMaskBuilderFields(
-            final Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder,
-            final Ipv6ArbitraryMask mask, final String ipv6AddressStr) {
-        Ipv6Address ipv6Address;
+    private static void setSrcIpv6MatchArbitraryBitMaskBuilderFields(final Ipv6MatchArbitraryBitMaskBuilder builder,
+                                                                     final Ipv6ArbitraryMask mask,
+                                                                     final Ipv6Address ipv6Address) {
         if (mask != null) {
-            ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceArbitraryBitmask(mask);
+            builder.setIpv6SourceArbitraryBitmask(mask);
         }
-        ipv6Address = new Ipv6Address(ipv6AddressStr);
-        ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceAddressNoMask(ipv6Address);
+        builder.setIpv6SourceAddressNoMask(ipv6Address);
     }
 
-    private static void setDstIpv6MatchArbitraryBitMaskBuilderFields(
-            final Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder,
-            final Ipv6ArbitraryMask mask, final String ipv6AddressStr) {
-        Ipv6Address ipv6Address;
+    private static void setDstIpv6MatchArbitraryBitMaskBuilderFields(final Ipv6MatchArbitraryBitMaskBuilder builder,
+                                                                     final Ipv6ArbitraryMask mask,
+                                                                     final Ipv6Address ipv6Address) {
         if (mask != null) {
-            ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationArbitraryBitmask(mask);
+            builder.setIpv6DestinationArbitraryBitmask(mask);
         }
-        ipv6Address = new Ipv6Address(ipv6AddressStr);
-        ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationAddressNoMask(ipv6Address);
+        builder.setIpv6DestinationAddressNoMask(ipv6Address);
     }
 }
index c360171190bd78ee232d9bda98aaa919a7ef1462..b48b66dad5678ea32c9dccad1f0e5ce6637f45ea 100644 (file)
@@ -5,39 +5,25 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
  */\r
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;\r
+package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common;\r
 \r
 import java.math.BigInteger;\r
 import java.util.Arrays;\r
 import org.junit.Assert;\r
 import org.junit.Test;\r
 import org.opendaylight.openflowjava.util.ByteBufUtils;\r
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil;\r
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorUtil;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.opendaylight.ipv6.arbitrary.bitmask.fields.rev160224.Ipv6ArbitraryMask;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.opendaylight.ipv6.arbitrary.bitmask.fields.rev160224.Ipv6ArbitraryMask;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 \r
-/**\r
- * @author Anton Ivanov aivanov@brocade.com\r
- * @author Sai MarapaReddy sai.marapareddy@gmail.com\r
- *\r
- */\r
 public class IpConversionUtilTest {\r
+    private static Logger LOG = LoggerFactory.getLogger(IpConversionUtilTest.class);\r
 \r
-    private static Logger LOG = LoggerFactory\r
-            .getLogger(IpConversionUtilTest.class);\r
-\r
-\r
-\r
-    /*\r
-     * Test canonicalBinaryV6Address\r
-     */\r
     @Test\r
     public void canonicalBinaryV6AddressTest() {\r
 \r
@@ -52,9 +38,6 @@ public class IpConversionUtilTest {
         }\r
     }\r
 \r
-    /*\r
-     * Test canonicalBinaryV6Prefix\r
-     */\r
     @Test\r
     public void canonicalBinaryV6AddressPrefixTest() {\r
 \r
@@ -86,13 +69,6 @@ public class IpConversionUtilTest {
         }\r
     }\r
 \r
-\r
-    /**\r
-     * Test method for {@link MatchConvertorUtil#getIpv4Mask(byte[])}.\r
-     *\r
-     * @throws Exception\r
-     */\r
-\r
     @Test\r
     public void testcountBitsAsGetIpv4Mask() {\r
         byte[][] maskInputs = new byte[][]{\r
@@ -223,9 +199,38 @@ public class IpConversionUtilTest {
 \r
     @Test\r
     public void compressedIpv6MaskFormatTest() {\r
-        Ipv6ArbitraryMask compressedIpv6IpAddressMask;\r
-        Ipv6ArbitraryMask ipv6IpAddressMask = new Ipv6ArbitraryMask("FFFF:0000:0000:0:0:0:1001:1000");\r
-        compressedIpv6IpAddressMask = IpConversionUtil.compressedIpv6MaskFormat(ipv6IpAddressMask);\r
-        Assert.assertEquals(compressedIpv6IpAddressMask.getValue(),"FFFF::1001:1000");\r
+        Ipv6ArbitraryMask compressedIpv6Mask;\r
+        Ipv6ArbitraryMask ipv6IpAddressMask;\r
+        // zero compression\r
+        ipv6IpAddressMask = new Ipv6ArbitraryMask("FFFF:0000:0000:0:0:0:1001:1000");\r
+        compressedIpv6Mask = IpConversionUtil.compressedIpv6MaskFormat(ipv6IpAddressMask);\r
+        Assert.assertEquals(compressedIpv6Mask.getValue(), "ffff::1001:1000");\r
+        // :: present - no compression\r
+        ipv6IpAddressMask = new Ipv6ArbitraryMask("FFFF::F000:0:0:1000");\r
+        compressedIpv6Mask = IpConversionUtil.compressedIpv6MaskFormat(ipv6IpAddressMask);\r
+        Assert.assertEquals(compressedIpv6Mask.getValue(), "ffff::f000:0:0:1000");\r
+        // more zero sequences - compress only one\r
+        ipv6IpAddressMask = new Ipv6ArbitraryMask("FFFF:0:0:F000:0000:0:0:1000");\r
+        compressedIpv6Mask = IpConversionUtil.compressedIpv6MaskFormat(ipv6IpAddressMask);\r
+        Assert.assertEquals(compressedIpv6Mask.getValue(), "ffff:0:0:f000::1000");\r
+    }\r
+\r
+    @Test\r
+    public void compressedIpv6AddressFormatTest() {\r
+        Ipv6Address compressedIpv6Address;\r
+        Ipv6Address ipv6IpAddressMask;\r
+        // zero compression\r
+        ipv6IpAddressMask = new Ipv6Address("FFFF:0000:0000:0:0:0:1001:1000");\r
+        compressedIpv6Address = IpConversionUtil.compressedIpv6AddressFormat(ipv6IpAddressMask);\r
+        Assert.assertEquals(compressedIpv6Address.getValue(), "ffff::1001:1000");\r
+        // :: present - no compression\r
+        ipv6IpAddressMask = new Ipv6Address("FFFF::F000:0:0:1000");\r
+        compressedIpv6Address = IpConversionUtil.compressedIpv6AddressFormat(ipv6IpAddressMask);\r
+        Assert.assertEquals(compressedIpv6Address.getValue(), "ffff::f000:0:0:1000");\r
+        // more zero sequences - compress only one\r
+        ipv6IpAddressMask = new Ipv6Address("FFFF:0:0:F000:0000:0:0:1000");\r
+        compressedIpv6Address = IpConversionUtil.compressedIpv6AddressFormat(ipv6IpAddressMask);\r
+        Assert.assertEquals(compressedIpv6Address.getValue(), "ffff:0:0:f000::1000");\r
     }\r
+\r
 }\r