1 /*
   2  * Copyright (c) 2003, 2010, 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 /* @test
  25  * @bug 4889870 4890033
  26  * @summary java -Xcheck:jni failing in net code on Solaris / [Datagram]Socket.getLocalAddress() failure
  27  * @library /test/lib
  28  * @build jdk.test.lib.NetworkConfiguration
  29  *        jdk.test.lib.Utils
  30  *        jdk.test.lib.Asserts
  31  *        jdk.test.lib.JDKToolFinder
  32  *        jdk.test.lib.JDKToolLauncher
  33  *        jdk.test.lib.Platform
  34  *        jdk.test.lib.process.*
  35  * @run main/othervm -Xcheck:jni CheckJNI
  36  */
  37 
  38 import java.net.*;
  39 import java.util.*;
  40 import java.util.stream.Collectors;
  41 import jdk.test.lib.NetworkConfiguration;
  42 
  43 public class CheckJNI {
  44     static Socket s;
  45     static ServerSocket server;
  46     static DatagramSocket dg1, dg2;
  47 
  48     public static void main (String[] args) throws Exception {
  49         /* try to invoke as much java.net native code as possible */
  50 
  51         System.out.println ("Testing IPv4 Socket/ServerSocket");
  52         server = new ServerSocket (0);
  53         s = new Socket ("127.0.0.1", server.getLocalPort());
  54         s.close();
  55         server.close();
  56 
  57         System.out.println ("Testing IPv4 DatagramSocket");
  58         dg1 = new DatagramSocket (0, InetAddress.getByName ("127.0.0.1"));
  59         dg2 = new DatagramSocket (0, InetAddress.getByName ("127.0.0.1"));
  60         testDatagrams (dg1, dg2);
  61 
  62         /* Find link local IPv6 addrs to test */
  63         List<Inet6Address> addrs = NetworkConfiguration.probe()
  64                 .ip6Addresses()
  65                 .filter(Inet6Address::isLinkLocalAddress)
  66                 .collect(Collectors.toList());
  67 
  68         server = new ServerSocket(0);
  69         for (Inet6Address ia6 : addrs) {
  70             System.out.println("Address:" + ia6);
  71             System.out.println("Testing IPv6 Socket");
  72             s = new Socket(ia6, server.getLocalPort());
  73             s.close();
  74 
  75             System.out.println("Testing IPv6 DatagramSocket");
  76             dg1 = new DatagramSocket(0, ia6);
  77             dg2 = new DatagramSocket(0, ia6);
  78             testDatagrams(dg1, dg2);
  79         }
  80         server.close();
  81         System.out.println ("OK");
  82     }
  83 
  84     static void testDatagrams (DatagramSocket s1, DatagramSocket s2) throws Exception {
  85         DatagramPacket p1 = new DatagramPacket (
  86                 "hello world".getBytes(),
  87                 0, "hello world".length(), s2.getLocalAddress(),
  88                 s2.getLocalPort()
  89         );
  90 
  91         DatagramPacket p2 = new DatagramPacket (new byte[128], 128);
  92         s1.send (p1);
  93         s2.receive (p2);
  94         s1.close ();
  95         s2.close ();
  96     }
  97 }