/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: Sergi Vladykin
*/
package org.h2.test.unit;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import org.h2.test.TestBase;
import org.h2.util.NetUtils;
import org.h2.util.Task;
/**
* Test the network utilities.
*
* @author Sergi Vladykin
*/
public class TestNetUtils extends TestBase {
private static final int WORKER_COUNT = 10;
private static final int PORT = 9111;
/**
* Run just this test.
*
* @param a ignored
*/
public static void main(String... a) throws Exception {
TestBase.createCaller().init().test();
}
public void test() throws Exception {
testFrequentConnections(true, 100);
testFrequentConnections(false, 1000);
}
private void testFrequentConnections(boolean ssl, int count) throws Exception {
final ServerSocket serverSocket = NetUtils.createServerSocket(PORT, ssl);
final AtomicInteger counter = new AtomicInteger(count);
Task serverThread = new Task() {
public void call() {
while (!stop) {
try {
Socket socket = serverSocket.accept();
// System.out.println("opened " + counter);
socket.close();
} catch (Exception e) {
// ignore
}
}
// System.out.println("stopped ");
}
};
serverThread.execute();
try {
Set<ConnectWorker> workers = new HashSet<ConnectWorker>();
for (int i = 0; i < WORKER_COUNT; i++) {
workers.add(new ConnectWorker(ssl, counter));
}
// ensure the server is started
Thread.sleep(100);
for (ConnectWorker worker : workers) {
worker.start();
}
for (ConnectWorker worker : workers) {
worker.join();
Exception e = worker.getException();
if (e != null) {
e.printStackTrace();
}
}
} finally {
try {
serverSocket.close();
} catch (Exception e) {
// ignore
}
serverThread.get();
}
}
/**
* A worker thread to test connecting.
*/
private static class ConnectWorker extends Thread {
private final boolean ssl;
private final AtomicInteger counter;
private Exception exception;
public ConnectWorker(boolean ssl, AtomicInteger counter) {
this.ssl = ssl;
this.counter = counter;
}
public void run() {
try {
while (!isInterrupted() && counter.decrementAndGet() > 0) {
Socket socket = NetUtils.createLoopbackSocket(PORT, ssl);
try {
socket.close();
} catch (IOException e) {
// ignore
}
}
} catch (Exception e) {
exception = new Exception("count: " + counter, e);
}
}
public Exception getException() {
return exception;
}
}
}