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.Socket;
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.InetSocketAddress;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.net.ssl.SSLServerSocket;
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.Test;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase;
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestSuite;
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * SSLServerSocketImplTest test
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class SSLServerSocketImplTest extends TestCase {
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static boolean doLog = false;
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Sets up the test case.
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @Override
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void setUp() {
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (doLog) {
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            System.out.println("");
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            System.out.println("========================");
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            System.out.println("====== Running the test: " + getName());
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private SSLServerSocket createSSLServerSocket() throws Exception {
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return new SSLServerSocketImpl(JSSETestData.getSSLParameters());
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * SSLServerSocketImpl(SSLParameters sslParameters) method testing.
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSSLServerSocketImpl1() throws Exception {
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Client client = null;
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLServerSocket ssocket = null;
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ssocket = new SSLServerSocketImpl(JSSETestData.getSSLParameters());
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ssocket.bind(null);
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ssocket.setUseClientMode(true);
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            final SSLServerSocket s = ssocket;
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Thread thread = new Thread() {
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                @Override
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                public void run() {
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        s.accept().close();
698d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (Exception e) {
708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            };
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            thread.start();
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            client = new Client(ssocket.getLocalPort());
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            client.start();
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int timeout = 10; // wait no more than 5 seconds for handshake
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while (!client.handshakeStarted()) {
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // wait for handshake start
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    Thread.sleep(500);
848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (Exception e) {
858d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                timeout--;
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (timeout < 0) {
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        client.close();
908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
918d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        ssocket.close();
948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    fail("Handshake was not started");
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (client != null) {
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    client.close();
1038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
1048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (ssocket != null) {
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    ssocket.close();
1098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
1108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * SSLServerSocketImpl(int port, SSLParameters sslParameters) method
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * testing.
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSSLServerSocketImpl2() throws Exception {
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Client client = null;
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLServerSocket ssocket = null;
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ssocket = new SSLServerSocketImpl(0,
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    JSSETestData.getSSLParameters());
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ssocket.setUseClientMode(true);
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            final SSLServerSocket s = ssocket;
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Thread thread = new Thread() {
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                @Override
130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                public void run() {
131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        s.accept().close();
1338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (Exception e) {
1348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            };
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            thread.start();
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            client = new Client(ssocket.getLocalPort());
141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            client.start();
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int timeout = 10; // wait no more than 5 seconds for handshake
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while (!client.handshakeStarted()) {
145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // wait for handshake start
146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    Thread.sleep(500);
1488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (Exception e) {
1498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                timeout--;
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (timeout < 0) {
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        client.close();
1548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
1558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        ssocket.close();
1588d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
1598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    fail("Handshake was not started");
161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (client != null) {
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    client.close();
1678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
1688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (ssocket != null) {
171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    ssocket.close();
1738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
1748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * SSLServerSocketImpl(int port, int backlog,
181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * SSLParameters sslParameters) method testing.
182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSSLServerSocketImpl3() throws Exception {
184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Client client = null;
185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLServerSocket ssocket = null;
186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ssocket = new SSLServerSocketImpl(0, 1,
188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    JSSETestData.getSSLParameters());
189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ssocket.setUseClientMode(true);
190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            final SSLServerSocket s = ssocket;
192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Thread thread = new Thread() {
193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                @Override
194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                public void run() {
195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        s.accept().close();
1978d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (Exception e) {
1988d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            };
201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            thread.start();
203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            client = new Client(ssocket.getLocalPort());
205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            client.start();
206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int timeout = 10; // wait no more than 5 seconds for handshake
208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while (!client.handshakeStarted()) {
209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // wait for handshake start
210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    Thread.sleep(500);
2128d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (Exception e) {
2138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                timeout--;
215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (timeout < 0) {
216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        client.close();
2188d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
2198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        ssocket.close();
2228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
2238d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    fail("Handshake was not started");
225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (client != null) {
229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    client.close();
2318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
2328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (ssocket != null) {
235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    ssocket.close();
2378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
2388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * SSLServerSocketImpl(int port, int backlog, InetAddress iAddress,
245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * SSLParameters sslParameters) method testing.
246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
247561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSSLServerSocketImpl4() throws Exception {
248561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Client client = null;
249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLServerSocket ssocket = null;
250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ssocket = new SSLServerSocketImpl(0, 1, null,
252561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    JSSETestData.getSSLParameters());
253561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ssocket.setUseClientMode(true);
254561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
255561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            final SSLServerSocket s = ssocket;
256561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Thread thread = new Thread() {
257561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                @Override
258561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                public void run() {
259561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
260561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        s.accept().close();
2618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (Exception e) {
2628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
263561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
264561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            };
265561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
266561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            thread.start();
267561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
268561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            client = new Client(ssocket.getLocalPort());
269561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            client.start();
270561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
271561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int timeout = 10; // wait no more than 5 seconds for handshake
272561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while (!client.handshakeStarted()) {
273561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // wait for handshake start
274561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
275561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    Thread.sleep(500);
2768d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (Exception e) {
2778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
278561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                timeout--;
279561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (timeout < 0) {
280561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
281561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        client.close();
2828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
2838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
284561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    try {
285561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        ssocket.close();
2868d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    } catch (IOException ex) {
2878d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    }
288561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    fail("Handshake was not started");
289561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
290561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
291561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
292561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (client != null) {
293561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
294561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    client.close();
2958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
2968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
297561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
298561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (ssocket != null) {
299561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
300561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    ssocket.close();
3018d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException ex) {
3028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
303561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
304561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
305561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
306561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
307561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
308561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getSupportedCipherSuites() method testing.
309561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
310561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGetSupportedCipherSuites() throws Exception {
311561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLServerSocket ssocket = createSSLServerSocket();
312561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] supported = ssocket.getSupportedCipherSuites();
313561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(supported);
314561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        supported[0] = "NOT_SUPPORTED_CIPHER_SUITE";
315561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        supported = ssocket.getEnabledCipherSuites();
3168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < supported.length; i++) {
317561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if ("NOT_SUPPORTED_CIPHER_SUITE".equals(supported[i])) {
318561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Modification of the returned result "
319561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        + "causes the modification of the internal state");
320561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
321561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
322561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
323561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
324561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
325561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getEnabledCipherSuites() method testing.
326561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
327561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGetEnabledCipherSuites() throws Exception {
328561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLServerSocket ssocket = createSSLServerSocket();
329561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] enabled = ssocket.getEnabledCipherSuites();
330561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(enabled);
331561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] supported = ssocket.getSupportedCipherSuites();
3328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < enabled.length; i++) {
333561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //System.out.println("Checking of "+enabled[i]);
3348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            found:
3358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            {
3368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                for (int j = 0; j < supported.length; j++) {
337561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    if (enabled[i].equals(supported[j])) {
338561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        break found;
339561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
340561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
341561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Enabled suite does not belong to the set "
342561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        + "of supported cipher suites: " + enabled[i]);
343561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
344561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
345561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ssocket.setEnabledCipherSuites(supported);
3468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < supported.length; i++) {
347561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            enabled = new String[supported.length - i];
348561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            System.arraycopy(supported, 0,
3498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    enabled, 0, supported.length - i);
350561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ssocket.setEnabledCipherSuites(enabled);
351561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            String[] result = ssocket.getEnabledCipherSuites();
352561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (result.length != enabled.length) {
353561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Returned result does not correspond to expected.");
354561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
3558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            for (int k = 0; k < result.length; k++) {
3568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                found:
3578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                {
3588d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    for (int n = 0; n < enabled.length; n++) {
359561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        if (result[k].equals(enabled[n])) {
360561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            break found;
361561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        }
362561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
363561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    if (result.length != enabled.length) {
364561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        fail("Returned result does not correspond "
365561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                + "to expected.");
366561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
367561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
368561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
369561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
370561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
371561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
372561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
373561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * setEnabledCipherSuites(String[] suites) method testing.
374561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
375561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSetEnabledCipherSuites() throws Exception {
376561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLServerSocket ssocket = createSSLServerSocket();
377561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] enabled = ssocket.getEnabledCipherSuites();
378561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(enabled);
379561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] supported = ssocket.getSupportedCipherSuites();
3808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < enabled.length; i++) {
381561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //System.out.println("Checking of "+enabled[i]);
3828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            found:
3838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            {
3848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                for (int j = 0; j < supported.length; j++) {
385561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    if (enabled[i].equals(supported[j])) {
386561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        break found;
387561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
388561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
389561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Enabled suite does not belong to the set "
390561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        + "of supported cipher suites: " + enabled[i]);
391561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
392561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
393561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ssocket.setEnabledCipherSuites(supported);
394561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ssocket.setEnabledCipherSuites(enabled);
395561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ssocket.setEnabledCipherSuites(supported);
3968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        String[] more_than_supported = new String[supported.length + 1];
3978d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < supported.length + 1; i++) {
398561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            more_than_supported[i]
3998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    = "NOT_SUPPORTED_CIPHER_SUITE";
400561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            System.arraycopy(supported, 0,
401561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    more_than_supported, 0, i);
402561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            System.arraycopy(supported, i,
4038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    more_than_supported, i + 1, supported.length - i);
404561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
405561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ssocket.setEnabledCipherSuites(more_than_supported);
406561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Expected IllegalArgumentException was not thrown");
4078d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            } catch (IllegalArgumentException e) {
4088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            }
409561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
410561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        enabled = ssocket.getEnabledCipherSuites();
411561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        enabled[0] = "NOT_SUPPORTED_CIPHER_SUITE";
412561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        enabled = ssocket.getEnabledCipherSuites();
4138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < enabled.length; i++) {
414561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if ("NOT_SUPPORTED_CIPHER_SUITE".equals(enabled[i])) {
415561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Modification of the returned result "
416561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        + "causes the modification of the internal state");
417561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
418561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
419561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
420561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
421561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
422561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getSupportedProtocols() method testing.
423561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
424561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGetSupportedProtocols() throws Exception {
425561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLServerSocket ssocket = createSSLServerSocket();
426561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] supported = ssocket.getSupportedProtocols();
427561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(supported);
428561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(supported.length == 0);
429561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        supported[0] = "NOT_SUPPORTED_PROTOCOL";
430561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        supported = ssocket.getSupportedProtocols();
4318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < supported.length; i++) {
432561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if ("NOT_SUPPORTED_PROTOCOL".equals(supported[i])) {
433561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Modification of the returned result "
434561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        + "causes the modification of the internal state");
435561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
436561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
437561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
438561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
439561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
440561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getEnabledProtocols() method testing.
441561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
442561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGetEnabledProtocols() throws Exception {
443561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLServerSocket ssocket = createSSLServerSocket();
444561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] enabled = ssocket.getEnabledProtocols();
445561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(enabled);
446561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] supported = ssocket.getSupportedProtocols();
4478d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < enabled.length; i++) {
448561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //System.out.println("Checking of "+enabled[i]);
4498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            found:
4508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            {
4518d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                for (int j = 0; j < supported.length; j++) {
452561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    if (enabled[i].equals(supported[j])) {
453561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        break found;
454561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
455561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
456561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Enabled protocol does not belong to the set "
457561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        + "of supported protocols: " + enabled[i]);
458561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
459561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
460561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ssocket.setEnabledProtocols(supported);
4618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < supported.length; i++) {
462561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            enabled = new String[supported.length - i];
463561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            System.arraycopy(supported, i,
4648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    enabled, 0, supported.length - i);
465561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //System.out.println("");
466561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //for (int k=0; k<supported.length - i; k++) {
467561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //    System.out.println("---- "+enabled[k]);
468561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //}
469561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ssocket.setEnabledProtocols(enabled);
470561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            String[] result = ssocket.getEnabledProtocols();
471561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (result.length != enabled.length) {
472561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Returned result does not correspond to expected.");
473561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
4748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            for (int k = 0; k < result.length; k++) {
4758d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                found:
4768d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                {
4778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    for (int n = 0; n < enabled.length; n++) {
478561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        if (result[k].equals(enabled[n])) {
479561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            break found;
480561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        }
481561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
482561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    if (result.length != enabled.length) {
483561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        fail("Returned result does not correspond "
484561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                + "to expected.");
485561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
486561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
487561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
488561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
489561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
490561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
491561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
492561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * setEnabledProtocols(String[] protocols) method testing.
493561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
494561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSetEnabledProtocols() throws Exception {
495561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLServerSocket ssocket = createSSLServerSocket();
496561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] enabled = ssocket.getEnabledProtocols();
497561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(enabled);
498561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] supported = ssocket.getSupportedProtocols();
4998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < enabled.length; i++) {
500561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //System.out.println("Checking of "+enabled[i]);
5018d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            found:
5028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            {
5038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                for (int j = 0; j < supported.length; j++) {
504561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    if (enabled[i].equals(supported[j])) {
505561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        break found;
506561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
507561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
508561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Enabled suite does not belong to the set "
509561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        + "of supported cipher suites: " + enabled[i]);
510561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
511561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
512561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ssocket.setEnabledProtocols(supported);
513561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ssocket.setEnabledProtocols(enabled);
514561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ssocket.setEnabledProtocols(supported);
5158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        String[] more_than_supported = new String[supported.length + 1];
5168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < supported.length + 1; i++) {
517561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            more_than_supported[i]
5188d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    = "NOT_SUPPORTED_PROTOCOL";
519561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            System.arraycopy(supported, 0,
520561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    more_than_supported, 0, i);
521561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            System.arraycopy(supported, i,
5228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    more_than_supported, i + 1, supported.length - i);
523561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
524561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ssocket.setEnabledProtocols(more_than_supported);
525561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Expected IllegalArgumentException was not thrown");
5268d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            } catch (IllegalArgumentException e) {
5278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            }
528561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
529561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        enabled = ssocket.getEnabledProtocols();
530561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        enabled[0] = "NOT_SUPPORTED_PROTOCOL";
531561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        enabled = ssocket.getEnabledProtocols();
5328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < enabled.length; i++) {
533561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if ("NOT_SUPPORTED_PROTOCOL".equals(enabled[i])) {
534561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Modification of the returned result "
535561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        + "causes the modification of the internal state");
536561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
537561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
538561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
539561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
540561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
541561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * setUseClientMode(boolean mode) method testing.
542561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getUseClientMode() method testing.
543561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
544561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSetGetUseClientMode() throws Exception {
545561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLServerSocket ssocket = createSSLServerSocket();
546561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
547561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ssocket.setUseClientMode(false);
548561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Result does not correspond to expected",
549561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ssocket.getUseClientMode());
550561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ssocket.setUseClientMode(true);
551561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Result does not correspond to expected",
552561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ssocket.getUseClientMode());
553561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
554561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
555561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
556561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * setNeedClientAuth(boolean need) method testing.
557561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getNeedClientAuth() method testing.
558561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
559561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSetGetNeedClientAuth() throws Exception {
560561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLServerSocket ssocket = createSSLServerSocket();
561561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
562561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ssocket.setWantClientAuth(true);
563561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ssocket.setNeedClientAuth(false);
564561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Result does not correspond to expected",
565561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ssocket.getNeedClientAuth());
566561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Socket did not reset its want client auth state",
567561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ssocket.getWantClientAuth());
568561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ssocket.setWantClientAuth(true);
569561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ssocket.setNeedClientAuth(true);
570561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Result does not correspond to expected",
571561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ssocket.getNeedClientAuth());
572561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Socket did not reset its want client auth state",
573561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ssocket.getWantClientAuth());
574561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
575561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
576561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
577561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * setWantClientAuth(boolean want) method testing.
578561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getWantClientAuth() method testing.
579561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
580561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSetGetWantClientAuth() throws Exception {
581561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLServerSocket ssocket = createSSLServerSocket();
582561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
583561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ssocket.setNeedClientAuth(true);
584561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ssocket.setWantClientAuth(false);
585561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Result does not correspond to expected",
586561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ssocket.getWantClientAuth());
587561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Socket did not reset its want client auth state",
588561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ssocket.getNeedClientAuth());
589561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ssocket.setNeedClientAuth(true);
590561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ssocket.setWantClientAuth(true);
591561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Result does not correspond to expected",
592561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ssocket.getWantClientAuth());
593561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Socket did not reset its want client auth state",
594561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ssocket.getNeedClientAuth());
595561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
596561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
597561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
598561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * setEnableSessionCreation(boolean flag) method testing.
599561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getEnableSessionCreation() method testing.
600561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
601561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSetGetEnableSessionCreation() throws Exception {
602561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLServerSocket ssocket = createSSLServerSocket();
603561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
604561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ssocket.setEnableSessionCreation(false);
605561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Result does not correspond to expected",
606561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ssocket.getEnableSessionCreation());
607561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ssocket.setEnableSessionCreation(true);
608561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Result does not correspond to expected",
609561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ssocket.getEnableSessionCreation());
610561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
611561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
612561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
613561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * toString() method testing.
614561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
615561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testToString() throws Exception {
616561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SSLServerSocket ssocket = createSSLServerSocket();
617561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull("String representation is null", ssocket.toString());
618561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
619561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
620561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static class Client extends Thread {
621561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
622561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private boolean closed;
623561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private boolean handshake_started = false;
624561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private Socket client = null;
625561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private int port;
626561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
627561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Client(int port) throws IOException {
628561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super();
629561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            this.port = port;
630561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            client = new Socket();
631561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            client.setSoTimeout(10000);
632561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
633561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
634561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public int getPort() {
635561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return client.getLocalPort();
636561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
637561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
638561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        @Override
639561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void run() {
640561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while (!closed) {
641561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
642561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    if (doLog) {
643561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        System.out.print(".");
644561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
645561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    if (!handshake_started) {
646561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        client.connect(
647561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                new InetSocketAddress("localhost", port));
648561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        client.getInputStream().read();
649561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        handshake_started = true;
650561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    }
651561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    Thread.sleep(1000);
652561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                } catch (Exception e) {
653561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    e.printStackTrace();
654561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
655561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
656561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (client != null) {
657561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
658561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    client.close();
6598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                } catch (IOException e) {
6608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                }
661561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
662561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //System.out.println("===== client has been stopped");
663561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
664561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
665561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean handshakeStarted() {
666561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return handshake_started;
667561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
668561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
669561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void close() throws IOException {
670561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            closed = true;
671561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            client.close();
672561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
673561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
6748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    }
6758d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
6768d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    ;
677561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
678561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static Test suite() {
679561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return new TestSuite(SSLServerSocketImplTest.class);
680561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
681561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
682561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
683