1cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath/*
2cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  Licensed to the Apache Software Foundation (ASF) under one or more
3cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  contributor license agreements.  See the NOTICE file distributed with
4cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  this work for additional information regarding copyright ownership.
5cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  The ASF licenses this file to You under the Apache License, Version 2.0
6cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  (the "License"); you may not use this file except in compliance with
7cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  the License.  You may obtain a copy of the License at
8cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *
9cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *     http://www.apache.org/licenses/LICENSE-2.0
10cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *
11cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  Unless required by applicable law or agreed to in writing, software
12cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  distributed under the License is distributed on an "AS IS" BASIS,
13cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  See the License for the specific language governing permissions and
15cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  limitations under the License.
16cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath */
17cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
18ab762bb740405d0fefcccf4a0899a234f995be13Narayan Kamathpackage org.apache.harmony.tests.java.net;
19cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
2036dc5b6f52d6b1dcf2e8d4380bed3929e86875f3Yi Kongimport libcore.io.Libcore;
2127604018f783bf6354a13870b3e7785edca69b5fPaul Duffinimport libcore.junit.junit3.TestCaseWithRules;
2227604018f783bf6354a13870b3e7785edca69b5fPaul Duffinimport libcore.junit.util.ResourceLeakageDetector;
2327604018f783bf6354a13870b3e7785edca69b5fPaul Duffinimport org.junit.Rule;
2427604018f783bf6354a13870b3e7785edca69b5fPaul Duffinimport org.junit.rules.TestRule;
2536dc5b6f52d6b1dcf2e8d4380bed3929e86875f3Yi Kong
26cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport tests.support.Support_Configuration;
27cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.IOException;
28cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.InputStream;
29cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.InterruptedIOException;
30cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.OutputStream;
31cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.net.BindException;
32cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.net.ConnectException;
33cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.net.InetAddress;
34cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.net.InetSocketAddress;
35cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.net.ServerSocket;
36cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.net.Socket;
37cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.net.SocketAddress;
38cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.net.SocketException;
39cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.net.SocketImpl;
40cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.net.SocketImplFactory;
41cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.net.UnknownHostException;
4265f1e0b7a1683d8e1e16b5c1f7a445cb8ceaea69Przemyslaw Szczepaniakimport java.lang.reflect.Field;
43cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.Date;
44cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.Locale;
45cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.Properties;
46cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
4736dc5b6f52d6b1dcf2e8d4380bed3929e86875f3Yi Kongimport static android.system.OsConstants.F_GETFL;
4836dc5b6f52d6b1dcf2e8d4380bed3929e86875f3Yi Kongimport static android.system.OsConstants.O_NONBLOCK;
4936dc5b6f52d6b1dcf2e8d4380bed3929e86875f3Yi Kong
5027604018f783bf6354a13870b3e7785edca69b5fPaul Duffinpublic class ServerSocketTest extends TestCaseWithRules {
5127604018f783bf6354a13870b3e7785edca69b5fPaul Duffin    @Rule
5227604018f783bf6354a13870b3e7785edca69b5fPaul Duffin    public TestRule guardRule = ResourceLeakageDetector.getRule();
53cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
54cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    boolean interrupted;
55cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
56cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    ServerSocket s;
57cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
58cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    Socket sconn;
59cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
60cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    Thread t;
61cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
62cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    static class SSClient implements Runnable {
63cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Socket cs;
64cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
65cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        int port;
66cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
67cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public SSClient(int prt) {
68cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            port = prt;
69cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
70cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
71cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public void run() {
72cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            try {
73cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                // Go to sleep so the server can setup and wait for connection
74cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                Thread.sleep(1000);
75cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                cs = new Socket(InetAddress.getLocalHost().getHostName(), port);
76cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                // Sleep again to allow server side processing. Thread is
77cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                // stopped by server.
78cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                Thread.sleep(10000);
79cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (InterruptedException e) {
80cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                return;
81cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (Throwable e) {
82cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                System.out
83cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        .println("Error establishing client: " + e.toString());
84cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } finally {
85cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                try {
86cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    if (cs != null)
87cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        cs.close();
88cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                } catch (Exception e) {
89cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
90cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
91cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
92cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
93cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
94cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
95cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.net.ServerSocket#ServerSocket()
96cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
97cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_Constructor() {
98cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method java.net.ServerSocket(int)
99cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Used during tests", true);
100cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
101cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
102cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
103cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.net.ServerSocket#ServerSocket(int)
104cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
105cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_ConstructorI() {
106cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test for method java.net.ServerSocket(int)
107cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Used during tests", true);
108cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
109cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
110cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
111cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.net.ServerSocket#ServerSocket(int)
112cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
113cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_ConstructorI_SocksSet() throws IOException {
114cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Harmony-623 regression test
115cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ServerSocket ss = null;
116cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Properties props = (Properties) System.getProperties().clone();
117cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
118cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            System.setProperty("socksProxyHost", "127.0.0.1");
119cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            System.setProperty("socksProxyPort", "12345");
120cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            ss = new ServerSocket(0);
121cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } finally {
122cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            System.setProperties(props);
123cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            if (null != ss) {
124cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                ss.close();
125cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
126cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
127cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
128cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
129cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
130cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.net.ServerSocket#ServerSocket(int, int)
131cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
132cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_ConstructorII() throws IOException {
133cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
134cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            s = new ServerSocket(0, 10);
135cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            s.setSoTimeout(2000);
136cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            startClient(s.getLocalPort());
137cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            sconn = s.accept();
138cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedIOException e) {
139cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return;
140cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
141cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
142cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ServerSocket s1 = new ServerSocket(0);
143cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
144cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            try {
145cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                ServerSocket s2 = new ServerSocket(s1.getLocalPort());
146cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                s2.close();
147cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                fail("Was able to create two serversockets on same port");
148cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (BindException e) {
149cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                // Expected
150cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
151cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } finally {
152cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            s1.close();
153cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
154cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
155cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        s1 = new ServerSocket(0);
156cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        int allocatedPort = s1.getLocalPort();
157cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        s1.close();
158cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        s1 = new ServerSocket(allocatedPort);
159cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        s1.close();
160cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
161cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
162cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
163cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.net.ServerSocket#ServerSocket(int, int, java.net.InetAddress)
164cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
165cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_ConstructorIILjava_net_InetAddress()
166cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            throws UnknownHostException, IOException {
167cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        s = new ServerSocket(0, 10, InetAddress.getLocalHost());
168cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
169cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            s.setSoTimeout(5000);
170cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            startClient(s.getLocalPort());
171cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            sconn = s.accept();
172cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertNotNull("Was unable to accept connection", sconn);
173cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            sconn.close();
174cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } finally {
175cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            s.close();
176cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
177cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
178cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
179cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
180cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.net.ServerSocket#accept()
181cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
18236dc5b6f52d6b1dcf2e8d4380bed3929e86875f3Yi Kong    public void test_accept() throws Exception {
183cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        s = new ServerSocket(0);
184cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
185cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            s.setSoTimeout(5000);
186cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            startClient(s.getLocalPort());
187cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            sconn = s.accept();
18836dc5b6f52d6b1dcf2e8d4380bed3929e86875f3Yi Kong
18936dc5b6f52d6b1dcf2e8d4380bed3929e86875f3Yi Kong            // The new socket should not be blocking.
19036dc5b6f52d6b1dcf2e8d4380bed3929e86875f3Yi Kong            assertEquals(0, Libcore.os.fcntlVoid(sconn.getFileDescriptor$(), F_GETFL) & O_NONBLOCK);
19136dc5b6f52d6b1dcf2e8d4380bed3929e86875f3Yi Kong
192cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            int localPort1 = s.getLocalPort();
193cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            int localPort2 = sconn.getLocalPort();
194cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            sconn.close();
195cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertEquals("Bad local port value", localPort1, localPort2);
196cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } finally {
197cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            s.close();
198cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
199cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
200cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
201cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            interrupted = false;
202cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            final ServerSocket ss = new ServerSocket(0);
203cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            ss.setSoTimeout(12000);
204cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            Runnable runnable = new Runnable() {
205cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                public void run() {
206cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    try {
207cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        ss.accept();
208cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    } catch (InterruptedIOException e) {
209cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        interrupted = true;
210cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    } catch (IOException e) {
211cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    }
212cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
213cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            };
214cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            Thread thread = new Thread(runnable, "ServerSocket.accept");
215cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            thread.start();
216cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            try {
217cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                do {
218cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    Thread.sleep(500);
219cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                } while (!thread.isAlive());
220cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (InterruptedException e) {
221cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
222cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            ss.close();
223cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            int c = 0;
224cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            do {
225cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                try {
226cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    Thread.sleep(500);
227cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                } catch (InterruptedException e) {
228cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
229cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                if (interrupted) {
230cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    fail("accept interrupted");
231cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
232cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                if (++c > 4) {
233cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    fail("accept call did not exit");
234cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
235cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } while (thread.isAlive());
236cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
237cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            interrupted = false;
238cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            ServerSocket ss2 = new ServerSocket(0);
239cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            ss2.setSoTimeout(500);
240cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            Date start = new Date();
241cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            try {
242cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                ss2.accept();
243cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (InterruptedIOException e) {
244cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                interrupted = true;
245cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
246cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertTrue("accept not interrupted", interrupted);
247cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            Date finish = new Date();
248cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            int delay = (int) (finish.getTime() - start.getTime());
249cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertTrue("timeout too soon: " + delay + " " + start.getTime()
250cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    + " " + finish.getTime(), delay >= 490);
251cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            ss2.close();
252cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (IOException e) {
253cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("Unexpected IOException : " + e.getMessage());
254cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
255cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
256cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
257cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
258cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.net.ServerSocket#close()
259cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
260cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_close() throws IOException {
261cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
262cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            s = new ServerSocket(0);
263cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            try {
264cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                s.close();
265cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                s.accept();
266cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                fail("Close test failed");
267cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (SocketException e) {
268cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                // expected;
269cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
270cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } finally {
271cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            s.close();
272cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
273cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
274cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
275cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
276cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.net.ServerSocket#getInetAddress()
277cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
278cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getInetAddress() throws IOException {
279cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        InetAddress addr = InetAddress.getLocalHost();
280cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        s = new ServerSocket(0, 10, addr);
281cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
282cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertEquals("Returned incorrect InetAdrees", addr, s
283cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    .getInetAddress());
284cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } finally {
285cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            s.close();
286cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
287cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
288cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
289cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
290cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.net.ServerSocket#getLocalPort()
291cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
292cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getLocalPort() throws IOException {
293cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Try a specific port number, but don't complain if we don't get it
294cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        int portNumber = 63024; // I made this up
295cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
296cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            try {
297cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                s = new ServerSocket(portNumber);
298cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            } catch (BindException e) {
299cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                // we could not get the port, give up
300cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                return;
301cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
302cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertEquals("Returned incorrect port", portNumber, s
303cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    .getLocalPort());
304cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } finally {
305cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            s.close();
306cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
307cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
308cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
309cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
310cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.net.ServerSocket#getSoTimeout()
311cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
312cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getSoTimeout() throws IOException {
313cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        s = new ServerSocket(0);
314969e52ff2fa0125d2f493df0511b292cb8c4107dNeil Fuller        final int timeoutSet = 100;
315cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
316969e52ff2fa0125d2f493df0511b292cb8c4107dNeil Fuller            s.setSoTimeout(timeoutSet);
317969e52ff2fa0125d2f493df0511b292cb8c4107dNeil Fuller            int actualTimeout = s.getSoTimeout();
318969e52ff2fa0125d2f493df0511b292cb8c4107dNeil Fuller            // The kernel can round the requested value based on the HZ setting. We allow up to 10ms.
319969e52ff2fa0125d2f493df0511b292cb8c4107dNeil Fuller            assertTrue("Returned incorrect sotimeout", Math.abs(timeoutSet - actualTimeout) <= 10);
320cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } finally {
321cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            s.close();
322cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
323cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
324cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
325cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
326cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.net.ServerSocket#setSocketFactory(java.net.SocketImplFactory)
327cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
328cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_setSocketFactoryLjava_net_SocketImplFactory()
32965f1e0b7a1683d8e1e16b5c1f7a445cb8ceaea69Przemyslaw Szczepaniak            throws Exception {
330cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        SocketImplFactory factory = new MockSocketImplFactory();
331cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Should not throw SocketException when set DatagramSocketImplFactory
332cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // for the first time.
333cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ServerSocket.setSocketFactory(factory);
334cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
335cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
33665f1e0b7a1683d8e1e16b5c1f7a445cb8ceaea69Przemyslaw Szczepaniak            try {
33765f1e0b7a1683d8e1e16b5c1f7a445cb8ceaea69Przemyslaw Szczepaniak                ServerSocket.setSocketFactory(null);
33865f1e0b7a1683d8e1e16b5c1f7a445cb8ceaea69Przemyslaw Szczepaniak                fail("Should throw SocketException");
33965f1e0b7a1683d8e1e16b5c1f7a445cb8ceaea69Przemyslaw Szczepaniak            } catch (SocketException e) {
34065f1e0b7a1683d8e1e16b5c1f7a445cb8ceaea69Przemyslaw Szczepaniak                // Expected
34165f1e0b7a1683d8e1e16b5c1f7a445cb8ceaea69Przemyslaw Szczepaniak            }
342cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
34365f1e0b7a1683d8e1e16b5c1f7a445cb8ceaea69Przemyslaw Szczepaniak            try {
34465f1e0b7a1683d8e1e16b5c1f7a445cb8ceaea69Przemyslaw Szczepaniak                ServerSocket.setSocketFactory(factory);
34565f1e0b7a1683d8e1e16b5c1f7a445cb8ceaea69Przemyslaw Szczepaniak                fail("Should throw SocketException");
34665f1e0b7a1683d8e1e16b5c1f7a445cb8ceaea69Przemyslaw Szczepaniak            } catch (SocketException e) {
34765f1e0b7a1683d8e1e16b5c1f7a445cb8ceaea69Przemyslaw Szczepaniak                // Expected
34865f1e0b7a1683d8e1e16b5c1f7a445cb8ceaea69Przemyslaw Szczepaniak            }
34965f1e0b7a1683d8e1e16b5c1f7a445cb8ceaea69Przemyslaw Szczepaniak        } finally {
35065f1e0b7a1683d8e1e16b5c1f7a445cb8ceaea69Przemyslaw Szczepaniak            // Clean-up after the test by setting the factory to null.
35165f1e0b7a1683d8e1e16b5c1f7a445cb8ceaea69Przemyslaw Szczepaniak            // We have to use reflection because #setSocketFactory can be called only once.
35265f1e0b7a1683d8e1e16b5c1f7a445cb8ceaea69Przemyslaw Szczepaniak            Field field = ServerSocket.class.getDeclaredField("factory");
35365f1e0b7a1683d8e1e16b5c1f7a445cb8ceaea69Przemyslaw Szczepaniak            field.setAccessible(true);
35465f1e0b7a1683d8e1e16b5c1f7a445cb8ceaea69Przemyslaw Szczepaniak            field.set(null, null);
355cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
356cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
357cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
358cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private static class MockSocketImplFactory implements SocketImplFactory {
359cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public SocketImpl createSocketImpl() {
36065f1e0b7a1683d8e1e16b5c1f7a445cb8ceaea69Przemyslaw Szczepaniak            return new MockSocketImpl();
361cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
362cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
363cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
364cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
365cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.net.ServerSocket#setSoTimeout(int)
366cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
367cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_setSoTimeoutI() throws IOException {
368cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Timeout should trigger and throw InterruptedIOException
369969e52ff2fa0125d2f493df0511b292cb8c4107dNeil Fuller        final int timeoutSet = 100;
370cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
371cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            s = new ServerSocket(0);
372969e52ff2fa0125d2f493df0511b292cb8c4107dNeil Fuller            s.setSoTimeout(timeoutSet);
373cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            s.accept();
374cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedIOException e) {
375969e52ff2fa0125d2f493df0511b292cb8c4107dNeil Fuller            int actualSoTimeout = s.getSoTimeout();
376969e52ff2fa0125d2f493df0511b292cb8c4107dNeil Fuller            // The kernel can round the requested value based on the HZ setting. We allow up to 10ms.
377969e52ff2fa0125d2f493df0511b292cb8c4107dNeil Fuller            assertTrue("Set incorrect sotimeout", Math.abs(timeoutSet - actualSoTimeout) <= 10);
378cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return;
379cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
380cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
381cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Timeout should not trigger in this case
382cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        s = new ServerSocket(0);
383cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        startClient(s.getLocalPort());
384cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        s.setSoTimeout(10000);
385cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        sconn = s.accept();
386cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
387cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
388cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
389cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.net.ServerSocket#toString()
390cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
391cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_toString() throws Exception {
392cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        s = new ServerSocket(0);
393cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
394cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            int portNumber = s.getLocalPort();
395933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // In IPv6, the all-zeros-address is written as "::"
39630a12fedf2b586779e268818d9b2d520787a018bNarayan Kamath            assertEquals("ServerSocket[addr=::/::,localport="
397cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    + portNumber + "]", s.toString());
398cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } finally {
399cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            s.close();
400cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
401cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
402cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
403cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
404cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.net.ServerSocket#bind(java.net.SocketAddress)
405cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
406cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_bindLjava_net_SocketAddress() throws IOException {
407cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        class mySocketAddress extends SocketAddress {
408cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            public mySocketAddress() {
409cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
410cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
411cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // create servers socket, bind it and then validate basic state
412cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ServerSocket theSocket = new ServerSocket();
413cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        InetSocketAddress theAddress = new InetSocketAddress(InetAddress
414cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .getLocalHost(), 0);
415cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.bind(theAddress);
416cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        int portNumber = theSocket.getLocalPort();
417cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue(
418cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                "Returned incorrect InetSocketAddress(2):"
419cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        + theSocket.getLocalSocketAddress().toString()
420cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        + "Expected: "
421cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        + (new InetSocketAddress(InetAddress.getLocalHost(),
422cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        portNumber)).toString(), theSocket
423cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .getLocalSocketAddress().equals(
424cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        new InetSocketAddress(InetAddress
425cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                                .getLocalHost(), portNumber)));
426cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Server socket not bound when it should be:", theSocket
427cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .isBound());
428cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
429cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // now make sure that it is actually bound and listening on the
430cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // address we provided
431cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Socket clientSocket = new Socket();
432cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        InetSocketAddress clAddress = new InetSocketAddress(InetAddress
433cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .getLocalHost(), portNumber);
434cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        clientSocket.connect(clAddress);
435cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Socket servSock = theSocket.accept();
436cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
437cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(clAddress, clientSocket.getRemoteSocketAddress());
438cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.close();
439cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        servSock.close();
440cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        clientSocket.close();
441cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
442cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // validate we can specify null for the address in the bind and all
443cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // goes ok
444cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket = new ServerSocket();
445cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.bind(null);
446cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.close();
447cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
448cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Address that we have already bound to
449cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket = new ServerSocket();
450cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ServerSocket theSocket2 = new ServerSocket();
451cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
452cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            theAddress = new InetSocketAddress(InetAddress.getLocalHost(), 0);
453cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            theSocket.bind(theAddress);
454cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            SocketAddress localAddress = theSocket.getLocalSocketAddress();
455cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            theSocket2.bind(localAddress);
456cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("No exception binding to address that is not available");
457cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (IOException ex) {
458cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
459cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.close();
460cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket2.close();
461cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
462cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // validate we get io address when we try to bind to address we
463cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // cannot bind to
464cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket = new ServerSocket();
465cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
466cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            theSocket.bind(new InetSocketAddress(InetAddress
467cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    .getByAddress(Support_Configuration.nonLocalAddressBytes),
468cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    0));
469cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("No exception was thrown when binding to bad address");
470cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (IOException ex) {
471cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
472cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.close();
473cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
474cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // now validate case where we pass in an unsupported subclass of
475cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // SocketAddress
476cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket = new ServerSocket();
477cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
478cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            theSocket.bind(new mySocketAddress());
479cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("No exception when binding using unsupported SocketAddress subclass");
480cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (IllegalArgumentException ex) {
481cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
482cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.close();
483cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
484cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
485cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
486cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.net.ServerSocket#bind(java.net.SocketAddress, int)
487cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
488cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_bindLjava_net_SocketAddressI() throws IOException {
489cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        class mySocketAddress extends SocketAddress {
490cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
491cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            public mySocketAddress() {
492cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
493cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
494cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
495cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // create servers socket, bind it and then validate basic state
496cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ServerSocket theSocket = new ServerSocket();
497cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        InetSocketAddress theAddress = new InetSocketAddress(InetAddress
498cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .getLocalHost(), 0);
499cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.bind(theAddress, 5);
500cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        int portNumber = theSocket.getLocalPort();
501cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue(
502cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                "Returned incorrect InetSocketAddress(2):"
503cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        + theSocket.getLocalSocketAddress().toString()
504cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        + "Expected: "
505cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        + (new InetSocketAddress(InetAddress.getLocalHost(),
506cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        portNumber)).toString(), theSocket
507cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .getLocalSocketAddress().equals(
508cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        new InetSocketAddress(InetAddress
509cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                                .getLocalHost(), portNumber)));
510cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Server socket not bound when it should be:", theSocket
511cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .isBound());
512cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
513cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // now make sure that it is actually bound and listening on the
514cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // address we provided
515cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        SocketAddress localAddress = theSocket.getLocalSocketAddress();
516cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Socket clientSocket = new Socket();
517cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        clientSocket.connect(localAddress);
518cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Socket servSock = theSocket.accept();
519cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
520cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue(clientSocket.getRemoteSocketAddress().equals(localAddress));
521cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.close();
522cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        servSock.close();
523cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        clientSocket.close();
524cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
525cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // validate we can specify null for the address in the bind and all
526cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // goes ok
527cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket = new ServerSocket();
528cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.bind(null, 5);
529cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.close();
530cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
531cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Address that we have already bound to
532cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket = new ServerSocket();
533cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ServerSocket theSocket2 = new ServerSocket();
534cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
535cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            theAddress = new InetSocketAddress(InetAddress.getLocalHost(), 0);
536cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            theSocket.bind(theAddress, 5);
537cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            SocketAddress inuseAddress = theSocket.getLocalSocketAddress();
538cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            theSocket2.bind(inuseAddress, 5);
539cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("No exception binding to address that is not available");
540cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (IOException ex) {
541cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // expected
542cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
543cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.close();
544cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket2.close();
545cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
546cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // validate we get ioException when we try to bind to address we
547cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // cannot bind to
548cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket = new ServerSocket();
549cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
550cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            theSocket.bind(new InetSocketAddress(InetAddress
551cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    .getByAddress(Support_Configuration.nonLocalAddressBytes),
552cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    0), 5);
553cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("No exception was thrown when binding to bad address");
554cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (IOException ex) {
555cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
556cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.close();
557cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
558cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // now validate case where we pass in an unsupported subclass of
559cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // SocketAddress
560cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket = new ServerSocket();
561cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
562cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            theSocket.bind(new mySocketAddress(), 5);
563cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("Binding using unsupported SocketAddress subclass should have thrown exception");
564cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (IllegalArgumentException ex) {
565cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
566cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.close();
567cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
568cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // now validate that backlog is respected. We have to do a test that
569cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // checks if it is a least a certain number as some platforms make
570cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // it higher than we request. Unfortunately non-server versions of
571cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // windows artificially limit the backlog to 5 and 5 is the
572cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // historical default so it is not a great test.
573cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket = new ServerSocket();
574cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theAddress = new InetSocketAddress(InetAddress.getLocalHost(), 0);
575cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.bind(theAddress, 4);
576cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        localAddress = theSocket.getLocalSocketAddress();
577cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Socket theSockets[] = new Socket[4];
578cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        int i = 0;
579cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
580cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            for (i = 0; i < 4; i++) {
581cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                theSockets[i] = new Socket();
582cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                theSockets[i].connect(localAddress);
583cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
584cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (ConnectException ex) {
585cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("Backlog does not seem to be respected in bind:" + i + ":"
586cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    + ex.toString());
587cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
588cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
589cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        for (i = 0; i < 4; i++) {
590cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            theSockets[i].close();
591cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
592cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
593cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.close();
594cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        servSock.close();
595cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
596cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
597cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
598cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.net.ServerSocket#getLocalSocketAddress()
599cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
600cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getLocalSocketAddress() throws Exception {
601cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // set up server connect and then validate that we get the right
602cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // response for the local address
603cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ServerSocket theSocket = new ServerSocket(0, 5, InetAddress
604cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .getLocalHost());
605cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        int portNumber = theSocket.getLocalPort();
606cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Returned incorrect InetSocketAddress(1):"
607cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                + theSocket.getLocalSocketAddress().toString()
608cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                + "Expected: "
609cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                + (new InetSocketAddress(InetAddress.getLocalHost(),
610cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                portNumber)).toString(), theSocket
611cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .getLocalSocketAddress().equals(
612cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        new InetSocketAddress(InetAddress.getLocalHost(),
613cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                                portNumber)));
614cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.close();
615cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
616cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // now create a socket that is not bound and validate we get the
617cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // right answer
618cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket = new ServerSocket();
619cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertNull(
620cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                "Returned incorrect InetSocketAddress -unbound socket- Expected null",
621cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                theSocket.getLocalSocketAddress());
622cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
623cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // now bind the socket and make sure we get the right answer
624cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket
625cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .bind(new InetSocketAddress(InetAddress.getLocalHost(), 0));
626cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        int localPort = theSocket.getLocalPort();
627cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("Returned incorrect InetSocketAddress(2):", theSocket
628cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .getLocalSocketAddress(), new InetSocketAddress(InetAddress
629cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .getLocalHost(), localPort));
630cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.close();
631cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
632cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
633cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
634cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.net.ServerSocket#isBound()
635cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
636cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_isBound() throws IOException {
637cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        InetAddress addr = InetAddress.getLocalHost();
638cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ServerSocket serverSocket = new ServerSocket();
639cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertFalse("Socket indicated bound when it should be (1)",
640cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                serverSocket.isBound());
641cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
642cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // now bind and validate bound ok
643cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket.bind(new InetSocketAddress(addr, 0));
644cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Socket indicated  not bound when it should be (1)",
645cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                serverSocket.isBound());
646cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket.close();
647cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
648cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // now do with some of the other constructors
649cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket = new ServerSocket(0);
650cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Socket indicated  not bound when it should be (2)",
651cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                serverSocket.isBound());
652cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket.close();
653cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
654cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket = new ServerSocket(0, 5, addr);
655cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Socket indicated  not bound when it should be (3)",
656cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                serverSocket.isBound());
657cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket.close();
658cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
659cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket = new ServerSocket(0, 5);
660cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Socket indicated  not bound when it should be (4)",
661cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                serverSocket.isBound());
662cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket.close();
663cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
664cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
665cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
666cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.net.ServerSocket#isClosed()
667cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
668cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_isClosed() throws IOException {
669cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        InetAddress addr = InetAddress.getLocalHost();
670cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ServerSocket serverSocket = new ServerSocket(0, 5, addr);
671cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
672cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // validate isClosed returns expected values
673cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertFalse("Socket should indicate it is not closed(1):", serverSocket
674cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .isClosed());
675cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket.close();
676cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Socket should indicate it is closed(1):", serverSocket
677cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .isClosed());
678cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
679cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // now do with some of the other constructors
680cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket = new ServerSocket(0);
681cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertFalse("Socket should indicate it is not closed(1):", serverSocket
682cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .isClosed());
683cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket.close();
684cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Socket should indicate it is closed(1):", serverSocket
685cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .isClosed());
686cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
687cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket = new ServerSocket(0, 5, addr);
688cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertFalse("Socket should indicate it is not closed(1):", serverSocket
689cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .isClosed());
690cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket.close();
691cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Socket should indicate it is closed(1):", serverSocket
692cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .isClosed());
693cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
694cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket = new ServerSocket(0, 5);
695cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertFalse("Socket should indicate it is not closed(1):", serverSocket
696cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .isClosed());
697cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket.close();
698cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Socket should indicate it is closed(1):", serverSocket
699cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .isClosed());
700cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
701cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
702cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /*
703cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * Regression HARMONY-6090
704cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
705cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_defaultValueReuseAddress() throws Exception {
706cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        String platform = System.getProperty("os.name").toLowerCase(Locale.US);
707cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        if (!platform.startsWith("windows")) {
708cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // on Unix
70927604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            assertReuseAddressAndCloseSocket(new ServerSocket());
71027604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            assertReuseAddressAndCloseSocket(new ServerSocket(0));
71127604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            assertReuseAddressAndCloseSocket(new ServerSocket(0, 50));
71227604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            assertReuseAddressAndCloseSocket(new ServerSocket(0, 50, InetAddress.getLocalHost()));
713cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } else {
714cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // on Windows
71527604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            assertReuseAddressAndCloseSocket(new ServerSocket());
71627604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            assertReuseAddressAndCloseSocket(new ServerSocket(0));
71727604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            assertReuseAddressAndCloseSocket(new ServerSocket(0, 50));
71827604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            assertReuseAddressAndCloseSocket(new ServerSocket(0, 50, InetAddress.getLocalHost()));
719cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
720cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
721cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
72227604018f783bf6354a13870b3e7785edca69b5fPaul Duffin    private void assertReuseAddressAndCloseSocket(ServerSocket socket) throws IOException {
72327604018f783bf6354a13870b3e7785edca69b5fPaul Duffin        boolean reuseAddress = socket.getReuseAddress();
72427604018f783bf6354a13870b3e7785edca69b5fPaul Duffin        socket.close();
72527604018f783bf6354a13870b3e7785edca69b5fPaul Duffin        assertTrue(reuseAddress);
72627604018f783bf6354a13870b3e7785edca69b5fPaul Duffin    }
72727604018f783bf6354a13870b3e7785edca69b5fPaul Duffin
728cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_setReuseAddressZ() throws Exception {
729cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // set up server and connect
730cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        InetSocketAddress anyAddress = new InetSocketAddress(InetAddress.getLocalHost(), 0);
731cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ServerSocket serverSocket = new ServerSocket();
732cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket.setReuseAddress(false);
733cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket.bind(anyAddress);
734cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        SocketAddress theAddress = serverSocket.getLocalSocketAddress();
735cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
736cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // make a connection to the server, then close the server
737cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Socket theSocket = new Socket();
738cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.connect(theAddress);
739cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Socket stillActiveSocket = serverSocket.accept();
740cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket.close();
741cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
742cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // now try to rebind the server which should fail with
74327604018f783bf6354a13870b3e7785edca69b5fPaul Duffin        // setReuseAddress to false.
74427604018f783bf6354a13870b3e7785edca69b5fPaul Duffin        try (ServerSocket failingServerSocket = new ServerSocket()) {
74527604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            failingServerSocket.setReuseAddress(false);
74627604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            try {
74727604018f783bf6354a13870b3e7785edca69b5fPaul Duffin                failingServerSocket.bind(theAddress);
74827604018f783bf6354a13870b3e7785edca69b5fPaul Duffin                fail("No exception when setReuseAddress is false and we bind:" + theAddress
74927604018f783bf6354a13870b3e7785edca69b5fPaul Duffin                        .toString());
75027604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            } catch (IOException expected) {
75127604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            }
752cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
753cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        stillActiveSocket.close();
754cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.close();
755cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
756cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // now test case were we set it to true
757cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        anyAddress = new InetSocketAddress(InetAddress.getLocalHost(), 0);
758cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket = new ServerSocket();
759cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket.setReuseAddress(true);
760cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket.bind(anyAddress);
761cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theAddress = serverSocket.getLocalSocketAddress();
762cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
763cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // make a connection to the server, then close the server
764cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket = new Socket();
765cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.connect(theAddress);
766cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        stillActiveSocket = serverSocket.accept();
767cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket.close();
768cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
769cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // now try to rebind the server which should pass with
770cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // setReuseAddress to true
77127604018f783bf6354a13870b3e7785edca69b5fPaul Duffin        try (ServerSocket rebindServerSocket = new ServerSocket()) {
77227604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            rebindServerSocket.setReuseAddress(true);
77327604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            try {
77427604018f783bf6354a13870b3e7785edca69b5fPaul Duffin                rebindServerSocket.bind(theAddress);
77527604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            } catch (IOException ex) {
77627604018f783bf6354a13870b3e7785edca69b5fPaul Duffin                fail("Unexpected exception when setReuseAddress is true and we bind:"
77727604018f783bf6354a13870b3e7785edca69b5fPaul Duffin                        + theAddress.toString() + ":" + ex.toString());
77827604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            }
779cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
780cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        stillActiveSocket.close();
781cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.close();
782cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
783cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // now test default case were we expect this to work regardless of
784cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // the value set
785cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        anyAddress = new InetSocketAddress(InetAddress.getLocalHost(), 0);
786cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket = new ServerSocket();
787cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket.bind(anyAddress);
788cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theAddress = serverSocket.getLocalSocketAddress();
789cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
790cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // make a connection to the server, then close the server
791cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket = new Socket();
792cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.connect(theAddress);
793cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        stillActiveSocket = serverSocket.accept();
794cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        serverSocket.close();
795cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
796cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // now try to rebind the server which should pass
79727604018f783bf6354a13870b3e7785edca69b5fPaul Duffin        try (ServerSocket rebindServerSocket = new ServerSocket()) {
79827604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            try {
79927604018f783bf6354a13870b3e7785edca69b5fPaul Duffin                rebindServerSocket.bind(theAddress);
80027604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            } catch (IOException ex) {
80127604018f783bf6354a13870b3e7785edca69b5fPaul Duffin                fail("Unexpected exception when setReuseAddress is the default case and we bind:"
80227604018f783bf6354a13870b3e7785edca69b5fPaul Duffin                        + theAddress.toString() + ":" + ex.toString());
80327604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            }
804cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
805cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        stillActiveSocket.close();
806cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.close();
807cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
808cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
809cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getReuseAddress() throws Exception {
81027604018f783bf6354a13870b3e7785edca69b5fPaul Duffin        try (ServerSocket theSocket = new ServerSocket()) {
81127604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            theSocket.setReuseAddress(true);
81227604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            assertTrue("getReuseAddress false when it should be true", theSocket.getReuseAddress());
81327604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            theSocket.setReuseAddress(false);
81427604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            assertFalse("getReuseAddress true when it should be false",
81527604018f783bf6354a13870b3e7785edca69b5fPaul Duffin                    theSocket.getReuseAddress());
81627604018f783bf6354a13870b3e7785edca69b5fPaul Duffin        }
817cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
818cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
819cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_setReceiveBufferSizeI() throws Exception {
820cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // now validate case where we try to set to 0
821cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ServerSocket theSocket = new ServerSocket();
822cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
823cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            theSocket.setReceiveBufferSize(0);
824cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("No exception when receive buffer size set to 0");
825cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (IllegalArgumentException ex) {
826cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
827cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.close();
828cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
829cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // now validate case where we try to set to a negative value
830cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket = new ServerSocket();
831cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
832cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            theSocket.setReceiveBufferSize(-1000);
833cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("No exception when receive buffer size set to -1000");
834cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (IllegalArgumentException ex) {
835cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
836cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.close();
837cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
838cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // now just try to set a good value to make sure it is set and there
839cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // are not exceptions
840cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket = new ServerSocket();
841cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.setReceiveBufferSize(1000);
842cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.close();
843cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
844cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
845cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getReceiveBufferSize() throws Exception {
84627604018f783bf6354a13870b3e7785edca69b5fPaul Duffin        try (ServerSocket theSocket = new ServerSocket()) {
847cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
84827604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            // since the value returned is not necessary what we set we are
84927604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            // limited in what we can test
85027604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            // just validate that it is not 0 or negative
85127604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            assertFalse("get Buffer size returns 0:", 0 == theSocket.getReceiveBufferSize());
85227604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            assertFalse("get Buffer size returns  a negative value:",
85327604018f783bf6354a13870b3e7785edca69b5fPaul Duffin                    0 > theSocket.getReceiveBufferSize());
85427604018f783bf6354a13870b3e7785edca69b5fPaul Duffin        }
855cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
856cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
857cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getChannel() throws Exception {
858cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertNull(new ServerSocket().getChannel());
859cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
860cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
861cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_setPerformancePreference_Int_Int_Int() throws Exception {
862cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ServerSocket theSocket = new ServerSocket();
863cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        theSocket.setPerformancePreferences(1, 1, 1);
864cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
865cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
866cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
867cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * Sets up the fixture, for example, open a network connection. This method
868cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * is called before a test is executed.
869cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
870cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    protected void setUp() {
871cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
872cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
873cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
874cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * Tears down the fixture, for example, close a network connection. This
875cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * method is called after a test is executed.
876cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
877cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    protected void tearDown() {
878cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
879cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
880cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            if (s != null)
881cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                s.close();
882cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            if (sconn != null)
883cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                sconn.close();
884cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            if (t != null)
885cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                t.interrupt();
886cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (Exception e) {
887cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
888cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
889cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
890cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
891cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * Sets up the fixture, for example, open a network connection. This method
892cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * is called before a test is executed.
893cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
894cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    protected void startClient(int port) {
895cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        t = new Thread(new SSClient(port), "SSClient");
896cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        t.start();
897cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
898cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            Thread.sleep(1000);
899cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (InterruptedException e) {
900cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            System.out.println("Exception during startClinet()" + e.toString());
901cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
902cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
903cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
904cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
905cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.net.ServerSocket#implAccept
906cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
907cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_implAcceptLjava_net_Socket() throws Exception {
908cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // regression test for Harmony-1235
90927604018f783bf6354a13870b3e7785edca69b5fPaul Duffin        try (MockServerSocket mockServerSocket = new MockServerSocket()) {
91027604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            try {
91127604018f783bf6354a13870b3e7785edca69b5fPaul Duffin                mockServerSocket.mockImplAccept(new MockSocket(new MockSocketImpl()));
91227604018f783bf6354a13870b3e7785edca69b5fPaul Duffin                fail("Expected SocketException");
91327604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            } catch (SocketException e) {
91427604018f783bf6354a13870b3e7785edca69b5fPaul Duffin                // expected
91527604018f783bf6354a13870b3e7785edca69b5fPaul Duffin            }
916cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
917cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
918cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
919cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    static class MockSocketImpl extends SocketImpl {
920cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        protected void create(boolean arg0) throws IOException {
921cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // empty
922cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
923cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
924cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        protected void connect(String arg0, int arg1) throws IOException {
925cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // empty
926cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
927cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
928cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        protected void connect(InetAddress arg0, int arg1) throws IOException {
929cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // empty
930cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
931cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
932cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        protected void connect(SocketAddress arg0, int arg1) throws IOException {
933cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // empty
934cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
935cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
936cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        protected void bind(InetAddress arg0, int arg1) throws IOException {
937cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // empty
938cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
939cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
940cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        protected void listen(int arg0) throws IOException {
941cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // empty
942cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
943cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
944cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        protected void accept(SocketImpl arg0) throws IOException {
945cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // empty
946cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
947cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
948cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        protected InputStream getInputStream() throws IOException {
949cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return null;
950cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
951cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
952cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        protected OutputStream getOutputStream() throws IOException {
953cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return null;
954cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
955cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
956cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        protected int available() throws IOException {
957cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return 0;
958cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
959cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
960cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        protected void close() throws IOException {
961cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // empty
962cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
963cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
964cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        protected void sendUrgentData(int arg0) throws IOException {
965cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // empty
966cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
967cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
968cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public void setOption(int arg0, Object arg1) throws SocketException {
969cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // empty
970cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
971cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
972cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public Object getOption(int arg0) throws SocketException {
973cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return null;
974cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
975cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
976cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
977cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    static class MockSocket extends Socket {
978cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public MockSocket(SocketImpl impl) throws SocketException {
979cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            super(impl);
980cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
981cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
982cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
983cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    static class MockServerSocket extends ServerSocket {
984cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public MockServerSocket() throws Exception {
985cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            super();
986cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
987cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
988cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public void mockImplAccept(Socket s) throws Exception {
989cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            super.implAccept(s);
990cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
991cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
992cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath}
993