package htsjdk.tribble.util.ftp;
import htsjdk.samtools.util.ftp.FTPClient;
import htsjdk.samtools.util.ftp.FTPReply;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.io.IOException;
import java.io.InputStream;
import java.net.UnknownHostException;
/**
* @author Jim Robinson
* @since 10/3/11
*/
public class FTPClientTest {
static String host = "ftp.broadinstitute.org";
static String file = "/pub/igv/TEST/test.txt";
static int fileSize = 27;
static byte[] expectedBytes = "abcdefghijklmnopqrstuvwxyz\n".getBytes();
FTPClient client;
@BeforeMethod
public void setUp() throws IOException {
client = new FTPClient();
FTPReply reply = client.connect(host);
Assert.assertTrue(reply.isSuccess());
}
@AfterMethod
public void tearDown() {
System.out.println("Disconnecting");
client.disconnect();
}
@Test
public void testLogin() throws Exception {
}
@Test
public void testPasv() throws Exception {
try {
FTPReply reply = client.login("anonymous", "igv@broadinstitute.org");
Assert.assertTrue(reply.isSuccess());
reply = client.pasv();
Assert.assertTrue(reply.isSuccess());
} finally {
client.closeDataStream();
}
}
@Test
public void testSize() throws Exception {
FTPReply reply = client.login("anonymous", "igv@broadinstitute.org");
Assert.assertTrue(reply.isSuccess());
reply = client.binary();
Assert.assertTrue(reply.isSuccess());
reply = client.size(file);
String val = reply.getReplyString();
int size = Integer.parseInt(val);
Assert.assertEquals(fileSize, size);
}
@Test
public void testDownload() throws Exception {
try {
FTPReply reply = client.login("anonymous", "igv@broadinstitute.org");
Assert.assertTrue(reply.isSuccess());
reply = client.binary();
Assert.assertTrue(reply.isSuccess());
reply = client.pasv();
Assert.assertTrue(reply.isSuccess());
reply = client.retr(file);
Assert.assertTrue(reply.getCode() == 150);
InputStream is = client.getDataStream();
int idx = 0;
int b;
while ((b = is.read()) >= 0) {
Assert.assertEquals(expectedBytes[idx], (byte) b);
idx++;
}
} finally {
client.closeDataStream();
FTPReply reply = client.retr(file);
System.out.println(reply.getCode());
Assert.assertTrue(reply.isSuccess());
}
}
@Test
public void testRest() throws Exception {
try {
FTPReply reply = client.login("anonymous", "igv@broadinstitute.org");
Assert.assertTrue(reply.isSuccess());
reply = client.binary();
Assert.assertTrue(reply.isSuccess());
reply = client.pasv();
Assert.assertTrue(reply.isSuccess());
final int restPosition = 5;
client.setRestPosition(restPosition);
reply = client.retr(file);
Assert.assertTrue(reply.getCode() == 150);
InputStream is = client.getDataStream();
int idx = restPosition;
int b;
while ((b = is.read()) >= 0) {
Assert.assertEquals(expectedBytes[idx], (byte) b);
idx++;
}
} finally {
client.closeDataStream();
FTPReply reply = client.retr(file);
System.out.println(reply.getCode());
Assert.assertTrue(reply.isSuccess());
}
}
/**
* Test accessing a non-existent file
*/
@Test
public void testNonExistentFile() throws Exception {
String host = "ftp.broadinstitute.org";
String file = "/pub/igv/TEST/fileDoesntExist.txt";
FTPClient client = new FTPClient();
FTPReply reply = client.connect(host);
Assert.assertTrue(reply.isSuccess());
reply = client.login("anonymous", "igv@broadinstitute.org");
Assert.assertTrue(reply.isSuccess());
reply = client.binary();
Assert.assertTrue(reply.isSuccess());
reply = client.executeCommand("size " + file);
Assert.assertEquals(550, reply.getCode());
client.disconnect();
}
/**
* Test accessing a non-existent server
*/
@Test
public void testNonExistentServer() throws Exception {
String host = "ftp.noSuchServer.org";
String file = "/pub/igv/TEST/fileDoesntExist.txt";
FTPClient client = new FTPClient();
FTPReply reply = null;
try {
reply = client.connect(host);
} catch (UnknownHostException e) {
// This is expected
}
client.disconnect();
}
@Test
public void testMultiplePasv() throws Exception {
try {
FTPReply reply = client.login("anonymous", "igv@broadinstitute.org");
Assert.assertTrue(reply.isSuccess());
reply = client.pasv();
Assert.assertTrue(reply.isSuccess());
client.closeDataStream();
reply = client.pasv();
Assert.assertTrue(reply.isSuccess());
client.closeDataStream();
}
finally {
}
}
@Test
public void testMultipleRest() throws Exception {
FTPReply reply = client.login("anonymous", "igv@broadinstitute.org");
Assert.assertTrue(reply.isSuccess());
reply = client.binary();
Assert.assertTrue(reply.isSuccess());
restRetr(5, 10);
restRetr(2, 10);
restRetr(15, 10);
}
private void restRetr(int restPosition, int length) throws IOException {
try {
if (client.getDataStream() == null) {
FTPReply reply = client.pasv();
Assert.assertTrue(reply.isSuccess());
}
client.setRestPosition(restPosition);
FTPReply reply = client.retr(file);
//assertTrue(reply.getCode() == 150);
InputStream is = client.getDataStream();
byte[] buffer = new byte[length];
is.read(buffer);
for (int i = 0; i < length; i++) {
System.out.print((char) buffer[i]);
Assert.assertEquals(expectedBytes[i + restPosition], buffer[i]);
}
System.out.println();
}
finally {
client.closeDataStream();
FTPReply reply = client.getReply(); // <== MUST READ THE REPLY
System.out.println(reply.getReplyString());
}
}
}