/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.utils.ssh.jsch; import java.io.File; import java.io.IOException; import java.util.Random; import org.apache.commons.io.FileUtils; import org.apache.sshd.server.Command; import org.apache.sshd.server.CommandFactory; import org.apache.sshd.server.Environment; import org.apache.sshd.server.SshServer; import org.apache.sshd.server.scp.UnknownCommand; import com.jcraft.jsch.Session; import de.rcenvironment.core.utils.ssh.jsch.executor.JSchCommandLineExecutor; /** * Provides utility methods to test ssh-related methods. * * @author Doreen Seider */ public final class SshTestUtils { /** Time out for test methods interacting with embedded SSH server. */ public static final int TIMEOUT = 30000; private static final int PORT_RANGE = 1000; private static final int MIN_PORT = 9000; private SshTestUtils() {} /** * Create a {@link CommandFactory}. * @param succeedingCommand command which should result in success * @param stdout stdout returned fir succeeding command * @param failingCommand command which should result in failure * @param stderr stderr returned for failing command * @return {@link CommandFactory} */ public static CommandFactory createDummyCommandFactory(final String succeedingCommand, final String stdout, final String failingCommand, final String stderr) { return new CommandFactory() { @Override public Command createCommand(String command) { if (succeedingCommand.equals(command)) { return new DummyCommand(stdout, null); } else if (failingCommand.equals(command)) { return new DummyCommand(null, stderr, 1); } else { return new DummyCommand(); } } }; } /** * @return random port number (port range: 9000 - 10000) */ public static int getRandomPortNumber() { return new Random().nextInt(PORT_RANGE) + MIN_PORT; } /** * Create a {@link CommandFactory}. * @return {@link CommandFactory} */ public static CommandFactory createDummyCommandFactory() { return createDummyCommandFactory("", null, "", null); } /** * Creates a file on server side. * @param sshServer {@link SshServer} to use * @param session {@link Session} to use * @param workDir server side work dir * @param filename name of file to create * @param fileContent content of file to create * @param executor executor to use * @throws IOException on error * @throws InterruptedException on error */ public static void createFileOnServerSidesWorkDir(SshServer sshServer, Session session, File workDir, final String filename, final String fileContent, JSchCommandLineExecutor executor) throws IOException, InterruptedException { createFileOnServerSide(sshServer, session, workDir.getAbsolutePath() + filename, fileContent, executor); } /** * Creates a file on server side. * @param sshServer {@link SshServer} to use * @param session {@link Session} to use * @param filepath absolute path to file * @param fileContent content of file to create * @param executor executor to use * @throws IOException on error * @throws InterruptedException on error */ public static void createFileOnServerSide(SshServer sshServer, Session session, final String filepath, final String fileContent, JSchCommandLineExecutor executor) throws IOException, InterruptedException { final String createFileCommand = "Create file!"; sshServer.setCommandFactory(new CommandFactory() { @Override public Command createCommand(String command) { if (command.contains(createFileCommand)) { return new DummyCommand() { @Override public void start(Environment env) throws IOException { File file = new File(filepath); file.createNewFile(); FileUtils.writeByteArrayToFile(file, fileContent.getBytes()); exitCallback.onExit(0); } }; } else { return new UnknownCommand(command); } } }); executor.start(createFileCommand); executor.waitForTermination(); } /** * Creates a dir on server side. * @param sshServer {@link SshServer} to use * @param session {@link Session} to use * @param workDir server side work dir * @param dirname name of dir to create * @param executor executor to use * @throws IOException on error * @throws InterruptedException on error */ public static void createDirOnServerSidesWorkDir(SshServer sshServer, Session session, File workDir, final String dirname, JSchCommandLineExecutor executor) throws IOException, InterruptedException { createDirOnServerSide(sshServer, session, workDir.getAbsolutePath() + dirname, executor); } /** * Creates a dir on server side. * @param sshServer {@link SshServer} to use * @param session {@link Session} to use * @param dirpath absolute path to dir to create * @param executor executor to use * @throws IOException on error * @throws InterruptedException on error */ public static void createDirOnServerSide(SshServer sshServer, Session session, final String dirpath, JSchCommandLineExecutor executor) throws IOException, InterruptedException { final String createFileCommand = "Create dir!"; sshServer.setCommandFactory(new CommandFactory() { @Override public Command createCommand(String command) { if (command.contains(createFileCommand)) { return new DummyCommand() { @Override public void start(Environment env) throws IOException { File dir = new File(dirpath); dir.mkdirs(); exitCallback.onExit(0); dir.deleteOnExit(); } }; } else { return new UnknownCommand(command); } } }); executor.start(createFileCommand); executor.waitForTermination(); } /** * Creates a file on server side. * @param sshServer {@link SshServer} to use * @param session {@link Session} to use * @param workDir server side work dir * @param filename name of file to create * @param fileContent content of file to create * @throws IOException on error * @throws InterruptedException on error */ public static void createFileOnServerSide(SshServer sshServer, Session session, File workDir, String filename, String fileContent) throws IOException, InterruptedException { createFileOnServerSidesWorkDir(sshServer, session, workDir, filename, fileContent, new JSchCommandLineExecutor(session, workDir.getAbsolutePath())); } }