11f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson/*
21f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson *  Licensed to the Apache Software Foundation (ASF) under one or more
31f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson *  contributor license agreements.  See the NOTICE file distributed with
41f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson *  this work for additional information regarding copyright ownership.
51f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson *  The ASF licenses this file to You under the Apache License, Version 2.0
61f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson *  (the "License"); you may not use this file except in compliance with
71f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson *  the License.  You may obtain a copy of the License at
81f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson *
91f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
101f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson *
111f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson *  Unless required by applicable law or agreed to in writing, software
121f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson *  distributed under the License is distributed on an "AS IS" BASIS,
131f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
141f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson *  See the License for the specific language governing permissions and
151f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson *  limitations under the License.
161f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson */
171f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
181f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilsonpackage libcore.java.net;
191f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
201f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilsonimport java.io.IOException;
211f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilsonimport java.io.InputStream;
221f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilsonimport java.io.OutputStream;
231f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilsonimport java.net.InetAddress;
241f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilsonimport java.net.InetSocketAddress;
251f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilsonimport java.net.ServerSocket;
261f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilsonimport java.net.Socket;
271f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilsonimport java.net.SocketAddress;
281f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilsonimport java.net.SocketException;
291f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilsonimport java.net.SocketImpl;
301f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilsonimport java.net.SocketImplFactory;
311f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilsonimport java.net.SocketTimeoutException;
321f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilsonimport java.nio.channels.IllegalBlockingModeException;
331f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilsonimport java.nio.channels.ServerSocketChannel;
341f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilsonimport java.security.Permission;
351f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilsonimport java.util.Properties;
361f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
371f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilsonpublic class OldServerSocketTest extends OldSocketTestCase {
381f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
391f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    boolean isCreateCalled = false;
401f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    ServerSocket s;
411f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    Socket sconn;
421f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    Thread t;
431f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
441f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    public void test_setPerformancePreference_Int_Int_Int() throws Exception {
451f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        performancePreferenceTest(1, 0, 0);
461f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        performancePreferenceTest(1, 1, 1);
471f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        performancePreferenceTest(0, 1, 2);
481f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        performancePreferenceTest(Integer.MAX_VALUE, Integer.MAX_VALUE,
491f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                Integer.MAX_VALUE);
501f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    }
511f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
521f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    void performancePreferenceTest(int connectionTime, int latency,
531f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            int bandwidth) throws Exception {
541f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        ServerSocket theSocket = new ServerSocket();
551f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        theSocket.setPerformancePreferences(connectionTime, latency, bandwidth);
561f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
571f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        InetSocketAddress theAddress = new InetSocketAddress(InetAddress
581f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                .getLocalHost(), 0);
591f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        theSocket.bind(theAddress);
601f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        int portNumber = theSocket.getLocalPort();
611f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        assertTrue(
621f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                "Returned incorrect InetSocketAddress(2):"
631f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                        + theSocket.getLocalSocketAddress().toString()
641f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                        + "Expected: "
651f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                        + (new InetSocketAddress(InetAddress.getLocalHost(),
661f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                                portNumber)).toString(), theSocket
671f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                        .getLocalSocketAddress().equals(
681f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                                new InetSocketAddress(InetAddress
691f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                                        .getLocalHost(), portNumber)));
701f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        assertTrue("Server socket not bound when it should be:", theSocket
711f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                .isBound());
721f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
731f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        // now make sure that it is actually bound and listening on the
741f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        // address we provided
751f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        Socket clientSocket = new Socket();
761f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        InetSocketAddress clAddress = new InetSocketAddress(InetAddress
771f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                .getLocalHost(), portNumber);
781f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        clientSocket.connect(clAddress);
791f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        Socket servSock = theSocket.accept();
801f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
811f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        assertEquals(clAddress, clientSocket.getRemoteSocketAddress());
821f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        theSocket.close();
831f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        servSock.close();
841f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        clientSocket.close();
851f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    }
861f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
871f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    public void test_ConstructorII() throws IOException {
88903b3f5b6a6e524cb4d88b83ea32e7c355392271Elliott Hughes        s = new ServerSocket(0, 1);
891f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        s.setSoTimeout(2000);
90903b3f5b6a6e524cb4d88b83ea32e7c355392271Elliott Hughes        startClient(s.getLocalPort());
911f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        sconn = s.accept();
921f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        sconn.close();
931f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        s.close();
941f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    }
951f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
961f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    static class SSClient implements Runnable {
971f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        Socket cs;
981f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
991f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        int port;
1001f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
1011f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        public SSClient(int prt) {
1021f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            port = prt;
1031f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
1041f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
1051f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        public void run() {
1061f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            try {
1071f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                // Go to sleep so the server can setup and wait for connection
1081f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                Thread.sleep(1000);
1091f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                cs = new Socket(InetAddress.getLocalHost().getHostName(), port);
1101f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                // Sleep again to allow server side processing. Thread is
1111f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                // stopped by server.
1121f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                Thread.sleep(10000);
1131f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            } catch (InterruptedException e) {
1141f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                return;
1151f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            } catch (Throwable e) {
1161f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                System.out.println("Error establishing client: " + e.toString());
1171f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            } finally {
1181f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                try {
1191f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                    if (cs != null)
1201f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                        cs.close();
1211f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                } catch (Exception e) {
1221f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                }
1231f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            }
1241f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
1251f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    }
1261f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
1271f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    public void test_Constructor() throws IOException {
1281f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        ServerSocket ss = new ServerSocket();
1291f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        assertEquals(-1, ss.getLocalPort());
1301f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        ss.close();
1311f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    }
1321f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
1331f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    public void test_ConstructorI() throws Exception {
134903b3f5b6a6e524cb4d88b83ea32e7c355392271Elliott Hughes        s = new ServerSocket(0);
1351f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        try {
136903b3f5b6a6e524cb4d88b83ea32e7c355392271Elliott Hughes            new ServerSocket(s.getLocalPort());
1371f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            fail("IOException was not thrown.");
1381f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        } catch(IOException ioe) {
1391f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            //expected
1401f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
1411f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        try {
1421f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            startClient(s.getLocalPort());
1431f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            sconn = s.accept();
1441f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            assertNotNull("Was unable to accept connection", sconn);
1451f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            sconn.close();
1461f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        } finally {
1471f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            s.close();
1481f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
1491f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
1501f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        s = new ServerSocket(0);
1511f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        try {
1521f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            startClient(s.getLocalPort());
1531f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            sconn = s.accept();
1541f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            assertNotNull("Was unable to accept connection", sconn);
1551f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            sconn.close();
1561f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        } finally {
1571f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            s.close();
1581f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
1591f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    }
1601f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
1611f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    public void test_ConstructorIILjava_net_InetAddress() throws IOException {
162903b3f5b6a6e524cb4d88b83ea32e7c355392271Elliott Hughes        ServerSocket ss = new ServerSocket(0, 10, InetAddress.getLocalHost());
1631f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        try {
164903b3f5b6a6e524cb4d88b83ea32e7c355392271Elliott Hughes            new ServerSocket(ss.getLocalPort(), 10, InetAddress.getLocalHost());
1651f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            fail("IOException was not thrown.");
1661f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        } catch(IOException expected) {
1671f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
1681f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        ss.close();
1691f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
1701f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        try {
1711f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            new ServerSocket(65536, 10, InetAddress.getLocalHost());
1721f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            fail("IllegalArgumentException was not thrown.");
1731f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        } catch(IllegalArgumentException expected) {
1741f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
1751f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    }
1761f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
1771f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    public void test_LocalPort() throws IOException {
1781f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        ServerSocket ss1 = new ServerSocket(4242);
1791f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        assertEquals(ss1.getLocalPort(), 4242);
1801f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        ss1.close();
1811f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
1821f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        ServerSocket ss2 = new ServerSocket();
1831f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        ss2.bind(new InetSocketAddress("127.0.0.1", 4343));
1841f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        assertEquals(ss2.getLocalPort(), 4343);
1851f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        ss2.close();
1861f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
1871f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        ServerSocket ss3 = new ServerSocket(0);
1881f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        assertTrue(ss3.getLocalPort() != 0);
1891f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        ss3.close();
1901f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    }
1911f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
1921f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    class MockSocketFactory implements SocketImplFactory {
1931f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        public SocketImpl createSocketImpl() {
1941f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            return new MockSocketImpl();
1951f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
1961f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    }
1971f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
1981f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    public void test_ConstructorI_SocksSet() throws IOException {
1991f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        // Harmony-623 regression test
2001f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        ServerSocket ss = null;
2011f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        Properties props = (Properties) System.getProperties().clone();
2021f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        try {
2031f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            System.setProperty("socksProxyHost", "127.0.0.1");
2041f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            System.setProperty("socksProxyPort", "12345");
2051f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            ss = new ServerSocket(0);
2061f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        } finally {
2071f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            System.setProperties(props);
2081f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            if (null != ss) {
2091f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                ss.close();
2101f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            }
2111f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
2121f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    }
2131f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
2141f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    public void test_accept() throws IOException {
215903b3f5b6a6e524cb4d88b83ea32e7c355392271Elliott Hughes        ServerSocket newSocket = new ServerSocket(0);
2161f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        newSocket.setSoTimeout(500);
2171f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        try {
2181f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            Socket accepted = newSocket.accept();
2191f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            fail("SocketTimeoutException was not thrown: " + accepted);
2201f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        } catch(SocketTimeoutException expected) {
2211f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
2221f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        newSocket.close();
2231f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
2241f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        ServerSocketChannel ssc = ServerSocketChannel.open();
2251f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        ServerSocket ss = ssc.socket();
2261f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
2271f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        try {
2281f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            ss.accept();
2291f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            fail("IllegalBlockingModeException was not thrown.");
2301f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        } catch(IllegalBlockingModeException ibme) {
2311f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            //expected
2321f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        } finally {
2331f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            ss.close();
2341f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            ssc.close();
2351f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
2361f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    }
2371f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
23804e25f30524dc7b51f280912d6ca97d991ae84b0Elliott Hughes    public void test_getSoTimeout_setSoTimeout() throws Exception {
23904e25f30524dc7b51f280912d6ca97d991ae84b0Elliott Hughes        // TODO: a useful test would check that setSoTimeout actually causes timeouts!
24004e25f30524dc7b51f280912d6ca97d991ae84b0Elliott Hughes        ServerSocket s = new ServerSocket();
24104e25f30524dc7b51f280912d6ca97d991ae84b0Elliott Hughes        s.setSoTimeout(1500);
24204e25f30524dc7b51f280912d6ca97d991ae84b0Elliott Hughes        int ms = s.getSoTimeout();
24304e25f30524dc7b51f280912d6ca97d991ae84b0Elliott Hughes        if (ms < 1500-10 || ms > 1500+10) {
24404e25f30524dc7b51f280912d6ca97d991ae84b0Elliott Hughes            fail("suspicious timeout: " + ms);
24504e25f30524dc7b51f280912d6ca97d991ae84b0Elliott Hughes        }
24604e25f30524dc7b51f280912d6ca97d991ae84b0Elliott Hughes        s.close();
2471f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        try {
24804e25f30524dc7b51f280912d6ca97d991ae84b0Elliott Hughes            s.getSoTimeout();
2491f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            fail("SocketException was not thrown.");
25004e25f30524dc7b51f280912d6ca97d991ae84b0Elliott Hughes        } catch (SocketException expected) {
2511f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
2521f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        try {
25304e25f30524dc7b51f280912d6ca97d991ae84b0Elliott Hughes            s.setSoTimeout(1000);
2541f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            fail("SocketException was not thrown.");
25504e25f30524dc7b51f280912d6ca97d991ae84b0Elliott Hughes        } catch (SocketException expected) {
2561f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
2571f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    }
2581f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
2591f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    public void test_toString() throws Exception {
2601f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        s = new ServerSocket(0);
2611f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        int portNumber = s.getLocalPort();
2621f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        assertTrue(s.toString().contains("" + portNumber));
2631f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        s.close();
2641f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    }
2651f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
2661f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    public void test_setReuseAddressZ() throws IOException {
2671f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        ServerSocket newSocket = new ServerSocket();
2681f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        newSocket.close();
2691f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        try {
2701f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            newSocket.setReuseAddress(true);
2711f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            fail("SocketException was not thrown.");
2721f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        } catch(SocketException expected) {
2731f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
2741f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    }
2751f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
2761f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    public void test_getReuseAddress() throws IOException {
2771f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        ServerSocket newSocket = new ServerSocket();
2781f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        newSocket.close();
2791f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        try {
2801f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            newSocket.getReuseAddress();
2811f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            fail("SocketException was not thrown.");
2821f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        } catch(SocketException e) {
2831f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            //expected
2841f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
2851f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    }
2861f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
2871f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    public void test_setReceiveBufferSizeI() throws IOException {
2881f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        ServerSocket newSocket = new ServerSocket();
2891f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        newSocket.close();
2901f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        try {
2911f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            newSocket.setReceiveBufferSize(10);
2921f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            fail("SocketException was not thrown.");
2931f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        } catch(SocketException se) {
2941f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            //expected
2951f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
2961f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    }
2971f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
2981f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    public void test_getReceiveBufferSize() throws IOException {
2991f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        ServerSocket newSocket = new ServerSocket();
3001f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        newSocket.close();
3011f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        try {
3021f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            newSocket.getReceiveBufferSize();
3031f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            fail("SocketException was not thrown.");
3041f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        } catch (SocketException e) {
3051f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            //expected
3061f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
3071f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    }
3081f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
3091f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    protected void tearDown() {
3101f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        try {
3111f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            if (s != null)
3121f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                s.close();
3131f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            if (sconn != null)
3141f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                sconn.close();
3151f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            if (t != null)
3161f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson                t.interrupt();
3171f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        } catch (Exception e) {
3181f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
3191f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    }
3201f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
3211f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    /**
3221f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson     * Sets up the fixture, for example, open a network connection. This method
3231f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson     * is called before a test is executed.
3241f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson     */
3251f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    protected void startClient(int port) {
3261f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        t = new Thread(new SSClient(port), "SSClient");
3271f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        t.start();
3281f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        try {
3291f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            Thread.sleep(1000);
3301f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        } catch (InterruptedException e) {
3311f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            System.out.println("Exception during startClinet()" + e.toString());
3321f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
3331f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    }
3341f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
3351f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    class MockSocketImpl extends SocketImpl {
3361f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        public MockSocketImpl() {
3371f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            isCreateCalled = true;
3381f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
3391f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
3401f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        protected void create(boolean arg0) throws IOException {
3411f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
3421f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
3431f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        protected void connect(String arg0, int arg1) throws IOException {
3441f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
3451f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
3461f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        protected void connect(InetAddress arg0, int arg1) throws IOException {
3471f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
3481f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
3491f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        protected void connect(SocketAddress arg0, int arg1) throws IOException {
3501f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
3511f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
3521f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        protected void bind(InetAddress arg0, int arg1) throws IOException {
3531f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
3541f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
3551f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        protected void listen(int arg0) throws IOException {
3561f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
3571f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
3581f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        protected void accept(SocketImpl arg0) throws IOException {
3591f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
3601f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
3611f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        protected InputStream getInputStream() throws IOException {
3621f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            return null;
3631f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
3641f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
3651f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        protected OutputStream getOutputStream() throws IOException {
3661f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            return null;
3671f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
3681f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
3691f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        protected int available() throws IOException {
3701f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            return 0;
3711f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
3721f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
3731f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        protected void close() throws IOException {
3741f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
3751f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
3761f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        protected void sendUrgentData(int arg0) throws IOException {
3771f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
3781f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
3791f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        public void setOption(int arg0, Object arg1) throws SocketException {
3801f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
3811f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson
3821f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        public Object getOption(int arg0) throws SocketException {
3831f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson            return null;
3841f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson        }
3851f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson    }
3861f8243e3d2b5a3f8e0398c304d1dea0395cbc368Jesse Wilson}
387