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