diff -r fd16c54261b3 -r 90ce3da70b43 jdk/test/java/net/PortUnreachableException/Test.java --- /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); + } +}