blob: cf3548910913b06deec11f084eeae35522f697eb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package libcore.java.net;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketException;
import java.net.SocketImpl;
import java.net.SocketImplFactory;
import java.net.SocketTimeoutException;
import java.nio.channels.IllegalBlockingModeException;
import java.nio.channels.ServerSocketChannel;
import java.security.Permission;
import java.util.Properties;
import tests.support.Support_PortManager;
public class OldServerSocketTest extends OldSocketTestCase {
boolean isCreateCalled = false;
ServerSocket s;
Socket sconn;
Thread t;
public void test_setPerformancePreference_Int_Int_Int() throws Exception {
performancePreferenceTest(1, 0, 0);
performancePreferenceTest(1, 1, 1);
performancePreferenceTest(0, 1, 2);
performancePreferenceTest(Integer.MAX_VALUE, Integer.MAX_VALUE,
Integer.MAX_VALUE);
}
void performancePreferenceTest(int connectionTime, int latency,
int bandwidth) throws Exception {
ServerSocket theSocket = new ServerSocket();
theSocket.setPerformancePreferences(connectionTime, latency, bandwidth);
InetSocketAddress theAddress = new InetSocketAddress(InetAddress
.getLocalHost(), 0);
theSocket.bind(theAddress);
int portNumber = theSocket.getLocalPort();
assertTrue(
"Returned incorrect InetSocketAddress(2):"
+ theSocket.getLocalSocketAddress().toString()
+ "Expected: "
+ (new InetSocketAddress(InetAddress.getLocalHost(),
portNumber)).toString(), theSocket
.getLocalSocketAddress().equals(
new InetSocketAddress(InetAddress
.getLocalHost(), portNumber)));
assertTrue("Server socket not bound when it should be:", theSocket
.isBound());
// now make sure that it is actually bound and listening on the
// address we provided
Socket clientSocket = new Socket();
InetSocketAddress clAddress = new InetSocketAddress(InetAddress
.getLocalHost(), portNumber);
clientSocket.connect(clAddress);
Socket servSock = theSocket.accept();
assertEquals(clAddress, clientSocket.getRemoteSocketAddress());
theSocket.close();
servSock.close();
clientSocket.close();
}
public void test_ConstructorII() throws IOException {
int freePortNumber = Support_PortManager.getNextPort();
s = new ServerSocket(freePortNumber, 1);
s.setSoTimeout(2000);
startClient(freePortNumber);
sconn = s.accept();
sconn.close();
s.close();
}
static class SSClient implements Runnable {
Socket cs;
int port;
public SSClient(int prt) {
port = prt;
}
public void run() {
try {
// Go to sleep so the server can setup and wait for connection
Thread.sleep(1000);
cs = new Socket(InetAddress.getLocalHost().getHostName(), port);
// Sleep again to allow server side processing. Thread is
// stopped by server.
Thread.sleep(10000);
} catch (InterruptedException e) {
return;
} catch (Throwable e) {
System.out.println("Error establishing client: " + e.toString());
} finally {
try {
if (cs != null)
cs.close();
} catch (Exception e) {
}
}
}
}
public void test_Constructor() throws IOException {
ServerSocket ss = new ServerSocket();
assertEquals(-1, ss.getLocalPort());
ss.close();
}
public void test_ConstructorI() throws Exception {
int portNumber = Support_PortManager.getNextPort();
s = new ServerSocket(portNumber);
try {
new ServerSocket(portNumber);
fail("IOException was not thrown.");
} catch(IOException ioe) {
//expected
}
try {
startClient(s.getLocalPort());
sconn = s.accept();
assertNotNull("Was unable to accept connection", sconn);
sconn.close();
} finally {
s.close();
}
s = new ServerSocket(0);
try {
startClient(s.getLocalPort());
sconn = s.accept();
assertNotNull("Was unable to accept connection", sconn);
sconn.close();
} finally {
s.close();
}
}
public void test_ConstructorIILjava_net_InetAddress() throws IOException {
int freePortNumber = Support_PortManager.getNextPort();
ServerSocket ss = new ServerSocket(freePortNumber, 10, InetAddress.getLocalHost());
try {
new ServerSocket(freePortNumber, 10, InetAddress.getLocalHost());
fail("IOException was not thrown.");
} catch(IOException expected) {
}
ss.close();
try {
new ServerSocket(65536, 10, InetAddress.getLocalHost());
fail("IllegalArgumentException was not thrown.");
} catch(IllegalArgumentException expected) {
}
}
public void test_LocalPort() throws IOException {
ServerSocket ss1 = new ServerSocket(4242);
assertEquals(ss1.getLocalPort(), 4242);
ss1.close();
ServerSocket ss2 = new ServerSocket();
ss2.bind(new InetSocketAddress("127.0.0.1", 4343));
assertEquals(ss2.getLocalPort(), 4343);
ss2.close();
ServerSocket ss3 = new ServerSocket(0);
assertTrue(ss3.getLocalPort() != 0);
ss3.close();
}
class MockSocketFactory implements SocketImplFactory {
public SocketImpl createSocketImpl() {
return new MockSocketImpl();
}
}
public void test_ConstructorI_SocksSet() throws IOException {
// Harmony-623 regression test
ServerSocket ss = null;
Properties props = (Properties) System.getProperties().clone();
try {
System.setProperty("socksProxyHost", "127.0.0.1");
System.setProperty("socksProxyPort", "12345");
ss = new ServerSocket(0);
} finally {
System.setProperties(props);
if (null != ss) {
ss.close();
}
}
}
public void test_accept() throws IOException {
int portNumber = Support_PortManager.getNextPort();
ServerSocket newSocket = new ServerSocket(portNumber);
newSocket.setSoTimeout(500);
try {
Socket accepted = newSocket.accept();
fail("SocketTimeoutException was not thrown: " + accepted);
} catch(SocketTimeoutException expected) {
}
newSocket.close();
ServerSocketChannel ssc = ServerSocketChannel.open();
ServerSocket ss = ssc.socket();
try {
ss.accept();
fail("IllegalBlockingModeException was not thrown.");
} catch(IllegalBlockingModeException ibme) {
//expected
} finally {
ss.close();
ssc.close();
}
}
public void test_getSoTimeout_setSoTimeout() throws Exception {
// TODO: a useful test would check that setSoTimeout actually causes timeouts!
ServerSocket s = new ServerSocket();
s.setSoTimeout(1500);
int ms = s.getSoTimeout();
if (ms < 1500-10 || ms > 1500+10) {
fail("suspicious timeout: " + ms);
}
s.close();
try {
s.getSoTimeout();
fail("SocketException was not thrown.");
} catch (SocketException expected) {
}
try {
s.setSoTimeout(1000);
fail("SocketException was not thrown.");
} catch (SocketException expected) {
}
}
public void test_toString() throws Exception {
s = new ServerSocket(0);
int portNumber = s.getLocalPort();
assertTrue(s.toString().contains("" + portNumber));
s.close();
}
public void test_setReuseAddressZ() throws IOException {
ServerSocket newSocket = new ServerSocket();
newSocket.close();
try {
newSocket.setReuseAddress(true);
fail("SocketException was not thrown.");
} catch(SocketException expected) {
}
}
public void test_getReuseAddress() throws IOException {
ServerSocket newSocket = new ServerSocket();
newSocket.close();
try {
newSocket.getReuseAddress();
fail("SocketException was not thrown.");
} catch(SocketException e) {
//expected
}
}
public void test_setReceiveBufferSizeI() throws IOException {
ServerSocket newSocket = new ServerSocket();
newSocket.close();
try {
newSocket.setReceiveBufferSize(10);
fail("SocketException was not thrown.");
} catch(SocketException se) {
//expected
}
}
public void test_getReceiveBufferSize() throws IOException {
ServerSocket newSocket = new ServerSocket();
newSocket.close();
try {
newSocket.getReceiveBufferSize();
fail("SocketException was not thrown.");
} catch (SocketException e) {
//expected
}
}
protected void tearDown() {
try {
if (s != null)
s.close();
if (sconn != null)
sconn.close();
if (t != null)
t.interrupt();
} catch (Exception e) {
}
}
/**
* Sets up the fixture, for example, open a network connection. This method
* is called before a test is executed.
*/
protected void startClient(int port) {
t = new Thread(new SSClient(port), "SSClient");
t.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Exception during startClinet()" + e.toString());
}
}
class MockSocketImpl extends SocketImpl {
public MockSocketImpl() {
isCreateCalled = true;
}
protected void create(boolean arg0) throws IOException {
}
protected void connect(String arg0, int arg1) throws IOException {
}
protected void connect(InetAddress arg0, int arg1) throws IOException {
}
protected void connect(SocketAddress arg0, int arg1) throws IOException {
}
protected void bind(InetAddress arg0, int arg1) throws IOException {
}
protected void listen(int arg0) throws IOException {
}
protected void accept(SocketImpl arg0) throws IOException {
}
protected InputStream getInputStream() throws IOException {
return null;
}
protected OutputStream getOutputStream() throws IOException {
return null;
}
protected int available() throws IOException {
return 0;
}
protected void close() throws IOException {
}
protected void sendUrgentData(int arg0) throws IOException {
}
public void setOption(int arg0, Object arg1) throws SocketException {
}
public Object getOption(int arg0) throws SocketException {
return null;
}
}
}