1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/* 2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Licensed to the Apache Software Foundation (ASF) under one or more 3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * contributor license agreements. See the NOTICE file distributed with 4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * this work for additional information regarding copyright ownership. 5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0 6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * (the "License"); you may not use this file except in compliance with 7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * the License. You may obtain a copy of the License at 8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * 9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * 11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Unless required by applicable law or agreed to in writing, software 12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * See the License for the specific language governing permissions and 15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * limitations under the License. 16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.xnet.provider.jsse; 19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.IOException; 21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.InputStream; 22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.OutputStream; 23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Arrays; 24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.net.ssl.HandshakeCompletedEvent; 25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.net.ssl.HandshakeCompletedListener; 26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.net.ssl.SSLContext; 27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.net.ssl.SSLServerSocket; 28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.net.ssl.SSLSocket; 29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.Test; 31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase; 32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestSuite; 33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/** 35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * SSLSocketImplTest 36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class SSLSocketFunctionalTest extends TestCase { 38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes /** 40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * The cipher suites used for functionality testing. 41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes private String[] cipher_suites = { 43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes "RSA_WITH_RC4_128_MD5", 44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes "RSA_WITH_DES_CBC_SHA", 45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes "DH_anon_EXPORT_WITH_DES40_CBC_SHA" 46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes }; 47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // turn on/off the debug logging 49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes private boolean doLog = false; 50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes /** 52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Sets up the test case. 53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes @Override 55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void setUp() throws Exception { 56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (doLog) { 57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("========================"); 58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("====== Running the test: " + getName()); 59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("========================"); 60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testContextInitialized2() throws Throwable { 64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes doTestSelfInteraction(JSSETestData.getContext()); 65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void doTestInteraction(SSLContext context, SSLContext ctx_other) 68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes throws Throwable { 69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes SSLContext ctx1, ctx2; 70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ctx1 = context; 72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ctx2 = ctx_other; 73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int k=1; 75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes SSLServerSocket ssocket = (SSLServerSocket) ctx1 77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .getServerSocketFactory().createServerSocket(0); 78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ssocket.setUseClientMode(false); 79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ssocket.setEnabledCipherSuites( 80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ((k & 1) > 0) 81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ? new String[] {"TLS_"+cipher_suites[0]} 82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes : new String[] {"SSL_"+cipher_suites[0]}); 83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes SSLSocket csocket = (SSLSocket) ctx2 85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .getSocketFactory().createSocket("localhost", 86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ssocket.getLocalPort()); 87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes csocket.setEnabledProtocols(new String[] {"TLSv1"}); 88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes csocket.setUseClientMode(true); 89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes csocket.setEnabledCipherSuites( 90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes (((k & 2) >> 1) > 0) 91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ? new String[] {"TLS_"+cipher_suites[0]} 92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes : new String[] {"SSL_"+cipher_suites[0]}); 93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes doTest(ssocket, csocket); 94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void _doTestInteraction(SSLContext context, SSLContext ctx_other) 97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes throws Throwable { 98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes for (int i=0; i<cipher_suites.length; i++) { 99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (doLog) { 100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("======== Checking the work on cipher: " 101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + cipher_suites[i]); 102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes SSLContext ctx1, ctx2; 104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // k: 00, 01, 10, 11; 105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // where 1 means implementation under the test, 106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // 0 - another implementation to interract with 107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes for (int k=0; k<4; k++) { 108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (doLog) { 109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("======== "+(k & 1)+" "+((k & 2) >> 1)); 110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ctx1 = ((k & 1) > 0) ? context : ctx_other; 112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ctx2 = (((k & 2) >> 1) > 0) ? context : ctx_other; 113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes SSLServerSocket ssocket = (SSLServerSocket) ctx1 115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .getServerSocketFactory().createServerSocket(0); 116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ssocket.setUseClientMode(false); 117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ssocket.setEnabledCipherSuites( 118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ((k & 1) > 0) 119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ? new String[] {"TLS_"+cipher_suites[i]} 120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes : new String[] {"SSL_"+cipher_suites[i]}); 121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes SSLSocket csocket = (SSLSocket) ctx2 123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .getSocketFactory().createSocket("localhost", 124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ssocket.getLocalPort()); 125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes csocket.setEnabledProtocols(new String[] {"TLSv1"}); 126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes csocket.setUseClientMode(true); 127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes csocket.setEnabledCipherSuites( 128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes (((k & 2) >> 1) > 0) 129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ? new String[] {"TLS_"+cipher_suites[i]} 130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes : new String[] {"SSL_"+cipher_suites[i]}); 131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes doTest(ssocket, csocket); 132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes /** 137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Tests the interaction with other implementation. 138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void doTestSelfInteraction(SSLContext context) 140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes throws Throwable { 141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes String[] protocols = {"SSLv3", "TLSv1"}; 142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes for (int i=0; i<cipher_suites.length; i++) { 143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes for (int j=0; j<2; j++) { 144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (doLog) { 145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("======= " + cipher_suites[i]); 146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes SSLServerSocket ssocket = (SSLServerSocket) context 148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .getServerSocketFactory().createServerSocket(0); 149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ssocket.setUseClientMode(false); 150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ssocket.setEnabledProtocols(new String[] {protocols[j]}); 151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ssocket.setEnabledCipherSuites( 152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new String[] {"TLS_"+cipher_suites[i]}); 153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes SSLSocket csocket = (SSLSocket) context 155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .getSocketFactory().createSocket("localhost", 156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ssocket.getLocalPort()); 157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes csocket.setEnabledProtocols(new String[] {protocols[j]}); 158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes csocket.setUseClientMode(true); 159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes csocket.setEnabledCipherSuites( 160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new String[] {"TLS_"+cipher_suites[i]}); 161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes doTest(ssocket, csocket); 163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes private static class HandshakeListener 168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes implements HandshakeCompletedListener { 169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes boolean compleated = false; 170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void handshakeCompleted(HandshakeCompletedEvent event) { 172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes compleated = true; 173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes /** 177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Performs SSL connection between the sockets 178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * @return 179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void doTest(SSLServerSocket ssocket, SSLSocket csocket) 181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes throws Throwable { 182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes final String server_message = "Hello from SSL Server Socket!"; 183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes final String client_message = "Hello from SSL Socket!"; 184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Thread server = null; 185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Thread client = null; 186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes final Throwable[] throwed = new Throwable[1]; 187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes final SSLServerSocket ss = ssocket; 189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes final SSLSocket s = csocket; 190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes server = new Thread() { 191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes @Override 192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void run() { 193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes InputStream is = null; 194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes OutputStream os = null; 195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes SSLSocket s = null; 196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes s = (SSLSocket) ss.accept(); 198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (doLog) { 199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Socket accepted: " + s); 200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes is = s.getInputStream(); 202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes os = s.getOutputStream(); 203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // send the message to the client 204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes os.write(server_message.getBytes()); 205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // read the response 206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes byte[] buff = new byte[client_message.length()]; 207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int len = is.read(buff); 208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (doLog) { 209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Received message of length " 210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + len + ": '" + new String(buff, 0, len)+"'"); 211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertTrue("Read message does not equal to expected", 213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Arrays.equals(client_message.getBytes(), buff)); 214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes os.write(-1); 215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("Read data differs from expected", 216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 255, is.read()); 217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (doLog) { 218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Server is closed: " 219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes +s.isClosed()); 220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("Returned value should be -1", 222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // initiate an exchange of closure alerts 223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes -1, is.read()); 224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (doLog) { 225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Server is closed: " 226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes +s.isClosed()); 227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("Returned value should be -1", 229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // initiate an exchange of closure alerts 230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes -1, is.read()); 231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (Throwable e) { 232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes synchronized (throwed) { 233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (doLog) { 234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes e.printStackTrace(); 235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (throwed[0] == null) { 237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes throwed[0] = e; 238561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } finally { 241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (is != null) { 243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes is.close(); 244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (IOException ex) {} 246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 247561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (os != null) { 248561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes os.close(); 249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (IOException ex) {} 251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 252561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (s != null) { 253561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes s.close(); 254561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 255561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (IOException ex) {} 256561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 257561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 258561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes }; 259561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 260561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes client = new Thread() { 261561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes @Override 262561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void run() { 263561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes InputStream is = null; 264561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes OutputStream os = null; 265561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 266561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertTrue("Client was not connected", s.isConnected()); 267561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (doLog) { 268561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Client connected"); 269561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 270561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes is = s.getInputStream(); 271561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes os = s.getOutputStream(); 272561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes s.startHandshake(); 273561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (doLog) { 274561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Client: HS was done"); 275561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 276561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // read the message from the server 277561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes byte[] buff = new byte[server_message.length()]; 278561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int len = is.read(buff); 279561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (doLog) { 280561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Received message of length " 281561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes + len + ": '" + new String(buff, 0, len)+"'"); 282561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 283561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertTrue("Read message does not equal to expected", 284561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Arrays.equals(server_message.getBytes(), buff)); 285561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // send the response 286561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes buff = (" "+client_message+" ").getBytes(); 287561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes os.write(buff, 1, buff.length-2); 288561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("Read data differs from expected", 289561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 255, is.read()); 290561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes os.write(-1); 291561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (doLog) { 292561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("\n======== Closing ========"); 293561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 294561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (doLog) { 295561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Client is closed: " 296561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes +s.isClosed()); 297561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 298561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes s.close(); 299561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (doLog) { 300561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes System.out.println("Client is closed: " 301561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes +s.isClosed()); 302561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 303561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (Throwable e) { 304561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes synchronized (throwed) { 305561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (doLog) { 306561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes e.printStackTrace(); 307561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 308561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (throwed[0] == null) { 309561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes throwed[0] = e; 310561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 311561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 312561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } finally { 313561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 314561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (is != null) { 315561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes is.close(); 316561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 317561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (IOException ex) {} 318561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 319561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (os != null) { 320561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes os.close(); 321561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 322561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (IOException ex) {} 323561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 324561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (s != null) { 325561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes s.close(); 326561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 327561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (IOException ex) {} 328561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 329561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 330561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes }; 331561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 332561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes server.start(); 333561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes client.start(); 334561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 335561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes while (server.isAlive() || client.isAlive()) { 336561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (throwed[0] != null) { 337561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes throw throwed[0]; 338561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 339561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 340561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Thread.sleep(500); 341561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (Exception e) { } 342561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 343561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } finally { 344561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (server != null) { 345561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes server.stop(); 346561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 347561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (client != null) { 348561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes client.stop(); 349561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 350561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 351561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (throwed[0] != null) { 352561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes throw throwed[0]; 353561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 354561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 355561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 356561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public static Test suite() { 357561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return new TestSuite(SSLSocketFunctionalTest.class); 358561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 359561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 360561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes} 361