1 /*
   2  * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 import java.io.ByteArrayInputStream;
  25 import java.io.ByteArrayOutputStream;
  26 import java.io.FileNotFoundException;
  27 import java.io.FileOutputStream;
  28 import java.io.IOException;
  29 import java.io.ObjectInputStream;
  30 import java.io.ObjectOutputStream;
  31 import java.io.PrintStream;
  32 import java.net.Inet6Address;
  33 import java.net.InetAddress;
  34 import java.net.NetworkInterface;
  35 import java.net.UnknownHostException;
  36 import java.util.ArrayList;
  37 import java.util.Arrays;
  38 import java.util.Enumeration;
  39 import java.util.List;
  40 
  41 /**
  42  * @test
  43  * @bug 8007373
  44  * @summary jdk7 backward compatibility serialization problem
  45  */
  46 
  47 public class Inet6AddressSerializationTest {
  48 
  49     static boolean failed;
  50 
  51     static boolean isWindows = System.getProperty("os.name").startsWith("Windows");
  52 
  53     public static final int LOOPBACK_SCOPE_ID = 0;
  54 
  55     public static final byte[] IN6ADDR_ANY_INIT = { (byte) 0x00, (byte) 0x00,
  56             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
  57             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
  58             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00 };
  59 
  60     public static final byte[] LOOPBACKIPV6ADDRESS = { (byte) 0x00,
  61             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
  62             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
  63             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01 };
  64 
  65     // fe80::21b:24ff:febd:f29c
  66     public static final byte[] E1000G0IPV6ADDRESS = { (byte) 0xfe, (byte) 0x80,
  67             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
  68             (byte) 0x00, (byte) 0x02, (byte) 0x1b, (byte) 0x24, (byte) 0xff,
  69             (byte) 0xfe, (byte) 0xbd, (byte) 0xf2, (byte) 0x9c };
  70 
  71     public static final String E1000G0HOSTNAME = "fe80:0:0:0:21b:24ff:febd:f29c%e1000g0";
  72 
  73     public static final String LOCALHOSTNAME = "localhost";
  74 
  75     public static final String NETWORK_IF_E1000G0 = "e1000g0";
  76 
  77     public static final String NETWORK_IF_LO0 = "lo0";
  78 
  79     public static final int SCOPE_ID_E1000G0 = 2;
  80 
  81     public static final int SCOPE_ID_LO0 = 1;
  82 
  83     public static final int SCOPE_ID_ZERO = 0;
  84 
  85     public static void main(String[] args) throws Exception {
  86         // args[0] == generate-loopback generates serial data for loopback if
  87         // args[0] == generateAll generates serial data for interfaces with an
  88         // IPV6 address binding
  89 
  90         if (args.length != 0) {
  91 
  92             if (args[0].equals("generate-loopback")) {
  93 
  94                 generateSerializedInet6AddressData(Inet6Address.getByAddress(
  95                         InetAddress.getLoopbackAddress().getHostName(),
  96                         LOOPBACKIPV6ADDRESS, LOOPBACK_SCOPE_ID), System.out,
  97                         true);
  98 
  99             } else {
 100                 generateAllInet6AddressSerializedData();
 101             }
 102         } else {
 103             runTests();
 104         }
 105     }
 106 
 107     private static void runTests() throws UnknownHostException, Exception,
 108             IOException {
 109         byte[] thisHostIPV6Address = null;
 110         int scope_id = LOOPBACK_SCOPE_ID;
 111 
 112         System.out.println("Hostname: "
 113                 + InetAddress.getLocalHost().getHostName());
 114         System.out.println("LocalHost isLoopback : "
 115                 + InetAddress.getLocalHost().isLoopbackAddress());
 116         thisHostIPV6Address = getThisHostIPV6Address(InetAddress.getLocalHost()
 117                 .getHostName());
 118 
 119         if (thisHostIPV6Address == null) {
 120             thisHostIPV6Address = IN6ADDR_ANY_INIT;
 121         }
 122 
 123         // testing JDK7 generated serialized loopback against locally generated
 124         // loopback address
 125         testInet6AddressSerialization(Inet6Address.getByAddress(InetAddress
 126                 .getLoopbackAddress().getHostName(), LOOPBACKIPV6ADDRESS,
 127                 scope_id), JDK7Inet6AddressSerialData);
 128         // testing JDK8 generated serialized loopback against locally generated
 129         // loopback address
 130         testInet6AddressSerialization(Inet6Address.getByAddress(InetAddress
 131                 .getLoopbackAddress().getHostName(), LOOPBACKIPV6ADDRESS,
 132                 scope_id), JDK8Inet6AddressSerialData);
 133         testInet6AddressSerialization(Inet6Address.getByAddress(InetAddress
 134                 .getLocalHost().getHostName(), IN6ADDR_ANY_INIT, scope_id),
 135                 null);
 136         testInet6AddressSerialization(Inet6Address.getByAddress(InetAddress
 137                 .getLocalHost().getHostName(), thisHostIPV6Address, scope_id),
 138                 null);
 139         testAllNetworkInterfaces();
 140 
 141         // test against lo0
 142         testSerializedLo0Inet6Address();
 143 
 144         testSerializedE1000gInet6Address();
 145 
 146         if (failed)
 147             throw new RuntimeException("Some tests failed, check output");
 148     }
 149 
 150     private static byte[] getThisHostIPV6Address(String hostName)
 151             throws Exception {
 152         InetAddress[] thisHostIPAddresses = null;
 153         try {
 154             thisHostIPAddresses = InetAddress.getAllByName(InetAddress
 155                     .getLocalHost().getHostName());
 156         } catch (UnknownHostException uhEx) {
 157             uhEx.printStackTrace();
 158             throw uhEx;
 159         }
 160         byte[] thisHostIPV6Address = null;
 161         for (InetAddress inetAddress : thisHostIPAddresses) {
 162             if (inetAddress instanceof Inet6Address) {
 163                 if (inetAddress.getHostName().equals(hostName)) {
 164                     thisHostIPV6Address = inetAddress.getAddress();
 165                     break;
 166                 }
 167             }
 168         }
 169         // System.err.println("getThisHostIPV6Address: address is "
 170         // + Arrays.toString(thisHostIPV6Address));
 171         return thisHostIPV6Address;
 172     }
 173 
 174     static void testAllNetworkInterfaces() throws Exception {
 175         System.err.println("\n testAllNetworkInterfaces: \n ");
 176         for (Enumeration<NetworkInterface> e = NetworkInterface
 177                 .getNetworkInterfaces(); e.hasMoreElements();) {
 178             NetworkInterface netIF = e.nextElement();
 179             // Skip (Windows)Teredo Tunneling Pseudo-Interface
 180             if (isWindows) {
 181                 String dName = netIF.getDisplayName();
 182                 if (dName != null && dName.contains("Teredo")) {
 183                     continue;
 184                 }
 185             }
 186             for (Enumeration<InetAddress> iadrs = netIF.getInetAddresses(); iadrs
 187                     .hasMoreElements();) {
 188                 InetAddress iadr = iadrs.nextElement();
 189                 if (iadr instanceof Inet6Address) {
 190                     System.err.println("Test NetworkInterface:  " + netIF);
 191                     Inet6Address i6adr = (Inet6Address) iadr;
 192                     System.err.println("Testing with " + iadr);
 193                     System.err.println(" scoped iface: "
 194                             + i6adr.getScopedInterface());
 195                     testInet6AddressSerialization(i6adr, null);
 196                 }
 197             }
 198         }
 199     }
 200 
 201     static void displayExpectedInet6Address(Inet6Address expectedInet6Address) {
 202 
 203         String expectedHostName = expectedInet6Address.getHostName();
 204         byte[] expectedAddress = expectedInet6Address.getAddress();
 205         String expectedHostAddress = expectedInet6Address.getHostAddress();
 206         int expectedScopeId = expectedInet6Address.getScopeId();
 207         NetworkInterface expectedNetIf = expectedInet6Address
 208                 .getScopedInterface();
 209 
 210         System.err.println("Excpected HostName: " + expectedHostName);
 211         System.err.println("Expected Address: "
 212                 + Arrays.toString(expectedAddress));
 213         System.err.println("Expected HostAddress: " + expectedHostAddress);
 214         System.err.println("Expected Scope Id " + expectedScopeId);
 215         System.err.println("Expected NetworkInterface " + expectedNetIf);
 216         System.err.println("Expected Inet6Address " + expectedInet6Address);
 217     }
 218 
 219     // test serialization deserialization of Inet6Address
 220     static void testInet6AddressSerialization(
 221             Inet6Address expectedInet6Address, byte[] serializedAddress)
 222             throws IOException {
 223         System.err.println("\n testInet6AddressSerialization:  enter \n");
 224 
 225         // displayExpectedInet6Address(expectedInet6Address);
 226 
 227         byte[] serialData = serializedAddress != null ? serializedAddress
 228                 : generateSerializedInet6AddressData(expectedInet6Address,
 229                         null, false);
 230         try (ByteArrayInputStream bis = new ByteArrayInputStream(serialData);
 231                 ObjectInputStream oin = new ObjectInputStream(bis)) {
 232             Inet6Address deserializedIPV6Addr = (Inet6Address) oin.readObject();
 233             System.err.println("Deserialized Inet6Address "
 234                     + deserializedIPV6Addr);
 235             assertHostNameEqual(expectedInet6Address.getHostName(),
 236                     deserializedIPV6Addr.getHostName());
 237             assertHostAddressEqual(expectedInet6Address.getHostAddress(),
 238                     deserializedIPV6Addr.getHostAddress());
 239             assertAddressEqual(expectedInet6Address.getAddress(),
 240                     deserializedIPV6Addr.getAddress());
 241             assertScopeIdEqual(expectedInet6Address.getScopeId(),
 242                     deserializedIPV6Addr.getScopeId());
 243             assertNetworkInterfaceEqual(
 244                     expectedInet6Address.getScopedInterface(),
 245                     deserializedIPV6Addr.getScopedInterface());
 246         } catch (Exception e) {
 247             System.err.println("Exception caught during deserialization");
 248             failed = true;
 249             e.printStackTrace();
 250         }
 251     }
 252 
 253     static void testSerializedE1000gInet6Address() throws IOException {
 254         System.err.println("\n testSerializedE1000gInet6Address:  enter \n");
 255         boolean testWithNetIf = true;
 256         boolean useMockInet6Address = false;
 257 
 258         NetworkInterface testNetIf = NetworkInterface
 259                 .getByName(NETWORK_IF_E1000G0);
 260         Inet6Address expectedInet6Address = null;
 261         if (testNetIf != null) {
 262             System.err
 263                     .println("\n testSerializedE1000gInet6Address:  using netif \n");
 264             try {
 265                 expectedInet6Address = Inet6Address.getByAddress(
 266                         E1000G0HOSTNAME, E1000G0IPV6ADDRESS, testNetIf);
 267             } catch (UnknownHostException ukhEx) {
 268                 ukhEx.printStackTrace();
 269                 testWithNetIf = true;
 270                 useMockInet6Address = true;
 271             }
 272         } else {
 273             System.err
 274                     .println("\n testSerializedE1000gInet6Address:  using index \n");
 275             try {
 276                 expectedInet6Address = Inet6Address.getByAddress(
 277                         E1000G0HOSTNAME, E1000G0IPV6ADDRESS, SCOPE_ID_ZERO);
 278             } catch (UnknownHostException ukhEx1) {
 279                 ukhEx1.printStackTrace();
 280                 useMockInet6Address = true;
 281             }
 282             testWithNetIf = false;
 283         }
 284 
 285         byte[] serializedAddress = SerialData_ifname_e1000g0;
 286 
 287         // displayExpectedInet6Address(expectedInet6Address);
 288 
 289         try (ByteArrayInputStream bis = new ByteArrayInputStream(
 290                 serializedAddress);
 291                 ObjectInputStream oin = new ObjectInputStream(bis)) {
 292             Inet6Address deserializedIPV6Addr = (Inet6Address) oin.readObject();
 293             System.err.println("Deserialized Inet6Address "
 294                     + deserializedIPV6Addr);
 295 
 296             if (!useMockInet6Address) {
 297                 assertHostNameEqual(expectedInet6Address.getHostName(),
 298                         deserializedIPV6Addr.getHostName());
 299                 if (testWithNetIf) {
 300                     assertHostAddressEqual(
 301                             expectedInet6Address.getHostAddress(),
 302                             deserializedIPV6Addr.getHostAddress());
 303                 } else {
 304                     assertHostAddressEqual(
 305                             MockE1000g0Inet6Address.getBareHostAddress(),
 306                             deserializedIPV6Addr.getHostAddress());
 307                 }
 308                 assertAddressEqual(expectedInet6Address.getAddress(),
 309                         deserializedIPV6Addr.getAddress());
 310                 assertScopeIdEqual(expectedInet6Address.getScopeId(),
 311                         deserializedIPV6Addr.getScopeId());
 312                 if (testWithNetIf) {
 313                     assertNetworkInterfaceEqual(
 314                             expectedInet6Address.getScopedInterface(),
 315                             deserializedIPV6Addr.getScopedInterface());
 316                 } else {
 317                     assertNetworkInterfaceEqual(null,
 318                             deserializedIPV6Addr.getScopedInterface());
 319                 }
 320             } else { // use MockLo0Inet6Address
 321                 assertHostNameEqual(MockE1000g0Inet6Address.getHostName(),
 322                         deserializedIPV6Addr.getHostName());
 323                 if (testWithNetIf) {
 324                     assertHostAddressEqual(
 325                             MockE1000g0Inet6Address.getHostAddress(),
 326                             deserializedIPV6Addr.getHostAddress());
 327                 } else {
 328                     assertHostAddressEqual(
 329                             MockE1000g0Inet6Address.getHostAddressWithIndex(),
 330                             deserializedIPV6Addr.getHostAddress());
 331                 }
 332                 assertAddressEqual(MockE1000g0Inet6Address.getAddress(),
 333                         deserializedIPV6Addr.getAddress());
 334                 if (testWithNetIf) {
 335                 assertScopeIdEqual(MockE1000g0Inet6Address.getScopeId(),
 336                         deserializedIPV6Addr.getScopeId());
 337                 } else {
 338                     assertScopeIdEqual(MockE1000g0Inet6Address.getScopeZero(),
 339                             deserializedIPV6Addr.getScopeId());
 340                 }
 341                 assertNetworkInterfaceNameEqual(
 342                         MockE1000g0Inet6Address.getScopeIfName(),
 343                         deserializedIPV6Addr.getScopedInterface());
 344             }
 345         } catch (Exception e) {
 346             System.err.println("Exception caught during deserialization");
 347             failed = true;
 348             e.printStackTrace();
 349         }
 350     }
 351 
 352     static void testSerializedLo0Inet6Address() throws IOException {
 353         System.err.println("\n testSerializedLo0Inet6Address:  enter \n");
 354         boolean testWithNetIf = true;
 355         boolean useMockInet6Address = false;
 356 
 357         NetworkInterface testNetIf = NetworkInterface.getByName(NETWORK_IF_LO0);
 358         Inet6Address expectedInet6Address = null;
 359         if (testNetIf != null) {
 360             System.err
 361                     .println("\n testSerializedLo0Inet6Address:  using netif \n");
 362             try {
 363                 expectedInet6Address = Inet6Address.getByAddress(LOCALHOSTNAME,
 364                         LOOPBACKIPV6ADDRESS, testNetIf);
 365             } catch (UnknownHostException ukhEx) {
 366                 ukhEx.printStackTrace();
 367                 testWithNetIf = true;
 368                 useMockInet6Address = true;
 369             }
 370         } else {
 371             System.err
 372                     .println("\n testSerializedLo0Inet6Address:  using index \n");
 373             try {
 374                 expectedInet6Address = Inet6Address.getByAddress(LOCALHOSTNAME,
 375                         LOOPBACKIPV6ADDRESS, SCOPE_ID_ZERO);
 376             } catch (UnknownHostException ukhEx1) {
 377                 ukhEx1.printStackTrace();
 378                 useMockInet6Address = true;
 379             }
 380             testWithNetIf = false;
 381         }
 382 
 383         // displayExpectedInet6Address(expectedInet6Address);
 384 
 385         byte[] serializedAddress = SerialData_ifname_lo0;
 386 
 387         try (ByteArrayInputStream bis = new ByteArrayInputStream(
 388                 serializedAddress);
 389                 ObjectInputStream oin = new ObjectInputStream(bis)) {
 390             Inet6Address deserializedIPV6Addr = (Inet6Address) oin.readObject();
 391             System.err.println("Deserialized Inet6Address "
 392                     + deserializedIPV6Addr);
 393             if (!useMockInet6Address) {
 394                 assertHostNameEqual(expectedInet6Address.getHostName(),
 395                         deserializedIPV6Addr.getHostName());
 396                 if (testWithNetIf) {
 397                     assertHostAddressEqual(
 398                             expectedInet6Address.getHostAddress(),
 399                             deserializedIPV6Addr.getHostAddress());
 400                 } else {
 401                     assertHostAddressEqual(
 402                             MockLo0Inet6Address.getBareHostAddress(),
 403                             deserializedIPV6Addr.getHostAddress());
 404                 }
 405                 assertAddressEqual(expectedInet6Address.getAddress(),
 406                         deserializedIPV6Addr.getAddress());
 407                 assertScopeIdEqual(expectedInet6Address.getScopeId(),
 408                         deserializedIPV6Addr.getScopeId());
 409                 if (testWithNetIf) {
 410                     assertNetworkInterfaceEqual(
 411                             expectedInet6Address.getScopedInterface(),
 412                             deserializedIPV6Addr.getScopedInterface());
 413                 } else {
 414                     assertNetworkInterfaceEqual(null,
 415                             deserializedIPV6Addr.getScopedInterface());
 416                 }
 417             } else { // use MockLo0Inet6Address
 418                 assertHostNameEqual(MockLo0Inet6Address.getHostName(),
 419                         deserializedIPV6Addr.getHostName());
 420                 if (testWithNetIf) {
 421                     assertHostAddressEqual(
 422                             MockLo0Inet6Address.getHostAddress(),
 423                             deserializedIPV6Addr.getHostAddress());
 424                 } else {
 425                     assertHostAddressEqual(
 426                             MockLo0Inet6Address.getHostAddressWithIndex(),
 427                             deserializedIPV6Addr.getHostAddress());
 428                 }
 429                 assertAddressEqual(MockLo0Inet6Address.getAddress(),
 430                         deserializedIPV6Addr.getAddress());
 431                 if (testWithNetIf) {
 432                 assertScopeIdEqual(MockLo0Inet6Address.getScopeId(),
 433                         deserializedIPV6Addr.getScopeId());
 434                 } else {
 435                     assertScopeIdEqual(MockLo0Inet6Address.getScopeZero(),
 436                             deserializedIPV6Addr.getScopeId());
 437                 }
 438                 assertNetworkInterfaceNameEqual(
 439                         MockLo0Inet6Address.getScopeIfName(),
 440                         deserializedIPV6Addr.getScopedInterface());
 441             }
 442         } catch (Exception e) {
 443             System.err.println("Exception caught during deserialization");
 444             failed = true;
 445             e.printStackTrace();
 446         }
 447     }
 448 
 449     static List<Inet6Address> getAllInet6Addresses() throws Exception {
 450         // System.err.println("\n getAllInet6Addresses: \n ");
 451         ArrayList<Inet6Address> inet6Addresses = new ArrayList<Inet6Address>();
 452         for (Enumeration<NetworkInterface> e = NetworkInterface
 453                 .getNetworkInterfaces(); e.hasMoreElements();) {
 454             NetworkInterface netIF = e.nextElement();
 455             for (Enumeration<InetAddress> iadrs = netIF.getInetAddresses(); iadrs
 456                     .hasMoreElements();) {
 457                 InetAddress iadr = iadrs.nextElement();
 458                 if (iadr instanceof Inet6Address) {
 459                     System.err.println("Test NetworkInterface:  " + netIF);
 460                     Inet6Address i6adr = (Inet6Address) iadr;
 461                     System.err.println(" address " + iadr);
 462                     System.err.println(" scoped iface: "
 463                             + i6adr.getScopedInterface());
 464                     // using this to actually set the hostName for an
 465                     // InetAddress
 466                     // created through the NetworkInterface
 467                     // have found that the fabricated instances has a null
 468                     // hostName
 469                     System.err.println(" hostName: " + i6adr.getHostName());
 470                     inet6Addresses.add(i6adr);
 471                 }
 472             }
 473         }
 474         return inet6Addresses;
 475     }
 476 
 477     static void assertHostNameEqual(String expectedHostName,
 478             String deserializedHostName) {
 479         System.err
 480                 .println("Inet6AddressSerializationTest.assertHostNameEqual:");
 481         if (expectedHostName == null) {
 482             if (deserializedHostName == null) {
 483                 // ok, do nothing.
 484             } else {
 485                 System.err.println("Error checking " + " HostName, expected:"
 486                         + expectedHostName + ", got :" + deserializedHostName);
 487                 failed = true;
 488             }
 489         } else if (!expectedHostName.equals(deserializedHostName)) {
 490             System.err.println("Error checking "
 491                     + // versionStr +
 492                     " HostName, expected:" + expectedHostName + ", got :"
 493                     + deserializedHostName);
 494             failed = true;
 495         } else {
 496             System.err.println("HostName equality "
 497                     + // versionStr +
 498                     " HostName, expected:" + expectedHostName + ", got :"
 499                     + deserializedHostName);
 500         }
 501     }
 502 
 503     static void assertHostAddressEqual(String expectedHostAddress,
 504             String deserializedHostAddress) {
 505         System.err
 506                 .println("Inet6AddressSerializationTest.assertHostAddressEqual:");
 507         if (expectedHostAddress == null) {
 508             if (deserializedHostAddress == null) {
 509                 // ok, do nothing.
 510             } else {
 511                 System.err.println("Error checking "
 512                         + " HostAddress, expected: " + expectedHostAddress
 513                         + ", got: " + deserializedHostAddress);
 514                 failed = true;
 515             }
 516         } else if (!expectedHostAddress.equals(deserializedHostAddress)) {
 517             System.err.println("Error checking "
 518                     + // versionStr +
 519                     " HostAddress, expected: " + expectedHostAddress
 520                     + ", got: " + deserializedHostAddress);
 521             failed = true;
 522         } else {
 523             System.err.println("HostAddress equality "
 524                     + // versionStr +
 525                     " HostAddress, expected: " + expectedHostAddress
 526                     + ", got: " + deserializedHostAddress);
 527         }
 528     }
 529 
 530     static void assertAddressEqual(byte[] expectedAddress,
 531             byte[] deserializedAddress) {
 532         System.err.println("Inet6AddressSerializationTest.assertAddressEqual:");
 533         if (expectedAddress == null) {
 534             if (deserializedAddress == null) {
 535                 // ok, do nothing.
 536             } else {
 537                 System.err.println("Error checking " + " Address, expected:"
 538                         + Arrays.toString(expectedAddress) + ", got: "
 539                         + Arrays.toString(deserializedAddress));
 540                 failed = true;
 541             }
 542         } else if (!Arrays.equals(expectedAddress, deserializedAddress)) {
 543             System.err.println("Error checking "
 544                     + // versionStr +
 545                     " Address, expected: " + Arrays.toString(expectedAddress)
 546                     + ", got: " + Arrays.toString(deserializedAddress));
 547             failed = true;
 548         } else {
 549             System.err.println("Address equality "
 550                     + // versionStr +
 551                     " Address, expected: " + Arrays.toString(expectedAddress)
 552                     + ", got: " + Arrays.toString(deserializedAddress));
 553         }
 554     }
 555 
 556     static void assertScopeIdEqual(int expectedScopeId, int deserializedScopeId) {
 557         System.err.println("Inet6AddressSerializationTest.assertScopeIdEqual:");
 558         if (expectedScopeId != deserializedScopeId) {
 559             System.err.println("Error checking " + " ScopeId, expected:"
 560                     + expectedScopeId + ", got: " + deserializedScopeId);
 561             failed = true;
 562         } else {
 563             System.err.println("ScopeId equality "
 564                     + // versionStr +
 565                     " ScopeId, expected: " + expectedScopeId + ", got: "
 566                     + deserializedScopeId);
 567         }
 568     }
 569 
 570     static void assertNetworkInterfaceNameEqual(String expectedNetworkIfName,
 571             NetworkInterface deserializedNetworkInterface) {
 572 
 573         if (deserializedNetworkInterface != null) {
 574             String deserializedNetworkIfName = deserializedNetworkInterface
 575                     .getName();
 576             System.err
 577                     .println("Inet6AddressSerializationTest.assertHostNameEqual:");
 578             if (expectedNetworkIfName == null) {
 579                 if (deserializedNetworkIfName == null) {
 580                     // ok, do nothing.
 581                 } else {
 582                     System.err.println("Error checking "
 583                             + " NetworkIfName, expected: "
 584                             + expectedNetworkIfName + ", got: "
 585                             + deserializedNetworkIfName);
 586                     failed = true;
 587                 }
 588             } else if (!expectedNetworkIfName.equals(deserializedNetworkIfName)) {
 589                 System.err.println("Error checking "
 590                         + " NetworkIfName, expected: " + expectedNetworkIfName
 591                         + ", got: " + deserializedNetworkIfName);
 592                 failed = true;
 593             } else {
 594                 System.err.println("NetworkIfName equality "
 595                         + " NetworkIfName, expected: " + expectedNetworkIfName
 596                         + ", got: " + deserializedNetworkIfName);
 597             }
 598         } else {
 599             System.err
 600                     .println("Warning "
 601                             + " NetworkInterface  expected, but is null - ifname not relevant on deserializing host");
 602         }
 603     }
 604 
 605     static void assertNetworkInterfaceEqual(
 606             NetworkInterface expectedNetworkInterface,
 607             NetworkInterface deserializedNetworkInterface) {
 608         System.err
 609                 .println("Inet6AddressSerializationTest.assertNetworkInterfaceEqual:");
 610         if (expectedNetworkInterface == null) {
 611             if (deserializedNetworkInterface == null) {
 612                 // ok, do nothing.
 613                 System.err.println("Network Interface equality "
 614                         + " NetworkInterface, expected:"
 615                         + expectedNetworkInterface + ", got :"
 616                         + deserializedNetworkInterface);
 617             } else {
 618                 System.err.println("Error checking "
 619                         + " NetworkInterface, expected:"
 620                         + expectedNetworkInterface + ", got :"
 621                         + deserializedNetworkInterface);
 622                 failed = true;
 623             }
 624         } else if (!expectedNetworkInterface
 625                 .equals(deserializedNetworkInterface)) {
 626             System.err.println("Error checking "
 627                     + // versionStr +
 628                     " NetworkInterface, expected:" + expectedNetworkInterface
 629                     + ", got :" + deserializedNetworkInterface);
 630             failed = true;
 631         } else {
 632             System.err.println("Network Interface equality "
 633                     + " NetworkInterface, expected:" + expectedNetworkInterface
 634                     + ", got :" + deserializedNetworkInterface);
 635         }
 636     }
 637 
 638     static void equal(Object expected, Object got) {
 639         if (expected == null) {
 640             if (got == null) {
 641                 // ok, do nothing.
 642             } else {
 643                 System.err.println("Error checking "
 644                         + " serial data, expected:" + expected + ", got :"
 645                         + got);
 646                 failed = true;
 647             }
 648         } else if (!expected.equals(got)) {
 649             System.err.println("Error checking " + // versionStr +
 650                     " serial data, expected:" + expected + ", got :" + got);
 651             failed = true;
 652         }
 653     }
 654 
 655     // Used to generate serialData.
 656     static byte[] generateSerializedInet6AddressData(Inet6Address addr,
 657             PrintStream out, boolean outputToFile) throws IOException {
 658         ByteArrayOutputStream bos = new ByteArrayOutputStream();
 659         try (ObjectOutputStream oos = new ObjectOutputStream(bos)) {
 660             oos.writeObject(addr);
 661         }
 662 
 663         String ifname = getIfName(addr);
 664         byte[] ba = bos.toByteArray();
 665         if (out != null) {
 666             out.format("static final byte[] SerialData" + ifname + " = {\n");
 667             for (int i = 0; i < ba.length; i++) {
 668                 out.format(" (byte)0x%02X", ba[i]);
 669                 if (i != (ba.length - 1))
 670                     out.format(",");
 671                 if (((i + 1) % 6) == 0)
 672                     out.format("\n");
 673             }
 674             out.format(" };\n \n");
 675         }
 676         if (outputToFile) {
 677             serializeInet6AddressToFile(addr);
 678         }
 679         return ba;
 680     }
 681 
 682     private static String getIfName(Inet6Address inet6Addr) {
 683         String ifname;
 684         if (inet6Addr.getScopedInterface() != null) {
 685             ifname = "_ifname_" + inet6Addr.getScopedInterface().getName();
 686         } else {
 687             ifname = "_ifname_"
 688                     + Integer.valueOf(inet6Addr.getScopeId()).toString();
 689         }
 690         return ifname;
 691     }
 692 
 693     static void generateAllInet6AddressSerializedData() throws IOException {
 694         // System.err.println("generateAllInet6AddressSerializedData: enter ....");
 695 
 696         List<Inet6Address> inet6Addresses;
 697 
 698         try {
 699             inet6Addresses = getAllInet6Addresses();
 700         } catch (Exception e) {
 701             e.printStackTrace();
 702             throw new IOException(e);
 703         }
 704 
 705         for (Inet6Address inet6Address : inet6Addresses) {
 706             generateSerializedInet6AddressData(inet6Address, System.out, true);
 707         }
 708     }
 709 
 710     static void serializeInet6AddressToFile(Inet6Address inet6Addr) {
 711 
 712         // System.err
 713         // .println("serializeInet6AddressToIPV6AddressFile: enter ....");
 714 
 715         FileOutputStream fOut = null;
 716         String inet6AddressOutputFilename = null;
 717         inet6AddressOutputFilename = createOutputFileName(inet6Addr);
 718         try {
 719             fOut = new FileOutputStream(inet6AddressOutputFilename);
 720         } catch (FileNotFoundException fnfEx) {
 721 
 722             fnfEx.printStackTrace();
 723         }
 724         ObjectOutputStream ooStream = null;
 725         try {
 726             if (fOut != null) {
 727                 ooStream = new ObjectOutputStream(fOut);
 728             } else {
 729                 System.err.println("Problem initilising Object output stream ");
 730                 System.exit(-1);
 731             }
 732 
 733         } catch (IOException e) {
 734             e.printStackTrace();
 735             System.exit(-1);
 736         }
 737 
 738         // serialise the last Inet6Address
 739         /*
 740          * System.err
 741          * .println("serializeInet6AddressToIPV6AddressFile scoped iface:  \n" +
 742          * inet6Addr.getScopedInterface());
 743          */
 744         try {
 745             ooStream.writeObject(inet6Addr);
 746         } catch (Exception ex) {
 747             ex.printStackTrace();
 748             System.exit(-1);
 749         }
 750 
 751         try {
 752             ooStream.close();
 753         } catch (IOException e) {
 754             e.printStackTrace();
 755         }
 756     }
 757 
 758     private static String createOutputFileName(Inet6Address inet6Addr) {
 759         String inet6AddressOutputFilename;
 760         if (inet6Addr.getScopedInterface() != null) {
 761             inet6AddressOutputFilename = "IPV6Address_"
 762                     + inet6Addr.getScopedInterface().getName() + ".out";
 763         } else {
 764             inet6AddressOutputFilename = "IPV6Address_"
 765                     + Integer.valueOf(inet6Addr.getScopeId()).toString()
 766                     + ".out";
 767         }
 768         return inet6AddressOutputFilename;
 769     }
 770 
 771     // --- Generated data ---
 772     // JDK7 output java Inet6AddressSerializationTest generate.
 773 
 774     // loopback lo0 interface on Solaris 10
 775 
 776     static final byte[] JDK7Inet6AddressSerialData = { (byte) 0xAC,
 777             (byte) 0xED, (byte) 0x00, (byte) 0x05, (byte) 0x73, (byte) 0x72,
 778             (byte) 0x00, (byte) 0x15, (byte) 0x6A, (byte) 0x61, (byte) 0x76,
 779             (byte) 0x61, (byte) 0x2E, (byte) 0x6E, (byte) 0x65, (byte) 0x74,
 780             (byte) 0x2E, (byte) 0x49, (byte) 0x6E, (byte) 0x65, (byte) 0x74,
 781             (byte) 0x36, (byte) 0x41, (byte) 0x64, (byte) 0x64, (byte) 0x72,
 782             (byte) 0x65, (byte) 0x73, (byte) 0x73, (byte) 0x5F, (byte) 0x7C,
 783             (byte) 0x20, (byte) 0x81, (byte) 0x52, (byte) 0x2C, (byte) 0x80,
 784             (byte) 0x21, (byte) 0x03, (byte) 0x00, (byte) 0x05, (byte) 0x49,
 785             (byte) 0x00, (byte) 0x08, (byte) 0x73, (byte) 0x63, (byte) 0x6F,
 786             (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x64,
 787             (byte) 0x5A, (byte) 0x00, (byte) 0x0C, (byte) 0x73, (byte) 0x63,
 788             (byte) 0x6F, (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69,
 789             (byte) 0x64, (byte) 0x5F, (byte) 0x73, (byte) 0x65, (byte) 0x74,
 790             (byte) 0x5A, (byte) 0x00, (byte) 0x10, (byte) 0x73, (byte) 0x63,
 791             (byte) 0x6F, (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69,
 792             (byte) 0x66, (byte) 0x6E, (byte) 0x61, (byte) 0x6D, (byte) 0x65,
 793             (byte) 0x5F, (byte) 0x73, (byte) 0x65, (byte) 0x74, (byte) 0x4C,
 794             (byte) 0x00, (byte) 0x06, (byte) 0x69, (byte) 0x66, (byte) 0x6E,
 795             (byte) 0x61, (byte) 0x6D, (byte) 0x65, (byte) 0x74, (byte) 0x00,
 796             (byte) 0x12, (byte) 0x4C, (byte) 0x6A, (byte) 0x61, (byte) 0x76,
 797             (byte) 0x61, (byte) 0x2F, (byte) 0x6C, (byte) 0x61, (byte) 0x6E,
 798             (byte) 0x67, (byte) 0x2F, (byte) 0x53, (byte) 0x74, (byte) 0x72,
 799             (byte) 0x69, (byte) 0x6E, (byte) 0x67, (byte) 0x3B, (byte) 0x5B,
 800             (byte) 0x00, (byte) 0x09, (byte) 0x69, (byte) 0x70, (byte) 0x61,
 801             (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73,
 802             (byte) 0x73, (byte) 0x74, (byte) 0x00, (byte) 0x02, (byte) 0x5B,
 803             (byte) 0x42, (byte) 0x78, (byte) 0x72, (byte) 0x00, (byte) 0x14,
 804             (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2E,
 805             (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x2E, (byte) 0x49,
 806             (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x41, (byte) 0x64,
 807             (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73,
 808             (byte) 0x2D, (byte) 0x9B, (byte) 0x57, (byte) 0xAF, (byte) 0x9F,
 809             (byte) 0xE3, (byte) 0xEB, (byte) 0xDB, (byte) 0x02, (byte) 0x00,
 810             (byte) 0x03, (byte) 0x49, (byte) 0x00, (byte) 0x07, (byte) 0x61,
 811             (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73,
 812             (byte) 0x73, (byte) 0x49, (byte) 0x00, (byte) 0x06, (byte) 0x66,
 813             (byte) 0x61, (byte) 0x6D, (byte) 0x69, (byte) 0x6C, (byte) 0x79,
 814             (byte) 0x4C, (byte) 0x00, (byte) 0x08, (byte) 0x68, (byte) 0x6F,
 815             (byte) 0x73, (byte) 0x74, (byte) 0x4E, (byte) 0x61, (byte) 0x6D,
 816             (byte) 0x65, (byte) 0x71, (byte) 0x00, (byte) 0x7E, (byte) 0x00,
 817             (byte) 0x01, (byte) 0x78, (byte) 0x70, (byte) 0x00, (byte) 0x00,
 818             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
 819             (byte) 0x02, (byte) 0x74, (byte) 0x00, (byte) 0x09, (byte) 0x6C,
 820             (byte) 0x6F, (byte) 0x63, (byte) 0x61, (byte) 0x6C, (byte) 0x68,
 821             (byte) 0x6F, (byte) 0x73, (byte) 0x74, (byte) 0x00, (byte) 0x00,
 822             (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x70,
 823             (byte) 0x75, (byte) 0x72, (byte) 0x00, (byte) 0x02, (byte) 0x5B,
 824             (byte) 0x42, (byte) 0xAC, (byte) 0xF3, (byte) 0x17, (byte) 0xF8,
 825             (byte) 0x06, (byte) 0x08, (byte) 0x54, (byte) 0xE0, (byte) 0x02,
 826             (byte) 0x00, (byte) 0x00, (byte) 0x78, (byte) 0x70, (byte) 0x00,
 827             (byte) 0x00, (byte) 0x00, (byte) 0x10, (byte) 0x00, (byte) 0x00,
 828             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
 829             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
 830             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x78 };
 831 
 832     // JDK8 output java Inet6AddressSerializationTest generate.
 833     // loopback lo0 interface on Solaris 10
 834 
 835     static final byte[] JDK8Inet6AddressSerialData = { (byte) 0xAC,
 836             (byte) 0xED, (byte) 0x00, (byte) 0x05, (byte) 0x73, (byte) 0x72,
 837             (byte) 0x00, (byte) 0x15, (byte) 0x6A, (byte) 0x61, (byte) 0x76,
 838             (byte) 0x61, (byte) 0x2E, (byte) 0x6E, (byte) 0x65, (byte) 0x74,
 839             (byte) 0x2E, (byte) 0x49, (byte) 0x6E, (byte) 0x65, (byte) 0x74,
 840             (byte) 0x36, (byte) 0x41, (byte) 0x64, (byte) 0x64, (byte) 0x72,
 841             (byte) 0x65, (byte) 0x73, (byte) 0x73, (byte) 0x5F, (byte) 0x7C,
 842             (byte) 0x20, (byte) 0x81, (byte) 0x52, (byte) 0x2C, (byte) 0x80,
 843             (byte) 0x21, (byte) 0x03, (byte) 0x00, (byte) 0x05, (byte) 0x49,
 844             (byte) 0x00, (byte) 0x08, (byte) 0x73, (byte) 0x63, (byte) 0x6F,
 845             (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x64,
 846             (byte) 0x5A, (byte) 0x00, (byte) 0x0C, (byte) 0x73, (byte) 0x63,
 847             (byte) 0x6F, (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69,
 848             (byte) 0x64, (byte) 0x5F, (byte) 0x73, (byte) 0x65, (byte) 0x74,
 849             (byte) 0x5A, (byte) 0x00, (byte) 0x10, (byte) 0x73, (byte) 0x63,
 850             (byte) 0x6F, (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69,
 851             (byte) 0x66, (byte) 0x6E, (byte) 0x61, (byte) 0x6D, (byte) 0x65,
 852             (byte) 0x5F, (byte) 0x73, (byte) 0x65, (byte) 0x74, (byte) 0x4C,
 853             (byte) 0x00, (byte) 0x06, (byte) 0x69, (byte) 0x66, (byte) 0x6E,
 854             (byte) 0x61, (byte) 0x6D, (byte) 0x65, (byte) 0x74, (byte) 0x00,
 855             (byte) 0x12, (byte) 0x4C, (byte) 0x6A, (byte) 0x61, (byte) 0x76,
 856             (byte) 0x61, (byte) 0x2F, (byte) 0x6C, (byte) 0x61, (byte) 0x6E,
 857             (byte) 0x67, (byte) 0x2F, (byte) 0x53, (byte) 0x74, (byte) 0x72,
 858             (byte) 0x69, (byte) 0x6E, (byte) 0x67, (byte) 0x3B, (byte) 0x5B,
 859             (byte) 0x00, (byte) 0x09, (byte) 0x69, (byte) 0x70, (byte) 0x61,
 860             (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73,
 861             (byte) 0x73, (byte) 0x74, (byte) 0x00, (byte) 0x02, (byte) 0x5B,
 862             (byte) 0x42, (byte) 0x78, (byte) 0x72, (byte) 0x00, (byte) 0x14,
 863             (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2E,
 864             (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x2E, (byte) 0x49,
 865             (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x41, (byte) 0x64,
 866             (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73,
 867             (byte) 0x2D, (byte) 0x9B, (byte) 0x57, (byte) 0xAF, (byte) 0x9F,
 868             (byte) 0xE3, (byte) 0xEB, (byte) 0xDB, (byte) 0x02, (byte) 0x00,
 869             (byte) 0x03, (byte) 0x49, (byte) 0x00, (byte) 0x07, (byte) 0x61,
 870             (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73,
 871             (byte) 0x73, (byte) 0x49, (byte) 0x00, (byte) 0x06, (byte) 0x66,
 872             (byte) 0x61, (byte) 0x6D, (byte) 0x69, (byte) 0x6C, (byte) 0x79,
 873             (byte) 0x4C, (byte) 0x00, (byte) 0x08, (byte) 0x68, (byte) 0x6F,
 874             (byte) 0x73, (byte) 0x74, (byte) 0x4E, (byte) 0x61, (byte) 0x6D,
 875             (byte) 0x65, (byte) 0x71, (byte) 0x00, (byte) 0x7E, (byte) 0x00,
 876             (byte) 0x01, (byte) 0x78, (byte) 0x70, (byte) 0x00, (byte) 0x00,
 877             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
 878             (byte) 0x02, (byte) 0x74, (byte) 0x00, (byte) 0x09, (byte) 0x6C,
 879             (byte) 0x6F, (byte) 0x63, (byte) 0x61, (byte) 0x6C, (byte) 0x68,
 880             (byte) 0x6F, (byte) 0x73, (byte) 0x74, (byte) 0x00, (byte) 0x00,
 881             (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x70,
 882             (byte) 0x75, (byte) 0x72, (byte) 0x00, (byte) 0x02, (byte) 0x5B,
 883             (byte) 0x42, (byte) 0xAC, (byte) 0xF3, (byte) 0x17, (byte) 0xF8,
 884             (byte) 0x06, (byte) 0x08, (byte) 0x54, (byte) 0xE0, (byte) 0x02,
 885             (byte) 0x00, (byte) 0x00, (byte) 0x78, (byte) 0x70, (byte) 0x00,
 886             (byte) 0x00, (byte) 0x00, (byte) 0x10, (byte) 0x00, (byte) 0x00,
 887             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
 888             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
 889             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x78 };
 890 
 891     // java Inet6AddressSerializationTest generateAll produces this inet6address
 892     // serial data
 893     // jdk8 generated serialization of on address fe80:0:0:0:21b:24ff:febd:f29c
 894     // net if e1000g0
 895 
 896     static final byte[] SerialData_ifname_e1000g0 = { (byte) 0xAC, (byte) 0xED,
 897             (byte) 0x00, (byte) 0x05, (byte) 0x73, (byte) 0x72, (byte) 0x00,
 898             (byte) 0x15, (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61,
 899             (byte) 0x2E, (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x2E,
 900             (byte) 0x49, (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x36,
 901             (byte) 0x41, (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65,
 902             (byte) 0x73, (byte) 0x73, (byte) 0x5F, (byte) 0x7C, (byte) 0x20,
 903             (byte) 0x81, (byte) 0x52, (byte) 0x2C, (byte) 0x80, (byte) 0x21,
 904             (byte) 0x03, (byte) 0x00, (byte) 0x05, (byte) 0x49, (byte) 0x00,
 905             (byte) 0x08, (byte) 0x73, (byte) 0x63, (byte) 0x6F, (byte) 0x70,
 906             (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x64, (byte) 0x5A,
 907             (byte) 0x00, (byte) 0x0C, (byte) 0x73, (byte) 0x63, (byte) 0x6F,
 908             (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x64,
 909             (byte) 0x5F, (byte) 0x73, (byte) 0x65, (byte) 0x74, (byte) 0x5A,
 910             (byte) 0x00, (byte) 0x10, (byte) 0x73, (byte) 0x63, (byte) 0x6F,
 911             (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x66,
 912             (byte) 0x6E, (byte) 0x61, (byte) 0x6D, (byte) 0x65, (byte) 0x5F,
 913             (byte) 0x73, (byte) 0x65, (byte) 0x74, (byte) 0x4C, (byte) 0x00,
 914             (byte) 0x06, (byte) 0x69, (byte) 0x66, (byte) 0x6E, (byte) 0x61,
 915             (byte) 0x6D, (byte) 0x65, (byte) 0x74, (byte) 0x00, (byte) 0x12,
 916             (byte) 0x4C, (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61,
 917             (byte) 0x2F, (byte) 0x6C, (byte) 0x61, (byte) 0x6E, (byte) 0x67,
 918             (byte) 0x2F, (byte) 0x53, (byte) 0x74, (byte) 0x72, (byte) 0x69,
 919             (byte) 0x6E, (byte) 0x67, (byte) 0x3B, (byte) 0x5B, (byte) 0x00,
 920             (byte) 0x09, (byte) 0x69, (byte) 0x70, (byte) 0x61, (byte) 0x64,
 921             (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73,
 922             (byte) 0x74, (byte) 0x00, (byte) 0x02, (byte) 0x5B, (byte) 0x42,
 923             (byte) 0x78, (byte) 0x72, (byte) 0x00, (byte) 0x14, (byte) 0x6A,
 924             (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2E, (byte) 0x6E,
 925             (byte) 0x65, (byte) 0x74, (byte) 0x2E, (byte) 0x49, (byte) 0x6E,
 926             (byte) 0x65, (byte) 0x74, (byte) 0x41, (byte) 0x64, (byte) 0x64,
 927             (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73, (byte) 0x2D,
 928             (byte) 0x9B, (byte) 0x57, (byte) 0xAF, (byte) 0x9F, (byte) 0xE3,
 929             (byte) 0xEB, (byte) 0xDB, (byte) 0x02, (byte) 0x00, (byte) 0x03,
 930             (byte) 0x49, (byte) 0x00, (byte) 0x07, (byte) 0x61, (byte) 0x64,
 931             (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73,
 932             (byte) 0x49, (byte) 0x00, (byte) 0x06, (byte) 0x66, (byte) 0x61,
 933             (byte) 0x6D, (byte) 0x69, (byte) 0x6C, (byte) 0x79, (byte) 0x4C,
 934             (byte) 0x00, (byte) 0x08, (byte) 0x68, (byte) 0x6F, (byte) 0x73,
 935             (byte) 0x74, (byte) 0x4E, (byte) 0x61, (byte) 0x6D, (byte) 0x65,
 936             (byte) 0x71, (byte) 0x00, (byte) 0x7E, (byte) 0x00, (byte) 0x01,
 937             (byte) 0x78, (byte) 0x70, (byte) 0x00, (byte) 0x00, (byte) 0x00,
 938             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x02,
 939             (byte) 0x74, (byte) 0x00, (byte) 0x25, (byte) 0x66, (byte) 0x65,
 940             (byte) 0x38, (byte) 0x30, (byte) 0x3A, (byte) 0x30, (byte) 0x3A,
 941             (byte) 0x30, (byte) 0x3A, (byte) 0x30, (byte) 0x3A, (byte) 0x32,
 942             (byte) 0x31, (byte) 0x62, (byte) 0x3A, (byte) 0x32, (byte) 0x34,
 943             (byte) 0x66, (byte) 0x66, (byte) 0x3A, (byte) 0x66, (byte) 0x65,
 944             (byte) 0x62, (byte) 0x64, (byte) 0x3A, (byte) 0x66, (byte) 0x32,
 945             (byte) 0x39, (byte) 0x63, (byte) 0x25, (byte) 0x65, (byte) 0x31,
 946             (byte) 0x30, (byte) 0x30, (byte) 0x30, (byte) 0x67, (byte) 0x30,
 947             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x02, (byte) 0x01,
 948             (byte) 0x01, (byte) 0x74, (byte) 0x00, (byte) 0x07, (byte) 0x65,
 949             (byte) 0x31, (byte) 0x30, (byte) 0x30, (byte) 0x30, (byte) 0x67,
 950             (byte) 0x30, (byte) 0x75, (byte) 0x72, (byte) 0x00, (byte) 0x02,
 951             (byte) 0x5B, (byte) 0x42, (byte) 0xAC, (byte) 0xF3, (byte) 0x17,
 952             (byte) 0xF8, (byte) 0x06, (byte) 0x08, (byte) 0x54, (byte) 0xE0,
 953             (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x78, (byte) 0x70,
 954             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x10, (byte) 0xFE,
 955             (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
 956             (byte) 0x00, (byte) 0x00, (byte) 0x02, (byte) 0x1B, (byte) 0x24,
 957             (byte) 0xFF, (byte) 0xFE, (byte) 0xBD, (byte) 0xF2, (byte) 0x9C,
 958             (byte) 0x78 };
 959 
 960     // jdk8 generated serialization of address 0::1 on net if lo0 hostname
 961     // localhost scope_id 1
 962 
 963     static final byte[] SerialData_ifname_lo0 = { (byte) 0xAC, (byte) 0xED,
 964             (byte) 0x00, (byte) 0x05, (byte) 0x73, (byte) 0x72, (byte) 0x00,
 965             (byte) 0x15, (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61,
 966             (byte) 0x2E, (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x2E,
 967             (byte) 0x49, (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x36,
 968             (byte) 0x41, (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65,
 969             (byte) 0x73, (byte) 0x73, (byte) 0x5F, (byte) 0x7C, (byte) 0x20,
 970             (byte) 0x81, (byte) 0x52, (byte) 0x2C, (byte) 0x80, (byte) 0x21,
 971             (byte) 0x03, (byte) 0x00, (byte) 0x05, (byte) 0x49, (byte) 0x00,
 972             (byte) 0x08, (byte) 0x73, (byte) 0x63, (byte) 0x6F, (byte) 0x70,
 973             (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x64, (byte) 0x5A,
 974             (byte) 0x00, (byte) 0x0C, (byte) 0x73, (byte) 0x63, (byte) 0x6F,
 975             (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x64,
 976             (byte) 0x5F, (byte) 0x73, (byte) 0x65, (byte) 0x74, (byte) 0x5A,
 977             (byte) 0x00, (byte) 0x10, (byte) 0x73, (byte) 0x63, (byte) 0x6F,
 978             (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x66,
 979             (byte) 0x6E, (byte) 0x61, (byte) 0x6D, (byte) 0x65, (byte) 0x5F,
 980             (byte) 0x73, (byte) 0x65, (byte) 0x74, (byte) 0x4C, (byte) 0x00,
 981             (byte) 0x06, (byte) 0x69, (byte) 0x66, (byte) 0x6E, (byte) 0x61,
 982             (byte) 0x6D, (byte) 0x65, (byte) 0x74, (byte) 0x00, (byte) 0x12,
 983             (byte) 0x4C, (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61,
 984             (byte) 0x2F, (byte) 0x6C, (byte) 0x61, (byte) 0x6E, (byte) 0x67,
 985             (byte) 0x2F, (byte) 0x53, (byte) 0x74, (byte) 0x72, (byte) 0x69,
 986             (byte) 0x6E, (byte) 0x67, (byte) 0x3B, (byte) 0x5B, (byte) 0x00,
 987             (byte) 0x09, (byte) 0x69, (byte) 0x70, (byte) 0x61, (byte) 0x64,
 988             (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73,
 989             (byte) 0x74, (byte) 0x00, (byte) 0x02, (byte) 0x5B, (byte) 0x42,
 990             (byte) 0x78, (byte) 0x72, (byte) 0x00, (byte) 0x14, (byte) 0x6A,
 991             (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2E, (byte) 0x6E,
 992             (byte) 0x65, (byte) 0x74, (byte) 0x2E, (byte) 0x49, (byte) 0x6E,
 993             (byte) 0x65, (byte) 0x74, (byte) 0x41, (byte) 0x64, (byte) 0x64,
 994             (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73, (byte) 0x2D,
 995             (byte) 0x9B, (byte) 0x57, (byte) 0xAF, (byte) 0x9F, (byte) 0xE3,
 996             (byte) 0xEB, (byte) 0xDB, (byte) 0x02, (byte) 0x00, (byte) 0x03,
 997             (byte) 0x49, (byte) 0x00, (byte) 0x07, (byte) 0x61, (byte) 0x64,
 998             (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73,
 999             (byte) 0x49, (byte) 0x00, (byte) 0x06, (byte) 0x66, (byte) 0x61,
1000             (byte) 0x6D, (byte) 0x69, (byte) 0x6C, (byte) 0x79, (byte) 0x4C,
1001             (byte) 0x00, (byte) 0x08, (byte) 0x68, (byte) 0x6F, (byte) 0x73,
1002             (byte) 0x74, (byte) 0x4E, (byte) 0x61, (byte) 0x6D, (byte) 0x65,
1003             (byte) 0x71, (byte) 0x00, (byte) 0x7E, (byte) 0x00, (byte) 0x01,
1004             (byte) 0x78, (byte) 0x70, (byte) 0x00, (byte) 0x00, (byte) 0x00,
1005             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x02,
1006             (byte) 0x74, (byte) 0x00, (byte) 0x09, (byte) 0x6C, (byte) 0x6F,
1007             (byte) 0x63, (byte) 0x61, (byte) 0x6C, (byte) 0x68, (byte) 0x6F,
1008             (byte) 0x73, (byte) 0x74, (byte) 0x00, (byte) 0x00, (byte) 0x00,
1009             (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x74, (byte) 0x00,
1010             (byte) 0x03, (byte) 0x6C, (byte) 0x6F, (byte) 0x30, (byte) 0x75,
1011             (byte) 0x72, (byte) 0x00, (byte) 0x02, (byte) 0x5B, (byte) 0x42,
1012             (byte) 0xAC, (byte) 0xF3, (byte) 0x17, (byte) 0xF8, (byte) 0x06,
1013             (byte) 0x08, (byte) 0x54, (byte) 0xE0, (byte) 0x02, (byte) 0x00,
1014             (byte) 0x00, (byte) 0x78, (byte) 0x70, (byte) 0x00, (byte) 0x00,
1015             (byte) 0x00, (byte) 0x10, (byte) 0x00, (byte) 0x00, (byte) 0x00,
1016             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
1017             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
1018             (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x78 };
1019 
1020 }
1021 
1022 class MockLo0Inet6Address {
1023 
1024     private static final byte[] LOOPBACKIPV6ADDRESS = { (byte) 0x00,
1025             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
1026             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
1027             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01 };
1028 
1029     private static final String LOCALHOSTNAME = "localhost";
1030 
1031     private static final String LO0HOSTADDRESS = "0:0:0:0:0:0:0:1%lo0";
1032 
1033     private static final String BARE_LO0HOSTADDRESS = "0:0:0:0:0:0:0:1";
1034 
1035     private static final String LO0HOSTADDRESS_WITHINDEX = "0:0:0:0:0:0:0:1%1";
1036 
1037     private static final int SCOPE_ID_LO0 = 1;
1038 
1039     private static final int SCOPE_ID_ZERO = 0;
1040 
1041     public static final String NETWORK_IF_LO0 = "lo0";
1042 
1043     static String getHostName() {
1044         return LOCALHOSTNAME;
1045     }
1046 
1047     static String getHostAddress() {
1048         return LO0HOSTADDRESS;
1049     }
1050 
1051     static String getBareHostAddress() {
1052         return BARE_LO0HOSTADDRESS;
1053     }
1054 
1055     static String getHostAddressWithIndex() {
1056         return LO0HOSTADDRESS_WITHINDEX;
1057     }
1058 
1059     static byte[] getAddress() {
1060         return LOOPBACKIPV6ADDRESS;
1061     }
1062 
1063     static int getScopeId() {
1064         return SCOPE_ID_LO0;
1065     }
1066 
1067     static int getScopeZero() {
1068         return SCOPE_ID_ZERO;
1069     }
1070 
1071     static String getScopeIfName() {
1072         return NETWORK_IF_LO0;
1073     }
1074 
1075 }
1076 
1077 class MockE1000g0Inet6Address {
1078 
1079     // fe80::21b:24ff:febd:f29c
1080     private static final byte[] E1000G0IPV6ADDRESS = { (byte) 0xfe,
1081             (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
1082             (byte) 0x00, (byte) 0x00, (byte) 0x02, (byte) 0x1b, (byte) 0x24,
1083             (byte) 0xff, (byte) 0xfe, (byte) 0xbd, (byte) 0xf2, (byte) 0x9c };
1084 
1085     private static final String E1000G0HOSTNAME = "fe80:0:0:0:21b:24ff:febd:f29c%e1000g0";
1086 
1087     private static final String BARE_E1000G0HOSTADDRESS = "fe80:0:0:0:21b:24ff:febd:f29c";
1088 
1089     private static final String E1000G0HOSTADDRESS_WITHINDEX = "fe80:0:0:0:21b:24ff:febd:f29c%2";
1090 
1091     private static final String E1000G0HOSTADDRESS = "fe80:0:0:0:21b:24ff:febd:f29c%e1000g0";
1092 
1093     private static final String NETWORK_IF_E1000G0 = "e1000g0";
1094 
1095     private static final int SCOPE_ID_E1000G0 = 2;
1096 
1097     private static final int SCOPE_ID_ZERO = 0;
1098 
1099     static String getHostName() {
1100         return E1000G0HOSTNAME;
1101     }
1102 
1103     static String getHostAddress() {
1104         return E1000G0HOSTADDRESS;
1105     }
1106 
1107     static String getHostAddressWithIndex() {
1108         return E1000G0HOSTADDRESS_WITHINDEX;
1109     }
1110 
1111     static String getBareHostAddress() {
1112         return BARE_E1000G0HOSTADDRESS;
1113     }
1114 
1115     static byte[] getAddress() {
1116         return E1000G0IPV6ADDRESS;
1117     }
1118 
1119     static int getScopeId() {
1120         return SCOPE_ID_E1000G0;
1121     }
1122 
1123     static int getScopeZero() {
1124         return SCOPE_ID_ZERO;
1125     }
1126 
1127     static String getScopeIfName() {
1128         return NETWORK_IF_E1000G0;
1129     }
1130 
1131 }