package org.threadly.litesockets.tcp; import static org.junit.Assert.*; import java.io.FileInputStream; import java.nio.ByteBuffer; import java.security.KeyStore; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.threadly.concurrent.PriorityScheduler; import org.threadly.concurrent.future.ListenableFuture; import org.threadly.litesockets.Client; import org.threadly.litesockets.NoThreadSocketExecuter; import org.threadly.litesockets.Server; import org.threadly.litesockets.TCPClient; import org.threadly.litesockets.TCPServer; import org.threadly.litesockets.utils.PortUtils; public class NoThreadSSLTests extends SSLTests { NoThreadSocketExecuter ntSE; volatile boolean running = true; @Before public void start() throws Exception { PS = new PriorityScheduler(5); ntSE = new NoThreadSocketExecuter(); SE = ntSE; SE.start(); PS.execute(new Runnable() { @Override public void run() { ntSE.select(10); if(running) { PS.execute(this); } }}); port = PortUtils.findTCPPort(); KS = KeyStore.getInstance(KeyStore.getDefaultType()); String filename = ClassLoader.getSystemClassLoader().getResource("keystore.jks").getFile(); FileInputStream ksf = new FileInputStream(filename); KS.load(ksf, "password".toCharArray()); kmf = KeyManagerFactory.getInstance("SunX509"); kmf.init(KS, "password".toCharArray()); sslCtx = SSLContext.getInstance("TLS"); sslCtx.init(kmf.getKeyManagers(), myTMs, null); serverFC = new FakeTCPServerClient(); } @After public void stop() { running = false; ntSE.wakeup(); ntSE.wakeup(); SE.stopIfRunning(); for(Server s: serverFC.getAllServers()) { s.close(); } for(Client c: serverFC.getAllClients()) { c.close(); } PS.shutdownNow(); System.gc(); System.out.println("Used Memory:" + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024*1024)); } //@Test public void loop() throws Exception { for(int i=0; i<100; i++) { this.largeWriteTest(); this.stop(); this.start(); } } @Test public void simpleInlineSSLtest() throws Exception { NoThreadSocketExecuter lntse = new NoThreadSocketExecuter(); lntse.start(); TCPServer server = lntse.createTCPServer("localhost", port); server.setSSLContext(sslCtx); server.setDoHandshake(true); serverFC.addTCPServer(server); TCPClient client = lntse.createTCPClient("localhost", port); SSLEngine ssle = sslCtx.createSSLEngine(); ssle.setUseClientMode(true); client.setSSLEngine(ssle); client.startSSL(); serverFC.addTCPClient(client); final ListenableFuture<?> connected = client.connect(); assertFalse(client.isEncrypted()); assertFalse(connected.isDone()); long start = System.currentTimeMillis(); while((!connected.isDone() || !client.isEncrypted()) && System.currentTimeMillis() - start < 5000) { lntse.select(1); } System.out.println(System.currentTimeMillis()-start ); assertTrue(System.currentTimeMillis()-start <= 5000); assertTrue(client.isEncrypted()); TCPClient sclient = serverFC.getClientAt(1); assertTrue(sclient.isEncrypted()); client.write(ByteBuffer.wrap(GET.getBytes())); assertEquals(0, serverFC.getClientsBuffer(sclient).remaining()); start = System.currentTimeMillis(); while((serverFC.getClientsBuffer(sclient).remaining() == 0) && System.currentTimeMillis() - start < 5000) { lntse.select(1); } String data = serverFC.getClientsBuffer(sclient).getAsString(serverFC.getClientsBuffer(sclient).remaining()); assertEquals(GET, data); } @Test public void preDataInlineSSLtest() throws Exception { NoThreadSocketExecuter lntse = new NoThreadSocketExecuter(); lntse.start(); TCPServer server = lntse.createTCPServer("localhost", port); server.setSSLContext(sslCtx); server.setDoHandshake(true); serverFC.addTCPServer(server); TCPClient client = lntse.createTCPClient("localhost", port); SSLEngine ssle = sslCtx.createSSLEngine(); ssle.setUseClientMode(true); client.setSSLEngine(ssle); client.startSSL(); serverFC.addTCPClient(client); final ListenableFuture<?> connected = client.connect(); assertFalse(client.isEncrypted()); assertFalse(connected.isDone()); System.out.println("startW"); client.write(ByteBuffer.wrap(GET.getBytes())); System.out.println("stopW"); long start = System.currentTimeMillis(); while((!connected.isDone() || !client.isEncrypted()) && System.currentTimeMillis() - start < 5000) { lntse.select(1); } System.out.println(System.currentTimeMillis()-start ); assertTrue(System.currentTimeMillis()-start <= 5000); assertTrue(client.isEncrypted()); TCPClient sclient = serverFC.getClientAt(1); assertTrue(sclient.isEncrypted()); start = System.currentTimeMillis(); while((serverFC.getClientsBuffer(sclient).remaining() == 0) && System.currentTimeMillis() - start < 5000) { lntse.select(1); } String data = serverFC.getClientsBuffer(sclient).getAsString(serverFC.getClientsBuffer(sclient).remaining()); assertEquals(GET, data); } @Test public void preDataServerInlineSSLtest() throws Exception { NoThreadSocketExecuter lntse = new NoThreadSocketExecuter(); lntse.start(); TCPServer server = lntse.createTCPServer("localhost", port); server.setSSLContext(sslCtx); serverFC.addTCPServer(server); TCPClient client = lntse.createTCPClient("localhost", port); SSLEngine ssle = sslCtx.createSSLEngine(); ssle.setUseClientMode(true); client.setSSLEngine(ssle); serverFC.addTCPClient(client); final ListenableFuture<?> connected = client.connect(); assertFalse(client.isEncrypted()); assertFalse(connected.isDone()); long start = System.currentTimeMillis(); while((!connected.isDone()) && System.currentTimeMillis() - start < 5000) { lntse.select(1); } System.out.println(System.currentTimeMillis()-start ); assertTrue(System.currentTimeMillis()-start <= 5000); assertFalse(client.isEncrypted()); TCPClient sclient = serverFC.getClientAt(1); assertFalse(sclient.isEncrypted()); sclient.startSSL(); client.startSSL(); System.out.println("startW"); sclient.write(ByteBuffer.wrap(GET.getBytes())); System.out.println("endW"); start = System.currentTimeMillis(); while((serverFC.getClientsBuffer(client).remaining() == 0) && System.currentTimeMillis() - start < 5000) { lntse.select(1); } String data = serverFC.getClientsBuffer(client).getAsString(serverFC.getClientsBuffer(client).remaining()); assertEquals(GET, data); } @Override public void largeWriteTest() throws Exception{ super.largeWriteTest(); } }