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