test/jdk/java/nio/channels/unixdomain/Basic.java
author michaelm
Wed, 13 Nov 2019 11:37:09 +0000
branchunixdomainchannels
changeset 59054 42bcf3042cd8
parent 59052 15e9a570c6e6
child 59073 832b8a28e17f
permissions -rw-r--r--
unixdomainchannels: update to unit tests
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59052
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
     1
/*
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
     2
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
     4
 *
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
     7
 * published by the Free Software Foundation.
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
     8
 *
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    13
 * accompanied this code).
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    14
 *
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    18
 *
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    21
 * questions.
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    22
 */
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    23
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    24
/**
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    25
 * @test
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    26
 * @bug 8231358
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    27
 * @run main/othervm Basic 32000 32000 nagle-off
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    28
 * @run main/othervm Basic default default nagle-off
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    29
 * @summary Basic test for Unix Domain and Inet socket and server socket channels
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    30
 */
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    31
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    32
import java.io.IOException;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    33
import java.net.*;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    34
import java.nio.ByteBuffer;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    35
import java.nio.channels.*;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    36
import java.nio.file.Files;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    37
import java.nio.file.Path;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    38
import java.util.LinkedList;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    39
import java.util.List;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    40
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    41
public class Basic {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    42
    static int sockRxBufsize, sockTxBufsize;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    43
    static boolean nagle;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    44
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    45
    public static void main(String args[]) throws Exception {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    46
        if (args.length != 3)
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    47
            usage();
59054
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    48
	if (!supported()) {
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    49
	    System.out.println("Unix domain channels not supported");
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    50
	    return;
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    51
	}
59052
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    52
        sockRxBufsize = getInt(args[0]);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    53
        sockTxBufsize = getInt(args[1]);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    54
        if (args[2].equals("nagle-on"))
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    55
            nagle = true;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    56
        else if (args[2].equals("nagle-off"))
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    57
            nagle = false;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    58
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    59
        warmup();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    60
        test(128, 1000);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    61
        test(8 * 1024, 10000);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    62
        test(16 * 1024, 10000);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    63
        test(32 * 1024, 10000);
59054
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    64
    }
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    65
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    66
    static boolean supported() {
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    67
	try {
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    68
	    SocketChannel.open(StandardProtocolFamily.UNIX);
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    69
	} catch (UnsupportedAddressTypeException e) {
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    70
	    return false;
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    71
	} catch (Exception e) {
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    72
	    return true; // continue test to see what problem is
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    73
	}
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    74
	return true;
59052
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    75
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    76
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    77
    static int getInt(String s) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    78
        if (s.equalsIgnoreCase("default"))
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    79
            return -1;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    80
        else
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    81
            return Integer.parseInt(s);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    82
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    83
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    84
    static void usage() {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    85
        System.out.println("usage: java Basic " +
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    86
            "<kernel sock read buf size> <kernel sock send buf size> {nagle-on|nagle-off}");
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    87
        System.out.println("nagle setting only affects TCP sockets");
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    88
        System.exit(-1);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    89
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    90
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    91
    static void warmup() throws Exception {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    92
        Server server = new Server(StandardProtocolFamily.UNIX, 1024);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    93
        Client client = new Client(server, 128, 100);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    94
        server.start();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    95
        client.run();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    96
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    97
        server = new Server(StandardProtocolFamily.INET, 1024);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    98
        client = new Client(server, 128, 100);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    99
        server.start();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   100
        client.run();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   101
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   102
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   103
    static void test(int bufsize, int nbufs) throws Exception {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   104
        long unix = testUnix(bufsize, nbufs);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   105
        long inet = testInet(bufsize, nbufs);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   106
        // expect unix to be faster (express as percentage of inet)
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   107
        long percent = (unix * 100) / inet;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   108
        System.out.printf ("Unix elapsed time is %d%% of the INET time\n\n", percent);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   109
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   110
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   111
    static long testUnix(int bufsize, int nbufs) throws Exception {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   112
        Server server = new Server(StandardProtocolFamily.UNIX, bufsize);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   113
        Client client = new Client(server, bufsize, nbufs);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   114
        System.out.printf("Test (family=unix bufsize=%d, nbufs=%d) ", bufsize, nbufs);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   115
        server.start();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   116
        client.run();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   117
        long unix = client.elapsed();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   118
        int sbuf = client.sendSocketBufsize();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   119
        int rbuf = client.receiveSocketBufsize();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   120
        System.out.printf("completed in %d ns (sbuf=%d, rbuf=%d)\n", unix, sbuf, rbuf);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   121
        System.gc();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   122
        return unix;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   123
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   124
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   125
    static long testInet(int bufsize, int nbufs) throws Exception {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   126
        Server server = new Server(StandardProtocolFamily.INET, bufsize);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   127
        Client client = new Client(server, bufsize, nbufs);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   128
        System.out.printf("Test (family=inet bufsize=%d, nbufs=%d) ", bufsize, nbufs);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   129
        server.start();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   130
        client.run();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   131
        long inet = client.elapsed();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   132
        System.gc();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   133
        int sbuf = client.sendSocketBufsize();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   134
        int rbuf = client.receiveSocketBufsize();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   135
        System.out.printf("completed in %d ns (sbuf=%d, rbuf=%d)\n", inet, sbuf, rbuf);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   136
        return inet;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   137
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   138
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   139
    static void setNagle(SocketChannel chan, boolean value) throws IOException {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   140
        if (chan.getRemoteAddress() instanceof InetSocketAddress) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   141
            chan.setOption(StandardSocketOptions.TCP_NODELAY, value);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   142
        }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   143
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   144
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   145
    static void setSendBufferSize(SocketChannel chan, int bufsize) throws IOException {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   146
        if (bufsize < 0)
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   147
            return;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   148
        chan.setOption(StandardSocketOptions.SO_SNDBUF, bufsize);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   149
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   150
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   151
    static void setRecvBufferSize(SocketChannel chan, int bufsize) throws IOException {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   152
        if (bufsize < 0)
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   153
            return;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   154
        chan.setOption(StandardSocketOptions.SO_RCVBUF, bufsize);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   155
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   156
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   157
    static class Server extends Thread {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   158
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   159
        ServerSocketChannel server;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   160
        SocketAddress address;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   161
        SocketChannel connection;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   162
        SelectionKey ckey;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   163
        List<ByteBuffer> toSend = new LinkedList<>();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   164
        final int bufsize;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   165
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   166
        Server(ProtocolFamily family, int bufsize) throws IOException {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   167
            setDaemon(true);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   168
            SocketAddress addr;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   169
            this.bufsize = bufsize;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   170
            if (family == StandardProtocolFamily.UNIX) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   171
                server = ServerSocketChannel.open(family);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   172
                Path sockfile = Path.of("server.sock");
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   173
                Files.deleteIfExists(sockfile);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   174
                addr = new UnixDomainSocketAddress(sockfile);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   175
            } else {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   176
                server = ServerSocketChannel.open();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   177
                addr = new InetSocketAddress(InetAddress.getLoopbackAddress(), 0);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   178
            }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   179
            server.bind(addr);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   180
            address = server.getLocalAddress();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   181
        }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   182
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   183
        SocketAddress getAddress() {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   184
            return address;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   185
        }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   186
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   187
        public void  run() {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   188
            try {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   189
                server.configureBlocking(false);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   190
                Selector sel = Selector.open();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   191
                server.register(sel, SelectionKey.OP_ACCEPT, server);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   192
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   193
                while (true) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   194
                    int n = sel.select();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   195
                    var keys = sel.selectedKeys();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   196
                    for (SelectionKey key : keys) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   197
                        if (key.isAcceptable()) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   198
                            if (connection != null)
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   199
                                throw new RuntimeException("One connection per server");
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   200
                            ServerSocketChannel server = (ServerSocketChannel)key.attachment();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   201
                            connection = server.accept();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   202
                            connection.configureBlocking(false);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   203
                            setNagle(connection, nagle);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   204
                            setSendBufferSize(connection, sockTxBufsize);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   205
                            setRecvBufferSize(connection, sockRxBufsize);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   206
                            ckey = connection.register(sel, SelectionKey.OP_READ, connection);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   207
                        }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   208
                        if (key.isReadable()) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   209
                            ByteBuffer buf = ByteBuffer.allocate(bufsize);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   210
                            SocketChannel channel = (SocketChannel)key.attachment();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   211
                            int m = channel.read(buf);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   212
                            if (m == -1) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   213
                                channel.close();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   214
                                server.close();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   215
                                return;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   216
                            } else {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   217
                                buf.flip();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   218
                                // ECHO
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   219
                                toSend.add(buf);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   220
                                ckey.interestOpsOr(SelectionKey.OP_WRITE);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   221
                            }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   222
                        }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   223
                        if (key.isWritable()) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   224
                            if (toSend.isEmpty()) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   225
                                ckey.interestOpsAnd(~SelectionKey.OP_WRITE);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   226
                            } else {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   227
                                ByteBuffer b = toSend.get(0);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   228
                                connection.write(b);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   229
                                if (b.remaining() == 0)
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   230
                                    toSend.remove(0);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   231
                            }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   232
                        }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   233
                    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   234
                    keys.clear();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   235
                }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   236
            } catch (IOException e) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   237
                throw new RuntimeException(e);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   238
            }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   239
        }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   240
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   241
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   242
    static void fill(ByteBuffer buf) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   243
        int n = buf.remaining();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   244
        for (int i=0; i<n; i++) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   245
            buf.put((byte)(i % 127));
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   246
        }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   247
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   248
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   249
    static void check(ByteBuffer buf, int expected, int iteration) throws Exception {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   250
        if (buf.remaining() != expected)
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   251
            throw new RuntimeException();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   252
        for (int i=0; i<expected; i++) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   253
            int b = buf.get();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   254
            if (b != (i % 127)) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   255
                System.out.printf("b = %d , i = %d\n", b, i);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   256
                throw new RuntimeException("Iteration " + Integer.toString(iteration));
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   257
            }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   258
        }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   259
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   260
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   261
// read until buf is full
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   262
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   263
    static void readFully(SocketChannel chan, ByteBuffer buf) throws Exception {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   264
        int n = buf.remaining();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   265
        while (n > 0) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   266
            int c = chan.read(buf);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   267
            if (c == -1)
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   268
                throw new RuntimeException("EOF");
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   269
            n -= c;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   270
        }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   271
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   272
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   273
    static class Client {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   274
        Server server;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   275
        int bufsize, nbufs, sbuf, rbuf;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   276
        long elapsed;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   277
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   278
        Client(Server server, int bufsize, int nbufs) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   279
            this.server = server;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   280
            this.bufsize = bufsize;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   281
            this.nbufs = nbufs;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   282
        }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   283
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   284
        public void run() throws Exception {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   285
            SocketAddress remote = server.getAddress();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   286
            long start = System.nanoTime();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   287
            SocketChannel c = null;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   288
            String fam;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   289
            if (remote instanceof UnixDomainSocketAddress) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   290
                c = SocketChannel.open(StandardProtocolFamily.UNIX);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   291
                fam = "unix";
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   292
            } else {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   293
                c = SocketChannel.open();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   294
                fam = "inet";
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   295
            }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   296
            setNagle(c, nagle);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   297
            c.connect(remote);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   298
            setSendBufferSize(c, sockTxBufsize);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   299
            setRecvBufferSize(c, sockRxBufsize);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   300
            ByteBuffer tx = ByteBuffer.allocate(bufsize);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   301
            ByteBuffer rx = ByteBuffer.allocate(bufsize);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   302
            fill(tx);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   303
            for (int i=0; i<nbufs; i++) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   304
                tx.rewind();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   305
                c.write(tx);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   306
                rx.clear();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   307
                readFully(c, rx);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   308
                rx.flip();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   309
                check(rx, bufsize, i);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   310
            }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   311
            long end = System.nanoTime();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   312
            elapsed = end - start;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   313
            sbuf = c.getOption(StandardSocketOptions.SO_SNDBUF);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   314
            rbuf = c.getOption(StandardSocketOptions.SO_SNDBUF);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   315
            c.close();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   316
        }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   317
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   318
        long elapsed() {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   319
            return elapsed;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   320
        }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   321
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   322
        int receiveSocketBufsize() {return rbuf;}
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   323
        int sendSocketBufsize() {return sbuf;}
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   324
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   325
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   326
}