/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.utils.executor.fileinfo;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.Properties;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Logger;
import com.jcraft.jsch.Session;
import de.rcenvironment.core.utils.executor.CommandLineExecutor;
import de.rcenvironment.core.utils.ssh.jsch.JschSessionFactory;
import de.rcenvironment.core.utils.ssh.jsch.SshParameterException;
import de.rcenvironment.core.utils.ssh.jsch.executor.JSchCommandLineExecutor;
/**
* Test cases for {@link UnixFileServiceTest}.
*
* Note: Deactivate tests because they won't run as long no test server is available (which is configured in
* src/test/resources/unixFileService.test.properties.template). Use embedded test server.
*
* @author Christian Weiss
*/
public class UnixFileServiceTest {
/** If test is set up as interactive one. */
public static final boolean INTERACTIVE = System.getProperty("test.interactive") != null
&& System.getProperty("test.interactive").equals("true");
private static final String HOME = "~/";
private static final String CURRENT = ".";
private static Log log = LogFactory.getLog(UnixFileServiceTest.class);
private static final Pattern HOST_PORT_PATTERN = Pattern.compile("^([^\\:]+)(?:\\:(\\d+))?$");
private static final Pattern USERNAME_PASSWORD_PATTERN = Pattern.compile("^([^\\:]+)(?:\\:(.+))?$");
private static final Logger CONNECTION_LOGGER = new Logger() {
@Override
public void log(int arg0, String arg1) {
if (arg0 > 1) {
log.info("Jsch log: " + arg0 + ": " + arg1);
}
}
@Override
public boolean isEnabled(int arg0) {
return true;
}
};
private static Session session;
private static Session initTestSession() {
final Properties testUtil;
try {
testUtil = loadSettings("unixFileService.test.properties");
} catch (IOException e) {
throw new RuntimeException(e);
}
String host = testUtil.getProperty("test.destinationHost");
String user = testUtil.getProperty("test.sshAuthUser");
String keyfile = testUtil.getProperty("test.sshKeyFileLocation");
String passphrase = testUtil.getProperty("test.sshAuthPhrase");
try {
final Session s = JschSessionFactory.setupSession(host, 22, user,
keyfile, passphrase, CONNECTION_LOGGER);
return s;
} catch (JSchException e) {
throw new RuntimeException(e);
} catch (SshParameterException e) {
throw new RuntimeException(e);
}
}
private static Session initInteractiveSession() {
final JSchConnectionData connectionData = readConnectionDataFromConsole();
try {
final JSch jSch = new JSch();
final Session s = jSch.getSession(connectionData.username, connectionData.host, connectionData.port);
s.setPassword(connectionData.password);
s.setConfig("StrictHostKeyChecking", "no");
s.connect();
return s;
} catch (JSchException e) {
throw new RuntimeException(e);
}
}
/**
* Set up.
*
* @throws JSchException on initializing errors.
**/
// @BeforeClass
public static void setupSessionData() throws JSchException {
if (INTERACTIVE) {
session = initInteractiveSession();
} else {
session = initTestSession();
}
}
private static JSchConnectionData readConnectionDataFromConsole() {
final JSchConnectionData result = new JSchConnectionData();
try (final Scanner in = new Scanner(System.in)) {
String line;
Matcher matcher;
do {
log.debug("host[:port] >> ");
line = in.nextLine();
matcher = HOST_PORT_PATTERN.matcher(line);
} while (!matcher.matches());
result.host = matcher.group(1);
if (matcher.group(2) != null) {
result.port = Integer.parseInt(matcher.group(2));
}
do {
log.debug("username[:password] >> ");
line = in.nextLine();
matcher = USERNAME_PASSWORD_PATTERN.matcher(line);
} while (!matcher.matches());
result.username = matcher.group(1);
if (matcher.group(2) != null) {
result.password = matcher.group(2);
}
}
return result;
}
/**
*
* Encapsulates data for SSH connection.
*
* @author Christian Weiss
*/
private static class JSchConnectionData {
private static final int DEFAULT_PORT = 22;
private String host;
private int port = DEFAULT_PORT;
private String username;
private String password = "";
}
/**
* Test.
*
* @throws IOException on I/O errors.
**/
@Ignore
@Test
public void testIsDirectory() throws IOException {
final CommandLineExecutor executor = new JSchCommandLineExecutor(session, CURRENT);
final UnixFileInfoService service = new UnixFileInfoService(executor);
Assert.assertTrue(service.isDirectory("/home"));
Assert.assertTrue(service.isDirectory(HOME));
Assert.assertFalse(service.isDirectory("/tmp/nonsense_dir/absolute/fake"));
}
/**
* Test.
*
* @throws IOException on I/O errors.
**/
@Ignore
@Test
public void testListFiles() throws IOException {
final CommandLineExecutor executor = new JSchCommandLineExecutor(session, CURRENT);
final UnixFileInfoService service = new UnixFileInfoService(executor);
final Collection<FileInfo> files = service.listFiles("~/.rce", true);
Assert.assertTrue(files.size() > 0);
for (final FileInfo file : files) {
Assert.assertFalse(file.isDirectory());
final String relativePath = file.getAbsolutePath();
Assert.assertNotNull(relativePath);
Assert.assertFalse(relativePath.isEmpty());
final String name = file.getName();
Assert.assertNotNull(name);
Assert.assertFalse(name.isEmpty());
Assert.assertTrue(relativePath.endsWith(name));
Assert.assertNotNull(file.getModificationDate());
log.debug("Found file: " + file.getAbsolutePath() + " (size: " + file.getSize() + " bytes)");
}
}
/**
* Test.
*
* @throws IOException on I/O errors.
**/
@Ignore
@Test
public void testListContent() throws IOException {
final CommandLineExecutor executor = new JSchCommandLineExecutor(session, CURRENT);
final UnixFileInfoService service = new UnixFileInfoService(executor);
final Collection<FileInfo> files = service.listContent(HOME, true);
Assert.assertTrue(files.size() > 0);
for (final FileInfo file : files) {
final String relativePath = file.getAbsolutePath();
Assert.assertNotNull(relativePath);
Assert.assertFalse(relativePath.isEmpty());
final String name = file.getName();
Assert.assertNotNull(name);
Assert.assertFalse(name.isEmpty());
Assert.assertTrue(relativePath.endsWith(name));
Assert.assertNotNull(file.getModificationDate());
}
}
/**
* Test.
*
* @throws IOException on I/O errors.
**/
@Ignore
@Test
public void testSize() throws IOException {
final CommandLineExecutor executor = new JSchCommandLineExecutor(session, CURRENT);
final UnixFileInfoService service = new UnixFileInfoService(executor);
Assert.assertEquals(new Long(0L), service.size(HOME));
Assert.assertTrue(service.size("/etc/hosts") > 0L);
}
/**
* Test.
*
* @throws IOException on I/O errors.
**/
@Ignore
@Test
public void testSizeFailure() throws IOException {
final CommandLineExecutor executor = new JSchCommandLineExecutor(session, CURRENT);
final UnixFileInfoService service = new UnixFileInfoService(executor);
Assert.assertNull(service.size("/root/hosts"));
}
private static Properties loadSettings(String filename) throws IOException {
Properties testSettings = new Properties();
InputStream stream = UnixFileInfoService.class.getResourceAsStream("/" + filename);
if (stream == null) {
throw new IOException("Test configuration file '" + filename + "' not found");
}
try {
testSettings.load(stream);
} finally {
stream.close();
}
return testSettings;
}
}