package lsr.paxos.network;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import lsr.common.Configuration;
import lsr.common.PID;
import lsr.common.ProcessDescriptor;
import org.junit.Before;
import org.junit.Test;
public class TcpConnectionTest {
private PID pid0;
private PID pid1;
private PID pid2;
@Before
public void setUp() {
pid0 = new PID(0, "localhost", 2000, 3000);
pid1 = new PID(1, "localhost", 2001, 3001);
pid2 = new PID(2, "localhost", 2002, 3002);
List<PID> processes = new ArrayList<PID>();
processes.add(pid0);
processes.add(pid1);
processes.add(pid2);
Configuration configuration = new Configuration(processes);
ProcessDescriptor.initialize(configuration, 1);
}
/**
* @throws IOException
* @throws InterruptedException
*/
@Test
public void activeConnectionShouldSendLocalId() throws Exception {
TcpNetwork network = mock(TcpNetwork.class);
boolean active = true;
TcpConnection connection = new TcpConnection(network, pid2, active);
connection.start();
ServerSocket server = new ServerSocket();
server.bind(new InetSocketAddress((InetAddress) null, pid2.getReplicaPort()));
Socket socket = server.accept();
DataInputStream inputStream = new DataInputStream(socket.getInputStream());
assertEquals(1, inputStream.readInt());
inputStream.close();
socket.close();
server.close();
connection.stop();
}
@Test(timeout = 2000)
public void shouldSendMessage() throws Exception {
TcpNetwork network = mock(TcpNetwork.class);
boolean active = true;
TcpConnection connection = new TcpConnection(network, pid2, active);
connection.start();
// handle connect
ServerSocket server = new ServerSocket();
server.bind(new InetSocketAddress((InetAddress) null, pid2.getReplicaPort()));
Socket socket = server.accept();
DataInputStream inputStream = new DataInputStream(socket.getInputStream());
assertEquals(1, inputStream.readInt());
// send new message
connection.send(new byte[] {1, 2, 3, 4});
byte[] message = new byte[4];
inputStream.readFully(message);
assertArrayEquals(new byte[] {1, 2, 3, 4}, message);
inputStream.close();
socket.close();
server.close();
connection.stop();
}
/**
* @throws IOException
* @throws InterruptedException
*/
@Test(timeout = 2000)
public void activeConnectionShouldNotBlockSendMethodWhenNotConnected() throws Exception {
TcpNetwork network = mock(TcpNetwork.class);
boolean active = true;
TcpConnection connection = new TcpConnection(network, pid2, active);
connection.start();
Thread.sleep(100);
for (int i = 0; i < 200; i++) {
connection.send(new byte[] {0, 1, 2, 3});
}
Thread.sleep(100);
connection.stop();
}
/**
* @throws IOException
* @throws InterruptedException
*/
@Test(timeout = 2000)
public void passiveConnectionShouldNotBlockSendMethodWhenNotConnected() throws Exception {
TcpNetwork network = mock(TcpNetwork.class);
boolean active = false;
TcpConnection connection = new TcpConnection(network, pid2, active);
connection.start();
Thread.sleep(100);
for (int i = 0; i < 200; i++) {
connection.send(new byte[] {0, 1, 2, 3});
}
Thread.sleep(100);
connection.stop();
}
@Test(timeout = 2000)
public void shouldIgnoreMessagesSentBeforeConnect() throws Exception {
TcpNetwork network = mock(TcpNetwork.class);
boolean active = true;
TcpConnection connection = new TcpConnection(network, pid2, active);
connection.start();
connection.send(new byte[] {1, 2, 3, 4});
// handle connect
ServerSocket server = new ServerSocket();
server.bind(new InetSocketAddress((InetAddress) null, pid2.getReplicaPort()));
Socket socket = server.accept();
DataInputStream inputStream = new DataInputStream(socket.getInputStream());
assertEquals(1, inputStream.readInt());
// send new message
connection.send(new byte[] {5, 6, 7, 8});
byte[] message = new byte[4];
inputStream.readFully(message);
assertArrayEquals(new byte[] {5, 6, 7, 8}, message);
inputStream.close();
socket.close();
server.close();
connection.stop();
}
}