package au.gov.amsa.util.nmea;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import org.junit.Test;
public class NameReaderFromSocketTest {
@Test
public void testConstructorForNonExistingHostThrowsUnknownHostException() {
try {
new NmeaReaderFromSocket("ZZZZAAGREFEFE09871091732409.amsa.gov.au",
100);
fail();
} catch (RuntimeException e) {
assertTrue(e.getCause() instanceof UnknownHostException);
}
}
@Test(expected = IllegalArgumentException.class)
public void testConstructorForNonExistingPortThrowsIllegalArgumentException() {
new NmeaReaderFromSocket("ZZZZAAGREFEFE09871091732409.amsa.gov.au",
Integer.MAX_VALUE);
}
@Test
public void testConstructorForNonListeningSocketThrowsIOException()
throws IOException {
final ServerSocket server = new ServerSocket(0);
int freePort = server.getLocalPort();
assertTrue(freePort > 0);
server.close();
try {
new NmeaReaderFromSocket(null, freePort);
fail();
} catch (RuntimeException e) {
assertTrue(e.getCause() instanceof IOException);
}
}
@Test
public void testConstructorForListeningPort() throws IOException {
final ServerSocket server = new ServerSocket(0);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
Socket socket = server.accept();
OutputStream os = socket.getOutputStream();
os.write("hello".getBytes());
os.close();
server.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
});
t.start();
NmeaReaderFromSocket r = new NmeaReaderFromSocket(null,
server.getLocalPort());
String s = null;
for (String line : r.read())
s = line;
assertEquals("hello", s);
}
@Test
public void testNullSocket() {
NmeaReaderFromSocket r = new NmeaReaderFromSocket(null);
r.close();
}
@Test
public void testCloseWhenSocketDoesNotThrowException() throws IOException {
Socket socket = createMock(Socket.class);
socket.close();
expectLastCall().once();
replay(socket);
NmeaReaderFromSocket r = new NmeaReaderFromSocket(socket);
r.close();
}
@Test
public void testSocketCloseThrowsIOException() throws IOException {
Socket socket = createMock(Socket.class);
socket.close();
expectLastCall().andThrow(
new IOException("expected exception, please ignore")).once();
replay(socket);
NmeaReaderFromSocket r = new NmeaReaderFromSocket(socket);
r.close();
verify(socket);
}
@Test
public void testReadThrowsIOException() {
Socket socket = createMock(Socket.class);
try {
expect(socket.getInputStream()).andThrow(
new IOException("mocked exception")).once();
} catch (IOException e) {
fail();
}
replay(socket);
NmeaReaderFromSocket r = new NmeaReaderFromSocket(socket);
try {
r.read();
fail();
} catch (RuntimeException e) {
assertTrue(e.getCause() instanceof IOException);
}
verify(socket);
}
@Test
public void testNormalRead() {
Socket socket = createMock(Socket.class);
try {
expect(socket.getInputStream()).andReturn(
new ByteArrayInputStream("hello".getBytes())).once();
} catch (IOException e) {
fail();
}
replay(socket);
NmeaReaderFromSocket r = new NmeaReaderFromSocket(socket);
String s = null;
for (String line : r.read())
s = line;
assertEquals("hello", s);
verify(socket);
}
}