package org.webpieces.nio.api; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.junit.Assert; import org.junit.Test; import org.webpieces.data.api.BufferCreationPool; import org.webpieces.nio.api.channels.Channel; import org.webpieces.nio.api.channels.TCPChannel; import org.webpieces.nio.api.channels.TCPServerChannel; import org.webpieces.util.threading.NamedThreadFactory; public class TestBasicSsl { private MockDataListener mockSvrDataListener = new MockDataListener(); private MockConnectionListener mockConnListener = new MockConnectionListener(mockSvrDataListener); private MockDataListener mockClientDataListener = new MockDataListener(); @Test public void testBasic() throws InterruptedException, ExecutionException { ChannelManager svrMgr = createSvrChanMgr("server"); SelfSignedSSLEngineFactory sslFactory = new SelfSignedSSLEngineFactory(); TCPServerChannel svrChannel = svrMgr.createTCPServerChannel("svrChan", mockConnListener, sslFactory); svrChannel.bind(new InetSocketAddress(8444)); int port = svrChannel.getLocalAddress().getPort(); //don't really need to use a separate chan mgr but we will here.. ChannelManager chanMgr = createSvrChanMgr("client"); TCPChannel channel = chanMgr.createTCPChannel("client", sslFactory.createEngineForClient("cvs.xsoftware.biz", port)); CompletableFuture<Channel> future = channel.connect(new InetSocketAddress("localhost", port), mockClientDataListener); future.get(); byte[] data = new byte[] {0, 2, 4, 6, 8, 10}; ByteBuffer buf = ByteBuffer.wrap(data); channel.write(buf); ByteBuffer result = mockSvrDataListener.getFirstBuffer().get(); byte[] newData = new byte[result.remaining()]; result.get(newData); Assert.assertEquals(data.length, newData.length); for(int i = 0; i < data.length; i++) { Assert.assertEquals(data[i], newData[i]); } //verify sniServerName was used in looking up security cert. String host = sslFactory.getCachedHost(); Assert.assertEquals("cvs.xsoftware.biz", host); } private ChannelManager createSvrChanMgr(String name) { ExecutorService executor = Executors.newFixedThreadPool(10, new NamedThreadFactory(name)); ChannelManagerFactory factory = ChannelManagerFactory.createFactory(); ChannelManager svrMgr = factory.createMultiThreadedChanMgr(name+"Mgr", new BufferCreationPool(), executor); return svrMgr; } }