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.luni.tests.java.net;
19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.IOException;
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.InputStream;
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.OutputStream;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.ConnectException;
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.Inet4Address;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.Inet6Address;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.InetAddress;
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.InetSocketAddress;
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.Proxy;
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.ServerSocket;
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.Socket;
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.SocketAddress;
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.SocketException;
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.SocketImpl;
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.SocketImplFactory;
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.SocketTimeoutException;
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.UnknownHostException;
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.Permission;
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Arrays;
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Locale;
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport tests.support.Support_Configuration;
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
435a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughespublic class SocketTest extends junit.framework.TestCase {
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private class ClientThread implements Runnable {
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void run() {
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Socket socket = new Socket();
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                InetSocketAddress addr = new InetSocketAddress(host, port);
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                socket.connect(addr);
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                socket.close();
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (IOException e) {
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throw new RuntimeException(e);
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private class ServerThread implements Runnable {
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private static final int FIRST_TIME = 1;
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private static final int SECOND_TIME = 2;
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private int backlog = 10;
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean ready = false;
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private int serverSocketConstructor = 0;
69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void run() {
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ServerSocket socket = null;
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                switch (serverSocketConstructor) {
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                case FIRST_TIME:
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    socket = new ServerSocket(port, backlog,
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            new InetSocketAddress(host, port).getAddress());
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    port = socket.getLocalPort();
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    break;
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                case SECOND_TIME:
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    socket = new ServerSocket(port, backlog);
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    host = socket.getInetAddress().getHostName();
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    port = socket.getLocalPort();
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    break;
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                default:
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    socket = new ServerSocket();
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    break;
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                synchronized (this) {
91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    ready = true;
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    this.notifyAll();
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                socket.setSoTimeout(5000);
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Socket client = socket.accept();
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                client.close();
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                socket.close();
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (IOException e) {
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                e.printStackTrace();
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (Throwable e) {
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                e.printStackTrace();
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public synchronized void waitCreated() throws Exception {
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            while (!ready) {
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                this.wait();
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    boolean interrupted;
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    String host = "localhost";
116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    int port;
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    Thread t;
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private void connectTestImpl(int ssConsType) throws Exception {
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerThread server = new ServerThread();
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.serverSocketConstructor = ssConsType;
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Thread serverThread = new Thread(server);
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serverThread.start();
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.waitCreated();
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ClientThread client = new ClientThread();
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Thread clientThread = new Thread(client);
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        clientThread.start();
130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            serverThread.join();
132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            clientThread.join();
133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (InterruptedException e) {
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            e.printStackTrace();
135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void tearDown() {
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (t != null) {
141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                t.interrupt();
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (Exception e) {
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        this.t = null;
146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        this.interrupted = false;
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#bind(java.net.SocketAddress)
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_bindLjava_net_SocketAddress() throws IOException {
153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        @SuppressWarnings("serial")
155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        class UnsupportedSocketAddress extends SocketAddress {
156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public UnsupportedSocketAddress() {
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Address we cannot bind to
161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket theSocket = new Socket();
162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        InetSocketAddress bogusAddress = new InetSocketAddress(InetAddress
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getByAddress(Support_Configuration.nonLocalAddressBytes), 42);
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            theSocket.bind(bogusAddress);
166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No exception when binding to bad address");
167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IOException ex) {
168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket.close();
171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Now create a socket that is not bound and then bind it
173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket = new Socket();
174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket.bind(new InetSocketAddress(InetAddress.getLocalHost(), 0));
175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int portNumber = theSocket.getLocalPort();
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Validate that the localSocketAddress reflects the address we
178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // bound to
179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Local address not correct after bind",
180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                new InetSocketAddress(InetAddress.getLocalHost(), portNumber),
181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                theSocket.getLocalSocketAddress());
182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Make sure we can now connect and that connections appear to come
184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // from the address we bound to.
185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        InetSocketAddress theAddress = new InetSocketAddress(InetAddress
186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalHost(), 0);
187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket();
188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.bind(theAddress);
189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int sport = server.getLocalPort();
190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        InetSocketAddress boundAddress = new InetSocketAddress(InetAddress
191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalHost(), sport);
192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket.connect(boundAddress);
194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket worker = server.accept();
195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(
196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                "Returned Remote address from server connected to does not match expected local address",
197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                new InetSocketAddress(InetAddress.getLocalHost(), portNumber),
198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                worker.getRemoteSocketAddress());
199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket.close();
200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.close();
201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Validate if we pass in null that it picks an address for us and
204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // all is ok
205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket = new Socket();
206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket.bind(null);
207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull("Bind with null did not work", theSocket
208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalSocketAddress());
209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket.close();
210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // now check the error conditions
212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Address that we have already bound to
214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket = new Socket();
215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theAddress = new InetSocketAddress(InetAddress.getLocalHost(), 0);
216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket.bind(theAddress);
217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket theSocket2 = new Socket();
219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            theSocket2.bind(theSocket.getLocalSocketAddress());
221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No exception binding to address that is not available");
222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IOException ex) {
223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket.close();
226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket2.close();
227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Unsupported SocketAddress subclass
229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket = new Socket();
230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            theSocket.bind(new UnsupportedSocketAddress());
232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No exception when binding using unsupported SocketAddress subclass");
233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException ex) {
234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket.close();
237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
238561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#bind(java.net.SocketAddress)
241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_bindLjava_net_SocketAddress_Proxy() throws IOException {
243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // The Proxy will not impact on the bind operation. It can be assigned
244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // with any address.
245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(
246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                "127.0.0.1", 0));
247561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket socket = new Socket(proxy);
248561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        InetAddress address = InetAddress.getByName("localhost");
250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        socket.bind(new InetSocketAddress(address, 0));
251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
252561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(address, socket.getLocalAddress());
253561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(0 != socket.getLocalPort());
254561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
255561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        socket.close();
256561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
257561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
258561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_close() throws IOException {
259561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
2605a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
261561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
2625a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.setSoLinger(false, 100);
263561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
264561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
265561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
266561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            client.getOutputStream();
267561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Failed to close socket");
2685a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        } catch (IOException expected) {
269561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
270561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
271561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
272561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
273561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
274561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_connect_unknownhost() throws Exception {
275561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket socket = new Socket();
276561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
277561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            socket.connect(new InetSocketAddress("unknownhost.invalid", 12345));
278249c40b94b9f5c8944a44be8e30aa01a90f1cf48Elliott Hughes            fail();
279249c40b94b9f5c8944a44be8e30aa01a90f1cf48Elliott Hughes        } catch (UnknownHostException expected) {
280561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
281561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
282561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
283561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_connect_unresolved() throws IOException {
284561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket socket = new Socket();
285249c40b94b9f5c8944a44be8e30aa01a90f1cf48Elliott Hughes        InetSocketAddress unresolved = InetSocketAddress.createUnresolved("www.apache.org", 80);
286561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
287249c40b94b9f5c8944a44be8e30aa01a90f1cf48Elliott Hughes            socket.connect(unresolved);
288249c40b94b9f5c8944a44be8e30aa01a90f1cf48Elliott Hughes            fail();
289249c40b94b9f5c8944a44be8e30aa01a90f1cf48Elliott Hughes        } catch (UnknownHostException expected) {
290561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
291561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
292249c40b94b9f5c8944a44be8e30aa01a90f1cf48Elliott Hughes            socket.connect(unresolved, 123);
293249c40b94b9f5c8944a44be8e30aa01a90f1cf48Elliott Hughes            fail();
294249c40b94b9f5c8944a44be8e30aa01a90f1cf48Elliott Hughes        } catch (UnknownHostException expected) {
295561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
296561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
297561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
298561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_connectLjava_net_SocketAddress() throws Exception {
299561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
300561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        @SuppressWarnings("serial")
301561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        class UnsupportedSocketAddress extends SocketAddress {
302561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public UnsupportedSocketAddress() {
303561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
304561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
305561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
306561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket theSocket = new Socket();
307561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
308561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            theSocket.connect(null);
309561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No exception for null arg");
310561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
311561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
312561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
313561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
314561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
315561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            theSocket.connect(new UnsupportedSocketAddress());
316561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No exception for invalid socket address");
317561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
318561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
319561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
320561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
321561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
322561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            theSocket.connect(new InetSocketAddress(InetAddress
323561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    .getByAddress(new byte[] { 0, 0, 0, 0 }), 42));
324561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No exception with non-connectable address");
325561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ConnectException e) {
326561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
327561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
328561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
329561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // now validate that we get a connect exception if we try to connect to
330561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // an address on which nobody is listening
331561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket = new Socket();
332561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
333561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            theSocket.connect(new InetSocketAddress(InetAddress.getLocalHost(),
334561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    0));
335561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No exception when connecting to address nobody listening on");
336561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ConnectException e) {
337561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
338561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
339561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
340561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Now validate that we can actually connect when somebody is listening
341561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
342561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        InetSocketAddress boundAddress = new InetSocketAddress(InetAddress
343561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalHost(), server.getLocalPort());
344561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket();
345561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.connect(boundAddress);
346561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
347561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // validate that when a socket is connected that it answers
348561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // correctly to related queries
349561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Wrong connected status", client.isConnected());
350561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Wrong closed status", client.isClosed());
351561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Wrong bound status", client.isBound());
352561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Wrong input shutdown status", client.isInputShutdown());
353561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Wrong output shutdown status", client.isOutputShutdown());
354561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Local port was 0", client.getLocalPort() != 0);
355561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
356561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
357561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
358561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
359561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Now validate that we get the right exception if we connect when we
360561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // are already connected
361561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server = new ServerSocket(0);
362561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        boundAddress = new InetSocketAddress(InetAddress.getLocalHost(), server
363561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalPort());
364561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client = new Socket();
365561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.connect(boundAddress);
366561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
367561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
368561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            client.connect(boundAddress);
369561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No exception when we try to connect on a connected socket: ");
370561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (SocketException e) {
371561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
372561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
373561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
374561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
375561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
376561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
377561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
378561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Regression for Harmony-2503
379561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
380561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_connectLjava_net_SocketAddress_AnyAddress()
381561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws Exception {
382561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        connectTestImpl(ServerThread.FIRST_TIME);
383561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        connectTestImpl(ServerThread.SECOND_TIME);
384561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
385561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
386561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
387561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#connect(java.net.SocketAddress, int)
388561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
389561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_connectLjava_net_SocketAddressI() throws Exception {
390561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
391561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        @SuppressWarnings("serial")
392561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        class UnsupportedSocketAddress extends SocketAddress {
393561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public UnsupportedSocketAddress() {
394561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
395561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
396561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
397561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Start by validating the error checks
398561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket theSocket = new Socket();
399561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
400561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            theSocket.connect(new InetSocketAddress(0), -100);
401561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No exception for negative timeout");
402561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
403561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
404561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
405561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
406561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
407561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            theSocket.connect(null, 0);
408561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No exception for null address");
409561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
410561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
411561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
412561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
413561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
414561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            theSocket.connect(new UnsupportedSocketAddress(), 1000);
415561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No exception for invalid socket address type");
416561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
417561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
418561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
419561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
420561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SocketAddress nonConnectableAddress = new InetSocketAddress(InetAddress
421561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getByAddress(new byte[] { 0, 0, 0, 0 }), 0);
422561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
423561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            theSocket.connect(nonConnectableAddress, 1000);
424561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No exception when non Connectable Address passed in: ");
425561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (SocketException e) {
426561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
427561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
428561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
429561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Now validate that we get a connect exception if we try to connect to
430561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // an address on which nobody is listening
431561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket = new Socket();
432561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
433561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            theSocket.connect(new InetSocketAddress(InetAddress.getLocalHost(),
434561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    0), 0);
435561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No exception when connecting to address nobody listening on");
436561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ConnectException e) {
437561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
438561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
439561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket.close();
440561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
441561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Now validate that we can actually connect when somebody is listening
442561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
443561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        InetSocketAddress boundAddress = new InetSocketAddress(InetAddress
444561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalHost(), server.getLocalPort());
445561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket();
446561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.connect(boundAddress, 0);
447561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
448561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Validate that when a socket is connected that it answers
449561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // correctly to related queries
450561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Wrong connected status", client.isConnected());
451561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Wrong closed status", client.isClosed());
452561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Wrong bound status", client.isBound());
453561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Wrong input shutdown status", client.isInputShutdown());
454561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Wrong output shutdown status", client.isOutputShutdown());
455561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Local port was 0", client.getLocalPort() != 0);
456561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
457561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
458561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
459561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
460561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Now validate that we get a connect exception if we try to connect to
461561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // an address on which nobody is listening
462561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket = new Socket();
463561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SocketAddress nonListeningAddress = new InetSocketAddress(InetAddress
464561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalHost(), 42);
465561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
466561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            theSocket.connect(nonListeningAddress, 1000);
467561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No exception when connecting to address nobody listening on");
468561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ConnectException e) {
469561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
470561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (SocketTimeoutException e) {
471561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // The other possibility is that the system timed us out.
472561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
473561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket.close();
474561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
475561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Now validate that we get the right exception if we connect when we
476561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // are already connected
477561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server = new ServerSocket(0);
478561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        boundAddress = new InetSocketAddress(InetAddress.getLocalHost(), server
479561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalPort());
480561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client = new Socket();
481561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.connect(boundAddress, 10000);
482561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
483561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
484561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            client.connect(boundAddress, 10000);
485561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No exception when we try to connect on a connected socket: ");
486561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (SocketException e) {
487561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
488561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
489561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
490561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
491561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
492561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
493561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
494561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#Socket()
495561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
496561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_Constructor() {
497561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // create the socket and then validate some basic state
498561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket s = new Socket();
499561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("new socket should not be connected", s.isConnected());
500561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("new socket should not be bound", s.isBound());
501561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("new socket should not be closed", s.isClosed());
502561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("new socket should not be in InputShutdown", s
503561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .isInputShutdown());
504561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("new socket should not be in OutputShutdown", s
505561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .isOutputShutdown());
506561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
507561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
508561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
509561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#Socket(java.lang.String, int)
510561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
511561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_ConstructorLjava_lang_StringI() throws IOException {
512561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
513561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server
514561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalPort());
515561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
516561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Failed to create socket", server.getLocalPort(), client
517561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getPort());
518561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
519561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Regression for HARMONY-946
520561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket ss = new ServerSocket(0);
521561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket s = new Socket("0.0.0.0", ss.getLocalPort());
522561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ss.close();
523561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        s.close();
524561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
525561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
526561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
527561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#Socket(java.lang.String, int,
528561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *        java.net.InetAddress, int)
529561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
530561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_ConstructorLjava_lang_StringILjava_net_InetAddressI()
531561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws IOException {
532561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
533561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
534561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int serverPort = server.getLocalPort();
535561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost().getHostName(),
536561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                serverPort, InetAddress.getLocalHost(), 0);
537561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Failed to create socket", client.getPort() == serverPort);
538561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
539561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
540561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket theSocket = null;
541561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
542561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            theSocket = new Socket("127.0.0.1", serverPort, InetAddress
543561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    .getLocalHost(), 0);
544561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IOException e) {
545561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // check here if InetAddress.getLocalHost() is returning the
546561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // loopback address, if so that is likely the cause of the failure
547561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertFalse(
548561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    "Misconfiguration - local host is the loopback address",
549561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    InetAddress.getLocalHost().isLoopbackAddress());
550561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throw e;
551561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
552561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
553561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(theSocket.isConnected());
554561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
555561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
556561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new Socket("127.0.0.1", serverPort, theSocket.getLocalAddress(),
557561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    theSocket.getLocalPort());
558561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Was able to create two sockets on same port");
559561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IOException e) {
560561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
561561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
562561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
563561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket.close();
564561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
565561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
566561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
567561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @SuppressWarnings("deprecation")
568561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_ConstructorLjava_lang_StringIZ() throws IOException {
569561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
570561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int serverPort = server.getLocalPort();
571561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost().getHostAddress(),
572561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                serverPort, true);
573561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
574561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Failed to create socket", serverPort, client.getPort());
575561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
576561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
577561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client = new Socket(InetAddress.getLocalHost().getHostName(),
578561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                serverPort, false);
579561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
580561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
581561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
582561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
583561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
584561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#Socket(java.net.InetAddress, int)
585561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
586561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_ConstructorLjava_net_InetAddressI() throws IOException {
587561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
588561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server
589561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalPort());
590561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
591561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Failed to create socket", server.getLocalPort(), client
592561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getPort());
593561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
594561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
595561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
596561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
597561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
598561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
599561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#Socket(java.net.InetAddress, int,
600561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     *        java.net.InetAddress, int)
601561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
602561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_ConstructorLjava_net_InetAddressILjava_net_InetAddressI()
603561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws IOException {
604561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
605561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server
606561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalPort(), InetAddress.getLocalHost(), 0);
607561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotSame("Failed to create socket", 0, client.getLocalPort());
608561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
609561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
610561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
611561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#Socket(java.net.InetAddress, int, boolean)
612561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
613561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @SuppressWarnings("deprecation")
614561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_ConstructorLjava_net_InetAddressIZ() throws IOException {
615561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
616561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int serverPort = server.getLocalPort();
617561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
618561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), serverPort, true);
619561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Failed to create socket", serverPort, client.getPort());
620561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
621561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client = new Socket(InetAddress.getLocalHost(), serverPort, false);
622561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
623561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
624561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
625561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
626561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#Socket(Proxy)
627561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
628561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_ConstructorLjava_net_Proxy_Exception() {
629561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
630561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SocketAddress addr1 = InetSocketAddress.createUnresolved("127.0.0.1",
631561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                80);
632561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SocketAddress addr2 = new InetSocketAddress("localhost", 80);
633561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
634561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Proxy proxy1 = new Proxy(Proxy.Type.HTTP, addr1);
635561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // IllegalArgumentException test
636561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
637561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new Socket(proxy1);
638561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw IllegalArgumentException");
639561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
640561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
641561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
642561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
643561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Proxy proxy2 = new Proxy(Proxy.Type.SOCKS, addr1);
644561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // should not throw any exception
645561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        new Socket(proxy2);
646561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        new Socket(Proxy.NO_PROXY);
647561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
648561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
649561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
650561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#getChannel()
651561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
652561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getChannel() {
653561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNull(new Socket().getChannel());
654561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
655561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
656561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
657561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#getInetAddress()
658561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
659561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getInetAddress() throws IOException {
660561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
661561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server
662561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalPort());
663561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
664561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Returned incorrect InetAdrees", client.getInetAddress()
665561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .equals(InetAddress.getLocalHost()));
666561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
667561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
668561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
669561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
670561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
671561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
672561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#getInputStream()
673561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
674561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getInputStream() throws IOException {
675561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Simple fetch test
676561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
677561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server
678561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalPort());
679561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        InputStream is = client.getInputStream();
680561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull("Failed to get stream", is);
681561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        is.close();
682561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
683561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
684561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
685561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
686561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private boolean isUnix() {
687561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String osName = System.getProperty("os.name");
688561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
689561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // only comparing ASCII, so assume english locale
690561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        osName = (osName == null ? null : osName.toLowerCase(Locale.ENGLISH));
691561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
692561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (osName != null && osName.startsWith("windows")) { //$NON-NLS-1$
693561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return false;
694561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
695561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return true;
696561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
697561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
6985a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes    public void test_getKeepAlive() throws Exception {
6995a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        ServerSocket server = new ServerSocket(0);
7005a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort(), null, 0);
7015a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes
7025a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.setKeepAlive(true);
7035a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        assertTrue("getKeepAlive false when it should be true", client.getKeepAlive());
7045a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes
7055a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.setKeepAlive(false);
7065a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        assertFalse("getKeepAlive true when it should be False", client.getKeepAlive());
707561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
708561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
709561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getLocalAddress() throws IOException {
710561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
7115a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
712561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
713561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Returned incorrect InetAddress", client.getLocalAddress()
714561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .equals(InetAddress.getLocalHost()));
715561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
716561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client = new Socket();
717561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.bind(new InetSocketAddress(InetAddress.getByName("0.0.0.0"), 0));
718249c40b94b9f5c8944a44be8e30aa01a90f1cf48Elliott Hughes        assertTrue(client.getLocalAddress().isAnyLocalAddress());
719561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
720561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
721561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
722561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
723561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
724561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
725561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#getLocalPort()
726561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
727561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getLocalPort() throws IOException {
728561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
729561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server
730561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalPort());
731561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
732561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotSame("Returned incorrect port", 0, client.getLocalPort());
733561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
734561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
735561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
736561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
737561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
738561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getLocalSocketAddress() throws IOException {
739561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // set up server connect and then validate that we get the right
740561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // response for the local address
741561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
742561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server
743561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalPort());
744561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int clientPort = client.getLocalPort();
745561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
746561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Returned incorrect InetSocketAddress(1):",
747561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                new InetSocketAddress(InetAddress.getLocalHost(), clientPort),
748561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                client.getLocalSocketAddress());
749561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
750561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
751561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
752561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // now create a socket that is not bound and validate we get the
753561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // right answer
754561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client = new Socket();
755561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNull(
756561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                "Returned incorrect InetSocketAddress -unbound socket- Expected null",
757561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                client.getLocalSocketAddress());
758561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
759561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // now bind the socket and make sure we get the right answer
760561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.bind(new InetSocketAddress(InetAddress.getLocalHost(), 0));
761561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        clientPort = client.getLocalPort();
762561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Returned incorrect InetSocketAddress(2):",
763561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                new InetSocketAddress(InetAddress.getLocalHost(), clientPort),
764561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                client.getLocalSocketAddress());
765561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
766561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
767561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // now validate the behaviour when the any address is returned
768561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client = new Socket();
769561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.bind(new InetSocketAddress(InetAddress.getByName("0.0.0.0"), 0));
770249c40b94b9f5c8944a44be8e30aa01a90f1cf48Elliott Hughes        assertTrue(((InetSocketAddress) client.getLocalSocketAddress()).getAddress().isAnyLocalAddress());
771561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
772561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
773561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // now validate the same for getLocalAddress
774561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client = new Socket();
775561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.bind(new InetSocketAddress(InetAddress.getByName("0.0.0.0"), 0));
776249c40b94b9f5c8944a44be8e30aa01a90f1cf48Elliott Hughes        assertTrue(client.getLocalAddress().isAnyLocalAddress());
777561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
778561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
779561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
7805a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes    public void test_getOOBInline() throws Exception {
7815a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        Socket theSocket = new Socket();
782561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
7835a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        theSocket.setOOBInline(true);
7845a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        assertTrue("expected OOBIline to be true", theSocket.getOOBInline());
785561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
7865a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        theSocket.setOOBInline(false);
7875a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        assertFalse("expected OOBIline to be false", theSocket.getOOBInline());
788561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
7895a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        theSocket.setOOBInline(false);
7905a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        assertFalse("expected OOBIline to be false", theSocket.getOOBInline());
791561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
792561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
793561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
794561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#getOutputStream()
795561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
796561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @SuppressWarnings("deprecation")
797561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getOutputStream() throws IOException {
798561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Simple fetch test
799561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
800561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server
801561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalPort());
802561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        OutputStream os = client.getOutputStream();
803561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull("Failed to get stream", os);
804561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        os.close();
805561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
806561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
807561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
808561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Simple read/write test over the IO streams
809561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        final ServerSocket sinkServer = new ServerSocket(0);
810561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Runnable runnable = new Runnable() {
811561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public void run() {
812561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
813561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    Socket worker = sinkServer.accept();
814561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    sinkServer.close();
815561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    InputStream in = worker.getInputStream();
816561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    in.read();
817561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    in.close();
818561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    worker.close();
819561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                } catch (IOException e) {
820561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    fail();
821561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
822561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
823561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        };
824561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Thread thread = new Thread(runnable, "Socket.getOutputStream");
825561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        thread.start();
826561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
827561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket pingClient = new Socket(InetAddress.getLocalHost(), sinkServer
828561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalPort());
829561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
830561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Busy wait until the client is connected.
831561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int c = 0;
832561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        while (!pingClient.isConnected()) {
833561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
834561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Thread.sleep(200);
835561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (InterruptedException e) {
836561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
837561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (++c > 4) {
838561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("thread is not alive");
839561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
840561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
841561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
842561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Write some data to the server
843561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        OutputStream out = pingClient.getOutputStream();
844561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.write(new byte[256]);
845561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
846561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Wait for the server to finish
847561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Thread.yield();
848561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        c = 0;
849561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        while (thread.isAlive()) {
850561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
851561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Thread.sleep(200);
852561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (InterruptedException e) {
853561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
854561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (++c > 4) {
855561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("read call did not exit");
856561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
857561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
858561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
859561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Subsequent writes should throw an exception
860561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
861561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // The output buffer may remain valid until the close completes
862561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            for (int i = 0; i < 400; i++) {
863561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                out.write(new byte[256]);
864561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
865561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("write to closed socket did not cause exception");
866561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IOException e) {
867561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
868561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
869561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
870561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.close();
871561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        pingClient.close();
872561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        sinkServer.close();
873561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
874561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Regression test for HARMONY-873
875561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket ss2 = new ServerSocket(0);
876561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket s = new Socket("127.0.0.1", ss2.getLocalPort());
877561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ss2.accept();
878561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        s.shutdownOutput();
879561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
880561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            s.getOutputStream();
881561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw SocketException");
882561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (SocketException e) {
883561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
884561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
885561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
886561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
887561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getPort() throws IOException {
888561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
889561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int serverPort = server.getLocalPort();
890561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), serverPort);
891561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
892561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Returned incorrect port", serverPort, client.getPort());
893561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
894561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
895561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
896561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
897561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
8985a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes    public void test_getReceiveBufferSize() throws Exception {
899561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
9005a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
9015a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.setReceiveBufferSize(130);
902561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
9035a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        assertTrue("Incorrect buffer size", client.getReceiveBufferSize() >= 130);
904561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
9055a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.close();
9065a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        server.close();
907561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
908561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
909561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
910561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#getRemoteSocketAddress()
911561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
912561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_getRemoteSocketAddress() throws IOException {
913561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // set up server connect and then validate that we get the right
914561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // response for the remote address
915561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
916561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int serverPort = server.getLocalPort();
917561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), serverPort);
918561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
919561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Returned incorrect InetSocketAddress(1):",
920561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                new InetSocketAddress(InetAddress.getLocalHost(), serverPort),
921561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                client.getRemoteSocketAddress());
922561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
923561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
924561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // now create one that is not connected and validate that we get the
925561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // right answer
926561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket theSocket = new Socket();
927561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket.bind(new InetSocketAddress(InetAddress.getLocalHost(), 0));
928561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNull("Returned incorrect InetSocketAddress -unconnected socket:",
929561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                theSocket.getRemoteSocketAddress());
930561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
931561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // now connect and validate we get the right answer
932561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket.connect(new InetSocketAddress(InetAddress.getLocalHost(),
933561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                serverPort));
934561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Returned incorrect InetSocketAddress(2):",
935561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                new InetSocketAddress(InetAddress.getLocalHost(), serverPort),
936561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                theSocket.getRemoteSocketAddress());
937561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket.close();
938561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
939561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
940561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
941561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
9425a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes    public void test_getReuseAddress() throws Exception {
9435a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        Socket theSocket = new Socket();
9445a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        theSocket.setReuseAddress(true);
9455a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        assertTrue("getReuseAddress false when it should be true", theSocket.getReuseAddress());
9465a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        theSocket.setReuseAddress(false);
9475a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        assertFalse("getReuseAddress true when it should be False", theSocket.getReuseAddress());
948561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
949561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
9505a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes    public void test_getSendBufferSize() throws Exception {
951561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
9525a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
9535a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.setSendBufferSize(134);
9545a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        assertTrue("Incorrect buffer size", client.getSendBufferSize() >= 134);
9555a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.close();
9565a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        server.close();
957561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
958561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
9595a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes    public void test_getSoLinger() throws Exception {
960561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
9615a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
9625a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.setSoLinger(true, 200);
9635a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        assertEquals("Returned incorrect linger", 200, client.getSoLinger());
9645a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.setSoLinger(false, 0);
9655a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.close();
9665a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        server.close();
967561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
968561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
9695a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes    public void test_getSoTimeout() throws Exception {
970561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
9715a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
9725a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.setSoTimeout(100);
9735a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        assertEquals("Returned incorrect sotimeout", 100, client.getSoTimeout());
9745a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.close();
9755a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        server.close();
976561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
977561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
9785a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes    public void test_getTcpNoDelay() throws Exception {
979561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
9805a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
981561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
9825a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        boolean bool = !client.getTcpNoDelay();
9835a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.setTcpNoDelay(bool);
9845a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        assertTrue("Failed to get no delay setting: " + client.getTcpNoDelay(), client.getTcpNoDelay() == bool);
985561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
9865a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.close();
9875a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        server.close();
988561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
989561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
9905a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes    public void test_getTrafficClass() throws Exception {
9915a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        /*
9925a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes         * We cannot actually check that the values are set as if a platform
9935a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes         * does not support the option then it may come back unset even
9945a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes         * though we set it so just get the value to make sure we can get it
9955a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes         */
9965a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        int trafficClass = new Socket().getTrafficClass();
9975a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        assertTrue(0 <= trafficClass);
9985a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        assertTrue(trafficClass <= 255);
999561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1000561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1001561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
1002561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#isBound()
1003561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
1004561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_isBound() throws IOException {
1005561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
1006561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server
1007561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalPort());
1008561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket worker = server.accept();
1009561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1010561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Socket indicated  not bound when it should be (1)", client
1011561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .isBound());
1012561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.close();
1013561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
1014561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
1015561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1016561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client = new Socket();
1017561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Socket indicated bound when it was not (2)", client
1018561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .isBound());
1019561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1020561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server = new ServerSocket();
1021561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.bind(new InetSocketAddress(InetAddress.getLocalHost(), 0));
1022561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        InetSocketAddress boundAddress = new InetSocketAddress(server
1023561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getInetAddress(), server.getLocalPort());
1024561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.connect(boundAddress);
1025561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker = server.accept();
1026561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Socket indicated not bound when it should be (2)", client
1027561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .isBound());
1028561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.close();
1029561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
1030561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
1031561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1032561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // now test when we bind explicitly
1033561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        InetSocketAddress theLocalAddress = new InetSocketAddress(InetAddress
1034561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalHost(), 0);
1035561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client = new Socket();
1036561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Socket indicated bound when it was not (3)", client
1037561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .isBound());
1038561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.bind(theLocalAddress);
1039561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Socket indicated not bound when it should be (3a)", client
1040561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .isBound());
1041561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
1042561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Socket indicated not bound when it should be (3b)", client
1043561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .isBound());
1044561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1045561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1046561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
1047561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#isClosed()
1048561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
1049561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_isClosed() throws IOException {
1050561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
1051561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server
1052561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalPort());
1053561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket worker = server.accept();
1054561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1055561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // validate isClosed returns expected values
1056561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Socket should indicate it is not closed(1):", client
1057561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .isClosed());
1058561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
1059561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Socket should indicate it is closed(1):", client.isClosed());
1060561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1061561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // validate that isClosed works ok for sockets returned from
1062561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // ServerSocket.accept()
1063561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Accepted Socket should indicate it is not closed:", worker
1064561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .isClosed());
1065561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.close();
1066561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Accepted Socket should indicate it is closed:", worker
1067561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .isClosed());
1068561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1069561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // and finally for the server socket
1070561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Server Socket should indicate it is not closed:", server
1071561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .isClosed());
1072561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
1073561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Server Socket should indicate it is closed:", server
1074561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .isClosed());
1075561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1076561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1077561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
1078561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#isConnected()
1079561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
1080561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_isConnected() throws IOException {
1081561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
1082561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server
1083561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalPort());
1084561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket worker = server.accept();
1085561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1086561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Socket indicated  not connected when it should be", client
1087561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .isConnected());
1088561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
1089561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.close();
1090561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
1091561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1092561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // now do it with the new constructors and revalidate
1093561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        InetSocketAddress theAddress = new InetSocketAddress(InetAddress
1094561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalHost(), 0);
1095561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client = new Socket();
1096561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Socket indicated connected when it was not", client
1097561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .isConnected());
1098561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1099561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server = new ServerSocket();
1100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.bind(theAddress);
1101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        InetSocketAddress boundAddress = new InetSocketAddress(server
1102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getInetAddress(), server.getLocalPort());
1103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.connect(boundAddress);
1104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker = server.accept();
1105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Socket indicated  not connected when it should be", client
1106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .isConnected());
1107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
1108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.close();
1109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
1110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
1113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#isInputShutdown()
1114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
1115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_isInputShutdown() throws IOException {
1116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
1117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server
1118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalPort());
1119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket worker = server.accept();
1121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        InputStream theInput = client.getInputStream();
1122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        OutputStream theOutput = worker.getOutputStream();
1123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // make sure we get the right answer with newly connected socket
1125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Socket indicated input shutdown when it should not have",
1126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                client.isInputShutdown());
1127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // shutdown the output
1129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.shutdownInput();
1130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // make sure we get the right answer once it is shut down
1132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(
1133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                "Socket indicated input was NOT shutdown when it should have been",
1134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                client.isInputShutdown());
1135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
1137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.close();
1138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
1139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // make sure we get the right answer for closed sockets
1141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(
1142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                "Socket indicated input was shutdown when socket was closed",
1143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                worker.isInputShutdown());
1144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theInput.close();
1146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theOutput.close();
1147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
1150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#isOutputShutdown()
1151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
1152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_isOutputShutdown() throws IOException {
1153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
1154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server
1155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalPort());
1156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket worker = server.accept();
1158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        InputStream theInput = client.getInputStream();
1159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        OutputStream theOutput = worker.getOutputStream();
1160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // make sure we get the right answer with newly connected socket
1162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Socket indicated output shutdown when it should not have",
1163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                worker.isOutputShutdown());
1164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // shutdown the output
1166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.shutdownOutput();
1167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // make sure we get the right answer once it is shut down
1169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(
1170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                "Socket indicated output was NOT shutdown when it should have been",
1171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                worker.isOutputShutdown());
1172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
1174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.close();
1175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
1176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // make sure we get the right answer for closed sockets
1178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(
1179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                "Socket indicated output was output shutdown when the socket was closed",
1180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                client.isOutputShutdown());
1181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theInput.close();
1183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theOutput.close();
1184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
1187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#sendUrgentData(int)
1188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
1189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_sendUrgentDataI() throws Exception {
1190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /*
1191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * Some platforms may not support urgent data in this case we will not
1192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * run these tests. For now run on all platforms until we find those
1193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * that do not support urgent data
1194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
1195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String platform = System.getProperty("os.name");
1196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (platform.equals("Dummy")) {
1197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return;
1198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /*
1201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * Test 1: Validate that when OOBInline is false that any urgent data is
1202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * silently ignored
1203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
1204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        InetAddress localHost = InetAddress.getLocalHost();
1205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0, 5, localHost);
1206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SocketAddress serverAddress = new InetSocketAddress(localHost, server
1207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getLocalPort());
1208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket();
1210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.setOOBInline(false);
1211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.connect(serverAddress);
1213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket worker = server.accept();
1214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.setTcpNoDelay(true);
1215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        OutputStream theOutput = worker.getOutputStream();
1216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Send the regular data
1218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] sendBytes = new String("Test").getBytes();
1219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theOutput.write(sendBytes);
1220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theOutput.flush();
1221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Send the urgent data byte which should not be received
1223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.sendUrgentData("UrgentData".getBytes()[0]);
1224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theOutput.write(sendBytes);
1225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.shutdownOutput();
1226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.close();
1227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Try to read the bytes back
1229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int totalBytesRead = 0;
1230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] myBytes = new byte[100];
1231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        InputStream theInput = client.getInputStream();
1232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        while (true) {
1233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int bytesRead = theInput.read(myBytes, totalBytesRead,
1234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    myBytes.length - totalBytesRead);
1235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (bytesRead == -1) {
1236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                break;
1237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1238561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            totalBytesRead = totalBytesRead + bytesRead;
1239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
1242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
1243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] expectBytes = new byte[2 * sendBytes.length];
1245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        System.arraycopy(sendBytes, 0, expectBytes, 0, sendBytes.length);
1246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        System.arraycopy(sendBytes, 0, expectBytes, sendBytes.length,
1247561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                sendBytes.length);
1248561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] resultBytes = new byte[totalBytesRead];
1250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        System.arraycopy(myBytes, 0, resultBytes, 0, totalBytesRead);
1251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1252561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Urgent data was received", Arrays.equals(expectBytes,
1253561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                resultBytes));
1254561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1255561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /*
1256561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * Test 2: Now validate that urgent data is received as expected. Expect
1257561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * that it should be between the two writes.
1258561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
1259561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server = new ServerSocket(0, 5, localHost);
1260561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serverAddress = new InetSocketAddress(localHost, server.getLocalPort());
1261561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1262561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client = new Socket();
1263561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.setOOBInline(true);
1264561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1265561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.connect(serverAddress);
1266561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker = server.accept();
1267561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.setTcpNoDelay(true);
1268561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theOutput = worker.getOutputStream();
1269561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1270561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Send the regular data
1271561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        sendBytes = new String("Test - Urgent Data").getBytes();
1272561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theOutput.write(sendBytes);
1273561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1274561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Send the urgent data (one byte) which should be received
1275561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.setOOBInline(true);
1276561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte urgentByte = "UrgentData".getBytes()[0];
1277561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.sendUrgentData(urgentByte);
1278561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1279561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Send more data, the urgent byte must stay in position
1280561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theOutput.write(sendBytes);
1281561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.shutdownOutput();
1282561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.close();
1283561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1284561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Try to read the bytes back
1285561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        totalBytesRead = 0;
1286561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        myBytes = new byte[100];
1287561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theInput = client.getInputStream();
1288561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        while (true) {
1289561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int bytesRead = theInput.read(myBytes, totalBytesRead,
1290561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    myBytes.length - totalBytesRead);
1291561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (bytesRead == -1) {
1292561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                break;
1293561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1294561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            totalBytesRead = totalBytesRead + bytesRead;
1295561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1296561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1297561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
1298561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
1299561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1300561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        expectBytes = new byte[2 * sendBytes.length + 1];
1301561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        System.arraycopy(sendBytes, 0, expectBytes, 0, sendBytes.length);
1302561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        expectBytes[sendBytes.length] = urgentByte;
1303561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        System.arraycopy(sendBytes, 0, expectBytes, sendBytes.length + 1,
1304561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                sendBytes.length);
1305561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1306561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        resultBytes = new byte[totalBytesRead];
1307561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        System.arraycopy(myBytes, 0, resultBytes, 0, totalBytesRead);
1308561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1309561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Urgent data was not received with one urgent byte", Arrays
1310561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .equals(expectBytes, resultBytes));
1311561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1312561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /*
1313561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * Test 3: Now validate that urgent data is received as expected. Expect
1314561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * that it should be between the two writes.
1315561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
1316561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server = new ServerSocket(0, 5, localHost);
1317561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serverAddress = new InetSocketAddress(localHost, server.getLocalPort());
1318561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1319561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client = new Socket();
1320561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.setOOBInline(true);
1321561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1322561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.connect(serverAddress);
1323561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker = server.accept();
1324561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.setTcpNoDelay(true);
1325561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theOutput = worker.getOutputStream();
1326561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1327561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Send the regular data
1328561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        sendBytes = new String("Test - Urgent Data").getBytes();
1329561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theOutput.write(sendBytes);
1330561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1331561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Send the urgent data (one byte) which should be received
1332561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.setOOBInline(true);
1333561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte urgentByte1 = "UrgentData".getBytes()[0];
1334561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte urgentByte2 = "UrgentData".getBytes()[1];
1335561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.sendUrgentData(urgentByte1);
1336561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.sendUrgentData(urgentByte2);
1337561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1338561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Send more data, the urgent byte must stay in position
1339561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theOutput.write(sendBytes);
1340561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.shutdownOutput();
1341561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.close();
1342561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1343561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Try to read the bytes back
1344561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        totalBytesRead = 0;
1345561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        myBytes = new byte[100];
1346561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theInput = client.getInputStream();
1347561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        while (true) {
1348561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int bytesRead = theInput.read(myBytes, totalBytesRead,
1349561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    myBytes.length - totalBytesRead);
1350561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (bytesRead == -1) {
1351561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                break;
1352561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1353561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            totalBytesRead = totalBytesRead + bytesRead;
1354561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1355561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1356561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
1357561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
1358561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1359561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        expectBytes = new byte[2 * sendBytes.length + 2];
1360561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        System.arraycopy(sendBytes, 0, expectBytes, 0, sendBytes.length);
1361561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        expectBytes[sendBytes.length] = urgentByte1;
1362561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        expectBytes[sendBytes.length + 1] = urgentByte2;
1363561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        System.arraycopy(sendBytes, 0, expectBytes, sendBytes.length + 2,
1364561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                sendBytes.length);
1365561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1366561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        resultBytes = new byte[totalBytesRead];
1367561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        System.arraycopy(myBytes, 0, resultBytes, 0, totalBytesRead);
1368561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1369561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Urgent data was not received with two urgent bytes", Arrays
1370561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .equals(expectBytes, resultBytes));
1371561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1372561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /*
1373561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * Test 4: Now test the case where there is only urgent data.
1374561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
1375561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server = new ServerSocket(0, 5, localHost);
1376561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        serverAddress = new InetSocketAddress(localHost, server.getLocalPort());
1377561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1378561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client = new Socket();
1379561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.setOOBInline(true);
1380561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1381561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.connect(serverAddress);
1382561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker = server.accept();
1383561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.setTcpNoDelay(true);
1384561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1385561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Send the urgent data (one byte) which should be received
1386561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.setOOBInline(true);
1387561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        urgentByte = "UrgentData".getBytes()[0];
1388561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.sendUrgentData(urgentByte);
1389561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.close();
1390561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1391561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Try to read the bytes back
1392561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theInput = client.getInputStream();
1393561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int byteRead = theInput.read();
1394561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1395561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
1396561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
1397561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1398561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Sole urgent data was not received",
1399561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (int) (urgentByte & 0xff), byteRead);
1400561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1401561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1402561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
1403561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#setKeepAlive(boolean)
1404561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
1405561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_setKeepAliveZ() throws IOException {
1406561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1407561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        class TestSocket extends Socket {
1408561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public TestSocket(SocketImpl impl) throws SocketException {
1409561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                super(impl);
1410561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
1411561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1412561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1413561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // There is not really a good test for this as it is there to detect
1414561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // crashed machines. Just make sure we can set it
1415561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
14165a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
1417561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
14185a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.setKeepAlive(true);
14195a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.setKeepAlive(false);
14205a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.close();
14215a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        server.close();
1422561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1423561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Regression test for HARMONY-1136
1424561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        new TestSocket((SocketImpl) null).setKeepAlive(true);
1425561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1426561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
14275a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes    public void test_setOOBInlineZ() throws Exception {
14285a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        Socket theSocket = new Socket();
14295a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        theSocket.setOOBInline(true);
14305a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        assertTrue("expected OOBIline to be true", theSocket.getOOBInline());
1431561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1432561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1433561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_setPerformancePreference_Int_Int_Int() throws IOException {
1434561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket theSocket = new Socket();
1435561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theSocket.setPerformancePreferences(1, 1, 1);
1436561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1437561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
14385a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes    public void test_setReceiveBufferSizeI() throws Exception {
1439561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
14405a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
1441561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
14425a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.setReceiveBufferSize(130);
14435a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        assertTrue("Incorrect buffer size", client.getReceiveBufferSize() >= 130);
1444561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
14455a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.close();
14465a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        server.close();
1447561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1448561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
14495a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes    public void test_setReuseAddressZ() throws Exception {
14505a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        Socket theSocket = new Socket();
14515a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        theSocket.setReuseAddress(false);
14525a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        // Bind to any available port on the given address
14535a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        theSocket.bind(new InetSocketAddress(InetAddress.getLocalHost(), 0));
14545a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        InetSocketAddress localAddress1 = new InetSocketAddress(theSocket.getLocalAddress(), theSocket.getLocalPort());
1455561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
14565a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        Socket theSocket2 = new Socket();
14575a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        theSocket2.setReuseAddress(false);
14585a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes
14595a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        /*
14605a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes         * Try to invoke a bind while the port is busy (TIME_WAIT). Note
14615a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes         * that we may not succeed, which will cause the test to pass
14625a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes         * without testing the reuseaddr behavior.
14635a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes         */
14645a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        theSocket.close();
14655a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        theSocket2.bind(localAddress1);
14665a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes
14675a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        theSocket2.close();
1468561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1469561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
14705a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes    public void test_setSendBufferSizeI() throws Exception {
1471561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
14725a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
14735a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.setSendBufferSize(134);
14745a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        assertTrue("Incorrect buffer size", client.getSendBufferSize() >= 134);
14755a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.close();
14765a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        server.close();
1477561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1478561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1479561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_setSocketImplFactoryLjava_net_SocketImplFactory() {
1480561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Cannot test as setting will cause the factory to be changed for
1481561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // all subsequent sockets
1482561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1483561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1484561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_setSoLingerZI() throws IOException {
1485561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
14865a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
14875a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.setSoLinger(true, 500);
14885a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        assertEquals("Set incorrect linger", 500, client.getSoLinger());
14895a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.setSoLinger(false, 0);
14905a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.close();
14915a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        server.close();
1492561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1493561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
14945a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes    public void test_setSoTimeoutI() throws Exception {
1495561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
14965a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
14975a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.setSoTimeout(100);
14985a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        assertEquals("Set incorrect sotimeout", 100, client.getSoTimeout());
14995a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.close();
15005a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        server.close();
1501561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1502561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
15035a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes    public void test_setTcpNoDelayZ() throws Exception {
1504561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
15055a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server .getLocalPort());
1506561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
15075a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        boolean bool;
15085a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.setTcpNoDelay(bool = !client.getTcpNoDelay());
15095a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        assertTrue("Failed to set no delay setting: " + client.getTcpNoDelay(), client.getTcpNoDelay() == bool);
1510561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
15115a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        client.close();
15125a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        server.close();
1513561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1514561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
15155a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes    public void test_setTrafficClassI() throws Exception {
15165a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        int IPTOS_LOWCOST = 0x2;
15175a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        int IPTOS_RELIABILTY = 0x4;
15185a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        int IPTOS_THROUGHPUT = 0x8;
15195a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        int IPTOS_LOWDELAY = 0x10;
1520561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
15215a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        Socket theSocket = new Socket();
1522561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
15235a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        // validate that value set must be between 0 and 255
15245a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        try {
15255a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes            theSocket.setTrafficClass(256);
15265a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes            fail("No exception was thrown when traffic class set to 256");
15275a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        } catch (IllegalArgumentException expected) {
15285a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        }
1529561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
15305a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        try {
15315a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes            theSocket.setTrafficClass(-1);
15325a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes            fail("No exception was thrown when traffic class set to -1");
15335a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        } catch (IllegalArgumentException expected) {
1534561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
15355a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes
15365a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        // now validate that we can set it to some good values
15375a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        theSocket.setTrafficClass(IPTOS_LOWCOST);
15385a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        theSocket.setTrafficClass(IPTOS_RELIABILTY);
15395a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        theSocket.setTrafficClass(IPTOS_THROUGHPUT);
15405a4ecd15a879353ab17c7910a445ab25c6462484Elliott Hughes        theSocket.setTrafficClass(IPTOS_LOWDELAY);
1541561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1542561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1543561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @SuppressWarnings("deprecation")
1544561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_shutdownInput() throws IOException {
1545561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
1546561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int port = server.getLocalPort();
1547561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), port);
1548561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1549561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket worker = server.accept();
1550561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.setTcpNoDelay(true);
1551561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1552561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        InputStream theInput = client.getInputStream();
1553561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        OutputStream theOutput = worker.getOutputStream();
1554561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1555561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // shutdown the input
1556561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.shutdownInput();
1557561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1558561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // send the regular data
1559561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String sendString = new String("Test");
1560561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theOutput.write(sendString.getBytes());
1561561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        theOutput.flush();
1562561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1563561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // RI fails here. It is a RI bug not to return 0 to indicate EOF
1564561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(0, theInput.available());
1565561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1566561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
1567561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
1568561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1569561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Regression test for HARMONY-2944
1570fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes        // Port 0 is not allowed to be used in connect() on some platforms,
1571561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Since server has been closed here, so the port is free now
1572561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket s = new Socket("0.0.0.0", port, false);
1573561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        s.shutdownInput();
1574561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
1575561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            s.shutdownInput();
1576561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw SocketException");
1577561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (SocketException se) {
1578561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
1579561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1580561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        s.close();
1581561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1582561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1583561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
1584561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.net.Socket#shutdownOutput()
1585561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
1586561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @SuppressWarnings("deprecation")
1587561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_shutdownOutput() throws IOException {
1588561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
1589561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int port = server.getLocalPort();
1590561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), port);
1591561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1592561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket worker = server.accept();
1593561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        OutputStream theOutput = worker.getOutputStream();
1594561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1595561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // shutdown the output
1596561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        worker.shutdownOutput();
1597561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1598561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // send the regular data
1599561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String sendString = new String("Test");
1600561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
1601561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            theOutput.write(sendString.getBytes());
1602561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            theOutput.flush();
1603561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No exception when writing on socket with output shutdown");
1604561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IOException e) {
1605561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
1606561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1607561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1608561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
1609561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
1610561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1611561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Regression test for HARMONY-2944
1612fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes        // Port 0 is not allowed to be used in connect() on some platforms,
1613561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Since server has been closed here, so the port is free now
1614561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Socket s = new Socket("0.0.0.0", port, false);
1615561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        s.shutdownOutput();
1616561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
1617561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            s.shutdownOutput();
1618561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw SocketException");
1619561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (SocketException se) {
1620561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
1621561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1622561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        s.close();
1623561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1624561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1625561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_toString() throws IOException {
1626561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ServerSocket server = new ServerSocket(0);
1627249c40b94b9f5c8944a44be8e30aa01a90f1cf48Elliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
1628249c40b94b9f5c8944a44be8e30aa01a90f1cf48Elliott Hughes        // RI has "addr" and "localport" instead of "address" and "localPort".
1629249c40b94b9f5c8944a44be8e30aa01a90f1cf48Elliott Hughes        String expected = "Socket[address=" + InetAddress.getLocalHost()
1630249c40b94b9f5c8944a44be8e30aa01a90f1cf48Elliott Hughes                + ",port=" + client.getPort() + ",localPort="
1631561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                + client.getLocalPort() + "]";
1632249c40b94b9f5c8944a44be8e30aa01a90f1cf48Elliott Hughes        assertEquals(expected, client.toString());
1633561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        client.close();
1634561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        server.close();
1635561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1636561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
1637