NetworkChannelTests.java 5.9 KB
Newer Older
1
/*
2
 * Copyright 2007-2009 Sun Microsystems, Inc.  All Rights Reserved.
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
 * 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 4640544
 * @summary Unit test for channels that implement NetworkChannel
 */

import java.nio.*;
import java.nio.channels.*;
import java.net.*;
import java.io.IOException;
import java.util.*;

public class NetworkChannelTests {

    static interface ChannelFactory {
        NetworkChannel open() throws IOException;
    }

    static class BogusSocketAddress extends SocketAddress {
    }

    /**
     * Exercise bind method.
     */
    static void bindTests(ChannelFactory factory) throws IOException {
        NetworkChannel ch;

        // AlreadyBoundException
        ch = factory.open().bind(new InetSocketAddress(0));
        try {
            ch.bind(new InetSocketAddress(0));
            throw new RuntimeException("AlreadyBoundException not thrown");
        } catch (AlreadyBoundException x) {
        }
        ch.close();

        // bind(null)
        ch = factory.open().bind(null);
        if (ch.getLocalAddress() == null)
            throw new RuntimeException("socket not found");
        ch.close();

        // UnsupportedAddressTypeException
        ch = factory.open();
        try {
            ch.bind(new BogusSocketAddress());
            throw new RuntimeException("UnsupportedAddressTypeException not thrown");
        } catch (UnsupportedAddressTypeException x) {
        }
        ch.close();

        // ClosedChannelException
        try {
            ch.bind(new InetSocketAddress(0));
            throw new RuntimeException("ClosedChannelException not thrown");
        } catch (ClosedChannelException x) {
        }
    }

    /**
     * Exercise getLocalAddress method.
     */
    static void localAddressTests(ChannelFactory factory) throws IOException {
        NetworkChannel ch;

        // not bound
        ch = factory.open();
        if (ch.getLocalAddress() != null) {
            throw new RuntimeException("Local address returned when not bound");
        }

        // bound
        InetSocketAddress local =
            (InetSocketAddress)(ch.bind(new InetSocketAddress(0)).getLocalAddress());
        if (!local.getAddress().isAnyLocalAddress()) {
            if (NetworkInterface.getByInetAddress(local.getAddress()) == null)
                throw new RuntimeException("not bound to local address");
        }
        if (local.getPort() <= 0)
            throw new RuntimeException("not bound to local port");

        // closed
        ch.close();
106 107 108 109
        try {
            ch.getLocalAddress();
            throw new RuntimeException("ClosedChannelException expected");
        } catch (ClosedChannelException e) { }
110 111 112
    }

    /**
113
     * Exercise getRemoteAddress method (SocketChannel only)
114 115 116 117 118 119 120 121 122 123 124
     */
    static void connectedAddressTests() throws IOException {
        ServerSocketChannel ssc = ServerSocketChannel.open()
            .bind(new InetSocketAddress(0));
        InetSocketAddress local = (InetSocketAddress)(ssc.getLocalAddress());
        int port = local.getPort();
        InetSocketAddress server = new InetSocketAddress(InetAddress.getLocalHost(), port);

        SocketChannel sc = SocketChannel.open();

        // not connected
125 126
        if (sc.getRemoteAddress() != null)
            throw new RuntimeException("getRemoteAddress returned address when not connected");
127 128 129

        // connected
        sc.connect(server);
130
        SocketAddress remote = sc.getRemoteAddress();
131
        if (!remote.equals(server))
132
            throw new RuntimeException("getRemoteAddress returned incorrect address");
133 134 135

        // closed
        sc.close();
136 137 138 139
        try {
            sc.getRemoteAddress();
            throw new RuntimeException("ClosedChannelException expected");
        } catch (ClosedChannelException e) { }
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190

        ssc.close();
    }

    public static void main(String[] args) throws IOException {
        ChannelFactory factory;

        // -- SocketChannel --

        factory = new ChannelFactory() {
            public NetworkChannel open() throws IOException {
                return SocketChannel.open();
            }
        };

        bindTests(factory);
        localAddressTests(factory);
        connectedAddressTests();

        // -- ServerSocketChannel --

        factory = new ChannelFactory() {
            public NetworkChannel open() throws IOException {
                return ServerSocketChannel.open();
            }
        };

        bindTests(factory);
        localAddressTests(factory);

        // backlog values
        ServerSocketChannel.open()
            .bind(new InetSocketAddress(0), 100).close();
        ServerSocketChannel.open()
            .bind(new InetSocketAddress(0), 0).close();
        ServerSocketChannel.open()
            .bind(new InetSocketAddress(0), -1).close();

        // -- DatagramChannel --

        factory = new ChannelFactory() {
            public NetworkChannel open() throws IOException {
                return DatagramChannel.open();
            }
        };

        bindTests(factory);
        localAddressTests(factory);
    }

}