/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.utils.ssh.jsch.executor.context;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.sshd.common.NamedFactory;
import org.apache.sshd.server.Command;
import org.apache.sshd.server.CommandFactory;
import org.apache.sshd.server.SshServer;
import org.apache.sshd.server.auth.UserAuth;
import org.apache.sshd.server.auth.password.UserAuthPasswordFactory;
import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import de.rcenvironment.core.utils.common.validation.ValidationFailureException;
import de.rcenvironment.core.utils.executor.CommandLineExecutor;
import de.rcenvironment.core.utils.ssh.jsch.DummyCommand;
import de.rcenvironment.core.utils.ssh.jsch.DummyPasswordAuthenticator;
import de.rcenvironment.core.utils.ssh.jsch.SshSessionConfiguration;
import de.rcenvironment.core.utils.ssh.jsch.SshSessionConfigurationFactory;
import de.rcenvironment.core.utils.ssh.jsch.SshTestUtils;
/**
* Test case for {@link JSchExecutorContext}.
*
* @author Doreen Seider
*/
public class JschExecutorContextTest {
private static final String LOCALHOST = "localhost";
private static final int INVALID_PORT = -22;
private static SshServer sshServer;
private static int port;
private volatile boolean failed = false;
private final SshSessionConfiguration sshConfiguration = SshSessionConfigurationFactory
.createSshSessionConfigurationWithAuthPhrase(LOCALHOST, port, DummyPasswordAuthenticator.USERNAME,
DummyPasswordAuthenticator.PASSWORD);
/**
* Set up test environment.
* @throws IOException on error
**/
@SuppressWarnings("serial")
@BeforeClass
public static void setUp() throws IOException {
port = SshTestUtils.getRandomPortNumber();
sshServer = SshServer.setUpDefaultServer();
sshServer.setPort(port);
sshServer.setKeyPairProvider(new SimpleGeneratorHostKeyProvider());
sshServer.setUserAuthFactories(new ArrayList<NamedFactory<UserAuth>>() {{ add(new UserAuthPasswordFactory()); }});
sshServer.setPasswordAuthenticator(new DummyPasswordAuthenticator());
sshServer.setCommandFactory(SshTestUtils.createDummyCommandFactory());
sshServer.start();
}
/**
* Set up work dir.
*
* @throws IOException on error
**/
@Before
public void createWorkDir() throws IOException {
failed = false;
}
/**
* Tear down test environment.
* @throws IOException
**/
@AfterClass
public static void tearDown() throws IOException {
sshServer.stop();
}
/**
* Test.
* @throws IOException on error
* @throws ValidationFailureException on error
**/
@Test(timeout = SshTestUtils.TIMEOUT)
public void testLifecycle() throws IOException, ValidationFailureException {
JSchExecutorContext context = new JSchExecutorContext(sshConfiguration);
context.setUpSession();
sshServer.setCommandFactory(new CommandFactory() {
@Override
public Command createCommand(String command) {
if (!command.contains("mkdir -p ")) {
failed = true;
}
return new DummyCommand();
}
});
CommandLineExecutor executor = context.setUpSandboxedExecutor();
if (failed) {
fail();
}
sshServer.setCommandFactory(new CommandFactory() {
@Override
public Command createCommand(String command) {
if (!command.contains("rm ") && !command.contains("rmdir")) {
failed = true;
}
return new DummyCommand();
}
});
context.tearDownSandbox(executor);
context.tearDownSession();
}
/**
* Test.
* @throws IOException on error
* @throws ValidationFailureException on error
**/
@Test(timeout = SshTestUtils.TIMEOUT)
public void testForLifecycleFailure() throws IOException, ValidationFailureException {
SshSessionConfiguration invalidSshConfiguration = SshSessionConfigurationFactory
.createSshSessionConfigurationWithAuthPhrase(LOCALHOST, INVALID_PORT, DummyPasswordAuthenticator.USERNAME,
DummyPasswordAuthenticator.PASSWORD);
JSchExecutorContext context = new JSchExecutorContext(invalidSshConfiguration);
try {
context.setUpSession();
fail();
} catch (ValidationFailureException e) {
assertTrue(true);
}
context = new JSchExecutorContext(sshConfiguration);
try {
context.setUpSandboxedExecutor();
fail();
} catch (IllegalStateException e) {
assertTrue(true);
}
try {
context.tearDownSession();
fail();
} catch (IllegalStateException e) {
assertTrue(true);
}
JSchExecutorContext context2 = new JSchExecutorContext(sshConfiguration);
context2.setUpSession();
CommandLineExecutor executor = context2.setUpSandboxedExecutor();
try {
context.tearDownSandbox(executor);
fail();
} catch (IllegalStateException e) {
assertTrue(true);
}
}
/**
* Test.
* @throws IOException on error
* @throws ValidationFailureException on error
**/
@Test
public void testCreateUniqueTempDir() throws IOException, ValidationFailureException {
JSchExecutorContext context = new JSchExecutorContext(sshConfiguration);
String contextHint = RandomStringUtils.randomAlphanumeric(5);
assertTrue(context.createUniqueTempDir(contextHint).contains(contextHint));
}
}