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.net.InetAddress;
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.InetSocketAddress;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.ServerSocket;
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.Socket;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.net.ssl.HandshakeCompletedEvent;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.net.ssl.HandshakeCompletedListener;
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.net.ssl.SSLSession;
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 test
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class SSLSocketImplTest extends TestCase {
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // turn on/off the debug logging
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static boolean doLog = false;
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Sets up the test case.
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @Override
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void setUp() throws Exception {
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (doLog) {
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            System.out.println("");
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            System.out.println("========================");
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            System.out.println("====== Running the test: " + getName());
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private SSLSocket createSSLSocket() throws Exception {
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return new SSLSocketImpl(JSSETestData.getSSLParameters());
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private SSLSocket createSSLSocket(int port) throws Exception {
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return new SSLSocketImpl("localhost", port,
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                JSSETestData.getSSLParameters());
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * SSLSocketImpl(SSLParameters sslParameters) method testing.
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSSLSocketImpl1() throws Exception {
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Server server = null;
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = null;
69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server = new Server();
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket = new SSLSocketImpl(JSSETestData.getSSLParameters());
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.connect(
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    new InetSocketAddress("localhost", server.getPort()));
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ((SSLSocketImpl) socket).init();
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.setUseClientMode(true);
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server.start();
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            final SSLSocket s = socket;
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Thread thread = new Thread() {
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                @Override
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                public void run() {
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        s.startHandshake();
858d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (Exception e) {
868d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            };
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            thread.start();
91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int timeout = 10; // wait no more than 10*500 ms for handshake
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while (!server.handshakeStarted()) {
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // wait for handshake start
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    Thread.sleep(500);
978d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (Exception e) {
988d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                timeout--;
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (timeout < 0) {
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        server.close();
1038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
1048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        socket.close();
1078d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
1088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    fail("Handshake was not started");
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (server != null) {
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    server.close();
1168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
1178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (socket != null) {
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    socket.close();
1228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
1238d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * SSLSocketImpl(String host, int port, SSLParameters sslParameters) method
130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * testing.
131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSSLSocketImpl2() throws Exception {
133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Server server = null;
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = null;
135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server = new Server();
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket = new SSLSocketImpl("localhost",
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    server.getPort(), JSSETestData.getSSLParameters());
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.setUseClientMode(true);
141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server.start();
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            final SSLSocket s = socket;
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Thread thread = new Thread() {
145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                @Override
146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                public void run() {
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        s.startHandshake();
1498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (Exception e) {
1508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            };
153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            thread.start();
155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int timeout = 10; // wait no more than 5 seconds for handshake
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while (!server.handshakeStarted()) {
158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // wait for handshake start
159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    Thread.sleep(500);
1618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (Exception e) {
1628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                timeout--;
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (timeout < 0) {
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        server.close();
1678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
1688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        socket.close();
1718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
1728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    fail("Handshake was not started");
174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (server != null) {
178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    server.close();
1808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
1818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (socket != null) {
184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    socket.close();
1868d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
1878d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * SSLSocketImpl(String host, int port, InetAddress localHost, int
194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * localPort, SSLParameters sslParameters) method testing.
195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSSLSocketImpl3() throws Exception {
197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Server server = null;
198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = null;
199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server = new Server();
201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket = new SSLSocketImpl(
203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    "localhost",
204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    server.getPort(),
205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    InetAddress.getByName("localhost"),
206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    0, JSSETestData.getSSLParameters());
207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.setUseClientMode(true);
208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server.start();
210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            final SSLSocket s = socket;
211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Thread thread = new Thread() {
212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                @Override
213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                public void run() {
214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        s.startHandshake();
2168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (Exception e) {
2178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            };
220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            thread.start();
222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int timeout = 10; // wait no more than 5 seconds for handshake
224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while (!server.handshakeStarted()) {
225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // wait for handshake start
226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    Thread.sleep(500);
2288d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (Exception e) {
2298d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                timeout--;
231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (timeout < 0) {
232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        server.close();
2348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
2358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        socket.close();
2388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
2398d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    fail("Handshake was not started");
241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (server != null) {
245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    server.close();
2478d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
2488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (socket != null) {
251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
252561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    socket.close();
2538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
2548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
255561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
256561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
257561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
258561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
259561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
260561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * SSLSocketImpl(InetAddress host, int port, SSLParameters sslParameters)
261561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * method testing.
262561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
263561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSSLSocketImpl4() throws Exception {
264561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Server server = null;
265561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = null;
266561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
267561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server = new Server();
268561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
269561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket = new SSLSocketImpl(
270561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    InetAddress.getByName("localhost"),
271561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    server.getPort(),
272561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    JSSETestData.getSSLParameters());
273561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.setUseClientMode(true);
274561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
275561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server.start();
276561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            final SSLSocket s = socket;
277561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Thread thread = new Thread() {
278561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                @Override
279561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                public void run() {
280561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
281561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        s.startHandshake();
2828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (Exception e) {
2838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
284561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
285561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            };
286561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
287561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            thread.start();
288561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
289561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int timeout = 10; // wait no more than 5 seconds for handshake
290561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while (!server.handshakeStarted()) {
291561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // wait for handshake start
292561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
293561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    Thread.sleep(500);
2948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (Exception e) {
2958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
296561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                timeout--;
297561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (timeout < 0) {
298561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
299561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        server.close();
3008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
3018d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
302561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
303561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        socket.close();
3048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
3058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
306561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    fail("Handshake was not started");
307561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
308561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
309561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
310561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (server != null) {
311561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
312561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    server.close();
3138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
3148d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
315561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
316561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (socket != null) {
317561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
318561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    socket.close();
3198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
3208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
321561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
322561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
323561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
324561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
325561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
326561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * SSLSocketImpl(InetAddress address, int port, InetAddress localAddress,
327561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * int localPort, SSLParameters sslParameters) method testing.
328561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
329561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSSLSocketImpl5() throws Exception {
330561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Server server = null;
331561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = null;
332561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
333561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server = new Server();
334561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
335561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket = new SSLSocketImpl(
336561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    InetAddress.getByName("localhost"),
337561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    server.getPort(),
338561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    InetAddress.getByName("localhost"),
339561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    0, JSSETestData.getSSLParameters());
340561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.setUseClientMode(true);
341561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
342561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server.start();
343561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            final SSLSocket s = socket;
344561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Thread thread = new Thread() {
345561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                @Override
346561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                public void run() {
347561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
348561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        s.startHandshake();
3498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (Exception e) {
3508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
351561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
352561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            };
353561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
354561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            thread.start();
355561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
356561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int timeout = 10; // wait no more than 5 seconds for handshake
357561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while (!server.handshakeStarted()) {
358561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // wait for handshake start
359561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
360561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    Thread.sleep(500);
3618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (Exception e) {
3628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
363561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                timeout--;
364561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (timeout < 0) {
365561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
366561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        server.close();
3678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
3688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
369561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
370561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        socket.close();
3718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
3728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
373561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    fail("Handshake was not started");
374561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
375561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
376561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
377561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (server != null) {
378561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
379561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    server.close();
3808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
3818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
382561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
383561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (socket != null) {
384561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
385561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    socket.close();
3868d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
3878d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
388561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
389561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
390561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
391561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
392561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
393561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getSupportedCipherSuites() method testing.
394561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
395561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGetSupportedCipherSuites() throws Exception {
396561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = createSSLSocket();
397561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] supported = socket.getSupportedCipherSuites();
398561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(supported);
399561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        supported[0] = "NOT_SUPPORTED_CIPHER_SUITE";
400561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        supported = socket.getEnabledCipherSuites();
4018d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < supported.length; i++) {
402561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if ("NOT_SUPPORTED_CIPHER_SUITE".equals(supported[i])) {
403561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Modification of the returned result "
404561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        + "causes the modification of the internal state");
405561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
406561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
407561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
408561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
409561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
410561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getEnabledCipherSuites() method testing.
411561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
412561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGetEnabledCipherSuites() throws Exception {
413561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = createSSLSocket();
414561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] enabled = socket.getEnabledCipherSuites();
415561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(enabled);
416561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] supported = socket.getSupportedCipherSuites();
4178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < enabled.length; i++) {
4188d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            found:
4198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            {
4208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                for (int j = 0; j < supported.length; j++) {
421561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    if (enabled[i].equals(supported[j])) {
422561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        break found;
423561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
424561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
425561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Enabled suite does not belong to the set "
426561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        + "of supported cipher suites: " + enabled[i]);
427561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
428561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
429561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        socket.setEnabledCipherSuites(supported);
4308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < supported.length; i++) {
431561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            enabled = new String[supported.length - i];
432561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            System.arraycopy(supported, 0,
4338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    enabled, 0, supported.length - i);
434561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.setEnabledCipherSuites(enabled);
435561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            String[] result = socket.getEnabledCipherSuites();
436561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (result.length != enabled.length) {
437561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Returned result does not correspond to expected.");
438561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
4398d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            for (int k = 0; k < result.length; k++) {
4408d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                found:
4418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                {
4428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    for (int n = 0; n < enabled.length; n++) {
443561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        if (result[k].equals(enabled[n])) {
444561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            break found;
445561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        }
446561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
447561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    if (result.length != enabled.length) {
448561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        fail("Returned result does not correspond "
449561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                + "to expected.");
450561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
451561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
452561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
453561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
454561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
455561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
456561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
457561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * setEnabledCipherSuites(String[] suites) method testing.
458561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
459561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSetEnabledCipherSuites() throws Exception {
460561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = createSSLSocket();
461561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] enabled = socket.getEnabledCipherSuites();
462561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(enabled);
463561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] supported = socket.getSupportedCipherSuites();
4648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < enabled.length; i++) {
4658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            found:
4668d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            {
4678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                for (int j = 0; j < supported.length; j++) {
468561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    if (enabled[i].equals(supported[j])) {
469561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        break found;
470561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
471561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
472561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Enabled suite does not belong to the set "
473561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        + "of supported cipher suites: " + enabled[i]);
474561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
475561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
476561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        socket.setEnabledCipherSuites(supported);
477561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        socket.setEnabledCipherSuites(enabled);
478561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        socket.setEnabledCipherSuites(supported);
4798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        String[] more_than_supported = new String[supported.length + 1];
4808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < supported.length + 1; i++) {
481561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            more_than_supported[i]
4828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    = "NOT_SUPPORTED_CIPHER_SUITE";
483561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            System.arraycopy(supported, 0,
484561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    more_than_supported, 0, i);
485561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            System.arraycopy(supported, i,
4868d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    more_than_supported, i + 1, supported.length - i);
487561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
488561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                socket.setEnabledCipherSuites(more_than_supported);
489561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Expected IllegalArgumentException was not thrown");
4908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            } catch (IllegalArgumentException e) {
4918d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            }
492561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
493561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        enabled = socket.getEnabledCipherSuites();
494561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        enabled[0] = "NOT_SUPPORTED_CIPHER_SUITE";
495561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        enabled = socket.getEnabledCipherSuites();
4968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < enabled.length; i++) {
497561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if ("NOT_SUPPORTED_CIPHER_SUITE".equals(enabled[i])) {
498561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Modification of the returned result "
499561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        + "causes the modification of the internal state");
500561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
501561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
502561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
503561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
504561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
505561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getSupportedProtocols() method testing.
506561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
507561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGetSupportedProtocols() throws Exception {
508561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = createSSLSocket();
509561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] supported = socket.getSupportedProtocols();
510561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(supported);
511561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(supported.length == 0);
512561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        supported[0] = "NOT_SUPPORTED_PROTOCOL";
513561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        supported = socket.getSupportedProtocols();
5148d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < supported.length; i++) {
515561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if ("NOT_SUPPORTED_PROTOCOL".equals(supported[i])) {
516561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Modification of the returned result "
517561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        + "causes the modification of the internal state");
518561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
519561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
520561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
521561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
522561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
523561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getEnabledProtocols() method testing.
524561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
525561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGetEnabledProtocols() throws Exception {
526561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = createSSLSocket();
527561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] enabled = socket.getEnabledProtocols();
528561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(enabled);
529561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] supported = socket.getSupportedProtocols();
5308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < enabled.length; i++) {
5318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            found:
5328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            {
5338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                for (int j = 0; j < supported.length; j++) {
534561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    if (enabled[i].equals(supported[j])) {
535561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        break found;
536561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
537561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
538561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Enabled protocol does not belong to the set "
539561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        + "of supported protocols: " + enabled[i]);
540561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
541561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
542561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        socket.setEnabledProtocols(supported);
5438d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < supported.length; i++) {
544561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            enabled = new String[supported.length - i];
545561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            System.arraycopy(supported, i,
5468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    enabled, 0, supported.length - i);
547561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.setEnabledProtocols(enabled);
548561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            String[] result = socket.getEnabledProtocols();
549561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (result.length != enabled.length) {
550561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Returned result does not correspond to expected.");
551561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
5528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            for (int k = 0; k < result.length; k++) {
5538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                found:
5548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                {
5558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    for (int n = 0; n < enabled.length; n++) {
556561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        if (result[k].equals(enabled[n])) {
557561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            break found;
558561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        }
559561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
560561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    if (result.length != enabled.length) {
561561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        fail("Returned result does not correspond "
562561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                + "to expected.");
563561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
564561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
565561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
566561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
567561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
568561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
569561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
570561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * setEnabledProtocols(String[] protocols) method testing.
571561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
572561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSetEnabledProtocols() throws Exception {
573561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = createSSLSocket();
574561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] enabled = socket.getEnabledProtocols();
575561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(enabled);
576561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] supported = socket.getSupportedProtocols();
5778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < enabled.length; i++) {
578561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //System.out.println("Checking of "+enabled[i]);
5798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            found:
5808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            {
5818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                for (int j = 0; j < supported.length; j++) {
582561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    if (enabled[i].equals(supported[j])) {
583561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        break found;
584561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
585561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
586561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Enabled suite does not belong to the set "
587561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        + "of supported cipher suites: " + enabled[i]);
588561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
589561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
590561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        socket.setEnabledProtocols(supported);
591561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        socket.setEnabledProtocols(enabled);
592561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        socket.setEnabledProtocols(supported);
5938d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        String[] more_than_supported = new String[supported.length + 1];
5948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < supported.length + 1; i++) {
595561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            more_than_supported[i]
5968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    = "NOT_SUPPORTED_PROTOCOL";
597561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            System.arraycopy(supported, 0,
598561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    more_than_supported, 0, i);
599561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            System.arraycopy(supported, i,
6008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    more_than_supported, i + 1, supported.length - i);
601561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
602561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                socket.setEnabledProtocols(more_than_supported);
603561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Expected IllegalArgumentException was not thrown");
6048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            } catch (IllegalArgumentException e) {
6058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            }
606561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
607561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        enabled = socket.getEnabledProtocols();
608561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        enabled[0] = "NOT_SUPPORTED_PROTOCOL";
609561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        enabled = socket.getEnabledProtocols();
6108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < enabled.length; i++) {
611561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if ("NOT_SUPPORTED_PROTOCOL".equals(enabled[i])) {
612561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Modification of the returned result "
613561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        + "causes the modification of the internal state");
614561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
615561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
616561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
617561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
618561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static class Server extends Thread {
619561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
620561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private final ServerSocket server;
621561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private boolean closed;
622561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private boolean handshake_started = false;
623561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private Socket endpoint = null;
624561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
625561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Server() throws IOException {
626561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super();
627561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server = new ServerSocket(0);
628561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server.setSoTimeout(1000);
629561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
630561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
631561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public int getPort() {
632561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return server.getLocalPort();
633561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
634561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
635561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        @Override
636561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void run() {
637561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while (!closed) {
638561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
639561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    if (doLog) {
640561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        System.out.print(".");
641561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
642561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    if (!handshake_started) {
643561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        endpoint = server.accept();
644561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        endpoint.getInputStream().read();
645561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        handshake_started = true;
646561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
647561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    Thread.sleep(1000);
648561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                } catch (Exception e) {
649561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    e.printStackTrace();
650561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
651561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
652561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (endpoint != null) {
653561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
654561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    endpoint.close();
6558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException e) {
6568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
657561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
658561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
659561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
660561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean handshakeStarted() {
661561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return handshake_started;
662561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
663561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
664561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void close() throws IOException {
665561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            closed = true;
666561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server.close();
667561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
668561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
6698d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    }
6708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
6718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    ;
672561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
673561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
674561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * setUseClientMode(boolean mode) method testing.
675561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getUseClientMode() method testing.
676561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
677561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSetGetUseClientMode() throws Exception {
678561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Server server = null;
679561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = null;
680561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
681561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server = new Server();
682561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
683561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket = createSSLSocket(server.getPort());
684561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
685561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.setUseClientMode(false);
686561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertFalse("Result does not correspond to expected",
687561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    socket.getUseClientMode());
688561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.setUseClientMode(true);
689561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertTrue("Result does not correspond to expected",
690561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    socket.getUseClientMode());
691561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
692561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server.start();
693561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            final SSLSocket s = socket;
694561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new Thread() {
695561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                @Override
696561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                public void run() {
697561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
698561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        s.startHandshake();
699561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    } catch (IOException e) {
700561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        //e.printStackTrace();
701561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
702561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
703561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }.start();
704561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
705561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while (!server.handshakeStarted()) {
706561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // wait for handshake start
707561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
708561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    Thread.sleep(500);
7098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (Exception e) {
7108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
711561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
712561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
713561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
714561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                socket.setUseClientMode(false);
715561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                server.close();
716561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                socket.close();
717561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Expected IllegalArgumentException was not thrown");
7188d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            } catch (IllegalArgumentException e) {
7198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            }
720561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
721561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (server != null) {
722561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
723561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    server.close();
7248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
7258d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
726561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
727561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (socket != null) {
728561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
729561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    socket.close();
7308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
7318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
732561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
733561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
734561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
735561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
736561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
737561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * setNeedClientAuth(boolean need) method testing.
738561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getNeedClientAuth() method testing.
739561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
740561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSetGetNeedClientAuth() throws Exception {
741561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = createSSLSocket();
742561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
743561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        socket.setWantClientAuth(true);
744561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        socket.setNeedClientAuth(false);
745561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Result does not correspond to expected",
746561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                socket.getNeedClientAuth());
747561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Socket did not reset its want client auth state",
748561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                socket.getWantClientAuth());
749561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        socket.setWantClientAuth(true);
750561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        socket.setNeedClientAuth(true);
751561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Result does not correspond to expected",
752561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                socket.getNeedClientAuth());
753561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Socket did not reset its want client auth state",
754561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                socket.getWantClientAuth());
755561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
756561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
757561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
758561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * setWantClientAuth(boolean want) method testing.
759561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getWantClientAuth() method testing.
760561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
761561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSetGetWantClientAuth() throws Exception {
762561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = createSSLSocket();
763561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
764561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        socket.setNeedClientAuth(true);
765561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        socket.setWantClientAuth(false);
766561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Result does not correspond to expected",
767561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                socket.getWantClientAuth());
768561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Socket did not reset its want client auth state",
769561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                socket.getNeedClientAuth());
770561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        socket.setNeedClientAuth(true);
771561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        socket.setWantClientAuth(true);
772561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Result does not correspond to expected",
773561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                socket.getWantClientAuth());
774561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Socket did not reset its want client auth state",
775561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                socket.getNeedClientAuth());
776561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
777561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
778561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
779561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * setEnableSessionCreation(boolean flag) method testing.
780561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getEnableSessionCreation() method testing.
781561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
782561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSetGetEnableSessionCreation() throws Exception {
783561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = createSSLSocket();
784561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
785561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        socket.setEnableSessionCreation(false);
786561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Result does not correspond to expected",
787561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                socket.getEnableSessionCreation());
788561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        socket.setEnableSessionCreation(true);
789561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Result does not correspond to expected",
790561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                socket.getEnableSessionCreation());
791561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
792561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
793561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
794561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getSession() method testing.
795561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
796561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGetSession() throws Exception {
797561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Server server = null;
798561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = null;
799561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
800561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server = new Server();
801561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
802561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket = createSSLSocket(server.getPort());
803561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.setUseClientMode(true);
804561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
805561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server.start();
806561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            final SSLSocket s = socket;
807561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            final SSLSession[] session = new SSLSession[1];
808561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Thread thread = new Thread() {
809561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                @Override
810561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                public void run() {
811561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
812561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        session[0] = s.getSession();
813561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    } catch (Exception e) {
814561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        e.printStackTrace();
815561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
816561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
817561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            };
818561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
819561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            thread.start();
820561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
821561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int timeout = 10; // wait no more than 5 seconds for handshake
822561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while (!server.handshakeStarted()) {
823561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // wait for handshake start
824561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
825561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    Thread.sleep(500);
8268d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (Exception e) {
8278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
828561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                timeout--;
829561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (timeout < 0) {
830561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
831561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        server.close();
8328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
8338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
834561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
835561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        socket.close();
8368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
8378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
838561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    fail("getSession method did not start a handshake");
839561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
840561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
841561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
842561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server.close(); // makes error during the handshake
843561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            thread.join();
844561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if ((session[0] == null) ||
8458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    (!session[0].getCipherSuite()
8468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                            .endsWith("_NULL_WITH_NULL_NULL"))) {
847561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Returned session is null "
8488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        + "or not TLS_NULL_WITH_NULL_NULL");
849561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
850561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
851561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (server != null) {
852561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
853561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    server.close();
8548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
8558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
856561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
857561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (socket != null) {
858561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
859561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    socket.close();
8608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
8618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
862561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
863561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
864561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
865561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
866561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
867561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * addHandshakeCompletedListener( HandshakeCompletedListener listener)
868561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * method testing.
869561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * removeHandshakeCompletedListener( HandshakeCompletedListener listener)
870561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * method testing.
871561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
872561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testAddRemoveHandshakeCompletedListener() throws Exception {
873561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        HandshakeCompletedListener listener =
8748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                new HandshakeCompletedListener() {
8758d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    public void handshakeCompleted(
8768d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                            HandshakeCompletedEvent event) {
8778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
8788d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                };
879561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = createSSLSocket();
880561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        socket.addHandshakeCompletedListener(listener);
881561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
882561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.addHandshakeCompletedListener(null);
883561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Expected IllegalArgumentException was not thrown.");
8848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } catch (IllegalArgumentException e) {
8858d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
886561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
887561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.removeHandshakeCompletedListener(null);
888561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Expected IllegalArgumentException was not thrown.");
8898d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } catch (IllegalArgumentException e) {
8908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
891561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
892561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.removeHandshakeCompletedListener(
893561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    new HandshakeCompletedListener() {
894561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        public void handshakeCompleted(
8958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                                HandshakeCompletedEvent event) {
8968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                        }
897561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    });
898561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Expected IllegalArgumentException was not thrown.");
8998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } catch (IllegalArgumentException e) {
9008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
901561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
902561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.removeHandshakeCompletedListener(listener);
903561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
904561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Unxpected IllegalArgumentException was thrown.");
905561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
906561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
907561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
908561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
909561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * startHandshake() method testing.
910561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
911561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testStartHandshake() throws Exception {
912561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Server server = null;
913561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = null;
914561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
915561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server = new Server();
916561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
917561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket = createSSLSocket(server.getPort());
918561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.setUseClientMode(true);
919561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
920561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server.start();
921561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            final SSLSocket s = socket;
922561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            final Exception[] exception = new Exception[1];
923561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Thread thread = new Thread() {
924561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                @Override
925561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                public void run() {
926561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
927561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        s.startHandshake();
928561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    } catch (Exception e) {
929561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        exception[0] = e;
930561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
931561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
932561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            };
933561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
934561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            thread.start();
935561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
936561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int timeout = 10; // wait no more than 5 seconds for handshake
937561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while (!server.handshakeStarted()) {
938561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // wait for handshake start
939561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
940561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    Thread.sleep(500);
9418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (Exception e) {
9428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
943561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                timeout--;
944561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (timeout < 0) {
945561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    fail("Handshake was not started");
946561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
947561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
948561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
949561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server.close(); // makes error during the handshake
950561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            thread.join();
951561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (exception[0] == null) {
952561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Expected IOException was not thrown");
953561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
954561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
955561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (server != null) {
956561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
957561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    server.close();
9588d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
9598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
960561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
961561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (socket != null) {
962561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
963561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    socket.close();
9648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
9658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
966561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
967561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
968561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
969561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
970561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
971561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getInputStream() method testing.
972561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
973561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGetInputStream() throws Exception {
974561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Server server = null;
975561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = null;
976561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
977561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server = new Server();
978561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
979561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket = createSSLSocket(server.getPort());
980561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.setUseClientMode(true);
981561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
982561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server.start();
983561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            final SSLSocket s = socket;
984561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Thread thread = new Thread() {
985561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                @Override
986561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                public void run() {
987561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
988561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        s.getInputStream().read(); // should start handshake
9898d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (Exception e) {
9908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
991561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
992561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            };
993561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
994561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            thread.start();
995561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
996561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int timeout = 10; // wait no more than 5 seconds for handshake
997561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while (!server.handshakeStarted()) {
998561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // wait for handshake start
999561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
1000561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    Thread.sleep(500);
10018d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (Exception e) {
10028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
1003561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                timeout--;
1004561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (timeout < 0) {
1005561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
1006561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        server.close();
10078d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
10088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
1009561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
1010561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        socket.close();
10118d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
10128d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
1013561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    fail("Handshake was not started");
1014561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
1015561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1016561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
1017561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (server != null) {
1018561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
1019561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    server.close();
10208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
10218d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
1022561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1023561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (socket != null) {
1024561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
1025561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    socket.close();
10268d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
10278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
1028561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1029561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1030561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1031561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1032561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
1033561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getOutputStream() method testing.
1034561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
1035561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGetOutputStream() throws Exception {
1036561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Server server = null;
1037561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = null;
1038561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
1039561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server = new Server();
1040561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1041561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket = createSSLSocket(server.getPort());
1042561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.setUseClientMode(true);
1043561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1044561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server.start();
1045561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            final SSLSocket s = socket;
1046561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Thread thread = new Thread() {
1047561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                @Override
1048561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                public void run() {
1049561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
1050561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        s.getOutputStream().write(0); // should start handshake
10518d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (Exception e) {
10528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
1053561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
1054561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            };
1055561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1056561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            thread.start();
1057561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1058561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int timeout = 10; // wait no more than 5 seconds for handshake
1059561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while (!server.handshakeStarted()) {
1060561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // wait for handshake start
1061561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
1062561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    Thread.sleep(500);
10638d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (Exception e) {
10648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
1065561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                timeout--;
1066561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (timeout < 0) {
1067561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
1068561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        server.close();
10698d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
10708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
1071561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
1072561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        socket.close();
10738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
10748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
1075561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    fail("Handshake was not started");
1076561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
1077561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1078561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
1079561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (server != null) {
1080561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
1081561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    server.close();
10828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
10838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
1084561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1085561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (socket != null) {
1086561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
1087561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    socket.close();
10888d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
10898d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
1090561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1091561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1092561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1093561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1094561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
1095561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * sendUrgentData(int data) method testing.
1096561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
1097561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSendUrgentData() {
1098561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Server server = null;
1099561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = null;
1100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
1101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server = new Server();
1102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket = createSSLSocket(server.getPort());
1103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.sendUrgentData(0);
1105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Expected exception was not thrown");
1106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (Exception e) {
1107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (doLog) {
11088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                System.out.println("Trowed exception: " + e.getMessage());
1109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
1111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (server != null) {
1112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
1113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    server.close();
11148d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
11158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
1116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (socket != null) {
1118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
1119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    socket.close();
11208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
11218d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
1122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
1127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * setOOBInline(boolean on) method testing.
1128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
1129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSetOOBInline() {
1130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Server server = null;
1131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = null;
1132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
1133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server = new Server();
1134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket = createSSLSocket(server.getPort());
1135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.setOOBInline(true);
1137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Expected exception was not thrown");
1138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (Exception e) {
1139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (doLog) {
11408d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                System.out.println("Trowed exception: " + e.getMessage());
1141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
1143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (server != null) {
1144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
1145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    server.close();
11468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
11478d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
1148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (socket != null) {
1150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
1151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    socket.close();
11528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
11538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
1154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
1159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * shutdownOutput() method testing.
1160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
1161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testShutdownOutput() {
1162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Server server = null;
1163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = null;
1164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
1165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server = new Server();
1166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket = createSSLSocket(server.getPort());
1167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.shutdownOutput();
1169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Expected exception was not thrown");
1170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (Exception e) {
1171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (doLog) {
11728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                System.out.println("Trowed exception: " + e.getMessage());
1173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
1175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (server != null) {
1176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
1177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    server.close();
11788d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
11798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
1180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (socket != null) {
1182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
1183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    socket.close();
11848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
11858d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
1186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
1191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * shutdownInput() method testing.
1192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
1193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testShutdownInput() {
1194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Server server = null;
1195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = null;
1196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
1197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            server = new Server();
1198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket = createSSLSocket(server.getPort());
1199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.shutdownInput();
1201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Expected exception was not thrown");
1202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (Exception e) {
1203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (doLog) {
12048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                System.out.println("Trowed exception: " + e.getMessage());
1205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
1207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (server != null) {
1208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
1209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    server.close();
12108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
12118d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
1212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (socket != null) {
1214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
1215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    socket.close();
12168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
12178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
1218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
1223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * toString() method testing.
1224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
1225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testToString() throws Exception {
1226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLSocket socket = createSSLSocket();
1227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull("String representation is null", socket.toString());
1228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static Test suite() {
1231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return new TestSuite(SSLSocketImplTest.class);
1232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
1235