package org.rubypeople.rdt.debug.core.tests;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;
public class NonBlockingSocketReader {
private Socket socket;
private PrintWriter out;
private BufferedReader reader;
private Process process;
private OutputRedirectorThread rubyStdoutRedirectorThread;
public void setUp() throws Exception {
String binDir = this.getClass().getResource("/").getFile();
if (binDir.startsWith("/") && File.separatorChar == '\\') {
binDir = binDir.substring(1);
}
String cmd = "ruby " + binDir + "../ruby/testNonBlockingSocketReader.rb";
System.out.println("Starting: " + cmd);
process = Runtime.getRuntime().exec(cmd);
rubyStdoutRedirectorThread = new OutputRedirectorThread(process.getInputStream());
rubyStdoutRedirectorThread.start();
rubyStdoutRedirectorThread = new OutputRedirectorThread(process.getErrorStream());
rubyStdoutRedirectorThread.start();
Thread.sleep(3500);
socket = new Socket("localhost", 12134);
out = new PrintWriter(socket.getOutputStream(), true);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
protected void tearDown() throws Exception {
socket.close();
process.destroy();
rubyStdoutRedirectorThread.join();
}
public void printBaseOperationsPerSecond() throws Exception {
int operationsPerSecond = Integer.parseInt(reader.readLine());
System.out.println("Operations Per Second (base): " + operationsPerSecond);
}
public void testOperationsPerSecond(double sleepTime, double blockingTime) throws Exception {
DecimalFormat format = new DecimalFormat() ;
format.setMaximumFractionDigits(10) ;
format.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.US)) ;
out.println("sleepTime " + format.format(sleepTime)) ;
out.println("blockingTime " + format.format(blockingTime)) ;
out.println("startCalculation");
Thread.sleep(2000);
out.println("stopCalculation");
Thread.sleep(500);
int operationsPerSecond = Integer.parseInt(reader.readLine());
System.out.println("sleeptime/blockingTime/OperationsPerSecond: " + format.format(sleepTime) + "/" + format.format(blockingTime) + "/" + operationsPerSecond);
}
public static void main(String[] args) throws Exception {
NonBlockingSocketReader test = new NonBlockingSocketReader();
test.setUp();
test.printBaseOperationsPerSecond() ;
test.testOperationsPerSecond(0.1, 1);
test.testOperationsPerSecond(0.1, 0.1);
test.testOperationsPerSecond(0.1, 0.001);
test.testOperationsPerSecond(0.1, 0.000001);
test.testOperationsPerSecond(0.1, 0.0);
test.testOperationsPerSecond(0.5, 1);
test.testOperationsPerSecond(0.5, 0.1);
test.testOperationsPerSecond(0.5, 0.001);
test.testOperationsPerSecond(0.5, 0.000001);
test.testOperationsPerSecond(0.5, 0.0);
test.tearDown();
}
}