/* * Copyright (C) 2006-2015 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.utils.ssh.jsch; import static org.junit.Assert.assertEquals; import java.io.File; import java.io.IOException; import java.io.InputStream; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; import de.rcenvironment.core.utils.common.StringUtils; import de.rcenvironment.core.utils.common.TempFileServiceAccess; import de.rcenvironment.core.utils.ssh.jsch.executor.JSchRCECommandLineExecutor; import de.rcenvironment.core.utils.testing.ParameterizedTestUtils; import de.rcenvironment.core.utils.testing.TestParametersProvider; /** * Manual test case. * * @author Brigitte Boden */ public class JSchFileTransferTest { private static final String WORKDIR_LOCAL = "local-workdir/"; private String ip; private int port; private String username; private String password; private String remoteWorkdir; private File localWorkdir; private TestParametersProvider testParameters; private Log log = LogFactory.getLog(getClass()); private Session session; /** * Set up test environment. * * @throws IOException on error * @throws SshParameterException on error * @throws JSchException on error * @throws InterruptedException on error **/ @Before public void setUp() throws IOException, JSchException, SshParameterException, InterruptedException { TempFileServiceAccess.setupUnitTestEnvironment(); testParameters = new ParameterizedTestUtils().readDefaultPropertiesFile(getClass()); ip = testParameters.getNonEmptyString("ip"); port = testParameters.getExistingInteger("port"); username = testParameters.getNonEmptyString("username"); password = testParameters.getNonEmptyString("passphrase"); session = JschSessionFactory.setupSession(ip, port, username, null, password, null); // Initialize scp context JSchRCECommandLineExecutor rceExecutor = new JSchRCECommandLineExecutor(session); String sessionToken; rceExecutor.start("ra init --compact"); try (InputStream stdoutStream = rceExecutor.getStdout(); InputStream stderrStream = rceExecutor.getStderr();) { rceExecutor.waitForTermination(); sessionToken = IOUtils.toString(stdoutStream).trim(); } remoteWorkdir = StringUtils.format("/ra/%s/input", sessionToken); } /** * Set up work dir. * * @throws IOException on error **/ @Before public void createWorkDir() throws IOException { localWorkdir = new File(WORKDIR_LOCAL); localWorkdir.mkdir(); log.info("Temp file dir: " + localWorkdir.getAbsolutePath()); } /** * Delete work dir. * * @throws IOException on error **/ @After public void deleteWorkDir() throws IOException { FileUtils.deleteQuietly(localWorkdir); } /** * Test. * * @throws JSchException on error * @throws SshParameterException on error * @throws IOException on error * @throws InterruptedException on error */ @Test public void testUploadDownloadFile() throws JSchException, SshParameterException, IOException, InterruptedException { final String srcFilename = RandomStringUtils.randomAlphabetic(5); final String targetFilename = RandomStringUtils.randomAlphabetic(5); final String remotePath = RandomStringUtils.randomAlphabetic(5); final String fileContent = RandomStringUtils.randomAlphabetic(9); File srcFile = new File(localWorkdir, srcFilename); FileUtils.write(srcFile, fileContent); JschFileTransfer.uploadFile(session, srcFile, remoteWorkdir + remotePath); FileUtils.deleteQuietly(srcFile); File localTargetFile = new File(localWorkdir, targetFilename); JschFileTransfer.downloadFile(session, remoteWorkdir + remotePath, localTargetFile); assertEquals(fileContent, FileUtils.readFileToString(localTargetFile)); FileUtils.deleteQuietly(localTargetFile); } /** * Test. * * @throws JSchException on error * @throws SshParameterException on error * @throws IOException on error * @throws InterruptedException on error */ @Test public void testUploadDownloadDirectory() throws JSchException, SshParameterException, IOException, InterruptedException { final String srcFilename = RandomStringUtils.randomAlphabetic(5) + ".txt"; final String srcDirname = "somedir"; final String fileContent = RandomStringUtils.randomAlphabetic(9); File srcDir = new File(localWorkdir, srcDirname); srcDir.mkdirs(); File srcFile = new File(srcDir, srcFilename); FileUtils.write(srcFile, fileContent); assertEquals(1, srcDir.listFiles().length); assertEquals(srcFilename, srcDir.listFiles()[0].getName()); JschFileTransfer.uploadDirectoryToRCEInstance(session, srcDir, remoteWorkdir + srcDirname); FileUtils.deleteQuietly(srcDir); File localTargetDir = new File(localWorkdir, RandomStringUtils.randomAlphabetic(5)); localTargetDir.mkdirs(); JschFileTransfer.downloadDirectory(session, remoteWorkdir + srcDirname, localTargetDir); assertEquals(1, localTargetDir.listFiles().length); assertEquals(1, localTargetDir.listFiles()[0].listFiles().length); assertEquals(srcFilename, localTargetDir.listFiles()[0].listFiles()[0].getName()); assertEquals(fileContent, FileUtils.readFileToString(localTargetDir.listFiles()[0].listFiles()[0])); FileUtils.deleteQuietly(localTargetDir); } }