summaryrefslogtreecommitdiffstats
path: root/socket_test/src
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
commit72231250ed81e10d66bfe70701e64fa5fe50f712 (patch)
tree2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /socket_test/src
Publish
Diffstat (limited to 'socket_test/src')
-rw-r--r--socket_test/src/main/java/com/yahoo/socket/test/SocketTestApp.java109
1 files changed, 109 insertions, 0 deletions
diff --git a/socket_test/src/main/java/com/yahoo/socket/test/SocketTestApp.java b/socket_test/src/main/java/com/yahoo/socket/test/SocketTestApp.java
new file mode 100644
index 00000000000..dfee51ce52d
--- /dev/null
+++ b/socket_test/src/main/java/com/yahoo/socket/test/SocketTestApp.java
@@ -0,0 +1,109 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.socket.test;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.nio.charset.StandardCharsets;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+
+/**
+ * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a>
+ */
+public class SocketTestApp {
+
+ private final static byte[] REQUEST = "foo".getBytes(StandardCharsets.UTF_8);
+ private final static byte[] RESPONSE = "bar".getBytes(StandardCharsets.UTF_8);
+ private static volatile int numRequests = 0;
+
+ public static void main(String[] args) throws IOException {
+ final boolean soLingerOn = Boolean.valueOf(args[0]);
+ final int soLingerTime = Integer.valueOf(args[1]);
+ final int numClients = Integer.valueOf(args[2]);
+ final int sleepMillis = Integer.valueOf(args[3]);
+
+ System.out.println("soLingerOn = " + soLingerOn);
+ System.out.println("soLingerTime = " + soLingerTime);
+ System.out.println("numClients = " + numClients);
+ System.out.println("sleepMillis = " + sleepMillis);
+
+ ServerSocket serverSocket = new ServerSocket(0);
+ for (int i = 0; i < numClients; ++i) {
+ new Client(serverSocket.getLocalPort()).start();
+ }
+
+ Executor workers = Executors.newFixedThreadPool(numClients);
+ long prev = System.currentTimeMillis();
+ while (true) {
+ long next = System.currentTimeMillis();
+ if (next > prev + 1000) {
+ System.err.println((numRequests * 1000) / (next - prev));
+ numRequests = 0;
+ prev = next;
+ }
+ final Socket clientSocket = serverSocket.accept();
+ clientSocket.setSoLinger(soLingerOn, soLingerTime);
+ workers.execute(new Runnable() {
+
+ @Override
+ public void run() {
+ try {
+ InputStream in = clientSocket.getInputStream();
+ for (byte expected : REQUEST) {
+ int actual = in.read();
+ if (actual != expected) {
+ throw new AssertionError("Expected '" + expected + "', got '" + actual + "'.");
+ }
+ }
+ Thread.sleep(sleepMillis);
+ OutputStream out = clientSocket.getOutputStream();
+ out.write(RESPONSE);
+ } catch (Throwable t) {
+ t.printStackTrace();
+ } finally {
+ try {
+ clientSocket.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ });
+ }
+ }
+
+ private static class Client extends Thread {
+
+ final int port;
+
+ Client(int port) throws IOException {
+ this.port = port;
+ }
+
+ @Override
+ public void run() {
+ try {
+ while (!isInterrupted()) {
+ Socket socket = new Socket("localhost", port);
+ OutputStream out = socket.getOutputStream();
+ out.write(REQUEST);
+
+ InputStream in = socket.getInputStream();
+ for (byte expected : RESPONSE) {
+ int actual = in.read();
+ if (actual != expected) {
+ throw new AssertionError("Expected '" + expected + "', got '" + actual + "'.");
+ }
+ }
+ socket.close();
+ ++numRequests;
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+ }
+}