1 /*
2  * Copyright (c) 2015, 2018, 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 
main(String[] args)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 
runTests()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 
getThisHostIPV6Address(String hostName)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 
testAllNetworkInterfaces()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                     System.err.println(" hostname: " + i6adr.getHostName());
196                     testInet6AddressSerialization(i6adr, null);
197                 }
198             }
199         }
200     }
201 
displayExpectedInet6Address(Inet6Address expectedInet6Address)202     static void displayExpectedInet6Address(Inet6Address expectedInet6Address) {
203 
204         String expectedHostName = expectedInet6Address.getHostName();
205         byte[] expectedAddress = expectedInet6Address.getAddress();
206         String expectedHostAddress = expectedInet6Address.getHostAddress();
207         int expectedScopeId = expectedInet6Address.getScopeId();
208         NetworkInterface expectedNetIf = expectedInet6Address
209                 .getScopedInterface();
210 
211         System.err.println("Excpected HostName: " + expectedHostName);
212         System.err.println("Expected Address: "
213                 + Arrays.toString(expectedAddress));
214         System.err.println("Expected HostAddress: " + expectedHostAddress);
215         System.err.println("Expected Scope Id " + expectedScopeId);
216         System.err.println("Expected NetworkInterface " + expectedNetIf);
217         System.err.println("Expected Inet6Address " + expectedInet6Address);
218     }
219 
220     // test serialization deserialization of Inet6Address
testInet6AddressSerialization( Inet6Address expectedInet6Address, byte[] serializedAddress)221     static void testInet6AddressSerialization(
222             Inet6Address expectedInet6Address, byte[] serializedAddress)
223             throws IOException {
224         System.err.println("\n testInet6AddressSerialization:  enter \n");
225 
226         // displayExpectedInet6Address(expectedInet6Address);
227 
228         byte[] serialData = serializedAddress != null ? serializedAddress
229                 : generateSerializedInet6AddressData(expectedInet6Address,
230                         null, false);
231         try (ByteArrayInputStream bis = new ByteArrayInputStream(serialData);
232                 ObjectInputStream oin = new ObjectInputStream(bis)) {
233             Inet6Address deserializedIPV6Addr = (Inet6Address) oin.readObject();
234             System.err.println("Deserialized Inet6Address "
235                     + deserializedIPV6Addr);
236             assertHostNameEqual(expectedInet6Address.getHostName(),
237                     deserializedIPV6Addr.getHostName());
238             assertHostAddressEqual(expectedInet6Address.getHostAddress(),
239                     deserializedIPV6Addr.getHostAddress());
240             assertAddressEqual(expectedInet6Address.getAddress(),
241                     deserializedIPV6Addr.getAddress());
242             assertScopeIdEqual(expectedInet6Address.getScopeId(),
243                     deserializedIPV6Addr.getScopeId());
244             assertNetworkInterfaceEqual(
245                     expectedInet6Address.getScopedInterface(),
246                     deserializedIPV6Addr.getScopedInterface());
247         } catch (Exception e) {
248             System.err.println("Exception caught during deserialization");
249             failed = true;
250             e.printStackTrace();
251         }
252     }
253 
testSerializedE1000gInet6Address()254     static void testSerializedE1000gInet6Address() throws IOException {
255         System.err.println("\n testSerializedE1000gInet6Address:  enter \n");
256         boolean testWithNetIf = true;
257         boolean useMockInet6Address = false;
258 
259         NetworkInterface testNetIf = NetworkInterface
260                 .getByName(NETWORK_IF_E1000G0);
261         Inet6Address expectedInet6Address = null;
262         if (testNetIf != null) {
263             System.err
264                     .println("\n testSerializedE1000gInet6Address:  using netif \n");
265             try {
266                 expectedInet6Address = Inet6Address.getByAddress(
267                         E1000G0HOSTNAME, E1000G0IPV6ADDRESS, testNetIf);
268             } catch (UnknownHostException ukhEx) {
269                 ukhEx.printStackTrace();
270                 testWithNetIf = true;
271                 useMockInet6Address = true;
272             }
273         } else {
274             System.err
275                     .println("\n testSerializedE1000gInet6Address:  using index \n");
276             try {
277                 expectedInet6Address = Inet6Address.getByAddress(
278                         E1000G0HOSTNAME, E1000G0IPV6ADDRESS, SCOPE_ID_ZERO);
279             } catch (UnknownHostException ukhEx1) {
280                 ukhEx1.printStackTrace();
281                 useMockInet6Address = true;
282             }
283             testWithNetIf = false;
284         }
285 
286         byte[] serializedAddress = SerialData_ifname_e1000g0;
287 
288         // displayExpectedInet6Address(expectedInet6Address);
289 
290         try (ByteArrayInputStream bis = new ByteArrayInputStream(
291                 serializedAddress);
292                 ObjectInputStream oin = new ObjectInputStream(bis)) {
293             Inet6Address deserializedIPV6Addr = (Inet6Address) oin.readObject();
294             System.err.println("Deserialized Inet6Address "
295                     + deserializedIPV6Addr);
296 
297             if (!useMockInet6Address) {
298                 assertHostNameEqual(expectedInet6Address.getHostName(),
299                         deserializedIPV6Addr.getHostName());
300                 if (testWithNetIf) {
301                     assertHostAddressEqual(
302                             expectedInet6Address.getHostAddress(),
303                             deserializedIPV6Addr.getHostAddress());
304                 } else {
305                     assertHostAddressEqual(
306                             MockE1000g0Inet6Address.getBareHostAddress(),
307                             deserializedIPV6Addr.getHostAddress());
308                 }
309                 assertAddressEqual(expectedInet6Address.getAddress(),
310                         deserializedIPV6Addr.getAddress());
311                 assertScopeIdEqual(expectedInet6Address.getScopeId(),
312                         deserializedIPV6Addr.getScopeId());
313                 if (testWithNetIf) {
314                     assertNetworkInterfaceEqual(
315                             expectedInet6Address.getScopedInterface(),
316                             deserializedIPV6Addr.getScopedInterface());
317                 } else {
318                     assertNetworkInterfaceEqual(null,
319                             deserializedIPV6Addr.getScopedInterface());
320                 }
321             } else { // use MockLo0Inet6Address
322                 assertHostNameEqual(MockE1000g0Inet6Address.getHostName(),
323                         deserializedIPV6Addr.getHostName());
324                 if (testWithNetIf) {
325                     assertHostAddressEqual(
326                             MockE1000g0Inet6Address.getHostAddress(),
327                             deserializedIPV6Addr.getHostAddress());
328                 } else {
329                     assertHostAddressEqual(
330                             MockE1000g0Inet6Address.getHostAddressWithIndex(),
331                             deserializedIPV6Addr.getHostAddress());
332                 }
333                 assertAddressEqual(MockE1000g0Inet6Address.getAddress(),
334                         deserializedIPV6Addr.getAddress());
335                 if (testWithNetIf) {
336                 assertScopeIdEqual(MockE1000g0Inet6Address.getScopeId(),
337                         deserializedIPV6Addr.getScopeId());
338                 } else {
339                     assertScopeIdEqual(MockE1000g0Inet6Address.getScopeZero(),
340                             deserializedIPV6Addr.getScopeId());
341                 }
342                 assertNetworkInterfaceNameEqual(
343                         MockE1000g0Inet6Address.getScopeIfName(),
344                         deserializedIPV6Addr.getScopedInterface());
345             }
346         } catch (Exception e) {
347             System.err.println("Exception caught during deserialization");
348             failed = true;
349             e.printStackTrace();
350         }
351     }
352 
testSerializedLo0Inet6Address()353     static void testSerializedLo0Inet6Address() throws IOException {
354         System.err.println("\n testSerializedLo0Inet6Address:  enter \n");
355         boolean testWithNetIf = true;
356         boolean useMockInet6Address = false;
357 
358         NetworkInterface testNetIf = NetworkInterface.getByName(NETWORK_IF_LO0);
359         Inet6Address expectedInet6Address = null;
360         if (testNetIf != null) {
361             System.err
362                     .println("\n testSerializedLo0Inet6Address:  using netif \n");
363             try {
364                 expectedInet6Address = Inet6Address.getByAddress(LOCALHOSTNAME,
365                         LOOPBACKIPV6ADDRESS, testNetIf);
366             } catch (UnknownHostException ukhEx) {
367                 ukhEx.printStackTrace();
368                 testWithNetIf = true;
369                 useMockInet6Address = true;
370             }
371         } else {
372             System.err
373                     .println("\n testSerializedLo0Inet6Address:  using index \n");
374             try {
375                 expectedInet6Address = Inet6Address.getByAddress(LOCALHOSTNAME,
376                         LOOPBACKIPV6ADDRESS, SCOPE_ID_ZERO);
377             } catch (UnknownHostException ukhEx1) {
378                 ukhEx1.printStackTrace();
379                 useMockInet6Address = true;
380             }
381             testWithNetIf = false;
382         }
383 
384         // displayExpectedInet6Address(expectedInet6Address);
385 
386         byte[] serializedAddress = SerialData_ifname_lo0;
387 
388         try (ByteArrayInputStream bis = new ByteArrayInputStream(
389                 serializedAddress);
390                 ObjectInputStream oin = new ObjectInputStream(bis)) {
391             Inet6Address deserializedIPV6Addr = (Inet6Address) oin.readObject();
392             System.err.println("Deserialized Inet6Address "
393                     + deserializedIPV6Addr);
394             if (!useMockInet6Address) {
395                 assertHostNameEqual(expectedInet6Address.getHostName(),
396                         deserializedIPV6Addr.getHostName());
397                 if (testWithNetIf) {
398                     assertHostAddressEqual(
399                             expectedInet6Address.getHostAddress(),
400                             deserializedIPV6Addr.getHostAddress());
401                 } else {
402                     assertHostAddressEqual(
403                             MockLo0Inet6Address.getBareHostAddress(),
404                             deserializedIPV6Addr.getHostAddress());
405                 }
406                 assertAddressEqual(expectedInet6Address.getAddress(),
407                         deserializedIPV6Addr.getAddress());
408                 assertScopeIdEqual(expectedInet6Address.getScopeId(),
409                         deserializedIPV6Addr.getScopeId());
410                 if (testWithNetIf) {
411                     assertNetworkInterfaceEqual(
412                             expectedInet6Address.getScopedInterface(),
413                             deserializedIPV6Addr.getScopedInterface());
414                 } else {
415                     assertNetworkInterfaceEqual(null,
416                             deserializedIPV6Addr.getScopedInterface());
417                 }
418             } else { // use MockLo0Inet6Address
419                 assertHostNameEqual(MockLo0Inet6Address.getHostName(),
420                         deserializedIPV6Addr.getHostName());
421                 if (testWithNetIf) {
422                     assertHostAddressEqual(
423                             MockLo0Inet6Address.getHostAddress(),
424                             deserializedIPV6Addr.getHostAddress());
425                 } else {
426                     assertHostAddressEqual(
427                             MockLo0Inet6Address.getHostAddressWithIndex(),
428                             deserializedIPV6Addr.getHostAddress());
429                 }
430                 assertAddressEqual(MockLo0Inet6Address.getAddress(),
431                         deserializedIPV6Addr.getAddress());
432                 if (testWithNetIf) {
433                 assertScopeIdEqual(MockLo0Inet6Address.getScopeId(),
434                         deserializedIPV6Addr.getScopeId());
435                 } else {
436                     assertScopeIdEqual(MockLo0Inet6Address.getScopeZero(),
437                             deserializedIPV6Addr.getScopeId());
438                 }
439                 assertNetworkInterfaceNameEqual(
440                         MockLo0Inet6Address.getScopeIfName(),
441                         deserializedIPV6Addr.getScopedInterface());
442             }
443         } catch (Exception e) {
444             System.err.println("Exception caught during deserialization");
445             failed = true;
446             e.printStackTrace();
447         }
448     }
449 
getAllInet6Addresses()450     static List<Inet6Address> getAllInet6Addresses() throws Exception {
451         // System.err.println("\n getAllInet6Addresses: \n ");
452         ArrayList<Inet6Address> inet6Addresses = new ArrayList<Inet6Address>();
453         for (Enumeration<NetworkInterface> e = NetworkInterface
454                 .getNetworkInterfaces(); e.hasMoreElements();) {
455             NetworkInterface netIF = e.nextElement();
456             for (Enumeration<InetAddress> iadrs = netIF.getInetAddresses(); iadrs
457                     .hasMoreElements();) {
458                 InetAddress iadr = iadrs.nextElement();
459                 if (iadr instanceof Inet6Address) {
460                     System.err.println("Test NetworkInterface:  " + netIF);
461                     Inet6Address i6adr = (Inet6Address) iadr;
462                     System.err.println(" address " + iadr);
463                     System.err.println(" scoped iface: "
464                             + i6adr.getScopedInterface());
465                     // using this to actually set the hostName for an
466                     // InetAddress
467                     // created through the NetworkInterface
468                     // have found that the fabricated instances has a null
469                     // hostName
470                     System.err.println(" hostName: " + i6adr.getHostName());
471                     inet6Addresses.add(i6adr);
472                 }
473             }
474         }
475         return inet6Addresses;
476     }
477 
assertHostNameEqual(String expectedHostName, String deserializedHostName)478     static void assertHostNameEqual(String expectedHostName,
479             String deserializedHostName) {
480         System.err
481                 .println("Inet6AddressSerializationTest.assertHostNameEqual:");
482         if (expectedHostName == null) {
483             if (deserializedHostName == null) {
484                 // ok, do nothing.
485             } else {
486                 System.err.println("Error checking " + " HostName, expected:"
487                         + expectedHostName + ", got :" + deserializedHostName);
488                 failed = true;
489             }
490         } else if (!expectedHostName.equals(deserializedHostName)) {
491             System.err.println("Error checking "
492                     + // versionStr +
493                     " HostName, expected:" + expectedHostName + ", got :"
494                     + deserializedHostName);
495             failed = true;
496         } else {
497             System.err.println("HostName equality "
498                     + // versionStr +
499                     " HostName, expected:" + expectedHostName + ", got :"
500                     + deserializedHostName);
501         }
502     }
503 
assertHostAddressEqual(String expectedHostAddress, String deserializedHostAddress)504     static void assertHostAddressEqual(String expectedHostAddress,
505             String deserializedHostAddress) {
506         System.err
507                 .println("Inet6AddressSerializationTest.assertHostAddressEqual:");
508         if (expectedHostAddress == null) {
509             if (deserializedHostAddress == null) {
510                 // ok, do nothing.
511             } else {
512                 System.err.println("Error checking "
513                         + " HostAddress, expected: " + expectedHostAddress
514                         + ", got: " + deserializedHostAddress);
515                 failed = true;
516             }
517         } else if (!expectedHostAddress.equals(deserializedHostAddress)) {
518             System.err.println("Error checking "
519                     + // versionStr +
520                     " HostAddress, expected: " + expectedHostAddress
521                     + ", got: " + deserializedHostAddress);
522             failed = true;
523         } else {
524             System.err.println("HostAddress equality "
525                     + // versionStr +
526                     " HostAddress, expected: " + expectedHostAddress
527                     + ", got: " + deserializedHostAddress);
528         }
529     }
530 
assertAddressEqual(byte[] expectedAddress, byte[] deserializedAddress)531     static void assertAddressEqual(byte[] expectedAddress,
532             byte[] deserializedAddress) {
533         System.err.println("Inet6AddressSerializationTest.assertAddressEqual:");
534         if (expectedAddress == null) {
535             if (deserializedAddress == null) {
536                 // ok, do nothing.
537             } else {
538                 System.err.println("Error checking " + " Address, expected:"
539                         + Arrays.toString(expectedAddress) + ", got: "
540                         + Arrays.toString(deserializedAddress));
541                 failed = true;
542             }
543         } else if (!Arrays.equals(expectedAddress, deserializedAddress)) {
544             System.err.println("Error checking "
545                     + // versionStr +
546                     " Address, expected: " + Arrays.toString(expectedAddress)
547                     + ", got: " + Arrays.toString(deserializedAddress));
548             failed = true;
549         } else {
550             System.err.println("Address equality "
551                     + // versionStr +
552                     " Address, expected: " + Arrays.toString(expectedAddress)
553                     + ", got: " + Arrays.toString(deserializedAddress));
554         }
555     }
556 
assertScopeIdEqual(int expectedScopeId, int deserializedScopeId)557     static void assertScopeIdEqual(int expectedScopeId, int deserializedScopeId) {
558         System.err.println("Inet6AddressSerializationTest.assertScopeIdEqual:");
559         if (expectedScopeId != deserializedScopeId) {
560             System.err.println("Error checking " + " ScopeId, expected:"
561                     + expectedScopeId + ", got: " + deserializedScopeId);
562             failed = true;
563         } else {
564             System.err.println("ScopeId equality "
565                     + // versionStr +
566                     " ScopeId, expected: " + expectedScopeId + ", got: "
567                     + deserializedScopeId);
568         }
569     }
570 
assertNetworkInterfaceNameEqual(String expectedNetworkIfName, NetworkInterface deserializedNetworkInterface)571     static void assertNetworkInterfaceNameEqual(String expectedNetworkIfName,
572             NetworkInterface deserializedNetworkInterface) {
573 
574         if (deserializedNetworkInterface != null) {
575             String deserializedNetworkIfName = deserializedNetworkInterface
576                     .getName();
577             System.err
578                     .println("Inet6AddressSerializationTest.assertHostNameEqual:");
579             if (expectedNetworkIfName == null) {
580                 if (deserializedNetworkIfName == null) {
581                     // ok, do nothing.
582                 } else {
583                     System.err.println("Error checking "
584                             + " NetworkIfName, expected: "
585                             + expectedNetworkIfName + ", got: "
586                             + deserializedNetworkIfName);
587                     failed = true;
588                 }
589             } else if (!expectedNetworkIfName.equals(deserializedNetworkIfName)) {
590                 System.err.println("Error checking "
591                         + " NetworkIfName, expected: " + expectedNetworkIfName
592                         + ", got: " + deserializedNetworkIfName);
593                 failed = true;
594             } else {
595                 System.err.println("NetworkIfName equality "
596                         + " NetworkIfName, expected: " + expectedNetworkIfName
597                         + ", got: " + deserializedNetworkIfName);
598             }
599         } else {
600             System.err
601                     .println("Warning "
602                             + " NetworkInterface  expected, but is null - ifname not relevant on deserializing host");
603         }
604     }
605 
assertNetworkInterfaceEqual( NetworkInterface expectedNetworkInterface, NetworkInterface deserializedNetworkInterface)606     static void assertNetworkInterfaceEqual(
607             NetworkInterface expectedNetworkInterface,
608             NetworkInterface deserializedNetworkInterface) {
609         System.err
610                 .println("Inet6AddressSerializationTest.assertNetworkInterfaceEqual:");
611         if (expectedNetworkInterface == null) {
612             if (deserializedNetworkInterface == null) {
613                 // ok, do nothing.
614                 System.err.println("Network Interface equality "
615                         + " NetworkInterface, expected:"
616                         + expectedNetworkInterface + ", got :"
617                         + deserializedNetworkInterface);
618             } else {
619                 System.err.println("Error checking "
620                         + " NetworkInterface, expected:"
621                         + expectedNetworkInterface + ", got :"
622                         + deserializedNetworkInterface);
623                 failed = true;
624             }
625         } else if (!expectedNetworkInterface
626                 .equals(deserializedNetworkInterface)) {
627             System.err.println("Error checking "
628                     + // versionStr +
629                     " NetworkInterface, expected:" + expectedNetworkInterface
630                     + ", got :" + deserializedNetworkInterface);
631             failed = true;
632         } else {
633             System.err.println("Network Interface equality "
634                     + " NetworkInterface, expected:" + expectedNetworkInterface
635                     + ", got :" + deserializedNetworkInterface);
636         }
637     }
638 
equal(Object expected, Object got)639     static void equal(Object expected, Object got) {
640         if (expected == null) {
641             if (got == null) {
642                 // ok, do nothing.
643             } else {
644                 System.err.println("Error checking "
645                         + " serial data, expected:" + expected + ", got :"
646                         + got);
647                 failed = true;
648             }
649         } else if (!expected.equals(got)) {
650             System.err.println("Error checking " + // versionStr +
651                     " serial data, expected:" + expected + ", got :" + got);
652             failed = true;
653         }
654     }
655 
656     // Used to generate serialData.
generateSerializedInet6AddressData(Inet6Address addr, PrintStream out, boolean outputToFile)657     static byte[] generateSerializedInet6AddressData(Inet6Address addr,
658             PrintStream out, boolean outputToFile) throws IOException {
659         ByteArrayOutputStream bos = new ByteArrayOutputStream();
660         try (ObjectOutputStream oos = new ObjectOutputStream(bos)) {
661             oos.writeObject(addr);
662         }
663 
664         String ifname = getIfName(addr);
665         byte[] ba = bos.toByteArray();
666         if (out != null) {
667             out.format("static final byte[] SerialData" + ifname + " = {\n");
668             for (int i = 0; i < ba.length; i++) {
669                 out.format(" (byte)0x%02X", ba[i]);
670                 if (i != (ba.length - 1))
671                     out.format(",");
672                 if (((i + 1) % 6) == 0)
673                     out.format("\n");
674             }
675             out.format(" };\n \n");
676         }
677         if (outputToFile) {
678             serializeInet6AddressToFile(addr);
679         }
680         return ba;
681     }
682 
getIfName(Inet6Address inet6Addr)683     private static String getIfName(Inet6Address inet6Addr) {
684         String ifname;
685         if (inet6Addr.getScopedInterface() != null) {
686             ifname = "_ifname_" + inet6Addr.getScopedInterface().getName();
687         } else {
688             ifname = "_ifname_"
689                     + Integer.valueOf(inet6Addr.getScopeId()).toString();
690         }
691         return ifname;
692     }
693 
generateAllInet6AddressSerializedData()694     static void generateAllInet6AddressSerializedData() throws IOException {
695         // System.err.println("generateAllInet6AddressSerializedData: enter ....");
696 
697         List<Inet6Address> inet6Addresses;
698 
699         try {
700             inet6Addresses = getAllInet6Addresses();
701         } catch (Exception e) {
702             e.printStackTrace();
703             throw new IOException(e);
704         }
705 
706         for (Inet6Address inet6Address : inet6Addresses) {
707             generateSerializedInet6AddressData(inet6Address, System.out, true);
708         }
709     }
710 
serializeInet6AddressToFile(Inet6Address inet6Addr)711     static void serializeInet6AddressToFile(Inet6Address inet6Addr) {
712 
713         // System.err
714         // .println("serializeInet6AddressToIPV6AddressFile: enter ....");
715 
716         FileOutputStream fOut = null;
717         String inet6AddressOutputFilename = null;
718         inet6AddressOutputFilename = createOutputFileName(inet6Addr);
719         try {
720             fOut = new FileOutputStream(inet6AddressOutputFilename);
721         } catch (FileNotFoundException fnfEx) {
722 
723             fnfEx.printStackTrace();
724         }
725         ObjectOutputStream ooStream = null;
726         try {
727             if (fOut != null) {
728                 ooStream = new ObjectOutputStream(fOut);
729             } else {
730                 System.err.println("Problem initilising Object output stream ");
731                 System.exit(-1);
732             }
733 
734         } catch (IOException e) {
735             e.printStackTrace();
736             System.exit(-1);
737         }
738 
739         // serialise the last Inet6Address
740         /*
741          * System.err
742          * .println("serializeInet6AddressToIPV6AddressFile scoped iface:  \n" +
743          * inet6Addr.getScopedInterface());
744          */
745         try {
746             ooStream.writeObject(inet6Addr);
747         } catch (Exception ex) {
748             ex.printStackTrace();
749             System.exit(-1);
750         }
751 
752         try {
753             ooStream.close();
754         } catch (IOException e) {
755             e.printStackTrace();
756         }
757     }
758 
createOutputFileName(Inet6Address inet6Addr)759     private static String createOutputFileName(Inet6Address inet6Addr) {
760         String inet6AddressOutputFilename;
761         if (inet6Addr.getScopedInterface() != null) {
762             inet6AddressOutputFilename = "IPV6Address_"
763                     + inet6Addr.getScopedInterface().getName() + ".out";
764         } else {
765             inet6AddressOutputFilename = "IPV6Address_"
766                     + Integer.valueOf(inet6Addr.getScopeId()).toString()
767                     + ".out";
768         }
769         return inet6AddressOutputFilename;
770     }
771 
772     // --- Generated data ---
773     // JDK7 output java Inet6AddressSerializationTest generate.
774 
775     // loopback lo0 interface on Solaris 10
776 
777     static final byte[] JDK7Inet6AddressSerialData = { (byte) 0xAC,
778             (byte) 0xED, (byte) 0x00, (byte) 0x05, (byte) 0x73, (byte) 0x72,
779             (byte) 0x00, (byte) 0x15, (byte) 0x6A, (byte) 0x61, (byte) 0x76,
780             (byte) 0x61, (byte) 0x2E, (byte) 0x6E, (byte) 0x65, (byte) 0x74,
781             (byte) 0x2E, (byte) 0x49, (byte) 0x6E, (byte) 0x65, (byte) 0x74,
782             (byte) 0x36, (byte) 0x41, (byte) 0x64, (byte) 0x64, (byte) 0x72,
783             (byte) 0x65, (byte) 0x73, (byte) 0x73, (byte) 0x5F, (byte) 0x7C,
784             (byte) 0x20, (byte) 0x81, (byte) 0x52, (byte) 0x2C, (byte) 0x80,
785             (byte) 0x21, (byte) 0x03, (byte) 0x00, (byte) 0x05, (byte) 0x49,
786             (byte) 0x00, (byte) 0x08, (byte) 0x73, (byte) 0x63, (byte) 0x6F,
787             (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x64,
788             (byte) 0x5A, (byte) 0x00, (byte) 0x0C, (byte) 0x73, (byte) 0x63,
789             (byte) 0x6F, (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69,
790             (byte) 0x64, (byte) 0x5F, (byte) 0x73, (byte) 0x65, (byte) 0x74,
791             (byte) 0x5A, (byte) 0x00, (byte) 0x10, (byte) 0x73, (byte) 0x63,
792             (byte) 0x6F, (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69,
793             (byte) 0x66, (byte) 0x6E, (byte) 0x61, (byte) 0x6D, (byte) 0x65,
794             (byte) 0x5F, (byte) 0x73, (byte) 0x65, (byte) 0x74, (byte) 0x4C,
795             (byte) 0x00, (byte) 0x06, (byte) 0x69, (byte) 0x66, (byte) 0x6E,
796             (byte) 0x61, (byte) 0x6D, (byte) 0x65, (byte) 0x74, (byte) 0x00,
797             (byte) 0x12, (byte) 0x4C, (byte) 0x6A, (byte) 0x61, (byte) 0x76,
798             (byte) 0x61, (byte) 0x2F, (byte) 0x6C, (byte) 0x61, (byte) 0x6E,
799             (byte) 0x67, (byte) 0x2F, (byte) 0x53, (byte) 0x74, (byte) 0x72,
800             (byte) 0x69, (byte) 0x6E, (byte) 0x67, (byte) 0x3B, (byte) 0x5B,
801             (byte) 0x00, (byte) 0x09, (byte) 0x69, (byte) 0x70, (byte) 0x61,
802             (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73,
803             (byte) 0x73, (byte) 0x74, (byte) 0x00, (byte) 0x02, (byte) 0x5B,
804             (byte) 0x42, (byte) 0x78, (byte) 0x72, (byte) 0x00, (byte) 0x14,
805             (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2E,
806             (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x2E, (byte) 0x49,
807             (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x41, (byte) 0x64,
808             (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73,
809             (byte) 0x2D, (byte) 0x9B, (byte) 0x57, (byte) 0xAF, (byte) 0x9F,
810             (byte) 0xE3, (byte) 0xEB, (byte) 0xDB, (byte) 0x02, (byte) 0x00,
811             (byte) 0x03, (byte) 0x49, (byte) 0x00, (byte) 0x07, (byte) 0x61,
812             (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73,
813             (byte) 0x73, (byte) 0x49, (byte) 0x00, (byte) 0x06, (byte) 0x66,
814             (byte) 0x61, (byte) 0x6D, (byte) 0x69, (byte) 0x6C, (byte) 0x79,
815             (byte) 0x4C, (byte) 0x00, (byte) 0x08, (byte) 0x68, (byte) 0x6F,
816             (byte) 0x73, (byte) 0x74, (byte) 0x4E, (byte) 0x61, (byte) 0x6D,
817             (byte) 0x65, (byte) 0x71, (byte) 0x00, (byte) 0x7E, (byte) 0x00,
818             (byte) 0x01, (byte) 0x78, (byte) 0x70, (byte) 0x00, (byte) 0x00,
819             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
820             (byte) 0x02, (byte) 0x74, (byte) 0x00, (byte) 0x09, (byte) 0x6C,
821             (byte) 0x6F, (byte) 0x63, (byte) 0x61, (byte) 0x6C, (byte) 0x68,
822             (byte) 0x6F, (byte) 0x73, (byte) 0x74, (byte) 0x00, (byte) 0x00,
823             (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x70,
824             (byte) 0x75, (byte) 0x72, (byte) 0x00, (byte) 0x02, (byte) 0x5B,
825             (byte) 0x42, (byte) 0xAC, (byte) 0xF3, (byte) 0x17, (byte) 0xF8,
826             (byte) 0x06, (byte) 0x08, (byte) 0x54, (byte) 0xE0, (byte) 0x02,
827             (byte) 0x00, (byte) 0x00, (byte) 0x78, (byte) 0x70, (byte) 0x00,
828             (byte) 0x00, (byte) 0x00, (byte) 0x10, (byte) 0x00, (byte) 0x00,
829             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
830             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
831             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x78 };
832 
833     // JDK8 output java Inet6AddressSerializationTest generate.
834     // loopback lo0 interface on Solaris 10
835 
836     static final byte[] JDK8Inet6AddressSerialData = { (byte) 0xAC,
837             (byte) 0xED, (byte) 0x00, (byte) 0x05, (byte) 0x73, (byte) 0x72,
838             (byte) 0x00, (byte) 0x15, (byte) 0x6A, (byte) 0x61, (byte) 0x76,
839             (byte) 0x61, (byte) 0x2E, (byte) 0x6E, (byte) 0x65, (byte) 0x74,
840             (byte) 0x2E, (byte) 0x49, (byte) 0x6E, (byte) 0x65, (byte) 0x74,
841             (byte) 0x36, (byte) 0x41, (byte) 0x64, (byte) 0x64, (byte) 0x72,
842             (byte) 0x65, (byte) 0x73, (byte) 0x73, (byte) 0x5F, (byte) 0x7C,
843             (byte) 0x20, (byte) 0x81, (byte) 0x52, (byte) 0x2C, (byte) 0x80,
844             (byte) 0x21, (byte) 0x03, (byte) 0x00, (byte) 0x05, (byte) 0x49,
845             (byte) 0x00, (byte) 0x08, (byte) 0x73, (byte) 0x63, (byte) 0x6F,
846             (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x64,
847             (byte) 0x5A, (byte) 0x00, (byte) 0x0C, (byte) 0x73, (byte) 0x63,
848             (byte) 0x6F, (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69,
849             (byte) 0x64, (byte) 0x5F, (byte) 0x73, (byte) 0x65, (byte) 0x74,
850             (byte) 0x5A, (byte) 0x00, (byte) 0x10, (byte) 0x73, (byte) 0x63,
851             (byte) 0x6F, (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69,
852             (byte) 0x66, (byte) 0x6E, (byte) 0x61, (byte) 0x6D, (byte) 0x65,
853             (byte) 0x5F, (byte) 0x73, (byte) 0x65, (byte) 0x74, (byte) 0x4C,
854             (byte) 0x00, (byte) 0x06, (byte) 0x69, (byte) 0x66, (byte) 0x6E,
855             (byte) 0x61, (byte) 0x6D, (byte) 0x65, (byte) 0x74, (byte) 0x00,
856             (byte) 0x12, (byte) 0x4C, (byte) 0x6A, (byte) 0x61, (byte) 0x76,
857             (byte) 0x61, (byte) 0x2F, (byte) 0x6C, (byte) 0x61, (byte) 0x6E,
858             (byte) 0x67, (byte) 0x2F, (byte) 0x53, (byte) 0x74, (byte) 0x72,
859             (byte) 0x69, (byte) 0x6E, (byte) 0x67, (byte) 0x3B, (byte) 0x5B,
860             (byte) 0x00, (byte) 0x09, (byte) 0x69, (byte) 0x70, (byte) 0x61,
861             (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73,
862             (byte) 0x73, (byte) 0x74, (byte) 0x00, (byte) 0x02, (byte) 0x5B,
863             (byte) 0x42, (byte) 0x78, (byte) 0x72, (byte) 0x00, (byte) 0x14,
864             (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2E,
865             (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x2E, (byte) 0x49,
866             (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x41, (byte) 0x64,
867             (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73,
868             (byte) 0x2D, (byte) 0x9B, (byte) 0x57, (byte) 0xAF, (byte) 0x9F,
869             (byte) 0xE3, (byte) 0xEB, (byte) 0xDB, (byte) 0x02, (byte) 0x00,
870             (byte) 0x03, (byte) 0x49, (byte) 0x00, (byte) 0x07, (byte) 0x61,
871             (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73,
872             (byte) 0x73, (byte) 0x49, (byte) 0x00, (byte) 0x06, (byte) 0x66,
873             (byte) 0x61, (byte) 0x6D, (byte) 0x69, (byte) 0x6C, (byte) 0x79,
874             (byte) 0x4C, (byte) 0x00, (byte) 0x08, (byte) 0x68, (byte) 0x6F,
875             (byte) 0x73, (byte) 0x74, (byte) 0x4E, (byte) 0x61, (byte) 0x6D,
876             (byte) 0x65, (byte) 0x71, (byte) 0x00, (byte) 0x7E, (byte) 0x00,
877             (byte) 0x01, (byte) 0x78, (byte) 0x70, (byte) 0x00, (byte) 0x00,
878             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
879             (byte) 0x02, (byte) 0x74, (byte) 0x00, (byte) 0x09, (byte) 0x6C,
880             (byte) 0x6F, (byte) 0x63, (byte) 0x61, (byte) 0x6C, (byte) 0x68,
881             (byte) 0x6F, (byte) 0x73, (byte) 0x74, (byte) 0x00, (byte) 0x00,
882             (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x70,
883             (byte) 0x75, (byte) 0x72, (byte) 0x00, (byte) 0x02, (byte) 0x5B,
884             (byte) 0x42, (byte) 0xAC, (byte) 0xF3, (byte) 0x17, (byte) 0xF8,
885             (byte) 0x06, (byte) 0x08, (byte) 0x54, (byte) 0xE0, (byte) 0x02,
886             (byte) 0x00, (byte) 0x00, (byte) 0x78, (byte) 0x70, (byte) 0x00,
887             (byte) 0x00, (byte) 0x00, (byte) 0x10, (byte) 0x00, (byte) 0x00,
888             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
889             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
890             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x78 };
891 
892     // java Inet6AddressSerializationTest generateAll produces this inet6address
893     // serial data
894     // jdk8 generated serialization of on address fe80:0:0:0:21b:24ff:febd:f29c
895     // net if e1000g0
896 
897     static final byte[] SerialData_ifname_e1000g0 = { (byte) 0xAC, (byte) 0xED,
898             (byte) 0x00, (byte) 0x05, (byte) 0x73, (byte) 0x72, (byte) 0x00,
899             (byte) 0x15, (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61,
900             (byte) 0x2E, (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x2E,
901             (byte) 0x49, (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x36,
902             (byte) 0x41, (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65,
903             (byte) 0x73, (byte) 0x73, (byte) 0x5F, (byte) 0x7C, (byte) 0x20,
904             (byte) 0x81, (byte) 0x52, (byte) 0x2C, (byte) 0x80, (byte) 0x21,
905             (byte) 0x03, (byte) 0x00, (byte) 0x05, (byte) 0x49, (byte) 0x00,
906             (byte) 0x08, (byte) 0x73, (byte) 0x63, (byte) 0x6F, (byte) 0x70,
907             (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x64, (byte) 0x5A,
908             (byte) 0x00, (byte) 0x0C, (byte) 0x73, (byte) 0x63, (byte) 0x6F,
909             (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x64,
910             (byte) 0x5F, (byte) 0x73, (byte) 0x65, (byte) 0x74, (byte) 0x5A,
911             (byte) 0x00, (byte) 0x10, (byte) 0x73, (byte) 0x63, (byte) 0x6F,
912             (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x66,
913             (byte) 0x6E, (byte) 0x61, (byte) 0x6D, (byte) 0x65, (byte) 0x5F,
914             (byte) 0x73, (byte) 0x65, (byte) 0x74, (byte) 0x4C, (byte) 0x00,
915             (byte) 0x06, (byte) 0x69, (byte) 0x66, (byte) 0x6E, (byte) 0x61,
916             (byte) 0x6D, (byte) 0x65, (byte) 0x74, (byte) 0x00, (byte) 0x12,
917             (byte) 0x4C, (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61,
918             (byte) 0x2F, (byte) 0x6C, (byte) 0x61, (byte) 0x6E, (byte) 0x67,
919             (byte) 0x2F, (byte) 0x53, (byte) 0x74, (byte) 0x72, (byte) 0x69,
920             (byte) 0x6E, (byte) 0x67, (byte) 0x3B, (byte) 0x5B, (byte) 0x00,
921             (byte) 0x09, (byte) 0x69, (byte) 0x70, (byte) 0x61, (byte) 0x64,
922             (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73,
923             (byte) 0x74, (byte) 0x00, (byte) 0x02, (byte) 0x5B, (byte) 0x42,
924             (byte) 0x78, (byte) 0x72, (byte) 0x00, (byte) 0x14, (byte) 0x6A,
925             (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2E, (byte) 0x6E,
926             (byte) 0x65, (byte) 0x74, (byte) 0x2E, (byte) 0x49, (byte) 0x6E,
927             (byte) 0x65, (byte) 0x74, (byte) 0x41, (byte) 0x64, (byte) 0x64,
928             (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73, (byte) 0x2D,
929             (byte) 0x9B, (byte) 0x57, (byte) 0xAF, (byte) 0x9F, (byte) 0xE3,
930             (byte) 0xEB, (byte) 0xDB, (byte) 0x02, (byte) 0x00, (byte) 0x03,
931             (byte) 0x49, (byte) 0x00, (byte) 0x07, (byte) 0x61, (byte) 0x64,
932             (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73,
933             (byte) 0x49, (byte) 0x00, (byte) 0x06, (byte) 0x66, (byte) 0x61,
934             (byte) 0x6D, (byte) 0x69, (byte) 0x6C, (byte) 0x79, (byte) 0x4C,
935             (byte) 0x00, (byte) 0x08, (byte) 0x68, (byte) 0x6F, (byte) 0x73,
936             (byte) 0x74, (byte) 0x4E, (byte) 0x61, (byte) 0x6D, (byte) 0x65,
937             (byte) 0x71, (byte) 0x00, (byte) 0x7E, (byte) 0x00, (byte) 0x01,
938             (byte) 0x78, (byte) 0x70, (byte) 0x00, (byte) 0x00, (byte) 0x00,
939             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x02,
940             (byte) 0x74, (byte) 0x00, (byte) 0x25, (byte) 0x66, (byte) 0x65,
941             (byte) 0x38, (byte) 0x30, (byte) 0x3A, (byte) 0x30, (byte) 0x3A,
942             (byte) 0x30, (byte) 0x3A, (byte) 0x30, (byte) 0x3A, (byte) 0x32,
943             (byte) 0x31, (byte) 0x62, (byte) 0x3A, (byte) 0x32, (byte) 0x34,
944             (byte) 0x66, (byte) 0x66, (byte) 0x3A, (byte) 0x66, (byte) 0x65,
945             (byte) 0x62, (byte) 0x64, (byte) 0x3A, (byte) 0x66, (byte) 0x32,
946             (byte) 0x39, (byte) 0x63, (byte) 0x25, (byte) 0x65, (byte) 0x31,
947             (byte) 0x30, (byte) 0x30, (byte) 0x30, (byte) 0x67, (byte) 0x30,
948             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x02, (byte) 0x01,
949             (byte) 0x01, (byte) 0x74, (byte) 0x00, (byte) 0x07, (byte) 0x65,
950             (byte) 0x31, (byte) 0x30, (byte) 0x30, (byte) 0x30, (byte) 0x67,
951             (byte) 0x30, (byte) 0x75, (byte) 0x72, (byte) 0x00, (byte) 0x02,
952             (byte) 0x5B, (byte) 0x42, (byte) 0xAC, (byte) 0xF3, (byte) 0x17,
953             (byte) 0xF8, (byte) 0x06, (byte) 0x08, (byte) 0x54, (byte) 0xE0,
954             (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x78, (byte) 0x70,
955             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x10, (byte) 0xFE,
956             (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
957             (byte) 0x00, (byte) 0x00, (byte) 0x02, (byte) 0x1B, (byte) 0x24,
958             (byte) 0xFF, (byte) 0xFE, (byte) 0xBD, (byte) 0xF2, (byte) 0x9C,
959             (byte) 0x78 };
960 
961     // jdk8 generated serialization of address 0::1 on net if lo0 hostname
962     // localhost scope_id 1
963 
964     static final byte[] SerialData_ifname_lo0 = { (byte) 0xAC, (byte) 0xED,
965             (byte) 0x00, (byte) 0x05, (byte) 0x73, (byte) 0x72, (byte) 0x00,
966             (byte) 0x15, (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61,
967             (byte) 0x2E, (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x2E,
968             (byte) 0x49, (byte) 0x6E, (byte) 0x65, (byte) 0x74, (byte) 0x36,
969             (byte) 0x41, (byte) 0x64, (byte) 0x64, (byte) 0x72, (byte) 0x65,
970             (byte) 0x73, (byte) 0x73, (byte) 0x5F, (byte) 0x7C, (byte) 0x20,
971             (byte) 0x81, (byte) 0x52, (byte) 0x2C, (byte) 0x80, (byte) 0x21,
972             (byte) 0x03, (byte) 0x00, (byte) 0x05, (byte) 0x49, (byte) 0x00,
973             (byte) 0x08, (byte) 0x73, (byte) 0x63, (byte) 0x6F, (byte) 0x70,
974             (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x64, (byte) 0x5A,
975             (byte) 0x00, (byte) 0x0C, (byte) 0x73, (byte) 0x63, (byte) 0x6F,
976             (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x64,
977             (byte) 0x5F, (byte) 0x73, (byte) 0x65, (byte) 0x74, (byte) 0x5A,
978             (byte) 0x00, (byte) 0x10, (byte) 0x73, (byte) 0x63, (byte) 0x6F,
979             (byte) 0x70, (byte) 0x65, (byte) 0x5F, (byte) 0x69, (byte) 0x66,
980             (byte) 0x6E, (byte) 0x61, (byte) 0x6D, (byte) 0x65, (byte) 0x5F,
981             (byte) 0x73, (byte) 0x65, (byte) 0x74, (byte) 0x4C, (byte) 0x00,
982             (byte) 0x06, (byte) 0x69, (byte) 0x66, (byte) 0x6E, (byte) 0x61,
983             (byte) 0x6D, (byte) 0x65, (byte) 0x74, (byte) 0x00, (byte) 0x12,
984             (byte) 0x4C, (byte) 0x6A, (byte) 0x61, (byte) 0x76, (byte) 0x61,
985             (byte) 0x2F, (byte) 0x6C, (byte) 0x61, (byte) 0x6E, (byte) 0x67,
986             (byte) 0x2F, (byte) 0x53, (byte) 0x74, (byte) 0x72, (byte) 0x69,
987             (byte) 0x6E, (byte) 0x67, (byte) 0x3B, (byte) 0x5B, (byte) 0x00,
988             (byte) 0x09, (byte) 0x69, (byte) 0x70, (byte) 0x61, (byte) 0x64,
989             (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73,
990             (byte) 0x74, (byte) 0x00, (byte) 0x02, (byte) 0x5B, (byte) 0x42,
991             (byte) 0x78, (byte) 0x72, (byte) 0x00, (byte) 0x14, (byte) 0x6A,
992             (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2E, (byte) 0x6E,
993             (byte) 0x65, (byte) 0x74, (byte) 0x2E, (byte) 0x49, (byte) 0x6E,
994             (byte) 0x65, (byte) 0x74, (byte) 0x41, (byte) 0x64, (byte) 0x64,
995             (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73, (byte) 0x2D,
996             (byte) 0x9B, (byte) 0x57, (byte) 0xAF, (byte) 0x9F, (byte) 0xE3,
997             (byte) 0xEB, (byte) 0xDB, (byte) 0x02, (byte) 0x00, (byte) 0x03,
998             (byte) 0x49, (byte) 0x00, (byte) 0x07, (byte) 0x61, (byte) 0x64,
999             (byte) 0x64, (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73,
1000             (byte) 0x49, (byte) 0x00, (byte) 0x06, (byte) 0x66, (byte) 0x61,
1001             (byte) 0x6D, (byte) 0x69, (byte) 0x6C, (byte) 0x79, (byte) 0x4C,
1002             (byte) 0x00, (byte) 0x08, (byte) 0x68, (byte) 0x6F, (byte) 0x73,
1003             (byte) 0x74, (byte) 0x4E, (byte) 0x61, (byte) 0x6D, (byte) 0x65,
1004             (byte) 0x71, (byte) 0x00, (byte) 0x7E, (byte) 0x00, (byte) 0x01,
1005             (byte) 0x78, (byte) 0x70, (byte) 0x00, (byte) 0x00, (byte) 0x00,
1006             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x02,
1007             (byte) 0x74, (byte) 0x00, (byte) 0x09, (byte) 0x6C, (byte) 0x6F,
1008             (byte) 0x63, (byte) 0x61, (byte) 0x6C, (byte) 0x68, (byte) 0x6F,
1009             (byte) 0x73, (byte) 0x74, (byte) 0x00, (byte) 0x00, (byte) 0x00,
1010             (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x74, (byte) 0x00,
1011             (byte) 0x03, (byte) 0x6C, (byte) 0x6F, (byte) 0x30, (byte) 0x75,
1012             (byte) 0x72, (byte) 0x00, (byte) 0x02, (byte) 0x5B, (byte) 0x42,
1013             (byte) 0xAC, (byte) 0xF3, (byte) 0x17, (byte) 0xF8, (byte) 0x06,
1014             (byte) 0x08, (byte) 0x54, (byte) 0xE0, (byte) 0x02, (byte) 0x00,
1015             (byte) 0x00, (byte) 0x78, (byte) 0x70, (byte) 0x00, (byte) 0x00,
1016             (byte) 0x00, (byte) 0x10, (byte) 0x00, (byte) 0x00, (byte) 0x00,
1017             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
1018             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
1019             (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x78 };
1020 
1021 }
1022 
1023 class MockLo0Inet6Address {
1024 
1025     private static final byte[] LOOPBACKIPV6ADDRESS = { (byte) 0x00,
1026             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
1027             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
1028             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01 };
1029 
1030     private static final String LOCALHOSTNAME = "localhost";
1031 
1032     private static final String LO0HOSTADDRESS = "0:0:0:0:0:0:0:1%lo0";
1033 
1034     private static final String BARE_LO0HOSTADDRESS = "0:0:0:0:0:0:0:1";
1035 
1036     private static final String LO0HOSTADDRESS_WITHINDEX = "0:0:0:0:0:0:0:1%1";
1037 
1038     private static final int SCOPE_ID_LO0 = 1;
1039 
1040     private static final int SCOPE_ID_ZERO = 0;
1041 
1042     public static final String NETWORK_IF_LO0 = "lo0";
1043 
getHostName()1044     static String getHostName() {
1045         return LOCALHOSTNAME;
1046     }
1047 
getHostAddress()1048     static String getHostAddress() {
1049         return LO0HOSTADDRESS;
1050     }
1051 
getBareHostAddress()1052     static String getBareHostAddress() {
1053         return BARE_LO0HOSTADDRESS;
1054     }
1055 
getHostAddressWithIndex()1056     static String getHostAddressWithIndex() {
1057         return LO0HOSTADDRESS_WITHINDEX;
1058     }
1059 
getAddress()1060     static byte[] getAddress() {
1061         return LOOPBACKIPV6ADDRESS;
1062     }
1063 
getScopeId()1064     static int getScopeId() {
1065         return SCOPE_ID_LO0;
1066     }
1067 
getScopeZero()1068     static int getScopeZero() {
1069         return SCOPE_ID_ZERO;
1070     }
1071 
getScopeIfName()1072     static String getScopeIfName() {
1073         return NETWORK_IF_LO0;
1074     }
1075 
1076 }
1077 
1078 class MockE1000g0Inet6Address {
1079 
1080     // fe80::21b:24ff:febd:f29c
1081     private static final byte[] E1000G0IPV6ADDRESS = { (byte) 0xfe,
1082             (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
1083             (byte) 0x00, (byte) 0x00, (byte) 0x02, (byte) 0x1b, (byte) 0x24,
1084             (byte) 0xff, (byte) 0xfe, (byte) 0xbd, (byte) 0xf2, (byte) 0x9c };
1085 
1086     private static final String E1000G0HOSTNAME = "fe80:0:0:0:21b:24ff:febd:f29c%e1000g0";
1087 
1088     private static final String BARE_E1000G0HOSTADDRESS = "fe80:0:0:0:21b:24ff:febd:f29c";
1089 
1090     private static final String E1000G0HOSTADDRESS_WITHINDEX = "fe80:0:0:0:21b:24ff:febd:f29c%2";
1091 
1092     private static final String E1000G0HOSTADDRESS = "fe80:0:0:0:21b:24ff:febd:f29c%e1000g0";
1093 
1094     private static final String NETWORK_IF_E1000G0 = "e1000g0";
1095 
1096     private static final int SCOPE_ID_E1000G0 = 2;
1097 
1098     private static final int SCOPE_ID_ZERO = 0;
1099 
getHostName()1100     static String getHostName() {
1101         return E1000G0HOSTNAME;
1102     }
1103 
getHostAddress()1104     static String getHostAddress() {
1105         return E1000G0HOSTADDRESS;
1106     }
1107 
getHostAddressWithIndex()1108     static String getHostAddressWithIndex() {
1109         return E1000G0HOSTADDRESS_WITHINDEX;
1110     }
1111 
getBareHostAddress()1112     static String getBareHostAddress() {
1113         return BARE_E1000G0HOSTADDRESS;
1114     }
1115 
getAddress()1116     static byte[] getAddress() {
1117         return E1000G0IPV6ADDRESS;
1118     }
1119 
getScopeId()1120     static int getScopeId() {
1121         return SCOPE_ID_E1000G0;
1122     }
1123 
getScopeZero()1124     static int getScopeZero() {
1125         return SCOPE_ID_ZERO;
1126     }
1127 
getScopeIfName()1128     static String getScopeIfName() {
1129         return NETWORK_IF_E1000G0;
1130     }
1131 
1132 }
1133