diff --git a/apps/streaming/java/test/net/i2p/client/streaming/ConnectCloseTest.java b/apps/streaming/java/test/net/i2p/client/streaming/ConnectCloseTest.java new file mode 100644 index 0000000000000000000000000000000000000000..4fa2ddf31de9c57d37796dcf460e3a873d994fe6 --- /dev/null +++ b/apps/streaming/java/test/net/i2p/client/streaming/ConnectCloseTest.java @@ -0,0 +1,138 @@ +package net.i2p.client.streaming; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.util.Properties; + +import net.i2p.I2PAppContext; +import net.i2p.client.I2PClient; +import net.i2p.client.I2PClientFactory; +import net.i2p.client.I2PSession; +import net.i2p.data.Destination; +import net.i2p.util.Log; + +/** + * Have a client connect to a server, where the server waits 5 + * seconds and closes the socket and the client detect that + * EOF. + * + */ +public class ConnectCloseTest { + private Log _log; + private I2PSession _server; + public void test() { + try { + I2PAppContext context = I2PAppContext.getGlobalContext(); + _log = context.logManager().getLog(ConnectCloseTest.class); + _log.debug("creating server session"); + _server = createSession(); + _log.debug("running server"); + runServer(context, _server); + _log.debug("running client"); + runClient(context, createSession()); + } catch (Exception e) { + _log.error("error running", e); + } + try { Thread.sleep(10*60*1000); } catch (Exception e) {} + } + + private void runClient(I2PAppContext ctx, I2PSession session) { + Thread t = new Thread(new ClientRunner(ctx, session)); + t.setName("client"); + t.setDaemon(true); + t.start(); + } + + private void runServer(I2PAppContext ctx, I2PSession session) { + Thread t = new Thread(new ServerRunner(ctx, session)); + t.setName("server"); + t.setDaemon(true); + t.start(); + } + + private class ServerRunner implements Runnable { + private I2PAppContext _context; + private I2PSession _session; + private Log _log; + public ServerRunner(I2PAppContext ctx, I2PSession session) { + _context = ctx; + _session = session; + _log = ctx.logManager().getLog(ServerRunner.class); + } + + public void run() { + try { + Properties opts = new Properties(); + I2PSocketManager mgr = new I2PSocketManagerFull(_context, _session, opts, "client"); + _log.debug("* manager created"); + I2PServerSocket ssocket = mgr.getServerSocket(); + _log.debug("* server socket created"); + while (true) { + I2PSocket socket = ssocket.accept(); + _log.debug("* socket accepted: " + socket); + try { Thread.sleep(5*1000); } catch (InterruptedException ie) {} + socket.close(); + _log.debug("* socket closed: " + socket); + } + } catch (Exception e) { + _log.error("error running", e); + } + } + + } + + private class ClientRunner implements Runnable { + private I2PAppContext _context; + private I2PSession _session; + private Log _log; + public ClientRunner(I2PAppContext ctx, I2PSession session) { + _context = ctx; + _session = session; + _log = ctx.logManager().getLog(ClientRunner.class); + } + + public void run() { + try { + Properties opts = new Properties(); + I2PSocketManager mgr = new I2PSocketManagerFull(_context, _session, opts, "client"); + _log.debug("* manager created"); + I2PSocket socket = mgr.connect(_server.getMyDestination()); + _log.debug("* socket created"); + InputStream in = socket.getInputStream(); + int c = in.read(); + if (c != -1) + throw new RuntimeException("hrm, we got data? [" + c + "]"); + socket.close(); + _log.debug("* socket closed"); + mgr.destroySocketManager(); + mgr = null; + socket = null; + } catch (Exception e) { + _log.error("error running", e); + } + try { Thread.sleep(5*1000); } catch (InterruptedException ie) {} + System.exit(0); + } + + } + + private I2PSession createSession() { + try { + I2PClient client = I2PClientFactory.createClient(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(512); + Destination dest = client.createDestination(baos); + I2PSession sess = client.createSession(new ByteArrayInputStream(baos.toByteArray()), System.getProperties()); + sess.connect(); + return sess; + } catch (Exception e) { + _log.error("error running", e); + throw new RuntimeException("b0rk b0rk b0rk"); + } + } + + public static void main(String args[]) { + ConnectCloseTest ct = new ConnectCloseTest(); + ct.test(); + } +}