/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.brooklyn.util.core.internal.ssh.cli;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
import java.io.ByteArrayOutputStream;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.brooklyn.util.collections.MutableMap;
import org.apache.brooklyn.util.core.internal.ssh.SshException;
import org.apache.brooklyn.util.core.internal.ssh.SshTool;
import org.apache.brooklyn.util.core.internal.ssh.SshToolAbstractIntegrationTest;
import org.apache.brooklyn.util.core.internal.ssh.cli.SshCliTool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
/**
* Test the operation of the {@link SshJschTool} utility class.
*/
public class SshCliToolIntegrationTest extends SshToolAbstractIntegrationTest {
private static final Logger log = LoggerFactory.getLogger(SshCliToolIntegrationTest.class);
protected SshTool newUnregisteredTool(Map<String,?> flags) {
return new SshCliTool(flags);
}
@Test(groups = {"Integration"})
public void testFlags() throws Exception {
final SshTool localtool = newTool(ImmutableMap.of("sshFlags", "-vvv -tt", "host", "localhost"));
tools.add(localtool);
try {
localtool.connect();
Map<String,Object> props = new LinkedHashMap<String, Object>();
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayOutputStream err = new ByteArrayOutputStream();
props.put("out", out);
props.put("err", err);
int exitcode = localtool.execScript(props, Arrays.asList("echo hello err > /dev/stderr"), null);
Assert.assertEquals(0, exitcode, "exitCode="+exitcode+", but expected 0");
log.debug("OUT from ssh -vvv command is: "+out);
log.debug("ERR from ssh -vvv command is: "+err);
assertFalse(err.toString().contains("hello err"), "hello found where it shouldn't have been, in stderr (should have been tty merged to stdout): "+err);
assertTrue(out.toString().contains("hello err"), "no hello in stdout: "+err);
// look for word 'ssh' to confirm we got verbose output
assertTrue(err.toString().toLowerCase().contains("ssh"), "no mention of ssh in stderr: "+err);
} catch (SshException e) {
if (!e.toString().contains("failed to connect")) throw e;
}
}
// Need to have at least one test method here (rather than just inherited) for eclipse to recognize it
@Test(enabled = false)
public void testDummy() throws Exception {
}
// TODO When running mvn on the command line (for Aled), this test hangs when prompting for a password (but works in the IDE!)
// Doing .connect() isn't enough; need to cause ssh or scp to be invoked
@Test(enabled=false, groups = {"Integration"})
public void testConnectWithInvalidUserThrowsException() throws Exception {
final SshTool localtool = newTool(ImmutableMap.of("user", "wronguser", "host", "localhost", "privateKeyFile", "~/.ssh/id_rsa"));
tools.add(localtool);
try {
localtool.connect();
int result = localtool.execScript(ImmutableMap.<String,Object>of(), ImmutableList.of("date"));
fail("exitCode="+result+", but expected exception");
} catch (SshException e) {
if (!e.toString().contains("failed to connect")) throw e;
}
}
// TODO ssh-cli doesn't support pass-phrases yet
@Test(enabled=false, groups = {"Integration"})
public void testSshKeyWithPassphrase() throws Exception {
super.testSshKeyWithPassphrase();
}
// Setting last modified date not yet supported for cli-based ssh
@Override
@Test(enabled=false, groups = {"Integration"})
public void testCopyToServerWithLastModifiedDate() throws Exception {
super.testCopyToServerWithLastModifiedDate();
}
@Test(groups = {"Integration"})
public void testExecReturningNonZeroExitCode() throws Exception {
int exitcode = tool.execCommands(MutableMap.<String,Object>of(), ImmutableList.of("exit 123"));
assertEquals(exitcode, 123);
}
}