jdk/test/java/net/PortUnreachableException/Test.java
changeset 2 90ce3da70b43
child 5506 202f599c92aa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/PortUnreachableException/Test.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2001 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 4413768
+ * @summary Checking that PortUnreachableException is thrown when
+ *          ICMP Port Unreachable is received.
+ */
+import java.net.*;
+import java.util.Properties;
+
+public class Test {
+
+    /*
+     * Return an available port
+     */
+    int getPort() throws Exception {
+        DatagramSocket s = new DatagramSocket(0);
+        int port = s.getLocalPort();
+        s.close();
+        return port;
+    }
+
+    /*
+     * Perform test by sending to remote_host:port
+     * sendOnly => send datagram to host and expect PUE on subsequent
+     *             send
+     * !sendOnly => send datagram to host and expect PUE on subsequent
+     *              send or receive.
+     */
+    void doTest(String remote_host, int port, boolean sendOnly) throws Exception {
+
+        System.out.println("***");
+        System.out.println("Test Description:");
+        System.out.println("    DatagramSocket.connect");
+        System.out.println("    Loop: DatagramSocket.send");
+        if (!sendOnly) {
+            System.out.println("          DatagramSocket.receive");
+        }
+        System.out.println("");
+        System.out.println("Test Run:");
+
+        InetAddress ia = InetAddress.getByName(remote_host);
+        DatagramSocket s = new DatagramSocket(0);
+        s.setSoTimeout(1000);
+        s.connect(ia, port);
+
+        byte[] b = "Hello".getBytes();
+        DatagramPacket p1 = new DatagramPacket(b, b.length, ia, port);
+
+        DatagramPacket p2 = new DatagramPacket(b, b.length);
+
+        int i = 0;
+        boolean gotPUE = false;
+
+        do {
+
+            System.out.println("Sending datagram to unreachable port...");
+            try {
+                s.send(p1);
+            } catch (PortUnreachableException e) {
+                System.out.println("DatagramSocket.send threw PUE");
+                gotPUE = true;
+            }
+
+            if (!gotPUE) {
+                Thread.currentThread().sleep(1000);
+            }
+
+            if (!sendOnly && !gotPUE) {
+                System.out.println("DatagramSocket.receive...");
+                try {
+                    s.receive(p2);
+                } catch (PortUnreachableException e) {
+                    System.out.println("DatagramSocket.receive threw PUE");
+                    gotPUE = true;
+                } catch (SocketTimeoutException e) {
+                    System.out.println("DatagramSocket.receive timed out - no PUE");
+                }
+            }
+
+            i++;
+        } while (i < 10 && !gotPUE);
+
+        if (!gotPUE) {
+            System.out.println("DatagramSocket.{send,receive} didn't throw " +
+                "PortUnreachableException - passing anyway!");
+        } else {
+            System.out.println("    Test passed.");
+        }
+        System.out.println("");
+    }
+
+    /*
+     * Perform tests via remote_host.
+     */
+    Test(String remote_host) throws Exception {
+
+        int port = getPort();
+
+        doTest(remote_host, port, true);
+        doTest(remote_host, port, false);
+    }
+
+    public static void main(String args[]) throws Exception {
+
+        String remote_host = "localhost";
+        if (args.length > 0) {
+            remote_host = args[0];
+        }
+
+        new Test(remote_host);
+    }
+}