1/*
2 * Copyright (c) 2001, 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/**
25 * @test
26 * @bug 4413768
27 * @summary Checking that PortUnreachableException is thrown when
28 *          ICMP Port Unreachable is received.
29 */
30import java.net.*;
31import java.util.Properties;
32
33public class Test {
34
35    /*
36     * Return an available port
37     */
38    int getPort() throws Exception {
39        DatagramSocket s = new DatagramSocket(0);
40        int port = s.getLocalPort();
41        s.close();
42        return port;
43    }
44
45    /*
46     * Perform test by sending to remote_host:port
47     * sendOnly => send datagram to host and expect PUE on subsequent
48     *             send
49     * !sendOnly => send datagram to host and expect PUE on subsequent
50     *              send or receive.
51     */
52    void doTest(String remote_host, int port, boolean sendOnly) throws Exception {
53
54        System.out.println("***");
55        System.out.println("Test Description:");
56        System.out.println("    DatagramSocket.connect");
57        System.out.println("    Loop: DatagramSocket.send");
58        if (!sendOnly) {
59            System.out.println("          DatagramSocket.receive");
60        }
61        System.out.println("");
62        System.out.println("Test Run:");
63
64        InetAddress ia = InetAddress.getByName(remote_host);
65        DatagramSocket s = new DatagramSocket(0);
66        s.setSoTimeout(1000);
67        s.connect(ia, port);
68
69        byte[] b = "Hello".getBytes();
70        DatagramPacket p1 = new DatagramPacket(b, b.length, ia, port);
71
72        DatagramPacket p2 = new DatagramPacket(b, b.length);
73
74        int i = 0;
75        boolean gotPUE = false;
76
77        do {
78
79            System.out.println("Sending datagram to unreachable port...");
80            try {
81                s.send(p1);
82            } catch (PortUnreachableException e) {
83                System.out.println("DatagramSocket.send threw PUE");
84                gotPUE = true;
85            }
86
87            if (!gotPUE) {
88                Thread.currentThread().sleep(1000);
89            }
90
91            if (!sendOnly && !gotPUE) {
92                System.out.println("DatagramSocket.receive...");
93                try {
94                    s.receive(p2);
95                } catch (PortUnreachableException e) {
96                    System.out.println("DatagramSocket.receive threw PUE");
97                    gotPUE = true;
98                } catch (SocketTimeoutException e) {
99                    System.out.println("DatagramSocket.receive timed out - no PUE");
100                }
101            }
102
103            i++;
104        } while (i < 10 && !gotPUE);
105
106        if (!gotPUE) {
107            System.out.println("DatagramSocket.{send,receive} didn't throw " +
108                "PortUnreachableException - passing anyway!");
109        } else {
110            System.out.println("    Test passed.");
111        }
112        System.out.println("");
113    }
114
115    /*
116     * Perform tests via remote_host.
117     */
118    Test(String remote_host) throws Exception {
119
120        int port = getPort();
121
122        doTest(remote_host, port, true);
123        doTest(remote_host, port, false);
124    }
125
126    public static void main(String args[]) throws Exception {
127
128        String remote_host = "localhost";
129        if (args.length > 0) {
130            remote_host = args[0];
131        }
132
133        new Test(remote_host);
134    }
135}
136