/*
* 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 org.apache.mina.example.echoserver;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import javax.net.ServerSocketFactory;
import javax.net.SocketFactory;
import org.apache.commons.net.EchoTCPClient;
import org.apache.commons.net.EchoUDPClient;
import org.apache.mina.example.echoserver.ssl.SSLServerSocketFactory;
import org.apache.mina.example.echoserver.ssl.SSLSocketFactory;
/**
* Tests echo server example.
*
* @author The Apache Directory Project (mina-dev@directory.apache.org)
* @version $Rev:448075 $, $Date:2006-09-20 05:26:53Z $
*/
public class AcceptorTest extends AbstractTest {
public AcceptorTest() {
}
public void testTCP() throws Exception {
EchoTCPClient client = new EchoTCPClient();
testTCP0(client);
}
public void testTCPWithSSL() throws Exception {
// Add an SSL filter
useSSL = true;
// Create a commons-net socket factory
SSLSocketFactory.setSslEnabled(true);
SSLServerSocketFactory.setSslEnabled(true);
org.apache.commons.net.SocketFactory factory = new org.apache.commons.net.SocketFactory() {
private SocketFactory f = SSLSocketFactory.getSocketFactory();
private ServerSocketFactory ssf = SSLServerSocketFactory
.getServerSocketFactory();
public Socket createSocket(String arg0, int arg1)
throws UnknownHostException, IOException {
return f.createSocket(arg0, arg1);
}
public Socket createSocket(InetAddress arg0, int arg1)
throws IOException {
return f.createSocket(arg0, arg1);
}
public Socket createSocket(String arg0, int arg1, InetAddress arg2,
int arg3) throws UnknownHostException, IOException {
return f.createSocket(arg0, arg1, arg2, arg3);
}
public Socket createSocket(InetAddress arg0, int arg1,
InetAddress arg2, int arg3) throws IOException {
return f.createSocket(arg0, arg1, arg2, arg3);
}
public ServerSocket createServerSocket(int arg0) throws IOException {
return ssf.createServerSocket(arg0);
}
public ServerSocket createServerSocket(int arg0, int arg1)
throws IOException {
return ssf.createServerSocket(arg0, arg1);
}
public ServerSocket createServerSocket(int arg0, int arg1,
InetAddress arg2) throws IOException {
return ssf.createServerSocket(arg0, arg1, arg2);
}
};
// Create a echo client with SSL factory and test it.
EchoTCPClient client = new EchoTCPClient();
client.setSocketFactory(factory);
testTCP0(client);
}
private void testTCP0(EchoTCPClient client) throws Exception {
client.connect("localhost", port);
byte[] writeBuf = new byte[16];
for (int i = 0; i < 10; i++) {
fillWriteBuffer(writeBuf, i);
client.getOutputStream().write(writeBuf);
}
client.setSoTimeout(30000);
byte[] readBuf = new byte[writeBuf.length];
for (int i = 0; i < 10; i++) {
fillWriteBuffer(writeBuf, i);
int readBytes = 0;
while (readBytes < readBuf.length) {
int nBytes = client.getInputStream().read(readBuf, readBytes,
readBuf.length - readBytes);
if (nBytes < 0)
fail("Unexpected disconnection.");
readBytes += nBytes;
}
assertEquals(writeBuf, readBuf);
}
client.setSoTimeout(500);
try {
client.getInputStream().read();
fail("Unexpected incoming data.");
} catch (SocketTimeoutException e) {
}
client.disconnect();
}
public void testUDP() throws Exception {
EchoUDPClient client = new EchoUDPClient();
client.open();
client.setSoTimeout(3000);
byte[] writeBuf = new byte[16];
byte[] readBuf = new byte[writeBuf.length];
client.setSoTimeout(500);
for (int i = 0; i < 10; i++) {
fillWriteBuffer(writeBuf, i);
client.send(writeBuf, writeBuf.length, InetAddress.getByName(null),
port);
assertEquals(readBuf.length, client
.receive(readBuf, readBuf.length));
assertEquals(writeBuf, readBuf);
}
try {
client.receive(readBuf);
fail("Unexpected incoming data.");
} catch (SocketTimeoutException e) {
}
client.close();
}
private void fillWriteBuffer(byte[] writeBuf, int i) {
for (int j = writeBuf.length - 1; j >= 0; j--) {
writeBuf[j] = (byte) (j + i);
}
}
public static void main(String[] args) {
junit.textui.TestRunner.run(AcceptorTest.class);
}
}