package org.simpleframework.transport; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.SocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SocketChannel; import java.util.concurrent.Executor; import java.util.concurrent.LinkedBlockingQueue; import junit.framework.TestCase; import org.simpleframework.common.thread.ConcurrentExecutor; import org.simpleframework.transport.reactor.ExecutorReactor; import org.simpleframework.transport.reactor.Reactor; import org.simpleframework.transport.trace.MockTrace; import org.simpleframework.transport.trace.Trace; public class SocketTransportPipeTest extends TestCase { private static final int ITERATIONS = 100000; public void testPipe() throws Exception { ServerSocket server = new ServerSocket(0); SocketAddress address = new InetSocketAddress("localhost", server.getLocalPort()); SocketChannel channel = SocketChannel.open(); channel.configureBlocking(false); // underlying socket must be non-blocking channel.connect(address); while(!channel.finishConnect()) { // wait to finish connection Thread.sleep(10); }; Trace trace = new MockTrace(); SocketWrapper wrapper = new SocketWrapper(channel, trace); Executor executor = new ConcurrentExecutor(Runnable.class); Reactor reactor = new ExecutorReactor(executor); SocketTransport transport = new SocketTransport(wrapper,reactor); java.net.Socket socket = server.accept(); final InputStream read = socket.getInputStream(); final ByteArrayOutputStream buffer = new ByteArrayOutputStream(); final LinkedBlockingQueue<String> sent = new LinkedBlockingQueue<String>(); final LinkedBlockingQueue<String> received = new LinkedBlockingQueue<String>(); Thread thread = new Thread(new Runnable() { public void run(){ try { byte[] token = new byte[]{'\r','\n'}; int pos = 0; int count = 0; while((count = read.read()) != -1){ if(count != token[pos++]){ pos = 0; } if(pos == token.length) { String value = buffer.toString().trim(); String expect = sent.take(); if(!value.equals(expect)) { throw new Exception("Out of sequence expected " + expect + " but got " + value); } received.offer(value); buffer.reset(); pos = 0; } else { buffer.write(count); System.err.write(count); System.err.flush(); } } }catch(Exception e){ e.printStackTrace(); } } }); thread.start(); for(int i = 0; i < ITERATIONS; i++) { String message = "message-"+i; transport.write(ByteBuffer.wrap((message+"\r\n").getBytes())); sent.offer(message); } transport.flush(); transport.close(); for(int i = 0; i < ITERATIONS; i++) { assertEquals(received.take(), "message-"+i); } assertTrue(sent.isEmpty()); assertTrue(received.isEmpty()); } }