test/jdk/java/nio/channels/unixdomain/Basic.java
author michaelm
Thu, 14 Nov 2019 08:27:28 +0000
branchunixdomainchannels
changeset 59073 832b8a28e17f
parent 59054 42bcf3042cd8
child 59090 fb91b01624be
permissions -rw-r--r--
unixdomainchannels: test updates
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();
59073
832b8a28e17f unixdomainchannels: test updates
michaelm
parents: 59054
diff changeset
    48
59054
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    49
	if (!supported()) {
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    50
	    System.out.println("Unix domain channels not supported");
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    51
	    return;
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    52
	}
59052
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    53
        sockRxBufsize = getInt(args[0]);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    54
        sockTxBufsize = getInt(args[1]);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    55
        if (args[2].equals("nagle-on"))
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    56
            nagle = true;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    57
        else if (args[2].equals("nagle-off"))
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    58
            nagle = false;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    59
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    60
        warmup();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    61
        test(128, 1000);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    62
        test(8 * 1024, 10000);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    63
        test(16 * 1024, 10000);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    64
        test(32 * 1024, 10000);
59054
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    65
    }
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    66
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    67
    static boolean supported() {
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    68
	try {
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    69
	    SocketChannel.open(StandardProtocolFamily.UNIX);
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    70
	} catch (UnsupportedAddressTypeException e) {
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    71
	    return false;
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    72
	} catch (Exception e) {
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    73
	    return true; // continue test to see what problem is
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    74
	}
42bcf3042cd8 unixdomainchannels: update to unit tests
michaelm
parents: 59052
diff changeset
    75
	return true;
59052
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    76
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    77
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    78
    static int getInt(String s) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    79
        if (s.equalsIgnoreCase("default"))
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    80
            return -1;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    81
        else
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    82
            return Integer.parseInt(s);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    83
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    84
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    85
    static void usage() {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    86
        System.out.println("usage: java Basic " +
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    87
            "<kernel sock read buf size> <kernel sock send buf size> {nagle-on|nagle-off}");
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    88
        System.out.println("nagle setting only affects TCP sockets");
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    89
        System.exit(-1);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    90
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    91
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    92
    static void warmup() throws Exception {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    93
        Server server = new Server(StandardProtocolFamily.UNIX, 1024);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    94
        Client client = new Client(server, 128, 100);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    95
        server.start();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    96
        client.run();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    97
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    98
        server = new Server(StandardProtocolFamily.INET, 1024);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
    99
        client = new Client(server, 128, 100);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   100
        server.start();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   101
        client.run();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   102
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   103
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   104
    static void test(int bufsize, int nbufs) throws Exception {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   105
        long unix = testUnix(bufsize, nbufs);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   106
        long inet = testInet(bufsize, nbufs);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   107
        // expect unix to be faster (express as percentage of inet)
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   108
        long percent = (unix * 100) / inet;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   109
        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
   110
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   111
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   112
    static long testUnix(int bufsize, int nbufs) throws Exception {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   113
        Server server = new Server(StandardProtocolFamily.UNIX, bufsize);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   114
        Client client = new Client(server, bufsize, nbufs);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   115
        System.out.printf("Test (family=unix bufsize=%d, nbufs=%d) ", bufsize, nbufs);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   116
        server.start();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   117
        client.run();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   118
        long unix = client.elapsed();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   119
        int sbuf = client.sendSocketBufsize();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   120
        int rbuf = client.receiveSocketBufsize();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   121
        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
   122
        System.gc();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   123
        return unix;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   124
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   125
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   126
    static long testInet(int bufsize, int nbufs) throws Exception {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   127
        Server server = new Server(StandardProtocolFamily.INET, bufsize);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   128
        Client client = new Client(server, bufsize, nbufs);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   129
        System.out.printf("Test (family=inet bufsize=%d, nbufs=%d) ", bufsize, nbufs);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   130
        server.start();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   131
        client.run();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   132
        long inet = client.elapsed();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   133
        System.gc();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   134
        int sbuf = client.sendSocketBufsize();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   135
        int rbuf = client.receiveSocketBufsize();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   136
        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
   137
        return inet;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   138
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   139
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   140
    static void setNagle(SocketChannel chan, boolean value) throws IOException {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   141
        if (chan.getRemoteAddress() instanceof InetSocketAddress) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   142
            chan.setOption(StandardSocketOptions.TCP_NODELAY, value);
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
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   146
    static void setSendBufferSize(SocketChannel chan, int bufsize) throws IOException {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   147
        if (bufsize < 0)
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   148
            return;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   149
        chan.setOption(StandardSocketOptions.SO_SNDBUF, bufsize);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   150
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   151
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   152
    static void setRecvBufferSize(SocketChannel chan, int bufsize) throws IOException {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   153
        if (bufsize < 0)
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   154
            return;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   155
        chan.setOption(StandardSocketOptions.SO_RCVBUF, bufsize);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   156
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   157
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   158
    static class Server extends Thread {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   159
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   160
        ServerSocketChannel server;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   161
        SocketAddress address;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   162
        SocketChannel connection;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   163
        SelectionKey ckey;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   164
        List<ByteBuffer> toSend = new LinkedList<>();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   165
        final int bufsize;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   166
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   167
        Server(ProtocolFamily family, int bufsize) throws IOException {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   168
            setDaemon(true);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   169
            SocketAddress addr;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   170
            this.bufsize = bufsize;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   171
            if (family == StandardProtocolFamily.UNIX) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   172
                server = ServerSocketChannel.open(family);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   173
                Path sockfile = Path.of("server.sock");
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   174
                Files.deleteIfExists(sockfile);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   175
                addr = new UnixDomainSocketAddress(sockfile);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   176
            } else {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   177
                server = ServerSocketChannel.open();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   178
                addr = new InetSocketAddress(InetAddress.getLoopbackAddress(), 0);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   179
            }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   180
            server.bind(addr);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   181
            address = server.getLocalAddress();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   182
        }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   183
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   184
        SocketAddress getAddress() {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   185
            return address;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   186
        }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   187
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   188
        public void  run() {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   189
            try {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   190
                server.configureBlocking(false);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   191
                Selector sel = Selector.open();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   192
                server.register(sel, SelectionKey.OP_ACCEPT, server);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   193
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   194
                while (true) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   195
                    int n = sel.select();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   196
                    var keys = sel.selectedKeys();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   197
                    for (SelectionKey key : keys) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   198
                        if (key.isAcceptable()) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   199
                            if (connection != null)
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   200
                                throw new RuntimeException("One connection per server");
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   201
                            ServerSocketChannel server = (ServerSocketChannel)key.attachment();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   202
                            connection = server.accept();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   203
                            connection.configureBlocking(false);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   204
                            setNagle(connection, nagle);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   205
                            setSendBufferSize(connection, sockTxBufsize);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   206
                            setRecvBufferSize(connection, sockRxBufsize);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   207
                            ckey = connection.register(sel, SelectionKey.OP_READ, connection);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   208
                        }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   209
                        if (key.isReadable()) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   210
                            ByteBuffer buf = ByteBuffer.allocate(bufsize);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   211
                            SocketChannel channel = (SocketChannel)key.attachment();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   212
                            int m = channel.read(buf);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   213
                            if (m == -1) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   214
                                channel.close();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   215
                                server.close();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   216
                                return;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   217
                            } else {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   218
                                buf.flip();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   219
                                // ECHO
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   220
                                toSend.add(buf);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   221
                                ckey.interestOpsOr(SelectionKey.OP_WRITE);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   222
                            }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   223
                        }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   224
                        if (key.isWritable()) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   225
                            if (toSend.isEmpty()) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   226
                                ckey.interestOpsAnd(~SelectionKey.OP_WRITE);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   227
                            } else {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   228
                                ByteBuffer b = toSend.get(0);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   229
                                connection.write(b);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   230
                                if (b.remaining() == 0)
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   231
                                    toSend.remove(0);
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
                    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   235
                    keys.clear();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   236
                }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   237
            } catch (IOException e) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   238
                throw new RuntimeException(e);
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
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   243
    static void fill(ByteBuffer buf) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   244
        int n = buf.remaining();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   245
        for (int i=0; i<n; i++) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   246
            buf.put((byte)(i % 127));
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
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   250
    static void check(ByteBuffer buf, int expected, int iteration) throws Exception {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   251
        if (buf.remaining() != expected)
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   252
            throw new RuntimeException();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   253
        for (int i=0; i<expected; i++) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   254
            int b = buf.get();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   255
            if (b != (i % 127)) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   256
                System.out.printf("b = %d , i = %d\n", b, i);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   257
                throw new RuntimeException("Iteration " + Integer.toString(iteration));
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
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   262
// read until buf is full
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   263
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   264
    static void readFully(SocketChannel chan, ByteBuffer buf) throws Exception {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   265
        int n = buf.remaining();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   266
        while (n > 0) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   267
            int c = chan.read(buf);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   268
            if (c == -1)
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   269
                throw new RuntimeException("EOF");
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   270
            n -= c;
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
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   274
    static class Client {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   275
        Server server;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   276
        int bufsize, nbufs, sbuf, rbuf;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   277
        long elapsed;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   278
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   279
        Client(Server server, int bufsize, int nbufs) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   280
            this.server = server;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   281
            this.bufsize = bufsize;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   282
            this.nbufs = nbufs;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   283
        }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   284
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   285
        public void run() throws Exception {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   286
            SocketAddress remote = server.getAddress();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   287
            long start = System.nanoTime();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   288
            SocketChannel c = null;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   289
            String fam;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   290
            if (remote instanceof UnixDomainSocketAddress) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   291
                c = SocketChannel.open(StandardProtocolFamily.UNIX);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   292
                fam = "unix";
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   293
            } else {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   294
                c = SocketChannel.open();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   295
                fam = "inet";
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   296
            }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   297
            setNagle(c, nagle);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   298
            c.connect(remote);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   299
            setSendBufferSize(c, sockTxBufsize);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   300
            setRecvBufferSize(c, sockRxBufsize);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   301
            ByteBuffer tx = ByteBuffer.allocate(bufsize);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   302
            ByteBuffer rx = ByteBuffer.allocate(bufsize);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   303
            fill(tx);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   304
            for (int i=0; i<nbufs; i++) {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   305
                tx.rewind();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   306
                c.write(tx);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   307
                rx.clear();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   308
                readFully(c, rx);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   309
                rx.flip();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   310
                check(rx, bufsize, i);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   311
            }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   312
            long end = System.nanoTime();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   313
            elapsed = end - start;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   314
            sbuf = c.getOption(StandardSocketOptions.SO_SNDBUF);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   315
            rbuf = c.getOption(StandardSocketOptions.SO_SNDBUF);
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   316
            c.close();
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   317
        }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   318
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   319
        long elapsed() {
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   320
            return elapsed;
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   321
        }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   322
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   323
        int receiveSocketBufsize() {return rbuf;}
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   324
        int sendSocketBufsize() {return sbuf;}
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   325
    }
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   326
15e9a570c6e6 unixdomainchannels: added some unit tests
michaelm
parents:
diff changeset
   327
}