package org.eclipse.jetty.io; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.eclipse.jetty.io.nio.IndirectNIOBuffer; import org.junit.Test; public abstract class EndPointTest<T extends EndPoint> { public static class EndPointPair<T> { public T client; public T server; } protected abstract EndPointPair<T> newConnection() throws Exception; @Test public void testClientServerExchange() throws Exception { EndPointPair<T> c = newConnection(); Buffer buffer = new IndirectNIOBuffer(4096); // Client sends a request c.client.flush(new ByteArrayBuffer("request")); // Server receives the request int len = c.server.fill(buffer); assertEquals(7,len); assertEquals("request",buffer.toString()); // Client and server are open assertTrue(c.client.isOpen()); assertFalse(c.client.isInputShutdown()); assertFalse(c.client.isOutputShutdown()); assertTrue(c.server.isOpen()); assertFalse(c.server.isInputShutdown()); assertFalse(c.server.isOutputShutdown()); // Server sends response and closes output c.server.flush(new ByteArrayBuffer("response")); c.server.shutdownOutput(); // client server are open, server is oshut assertTrue(c.client.isOpen()); assertFalse(c.client.isInputShutdown()); assertFalse(c.client.isOutputShutdown()); assertTrue(c.server.isOpen()); assertFalse(c.server.isInputShutdown()); assertTrue(c.server.isOutputShutdown()); // Client reads response buffer.clear(); len = c.client.fill(buffer); assertEquals(8,len); assertEquals("response",buffer.toString()); // Client and server are open, server is oshut assertTrue(c.client.isOpen()); assertFalse(c.client.isInputShutdown()); assertFalse(c.client.isOutputShutdown()); assertTrue(c.server.isOpen()); assertFalse(c.server.isInputShutdown()); assertTrue(c.server.isOutputShutdown()); // Client reads -1 buffer.clear(); len = c.client.fill(buffer); assertEquals(-1,len); // Client and server are open, server is oshut, client is ishut assertTrue(c.client.isOpen()); assertTrue(c.client.isInputShutdown()); assertFalse(c.client.isOutputShutdown()); assertTrue(c.server.isOpen()); assertFalse(c.server.isInputShutdown()); assertTrue(c.server.isOutputShutdown()); // Client shutsdown output, which is a close because already ishut c.client.shutdownOutput(); // Client is closed. Server is open and oshut assertFalse(c.client.isOpen()); assertTrue(c.client.isInputShutdown()); assertTrue(c.client.isOutputShutdown()); assertTrue(c.server.isOpen()); assertFalse(c.server.isInputShutdown()); assertTrue(c.server.isOutputShutdown()); // Server reads close buffer.clear(); len = c.server.fill(buffer); assertEquals(-1,len); // Client and Server are closed assertFalse(c.client.isOpen()); assertTrue(c.client.isInputShutdown()); assertTrue(c.client.isOutputShutdown()); assertFalse(c.server.isOpen()); assertTrue(c.server.isInputShutdown()); assertTrue(c.server.isOutputShutdown()); } @Test public void testClientClose() throws Exception { EndPointPair<T> c = newConnection(); Buffer buffer = new IndirectNIOBuffer(4096); c.client.flush(new ByteArrayBuffer("request")); int len = c.server.fill(buffer); assertEquals(7,len); assertEquals("request",buffer.toString()); assertTrue(c.client.isOpen()); assertFalse(c.client.isInputShutdown()); assertFalse(c.client.isOutputShutdown()); assertTrue(c.server.isOpen()); assertFalse(c.server.isInputShutdown()); assertFalse(c.server.isOutputShutdown()); c.client.close(); assertFalse(c.client.isOpen()); assertTrue(c.client.isInputShutdown()); assertTrue(c.client.isOutputShutdown()); assertTrue(c.server.isOpen()); assertFalse(c.server.isInputShutdown()); assertFalse(c.server.isOutputShutdown()); len = c.server.fill(buffer); assertEquals(-1,len); assertFalse(c.client.isOpen()); assertTrue(c.client.isInputShutdown()); assertTrue(c.client.isOutputShutdown()); assertTrue(c.server.isOpen()); assertTrue(c.server.isInputShutdown()); assertFalse(c.server.isOutputShutdown()); c.server.shutdownOutput(); assertFalse(c.client.isOpen()); assertTrue(c.client.isInputShutdown()); assertTrue(c.client.isOutputShutdown()); assertFalse(c.server.isOpen()); assertTrue(c.server.isInputShutdown()); assertTrue(c.server.isOutputShutdown()); } }