/**
* Copyright (C) 2010-2017 Gordon Fraser, Andrea Arcuri and EvoSuite
* contributors
*
* This file is part of EvoSuite.
*
* EvoSuite is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3.0 of the License, or
* (at your option) any later version.
*
* EvoSuite is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with EvoSuite. If not, see <http://www.gnu.org/licenses/>.
*/
package org.evosuite.runtime.mock.java.net;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;
import org.evosuite.runtime.mock.MockFramework;
import org.evosuite.runtime.testdata.EvoSuiteAddress;
import org.evosuite.runtime.testdata.EvoSuiteLocalAddress;
import org.evosuite.runtime.vnet.NativeTcp;
import org.evosuite.runtime.testdata.NetworkHandling;
import org.evosuite.runtime.vnet.VirtualNetwork;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class ServerSocketTest {
@Before
public void init(){
MockFramework.enable();
VirtualNetwork.getInstance().reset();
}
@Test
public void testNotBound() throws IOException{
MockServerSocket server = new MockServerSocket();
try{
server.accept();
Assert.fail();
} catch(Exception e){
//expected, because not bound
}
int port = 42;
server.bind(new InetSocketAddress(port));
Assert.assertTrue(server.isBound());
try{
server.accept();
Assert.fail();
} catch(Exception e){
//expected. as there is no simulated inbound connection, the virtual network
//should throw an IOE rather than blocking the test case
}
server.close();
}
@Test
public void testCollidingBinding() throws IOException{
MockServerSocket first = new MockServerSocket();
int port = 42;
first.bind(new InetSocketAddress(port));
MockServerSocket second = new MockServerSocket();
try{
second.bind(new InetSocketAddress(port));
Assert.fail();
} catch(IOException e){
//expected, as binding on same port/interface
}
//binding on different port should work
second.bind(new InetSocketAddress(port+1));
first.close();
second.close();
}
@Test
public void testIncomingConnection() throws IOException{
//first bind a listening server
MockServerSocket server = new MockServerSocket();
String localAddress = "127.0.0.1";
int localPort = 42;
server.bind(new InetSocketAddress(localAddress,localPort));
//before accepting a connection, do register an incoming one
String remoteAddress = "127.0.0.2";
int remotePort = 1234;
VirtualNetwork.getInstance().registerIncomingTcpConnection(remoteAddress, remotePort, localAddress, localPort);
Socket socket = server.accept();
Assert.assertNotNull(socket);
Assert.assertEquals(remoteAddress,socket.getInetAddress().getHostAddress());
Assert.assertEquals(remotePort, socket.getPort());
Assert.assertEquals(localAddress, socket.getLocalAddress().getHostAddress());
Assert.assertEquals(localPort, socket.getLocalPort());
server.close();
socket.close();
}
@Test
public void testReceiveAndReplyMessage() throws IOException{
int n = VirtualNetwork.getInstance().getViewOfOpenedTcpConnections().size();
Assert.assertEquals(0, n);
//first bind a listening server
MockServerSocket server = new MockServerSocket();
String localAddress = "127.0.0.1";
int localPort = 42;
server.bind(new InetSocketAddress(localAddress,localPort));
n = VirtualNetwork.getInstance().getViewOfOpenedTcpConnections().size();
Assert.assertEquals(0, n);
//send a message on tcp connection, although SUT is not listening yet
String msg = "Hello World! Sent from mocked TCP connection";
EvoSuiteLocalAddress addr = new EvoSuiteLocalAddress(localAddress,localPort);
NetworkHandling.sendMessageOnTcp(addr, msg);
//open listening port, and read message
Socket socket = server.accept();
Assert.assertNotNull(socket);
InputStream in = socket.getInputStream();
Assert.assertNotNull(in);
Scanner inScan = new Scanner(in);
String received = inScan.nextLine();
inScan.close();
Assert.assertEquals(msg, received);
//send a reply to remote host on same TCP connection
String reply = "Reply to Hello Message";
OutputStream out = socket.getOutputStream();
out.write(reply.getBytes());
n = VirtualNetwork.getInstance().getViewOfOpenedTcpConnections().size();
Assert.assertEquals(1, n);
NativeTcp connection = VirtualNetwork.getInstance().getViewOfOpenedTcpConnections().iterator().next();
Assert.assertEquals(reply.length(), connection.getAmountOfDataInRemoteBuffer());
server.close();
}
}