package testCases.stepic;
import base.CaseConfig;
import base.TestCase;
import base.TestException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.*;
/**
* @author v.chibrikov
*/
public class HW07 implements TestCase {
private static final int CLIENTS_NUMBER = 10;
private static final long SLEEP_TIME = TimeUnit.MILLISECONDS.toMillis(1);
private static final long TEST_TIME = TimeUnit.SECONDS.toMillis(10);
@Override
public boolean test(CaseConfig cfg) {
String host = cfg.getHost();
String port = cfg.getPort();
ExecutorService executor = null;
long timeStart = new Date().getTime();
try {
executor = Executors.newFixedThreadPool(CLIENTS_NUMBER);
List<Future<Boolean>> list = new ArrayList<>();
for (int i = 0; i < CLIENTS_NUMBER; i++) {
Callable<Boolean> worker = new ClientSocketCallable(host, Integer.decode(port));
Future<Boolean> submit = executor.submit(worker);
list.add(submit);
}
Boolean result = true;
System.out.println(list.size());
for (Future<Boolean> future : list) {
if (!future.get()) {
result = false;
break;
}
}
long timeEnd = new Date().getTime();
long totalTime = timeEnd - timeStart;
if (totalTime > TEST_TIME) {
System.out.println("Server is too slow. Test time: " + totalTime + ". Expected time: " + TEST_TIME);
}
return result && totalTime < TEST_TIME;
} catch (InterruptedException | ExecutionException e) {
throw new TestException(e);
} finally {
if (executor != null)
executor.shutdown();
}
}
private class ClientSocketCallable implements Callable<Boolean> {
private final String host;
private final int port;
private ClientSocketCallable(String host, int port) {
this.host = host;
this.port = port;
}
@Override
public Boolean call() throws Exception {
try (Socket clientSocket = new Socket(host, port);
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))) {
int callIndex = 0;
do {
String messageToServer = "Client time: " + new Date().getTime();
out.println(messageToServer);
String messageFromServer = in.readLine();
if (messageFromServer == null || !messageFromServer.equals(messageToServer))
return false;
++callIndex;
Thread.sleep(SLEEP_TIME);
} while (callIndex < 5000);
out.println("Bye.");
System.out.println("Thread: " + Thread.currentThread().getName() + " messages: " + callIndex);
return true;
} catch (IOException e) {
throw new TestException(e);
}
}
}
}