/*
 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintStream;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;

/**
 * @test
 * @bug 8007373
 * @summary jdk7 backward compatibility serialization problem
 */

public class Inet6AddressSerializationTest {

    static boolean failed;

    public static final int LOOPBACK_SCOPE_ID = 0;

    public static final byte[] IN6ADDR_ANY_INIT = { (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00 };

    public static final byte[] LOOPBACKIPV6ADDRESS = { (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01 };

    // fe80::21b:24ff:febd:f29c
    public static final byte[] E1000G0IPV6ADDRESS = { (byte) 0xfe, (byte) 0x80,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x02, (byte) 0x1b, (byte) 0x24, (byte) 0xff,
            (byte) 0xfe, (byte) 0xbd, (byte) 0xf2, (byte) 0x9c };

    public static final String E1000G0HOSTNAME = "fe80:0:0:0:21b:24ff:febd:f29c%e1000g0";

    public static final String LOCALHOSTNAME = "localhost";

    public static final String NETWORK_IF_E1000G0 = "e1000g0";

    public static final String NETWORK_IF_LO0 = "lo0";

    public static final int SCOPE_ID_E1000G0 = 2;

    public static final int SCOPE_ID_LO0 = 1;

    public static final int SCOPE_ID_ZERO = 0;

    public static void main(String[] args) throws Exception {
        // args[0] == generate-loopback generates serial data for loopback if
        // args[0] == generateAll generates serial data for interfaces with an
        // IPV6 address binding

        if (args.length != 0) {

            if (args[0].equals("generate-loopback")) {

                generateSerializedInet6AddressData(Inet6Address.getByAddress(
                        InetAddress.getLoopbackAddress().getHostName(),
                        LOOPBACKIPV6ADDRESS, LOOPBACK_SCOPE_ID), System.out,
                        true);

            } else {
                generateAllInet6AddressSerializedData();
            }
        } else {
            runTests();
        }
    }

    private static void runTests() throws UnknownHostException, Exception,
            IOException {
        byte[] thisHostIPV6Address = null;
        int scope_id = LOOPBACK_SCOPE_ID;

        System.out.println("Hostname: "
                + InetAddress.getLocalHost().getHostName());
        System.out.println("LocalHost isLoopback : "
                + InetAddress.getLocalHost().isLoopbackAddress());
        thisHostIPV6Address = getThisHostIPV6Address(InetAddress.getLocalHost()
                .getHostName());

        if (thisHostIPV6Address == null) {
            thisHostIPV6Address = IN6ADDR_ANY_INIT;
        }

        // testing JDK7 generated serialized loopback against locally generated
        // loopback address
        testInet6AddressSerialization(Inet6Address.getByAddress(InetAddress
                .getLoopbackAddress().getHostName(), LOOPBACKIPV6ADDRESS,
                scope_id), JDK7Inet6AddressSerialData);
        // testing JDK8 generated serialized loopback against locally generated
        // loopback address
        testInet6AddressSerialization(Inet6Address.getByAddress(InetAddress
                .getLoopbackAddress().getHostName(), LOOPBACKIPV6ADDRESS,
                scope_id), JDK8Inet6AddressSerialData);
        testInet6AddressSerialization(Inet6Address.getByAddress(InetAddress
                .getLocalHost().getHostName(), IN6ADDR_ANY_INIT, scope_id),
                null);
        testInet6AddressSerialization(Inet6Address.getByAddress(InetAddress
                .getLocalHost().getHostName(), thisHostIPV6Address, scope_id),
                null);
        testAllNetworkInterfaces();

        // test against lo0
        testSerializedLo0Inet6Address();

        testSerializedE1000gInet6Address();

        if (failed)
            throw new RuntimeException("Some tests failed, check output");
    }

    private static byte[] getThisHostIPV6Address(String hostName)
            throws Exception {
        InetAddress[] thisHostIPAddresses = null;
        try {
            thisHostIPAddresses = InetAddress.getAllByName(InetAddress
                    .getLocalHost().getHostName());
        } catch (UnknownHostException uhEx) {
            uhEx.printStackTrace();
            throw uhEx;
        }
        byte[] thisHostIPV6Address = null;
        for (InetAddress inetAddress : thisHostIPAddresses) {
            if (inetAddress instanceof Inet6Address) {
                if (inetAddress.getHostName().equals(hostName)) {
                    thisHostIPV6Address = inetAddress.getAddress();
                    break;
                }
            }
        }
        // System.err.println("getThisHostIPV6Address: address is "
        // + Arrays.toString(thisHostIPV6Address));
        return thisHostIPV6Address;
    }

    static void testAllNetworkInterfaces() throws Exception {
        System.err.println("\n testAllNetworkInterfaces: \n ");
        for (Enumeration<NetworkInterface> e = NetworkInterface
                .getNetworkInterfaces(); e.hasMoreElements();) {
            NetworkInterface netIF = e.nextElement();
            for (Enumeration<InetAddress> iadrs = netIF.getInetAddresses(); iadrs
                    .hasMoreElements();) {
                InetAddress iadr = iadrs.nextElement();
                if (iadr instanceof Inet6Address) {
                    System.err.println("Test NetworkInterface:  " + netIF);
                    Inet6Address i6adr = (Inet6Address) iadr;
                    System.err.println("Testing with " + iadr);
                    System.err.println(" scoped iface: "
                            + i6adr.getScopedInterface());
                    testInet6AddressSerialization(i6adr, null);
                }
            }
        }
    }

    static void displayExpectedInet6Address(Inet6Address expectedInet6Address) {

        String expectedHostName = expectedInet6Address.getHostName();
        byte[] expectedAddress = expectedInet6Address.getAddress();
        String expectedHostAddress = expectedInet6Address.getHostAddress();
        int expectedScopeId = expectedInet6Address.getScopeId();
        NetworkInterface expectedNetIf = expectedInet6Address
                .getScopedInterface();

        System.err.println("Excpected HostName: " + expectedHostName);
        System.err.println("Expected Address: "
                + Arrays.toString(expectedAddress));
        System.err.println("Expected HostAddress: " + expectedHostAddress);
        System.err.println("Expected Scope Id " + expectedScopeId);
        System.err.println("Expected NetworkInterface " + expectedNetIf);
        System.err.println("Expected Inet6Address " + expectedInet6Address);
    }

    // test serialization deserialization of Inet6Address
    static void testInet6AddressSerialization(
            Inet6Address expectedInet6Address, byte[] serializedAddress)
            throws IOException {
        System.err.println("\n testInet6AddressSerialization:  enter \n");

        // displayExpectedInet6Address(expectedInet6Address);

        byte[] serialData = serializedAddress != null ? serializedAddress
                : generateSerializedInet6AddressData(expectedInet6Address,
                        null, false);
        try (ByteArrayInputStream bis = new ByteArrayInputStream(serialData);
                ObjectInputStream oin = new ObjectInputStream(bis)) {
            Inet6Address deserializedIPV6Addr = (Inet6Address) oin.readObject();
            System.err.println("Deserialized Inet6Address "
                    + deserializedIPV6Addr);
            assertHostNameEqual(expectedInet6Address.getHostName(),
                    deserializedIPV6Addr.getHostName());
            assertHostAddressEqual(expectedInet6Address.getHostAddress(),
                    deserializedIPV6Addr.getHostAddress());
            assertAddressEqual(expectedInet6Address.getAddress(),
                    deserializedIPV6Addr.getAddress());
            assertScopeIdEqual(expectedInet6Address.getScopeId(),
                    deserializedIPV6Addr.getScopeId());
            assertNetworkInterfaceEqual(
                    expectedInet6Address.getScopedInterface(),
                    deserializedIPV6Addr.getScopedInterface());
        } catch (Exception e) {
            System.err.println("Exception caught during deserialization");
            failed = true;
            e.printStackTrace();
        }
    }

    static void testSerializedE1000gInet6Address() throws IOException {
        System.err.println("\n testSerializedE1000gInet6Address:  enter \n");
        boolean testWithNetIf = true;
        boolean useMockInet6Address = false;

        NetworkInterface testNetIf = NetworkInterface
                .getByName(NETWORK_IF_E1000G0);
        Inet6Address expectedInet6Address = null;
        if (testNetIf != null) {
            System.err
                    .println("\n testSerializedE1000gInet6Address:  using netif \n");
            try {
                expectedInet6Address = Inet6Address.getByAddress(
                        E1000G0HOSTNAME, E1000G0IPV6ADDRESS, testNetIf);
            } catch (UnknownHostException ukhEx) {
                ukhEx.printStackTrace();
                testWithNetIf = true;
                useMockInet6Address = true;
            }
        } else {
            System.err
                    .println("\n testSerializedE1000gInet6Address:  using index \n");
            try {
                expectedInet6Address = Inet6Address.getByAddress(
                        E1000G0HOSTNAME, E1000G0IPV6ADDRESS, SCOPE_ID_ZERO);
            } catch (UnknownHostException ukhEx1) {
                ukhEx1.printStackTrace();
                useMockInet6Address = true;
            }
            testWithNetIf = false;
        }

        byte[] serializedAddress = SerialData_ifname_e1000g0;

        // displayExpectedInet6Address(expectedInet6Address);

        try (ByteArrayInputStream bis = new ByteArrayInputStream(
                serializedAddress);
                ObjectInputStream oin = new ObjectInputStream(bis)) {
            Inet6Address deserializedIPV6Addr = (Inet6Address) oin.readObject();
            System.err.println("Deserialized Inet6Address "
                    + deserializedIPV6Addr);

            if (!useMockInet6Address) {
                assertHostNameEqual(expectedInet6Address.getHostName(),
                        deserializedIPV6Addr.getHostName());
                if (testWithNetIf) {
                    assertHostAddressEqual(
                            expectedInet6Address.getHostAddress(),
                            deserializedIPV6Addr.getHostAddress());
                } else {
                    assertHostAddressEqual(
                            MockE1000g0Inet6Address.getBareHostAddress(),
                            deserializedIPV6Addr.getHostAddress());
                }
                assertAddressEqual(expectedInet6Address.getAddress(),
                        deserializedIPV6Addr.getAddress());
                assertScopeIdEqual(expectedInet6Address.getScopeId(),
                        deserializedIPV6Addr.getScopeId());
                if (testWithNetIf) {
                    assertNetworkInterfaceEqual(
                            expectedInet6Address.getScopedInterface(),
                            deserializedIPV6Addr.getScopedInterface());
                } else {
                    assertNetworkInterfaceEqual(null,
                            deserializedIPV6Addr.getScopedInterface());
                }
            } else { // use MockLo0Inet6Address
                assertHostNameEqual(MockE1000g0Inet6Address.getHostName(),
                        deserializedIPV6Addr.getHostName());
                if (testWithNetIf) {
                    assertHostAddressEqual(
                            MockE1000g0Inet6Address.getHostAddress(),
                            deserializedIPV6Addr.getHostAddress());
                } else {
                    assertHostAddressEqual(
                            MockE1000g0Inet6Address.getHostAddressWithIndex(),
                            deserializedIPV6Addr.getHostAddress());
                }
                assertAddressEqual(MockE1000g0Inet6Address.getAddress(),
                        deserializedIPV6Addr.getAddress());
                if (testWithNetIf) {
                assertScopeIdEqual(MockE1000g0Inet6Address.getScopeId(),
                        deserializedIPV6Addr.getScopeId());
                } else {
                    assertScopeIdEqual(MockE1000g0Inet6Address.getScopeZero(),
                            deserializedIPV6Addr.getScopeId());
                }
                assertNetworkInterfaceNameEqual(
                        MockE1000g0Inet6Address.getScopeIfName(),
                        deserializedIPV6Addr.getScopedInterface());
            }
        } catch (Exception e) {
            System.err.println("Exception caught during deserialization");
            failed = true;
            e.printStackTrace();
        }
    }

    static void testSerializedLo0Inet6Address() throws IOException {
        System.err.println("\n testSerializedLo0Inet6Address:  enter \n");
        boolean testWithNetIf = true;
        boolean useMockInet6Address = false;

        NetworkInterface testNetIf = NetworkInterface.getByName(NETWORK_IF_LO0);
        Inet6Address expectedInet6Address = null;
        if (testNetIf != null) {
            System.err
                    .println("\n testSerializedLo0Inet6Address:  using netif \n");
            try {
                expectedInet6Address = Inet6Address.getByAddress(LOCALHOSTNAME,
                        LOOPBACKIPV6ADDRESS, testNetIf);
            } catch (UnknownHostException ukhEx) {
                ukhEx.printStackTrace();
                testWithNetIf = true;
                useMockInet6Address = true;
            }
        } else {
            System.err
                    .println("\n testSerializedLo0Inet6Address:  using index \n");
            try {
                expectedInet6Address = Inet6Address.getByAddress(LOCALHOSTNAME,
                        LOOPBACKIPV6ADDRESS, SCOPE_ID_ZERO);
            } catch (UnknownHostException ukhEx1) {
                ukhEx1.printStackTrace();
                useMockInet6Address = true;
            }
            testWithNetIf = false;
        }

        // displayExpectedInet6Address(expectedInet6Address);

        byte[] serializedAddress = SerialData_ifname_lo0;

        try (ByteArrayInputStream bis = new ByteArrayInputStream(
                serializedAddress);
                ObjectInputStream oin = new ObjectInputStream(bis)) {
            Inet6Address deserializedIPV6Addr = (Inet6Address) oin.readObject();
            System.err.println("Deserialized Inet6Address "
                    + deserializedIPV6Addr);
            if (!useMockInet6Address) {
                assertHostNameEqual(expectedInet6Address.getHostName(),
                        deserializedIPV6Addr.getHostName());
                if (testWithNetIf) {
                    assertHostAddressEqual(
                            expectedInet6Address.getHostAddress(),
                            deserializedIPV6Addr.getHostAddress());
                } else {
                    assertHostAddressEqual(
                            MockLo0Inet6Address.getBareHostAddress(),
                            deserializedIPV6Addr.getHostAddress());
                }
                assertAddressEqual(expectedInet6Address.getAddress(),
                        deserializedIPV6Addr.getAddress());
                assertScopeIdEqual(expectedInet6Address.getScopeId(),
                        deserializedIPV6Addr.getScopeId());
                if (testWithNetIf) {
                    assertNetworkInterfaceEqual(
                            expectedInet6Address.getScopedInterface(),
                            deserializedIPV6Addr.getScopedInterface());
                } else {
                    assertNetworkInterfaceEqual(null,
                            deserializedIPV6Addr.getScopedInterface());
                }
            } else { // use MockLo0Inet6Address
                assertHostNameEqual(MockLo0Inet6Address.getHostName(),
                        deserializedIPV6Addr.getHostName());
                if (testWithNetIf) {
                    assertHostAddressEqual(
                            MockLo0Inet6Address.getHostAddress(),
                            deserializedIPV6Addr.getHostAddress());
                } else {
                    assertHostAddressEqual(
                            MockLo0Inet6Address.getHostAddressWithIndex(),
                            deserializedIPV6Addr.getHostAddress());
                }
                assertAddressEqual(MockLo0Inet6Address.getAddress(),
                        deserializedIPV6Addr.getAddress());
                if (testWithNetIf) {
                assertScopeIdEqual(MockLo0Inet6Address.getScopeId(),
                        deserializedIPV6Addr.getScopeId());
                } else {
                    assertScopeIdEqual(MockLo0Inet6Address.getScopeZero(),
                            deserializedIPV6Addr.getScopeId());
                }
                assertNetworkInterfaceNameEqual(
                        MockLo0Inet6Address.getScopeIfName(),
                        deserializedIPV6Addr.getScopedInterface());
            }
        } catch (Exception e) {
            System.err.println("Exception caught during deserialization");
            failed = true;
            e.printStackTrace();
        }
    }

    static List<Inet6Address> getAllInet6Addresses() throws Exception {
        // System.err.println("\n getAllInet6Addresses: \n ");
        ArrayList<Inet6Address> inet6Addresses = new ArrayList<Inet6Address>();
        for (Enumeration<NetworkInterface> e = NetworkInterface
                .getNetworkInterfaces(); e.hasMoreElements();) {
            NetworkInterface netIF = e.nextElement();
            for (Enumeration<InetAddress> iadrs = netIF.getInetAddresses(); iadrs
                    .hasMoreElements();) {
                InetAddress iadr = iadrs.nextElement();
                if (iadr instanceof Inet6Address) {
                    System.err.println("Test NetworkInterface:  " + netIF);
                    Inet6Address i6adr = (Inet6Address) iadr;
                    System.err.println(" address " + iadr);
                    System.err.println(" scoped iface: "
                            + i6adr.getScopedInterface());
                    // using this to actually set the hostName for an
                    // InetAddress
                    // created through the NetworkInterface
                    // have found that the fabricated instances has a null
                    // hostName
                    System.err.println(" hostName: " + i6adr.getHostName());
                    inet6Addresses.add(i6adr);
                }
            }
        }
        return inet6Addresses;
    }

    static void assertHostNameEqual(String expectedHostName,
            String deserializedHostName) {
        System.err
                .println("Inet6AddressSerializationTest.assertHostNameEqual:");
        if (expectedHostName == null) {
            if (deserializedHostName == null) {
                // ok, do nothing.
            } else {
                System.err.println("Error checking " + " HostName, expected:"
                        + expectedHostName + ", got :" + deserializedHostName);
                failed = true;
            }
        } else if (!expectedHostName.equals(deserializedHostName)) {
            System.err.println("Error checking "
                    + // versionStr +
                    " HostName, expected:" + expectedHostName + ", got :"
                    + deserializedHostName);
            failed = true;
        } else {
            System.err.println("HostName equality "
                    + // versionStr +
                    " HostName, expected:" + expectedHostName + ", got :"
                    + deserializedHostName);
        }
    }

    static void assertHostAddressEqual(String expectedHostAddress,
            String deserializedHostAddress) {
        System.err
                .println("Inet6AddressSerializationTest.assertHostAddressEqual:");
        if (expectedHostAddress == null) {
            if (deserializedHostAddress == null) {
                // ok, do nothing.
            } else {
                System.err.println("Error checking "
                        + " HostAddress, expected: " + expectedHostAddress
                        + ", got: " + deserializedHostAddress);
                failed = true;
            }
        } else if (!expectedHostAddress.equals(deserializedHostAddress)) {
            System.err.println("Error checking "
                    + // versionStr +
                    " HostAddress, expected: " + expectedHostAddress
                    + ", got: " + deserializedHostAddress);
            failed = true;
        } else {
            System.err.println("HostAddress equality "
                    + // versionStr +
                    " HostAddress, expected: " + expectedHostAddress
                    + ", got: " + deserializedHostAddress);
        }
    }

    static void assertAddressEqual(byte[] expectedAddress,
            byte[] deserializedAddress) {
        System.err.println("Inet6AddressSerializationTest.assertAddressEqual:");
        if (expectedAddress == null) {
            if (deserializedAddress == null) {
                // ok, do nothing.
            } else {
                System.err.println("Error checking " + " Address, expected:"
                        + Arrays.toString(expectedAddress) + ", got: "
                        + Arrays.toString(deserializedAddress));
                failed = true;
            }
        } else if (!Arrays.equals(expectedAddress, deserializedAddress)) {
            System.err.println("Error checking "
                    + // versionStr +
                    " Address, expected: " + Arrays.toString(expectedAddress)
                    + ", got: " + Arrays.toString(deserializedAddress));
            failed = true;
        } else {
            System.err.println("Address equality "
                    + // versionStr +
                    " Address, expected: " + Arrays.toString(expectedAddress)
                    + ", got: " + Arrays.toString(deserializedAddress));
        }
    }

    static void assertScopeIdEqual(int expectedScopeId, int deserializedScopeId) {
        System.err.println("Inet6AddressSerializationTest.assertScopeIdEqual:");
        if (expectedScopeId != deserializedScopeId) {
            System.err.println("Error checking " + " ScopeId, expected:"
                    + expectedScopeId + ", got: " + deserializedScopeId);
            failed = true;
        } else {
            System.err.println("ScopeId equality "
                    + // versionStr +
                    " ScopeId, expected: " + expectedScopeId + ", got: "
                    + deserializedScopeId);
        }
    }

    static void assertNetworkInterfaceNameEqual(String expectedNetworkIfName,
            NetworkInterface deserializedNetworkInterface) {

        if (deserializedNetworkInterface != null) {
            String deserializedNetworkIfName = deserializedNetworkInterface
                    .getName();
            System.err
                    .println("Inet6AddressSerializationTest.assertHostNameEqual:");
            if (expectedNetworkIfName == null) {
                if (deserializedNetworkIfName == null) {
                    // ok, do nothing.
                } else {
                    System.err.println("Error checking "
                            + " NetworkIfName, expected: "
                            + expectedNetworkIfName + ", got: "
                            + deserializedNetworkIfName);
                    failed = true;
                }
            } else if (!expectedNetworkIfName.equals(deserializedNetworkIfName)) {
                System.err.println("Error checking "
                        + " NetworkIfName, expected: " + expectedNetworkIfName
                        + ", got: " + deserializedNetworkIfName);
                failed = true;
            } else {
                System.err.println("NetworkIfName equality "
                        + " NetworkIfName, expected: " + expectedNetworkIfName
                        + ", got: " + deserializedNetworkIfName);
            }
        } else {
            System.err
                    .println("Warning "
                            + " NetworkInterface  expected, but is null - ifname not relevant on deserializing host");
        }
    }

    static void assertNetworkInterfaceEqual(
            NetworkInterface expectedNetworkInterface,
            NetworkInterface deserializedNetworkInterface) {
        System.err
                .println("Inet6AddressSerializationTest.assertNetworkInterfaceEqual:");
        if (expectedNetworkInterface == null) {
            if (deserializedNetworkInterface == null) {
                // ok, do nothing.
                System.err.println("Network Interface equality "
                        + " NetworkInterface, expected:"
                        + expectedNetworkInterface + ", got :"
                        + deserializedNetworkInterface);
            } else {
                System.err.println("Error checking "
                        + " NetworkInterface, expected:"
                        + expectedNetworkInterface + ", got :"
                        + deserializedNetworkInterface);
                failed = true;
            }
        } else if (!expectedNetworkInterface
                .equals(deserializedNetworkInterface)) {
            System.err.println("Error checking "
                    + // versionStr +
                    " NetworkInterface, expected:" + expectedNetworkInterface
                    + ", got :" + deserializedNetworkInterface);
            failed = true;
        } else {
            System.err.println("Network Interface equality "
                    + " NetworkInterface, expected:" + expectedNetworkInterface
                    + ", got :" + deserializedNetworkInterface);
        }
    }

    static void equal(Object expected, Object got) {
        if (expected == null) {
            if (got == null) {
                // ok, do nothing.
            } else {
                System.err.println("Error checking "
                        + " serial data, expected:" + expected + ", got :"
                        + got);
                failed = true;
            }
        } else if (!expected.equals(got)) {
            System.err.println("Error checking " + // versionStr +
                    " serial data, expected:" + expected + ", got :" + got);
            failed = true;
        }
    }

    // Used to generate serialData.
    static byte[] generateSerializedInet6AddressData(Inet6Address addr,
            PrintStream out, boolean outputToFile) throws IOException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try (ObjectOutputStream oos = new ObjectOutputStream(bos)) {
            oos.writeObject(addr);
        }

        String ifname = getIfName(addr);
        byte[] ba = bos.toByteArray();
        if (out != null) {
            out.format("static final byte[] SerialData" + ifname + " = {\n");
            for (int i = 0; i < ba.length; i++) {
                out.format(" (byte)0x%02X", ba[i]);
                if (i != (ba.length - 1))
                    out.format(",");
                if (((i + 1) % 6) == 0)
                    out.format("\n");
            }
            out.format(" };\n \n");
        }
        if (outputToFile) {
            serializeInet6AddressToFile(addr);
        }
        return ba;
    }

    private static String getIfName(Inet6Address inet6Addr) {
        String ifname;
        if (inet6Addr.getScopedInterface() != null) {
            ifname = "_ifname_" + inet6Addr.getScopedInterface().getName();
        } else {
            ifname = "_ifname_"
                    + Integer.valueOf(inet6Addr.getScopeId()).toString();
        }
        return ifname;
    }

    static void generateAllInet6AddressSerializedData() throws IOException {
        // System.err.println("generateAllInet6AddressSerializedData: enter ....");

        List<Inet6Address> inet6Addresses;

        try {
            inet6Addresses = getAllInet6Addresses();
        } catch (Exception e) {
            e.printStackTrace();
            throw new IOException(e);
        }

        for (Inet6Address inet6Address : inet6Addresses) {
            generateSerializedInet6AddressData(inet6Address, System.out, true);
        }
    }

    static void serializeInet6AddressToFile(Inet6Address inet6Addr) {

        // System.err
        // .println("serializeInet6AddressToIPV6AddressFile: enter ....");

        FileOutputStream fOut = null;
        String inet6AddressOutputFilename = null;
        inet6AddressOutputFilename = createOutputFileName(inet6Addr);
        try {
            fOut = new FileOutputStream(inet6AddressOutputFilename);
        } catch (FileNotFoundException fnfEx) {

            fnfEx.printStackTrace();
        }
        ObjectOutputStream ooStream = null;
        try {
            if (fOut != null) {
                ooStream = new ObjectOutputStream(fOut);
            } else {
                System.err.println("Problem initilising Object output stream ");
                System.exit(-1);
            }

        } catch (IOException e) {
            e.printStackTrace();
            System.exit(-1);
        }

        // serialise the last Inet6Address
        /*
         * System.err
         * .println("serializeInet6AddressToIPV6AddressFile scoped iface:  \n" +
         * inet6Addr.getScopedInterface());
         */
        try {
            ooStream.writeObject(inet6Addr);
        } catch (Exception ex) {
            ex.printStackTrace();
            System.exit(-1);
        }

        try {
            ooStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static String createOutputFileName(Inet6Address inet6Addr) {
        String inet6AddressOutputFilename;
        if (inet6Addr.getScopedInterface() != null) {
            inet6AddressOutputFilename = "IPV6Address_"
                    + inet6Addr.getScopedInterface().getName() + ".out";
        } else {
            inet6AddressOutputFilename = "IPV6Address_"
                    + Integer.valueOf(inet6Addr.getScopeId()).toString()
                    + ".out";
        }
        return inet6AddressOutputFilename;
    }

    // --- Generated data ---
    // JDK7 output java Inet6AddressSerializationTest generate.

    // loopback lo0 interface on Solaris 10

    static final byte[] JDK7Inet6AddressSerialData = { (byte) 0xAC,
            (byte) 0xED, (byte) 0x00, (byte) 0x05, (byte) 0x73, (byte) 0x72,
            (byte) 0x00, (byte) 0x15, (byte) 0x6A, (byte) 0x61, (byte) 0x76,
            (byte) 0x61, (byte) 0x2E, (byte) 0x6E, (byte) 0x65, (byte) 0x74,
            (byte) 0x2E, (byte) 0x49, (byte) 0x6E, (byte) 0x65, (byte) 0x74,
            (byte) 0x36, (byte) 0x41, (byte) 0x64, (byte) 0x64, (byte) 0x72,
            (byte) 0x65, (byte) 0x73, (byte) 0x73, (byte) 0x5F, (byte) 0x7C,
            (byte) 0x20, (byte) 0x81, (byte) 0x52, (byte) 0x2C, (byte) 0x80,
            (byte) 0x21, (byte) 0x03, (byte) 0x00, (byte) 0x05, (byte) 0x49,
            (byte) 0x00, (byte) 0x08, (byte) 0x73, (byte) 0x63, (byte) 0x6F,
            (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x64,
            (byte) 0x5A, (byte) 0x00, (byte) 0x0C, (byte) 0x73, (byte) 0x63,
            (byte) 0x6F, (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69,
            (byte) 0x64, (byte) 0x5F, (byte) 0x73, (byte) 0x65, (byte) 0x74,
            (byte) 0x5A, (byte) 0x00, (byte) 0x10, (byte) 0x73, (byte) 0x63,
            (byte) 0x6F, (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69,
            (byte) 0x66, (byte) 0x6E, (byte) 0x61, (byte) 0x6D, (byte) 0x65,
            (byte) 0x5F, (byte) 0x73, (byte) 0x65, (byte) 0x74, (byte) 0x4C,
            (byte) 0x00, (byte) 0x06, (byte) 0x69, (byte) 0x66, (byte) 0x6E,
            (byte) 0x61, (byte) 0x6D, (byte) 0x65, (byte) 0x74, (byte) 0x00,
            (byte) 0x12, (byte) 0x4C, (byte) 0x6A, (byte) 0x61, (byte) 0x76,
            (byte) 0x61, (byte) 0x2F, (byte) 0x6C, (byte) 0x61, (byte) 0x6E,
            (byte) 0x67, (byte) 0x2F, (byte) 0x53, (byte) 0x74, (byte) 0x72,
            (byte) 0x69, (byte) 0x6E, (byte) 0x67, (byte) 0x3B, (byte) 0x5B,
            (byte) 0x00, (byte) 0x09, (byte) 0x69, (byte) 0x70, (byte) 0x61,
            (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73,
            (byte) 0x73, (byte) 0x74, (byte) 0x00, (byte) 0x02, (byte) 0x5B,
            (byte) 0x42, (byte) 0x78, (byte) 0x72, (byte) 0x00, (byte) 0x14,
            (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2E,
            (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x2E, (byte) 0x49,
            (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x41, (byte) 0x64,
            (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73,
            (byte) 0x2D, (byte) 0x9B, (byte) 0x57, (byte) 0xAF, (byte) 0x9F,
            (byte) 0xE3, (byte) 0xEB, (byte) 0xDB, (byte) 0x02, (byte) 0x00,
            (byte) 0x03, (byte) 0x49, (byte) 0x00, (byte) 0x07, (byte) 0x61,
            (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73,
            (byte) 0x73, (byte) 0x49, (byte) 0x00, (byte) 0x06, (byte) 0x66,
            (byte) 0x61, (byte) 0x6D, (byte) 0x69, (byte) 0x6C, (byte) 0x79,
            (byte) 0x4C, (byte) 0x00, (byte) 0x08, (byte) 0x68, (byte) 0x6F,
            (byte) 0x73, (byte) 0x74, (byte) 0x4E, (byte) 0x61, (byte) 0x6D,
            (byte) 0x65, (byte) 0x71, (byte) 0x00, (byte) 0x7E, (byte) 0x00,
            (byte) 0x01, (byte) 0x78, (byte) 0x70, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x02, (byte) 0x74, (byte) 0x00, (byte) 0x09, (byte) 0x6C,
            (byte) 0x6F, (byte) 0x63, (byte) 0x61, (byte) 0x6C, (byte) 0x68,
            (byte) 0x6F, (byte) 0x73, (byte) 0x74, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x70,
            (byte) 0x75, (byte) 0x72, (byte) 0x00, (byte) 0x02, (byte) 0x5B,
            (byte) 0x42, (byte) 0xAC, (byte) 0xF3, (byte) 0x17, (byte) 0xF8,
            (byte) 0x06, (byte) 0x08, (byte) 0x54, (byte) 0xE0, (byte) 0x02,
            (byte) 0x00, (byte) 0x00, (byte) 0x78, (byte) 0x70, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x10, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x78 };

    // JDK8 output java Inet6AddressSerializationTest generate.
    // loopback lo0 interface on Solaris 10

    static final byte[] JDK8Inet6AddressSerialData = { (byte) 0xAC,
            (byte) 0xED, (byte) 0x00, (byte) 0x05, (byte) 0x73, (byte) 0x72,
            (byte) 0x00, (byte) 0x15, (byte) 0x6A, (byte) 0x61, (byte) 0x76,
            (byte) 0x61, (byte) 0x2E, (byte) 0x6E, (byte) 0x65, (byte) 0x74,
            (byte) 0x2E, (byte) 0x49, (byte) 0x6E, (byte) 0x65, (byte) 0x74,
            (byte) 0x36, (byte) 0x41, (byte) 0x64, (byte) 0x64, (byte) 0x72,
            (byte) 0x65, (byte) 0x73, (byte) 0x73, (byte) 0x5F, (byte) 0x7C,
            (byte) 0x20, (byte) 0x81, (byte) 0x52, (byte) 0x2C, (byte) 0x80,
            (byte) 0x21, (byte) 0x03, (byte) 0x00, (byte) 0x05, (byte) 0x49,
            (byte) 0x00, (byte) 0x08, (byte) 0x73, (byte) 0x63, (byte) 0x6F,
            (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x64,
            (byte) 0x5A, (byte) 0x00, (byte) 0x0C, (byte) 0x73, (byte) 0x63,
            (byte) 0x6F, (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69,
            (byte) 0x64, (byte) 0x5F, (byte) 0x73, (byte) 0x65, (byte) 0x74,
            (byte) 0x5A, (byte) 0x00, (byte) 0x10, (byte) 0x73, (byte) 0x63,
            (byte) 0x6F, (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69,
            (byte) 0x66, (byte) 0x6E, (byte) 0x61, (byte) 0x6D, (byte) 0x65,
            (byte) 0x5F, (byte) 0x73, (byte) 0x65, (byte) 0x74, (byte) 0x4C,
            (byte) 0x00, (byte) 0x06, (byte) 0x69, (byte) 0x66, (byte) 0x6E,
            (byte) 0x61, (byte) 0x6D, (byte) 0x65, (byte) 0x74, (byte) 0x00,
            (byte) 0x12, (byte) 0x4C, (byte) 0x6A, (byte) 0x61, (byte) 0x76,
            (byte) 0x61, (byte) 0x2F, (byte) 0x6C, (byte) 0x61, (byte) 0x6E,
            (byte) 0x67, (byte) 0x2F, (byte) 0x53, (byte) 0x74, (byte) 0x72,
            (byte) 0x69, (byte) 0x6E, (byte) 0x67, (byte) 0x3B, (byte) 0x5B,
            (byte) 0x00, (byte) 0x09, (byte) 0x69, (byte) 0x70, (byte) 0x61,
            (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73,
            (byte) 0x73, (byte) 0x74, (byte) 0x00, (byte) 0x02, (byte) 0x5B,
            (byte) 0x42, (byte) 0x78, (byte) 0x72, (byte) 0x00, (byte) 0x14,
            (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2E,
            (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x2E, (byte) 0x49,
            (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x41, (byte) 0x64,
            (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73,
            (byte) 0x2D, (byte) 0x9B, (byte) 0x57, (byte) 0xAF, (byte) 0x9F,
            (byte) 0xE3, (byte) 0xEB, (byte) 0xDB, (byte) 0x02, (byte) 0x00,
            (byte) 0x03, (byte) 0x49, (byte) 0x00, (byte) 0x07, (byte) 0x61,
            (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73,
            (byte) 0x73, (byte) 0x49, (byte) 0x00, (byte) 0x06, (byte) 0x66,
            (byte) 0x61, (byte) 0x6D, (byte) 0x69, (byte) 0x6C, (byte) 0x79,
            (byte) 0x4C, (byte) 0x00, (byte) 0x08, (byte) 0x68, (byte) 0x6F,
            (byte) 0x73, (byte) 0x74, (byte) 0x4E, (byte) 0x61, (byte) 0x6D,
            (byte) 0x65, (byte) 0x71, (byte) 0x00, (byte) 0x7E, (byte) 0x00,
            (byte) 0x01, (byte) 0x78, (byte) 0x70, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x02, (byte) 0x74, (byte) 0x00, (byte) 0x09, (byte) 0x6C,
            (byte) 0x6F, (byte) 0x63, (byte) 0x61, (byte) 0x6C, (byte) 0x68,
            (byte) 0x6F, (byte) 0x73, (byte) 0x74, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x70,
            (byte) 0x75, (byte) 0x72, (byte) 0x00, (byte) 0x02, (byte) 0x5B,
            (byte) 0x42, (byte) 0xAC, (byte) 0xF3, (byte) 0x17, (byte) 0xF8,
            (byte) 0x06, (byte) 0x08, (byte) 0x54, (byte) 0xE0, (byte) 0x02,
            (byte) 0x00, (byte) 0x00, (byte) 0x78, (byte) 0x70, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x10, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x78 };

    // java Inet6AddressSerializationTest generateAll produces this inet6address
    // serial data
    // jdk8 generated serialization of on address fe80:0:0:0:21b:24ff:febd:f29c
    // net if e1000g0

    static final byte[] SerialData_ifname_e1000g0 = { (byte) 0xAC, (byte) 0xED,
            (byte) 0x00, (byte) 0x05, (byte) 0x73, (byte) 0x72, (byte) 0x00,
            (byte) 0x15, (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61,
            (byte) 0x2E, (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x2E,
            (byte) 0x49, (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x36,
            (byte) 0x41, (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65,
            (byte) 0x73, (byte) 0x73, (byte) 0x5F, (byte) 0x7C, (byte) 0x20,
            (byte) 0x81, (byte) 0x52, (byte) 0x2C, (byte) 0x80, (byte) 0x21,
            (byte) 0x03, (byte) 0x00, (byte) 0x05, (byte) 0x49, (byte) 0x00,
            (byte) 0x08, (byte) 0x73, (byte) 0x63, (byte) 0x6F, (byte) 0x70,
            (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x64, (byte) 0x5A,
            (byte) 0x00, (byte) 0x0C, (byte) 0x73, (byte) 0x63, (byte) 0x6F,
            (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x64,
            (byte) 0x5F, (byte) 0x73, (byte) 0x65, (byte) 0x74, (byte) 0x5A,
            (byte) 0x00, (byte) 0x10, (byte) 0x73, (byte) 0x63, (byte) 0x6F,
            (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x66,
            (byte) 0x6E, (byte) 0x61, (byte) 0x6D, (byte) 0x65, (byte) 0x5F,
            (byte) 0x73, (byte) 0x65, (byte) 0x74, (byte) 0x4C, (byte) 0x00,
            (byte) 0x06, (byte) 0x69, (byte) 0x66, (byte) 0x6E, (byte) 0x61,
            (byte) 0x6D, (byte) 0x65, (byte) 0x74, (byte) 0x00, (byte) 0x12,
            (byte) 0x4C, (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61,
            (byte) 0x2F, (byte) 0x6C, (byte) 0x61, (byte) 0x6E, (byte) 0x67,
            (byte) 0x2F, (byte) 0x53, (byte) 0x74, (byte) 0x72, (byte) 0x69,
            (byte) 0x6E, (byte) 0x67, (byte) 0x3B, (byte) 0x5B, (byte) 0x00,
            (byte) 0x09, (byte) 0x69, (byte) 0x70, (byte) 0x61, (byte) 0x64,
            (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73,
            (byte) 0x74, (byte) 0x00, (byte) 0x02, (byte) 0x5B, (byte) 0x42,
            (byte) 0x78, (byte) 0x72, (byte) 0x00, (byte) 0x14, (byte) 0x6A,
            (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2E, (byte) 0x6E,
            (byte) 0x65, (byte) 0x74, (byte) 0x2E, (byte) 0x49, (byte) 0x6E,
            (byte) 0x65, (byte) 0x74, (byte) 0x41, (byte) 0x64, (byte) 0x64,
            (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73, (byte) 0x2D,
            (byte) 0x9B, (byte) 0x57, (byte) 0xAF, (byte) 0x9F, (byte) 0xE3,
            (byte) 0xEB, (byte) 0xDB, (byte) 0x02, (byte) 0x00, (byte) 0x03,
            (byte) 0x49, (byte) 0x00, (byte) 0x07, (byte) 0x61, (byte) 0x64,
            (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73,
            (byte) 0x49, (byte) 0x00, (byte) 0x06, (byte) 0x66, (byte) 0x61,
            (byte) 0x6D, (byte) 0x69, (byte) 0x6C, (byte) 0x79, (byte) 0x4C,
            (byte) 0x00, (byte) 0x08, (byte) 0x68, (byte) 0x6F, (byte) 0x73,
            (byte) 0x74, (byte) 0x4E, (byte) 0x61, (byte) 0x6D, (byte) 0x65,
            (byte) 0x71, (byte) 0x00, (byte) 0x7E, (byte) 0x00, (byte) 0x01,
            (byte) 0x78, (byte) 0x70, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x02,
            (byte) 0x74, (byte) 0x00, (byte) 0x25, (byte) 0x66, (byte) 0x65,
            (byte) 0x38, (byte) 0x30, (byte) 0x3A, (byte) 0x30, (byte) 0x3A,
            (byte) 0x30, (byte) 0x3A, (byte) 0x30, (byte) 0x3A, (byte) 0x32,
            (byte) 0x31, (byte) 0x62, (byte) 0x3A, (byte) 0x32, (byte) 0x34,
            (byte) 0x66, (byte) 0x66, (byte) 0x3A, (byte) 0x66, (byte) 0x65,
            (byte) 0x62, (byte) 0x64, (byte) 0x3A, (byte) 0x66, (byte) 0x32,
            (byte) 0x39, (byte) 0x63, (byte) 0x25, (byte) 0x65, (byte) 0x31,
            (byte) 0x30, (byte) 0x30, (byte) 0x30, (byte) 0x67, (byte) 0x30,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x02, (byte) 0x01,
            (byte) 0x01, (byte) 0x74, (byte) 0x00, (byte) 0x07, (byte) 0x65,
            (byte) 0x31, (byte) 0x30, (byte) 0x30, (byte) 0x30, (byte) 0x67,
            (byte) 0x30, (byte) 0x75, (byte) 0x72, (byte) 0x00, (byte) 0x02,
            (byte) 0x5B, (byte) 0x42, (byte) 0xAC, (byte) 0xF3, (byte) 0x17,
            (byte) 0xF8, (byte) 0x06, (byte) 0x08, (byte) 0x54, (byte) 0xE0,
            (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x78, (byte) 0x70,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x10, (byte) 0xFE,
            (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x02, (byte) 0x1B, (byte) 0x24,
            (byte) 0xFF, (byte) 0xFE, (byte) 0xBD, (byte) 0xF2, (byte) 0x9C,
            (byte) 0x78 };

    // jdk8 generated serialization of address 0::1 on net if lo0 hostname
    // localhost scope_id 1

    static final byte[] SerialData_ifname_lo0 = { (byte) 0xAC, (byte) 0xED,
            (byte) 0x00, (byte) 0x05, (byte) 0x73, (byte) 0x72, (byte) 0x00,
            (byte) 0x15, (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61,
            (byte) 0x2E, (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x2E,
            (byte) 0x49, (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x36,
            (byte) 0x41, (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65,
            (byte) 0x73, (byte) 0x73, (byte) 0x5F, (byte) 0x7C, (byte) 0x20,
            (byte) 0x81, (byte) 0x52, (byte) 0x2C, (byte) 0x80, (byte) 0x21,
            (byte) 0x03, (byte) 0x00, (byte) 0x05, (byte) 0x49, (byte) 0x00,
            (byte) 0x08, (byte) 0x73, (byte) 0x63, (byte) 0x6F, (byte) 0x70,
            (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x64, (byte) 0x5A,
            (byte) 0x00, (byte) 0x0C, (byte) 0x73, (byte) 0x63, (byte) 0x6F,
            (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x64,
            (byte) 0x5F, (byte) 0x73, (byte) 0x65, (byte) 0x74, (byte) 0x5A,
            (byte) 0x00, (byte) 0x10, (byte) 0x73, (byte) 0x63, (byte) 0x6F,
            (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x66,
            (byte) 0x6E, (byte) 0x61, (byte) 0x6D, (byte) 0x65, (byte) 0x5F,
            (byte) 0x73, (byte) 0x65, (byte) 0x74, (byte) 0x4C, (byte) 0x00,
            (byte) 0x06, (byte) 0x69, (byte) 0x66, (byte) 0x6E, (byte) 0x61,
            (byte) 0x6D, (byte) 0x65, (byte) 0x74, (byte) 0x00, (byte) 0x12,
            (byte) 0x4C, (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61,
            (byte) 0x2F, (byte) 0x6C, (byte) 0x61, (byte) 0x6E, (byte) 0x67,
            (byte) 0x2F, (byte) 0x53, (byte) 0x74, (byte) 0x72, (byte) 0x69,
            (byte) 0x6E, (byte) 0x67, (byte) 0x3B, (byte) 0x5B, (byte) 0x00,
            (byte) 0x09, (byte) 0x69, (byte) 0x70, (byte) 0x61, (byte) 0x64,
            (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73,
            (byte) 0x74, (byte) 0x00, (byte) 0x02, (byte) 0x5B, (byte) 0x42,
            (byte) 0x78, (byte) 0x72, (byte) 0x00, (byte) 0x14, (byte) 0x6A,
            (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2E, (byte) 0x6E,
            (byte) 0x65, (byte) 0x74, (byte) 0x2E, (byte) 0x49, (byte) 0x6E,
            (byte) 0x65, (byte) 0x74, (byte) 0x41, (byte) 0x64, (byte) 0x64,
            (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73, (byte) 0x2D,
            (byte) 0x9B, (byte) 0x57, (byte) 0xAF, (byte) 0x9F, (byte) 0xE3,
            (byte) 0xEB, (byte) 0xDB, (byte) 0x02, (byte) 0x00, (byte) 0x03,
            (byte) 0x49, (byte) 0x00, (byte) 0x07, (byte) 0x61, (byte) 0x64,
            (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73,
            (byte) 0x49, (byte) 0x00, (byte) 0x06, (byte) 0x66, (byte) 0x61,
            (byte) 0x6D, (byte) 0x69, (byte) 0x6C, (byte) 0x79, (byte) 0x4C,
            (byte) 0x00, (byte) 0x08, (byte) 0x68, (byte) 0x6F, (byte) 0x73,
            (byte) 0x74, (byte) 0x4E, (byte) 0x61, (byte) 0x6D, (byte) 0x65,
            (byte) 0x71, (byte) 0x00, (byte) 0x7E, (byte) 0x00, (byte) 0x01,
            (byte) 0x78, (byte) 0x70, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x02,
            (byte) 0x74, (byte) 0x00, (byte) 0x09, (byte) 0x6C, (byte) 0x6F,
            (byte) 0x63, (byte) 0x61, (byte) 0x6C, (byte) 0x68, (byte) 0x6F,
            (byte) 0x73, (byte) 0x74, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x74, (byte) 0x00,
            (byte) 0x03, (byte) 0x6C, (byte) 0x6F, (byte) 0x30, (byte) 0x75,
            (byte) 0x72, (byte) 0x00, (byte) 0x02, (byte) 0x5B, (byte) 0x42,
            (byte) 0xAC, (byte) 0xF3, (byte) 0x17, (byte) 0xF8, (byte) 0x06,
            (byte) 0x08, (byte) 0x54, (byte) 0xE0, (byte) 0x02, (byte) 0x00,
            (byte) 0x00, (byte) 0x78, (byte) 0x70, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x10, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x78 };

}

class MockLo0Inet6Address {

    private static final byte[] LOOPBACKIPV6ADDRESS = { (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01 };

    private static final String LOCALHOSTNAME = "localhost";

    private static final String LO0HOSTADDRESS = "0:0:0:0:0:0:0:1%lo0";

    private static final String BARE_LO0HOSTADDRESS = "0:0:0:0:0:0:0:1";

    private static final String LO0HOSTADDRESS_WITHINDEX = "0:0:0:0:0:0:0:1%1";

    private static final int SCOPE_ID_LO0 = 1;

    private static final int SCOPE_ID_ZERO = 0;

    public static final String NETWORK_IF_LO0 = "lo0";

    static String getHostName() {
        return LOCALHOSTNAME;
    }

    static String getHostAddress() {
        return LO0HOSTADDRESS;
    }

    static String getBareHostAddress() {
        return BARE_LO0HOSTADDRESS;
    }

    static String getHostAddressWithIndex() {
        return LO0HOSTADDRESS_WITHINDEX;
    }

    static byte[] getAddress() {
        return LOOPBACKIPV6ADDRESS;
    }

    static int getScopeId() {
        return SCOPE_ID_LO0;
    }

    static int getScopeZero() {
        return SCOPE_ID_ZERO;
    }

    static String getScopeIfName() {
        return NETWORK_IF_LO0;
    }

}

class MockE1000g0Inet6Address {

    // fe80::21b:24ff:febd:f29c
    private static final byte[] E1000G0IPV6ADDRESS = { (byte) 0xfe,
            (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x02, (byte) 0x1b, (byte) 0x24,
            (byte) 0xff, (byte) 0xfe, (byte) 0xbd, (byte) 0xf2, (byte) 0x9c };

    private static final String E1000G0HOSTNAME = "fe80:0:0:0:21b:24ff:febd:f29c%e1000g0";

    private static final String BARE_E1000G0HOSTADDRESS = "fe80:0:0:0:21b:24ff:febd:f29c";

    private static final String E1000G0HOSTADDRESS_WITHINDEX = "fe80:0:0:0:21b:24ff:febd:f29c%2";

    private static final String E1000G0HOSTADDRESS = "fe80:0:0:0:21b:24ff:febd:f29c%e1000g0";

    private static final String NETWORK_IF_E1000G0 = "e1000g0";

    private static final int SCOPE_ID_E1000G0 = 2;

    private static final int SCOPE_ID_ZERO = 0;

    static String getHostName() {
        return E1000G0HOSTNAME;
    }

    static String getHostAddress() {
        return E1000G0HOSTADDRESS;
    }

    static String getHostAddressWithIndex() {
        return E1000G0HOSTADDRESS_WITHINDEX;
    }

    static String getBareHostAddress() {
        return BARE_E1000G0HOSTADDRESS;
    }

    static byte[] getAddress() {
        return E1000G0IPV6ADDRESS;
    }

    static int getScopeId() {
        return SCOPE_ID_E1000G0;
    }

    static int getScopeZero() {
        return SCOPE_ID_ZERO;
    }

    static String getScopeIfName() {
        return NETWORK_IF_E1000G0;
    }

}
