/*
* JBoss, Home of Professional Open Source.
* Copyright 2006, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.test.util.test;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.jboss.test.JBossTestCase;
/**
* Unit tests for the Twiddle command line utility.
*
* @author <a href="mailto:stan@jboss.org">Stan Silvert</a>
* @author <a href="mailto:dimitris@jboss.org">Dimitris Andreadis</a>
*/
public class TwiddleUnitTestCase extends JBossTestCase
{
public TwiddleUnitTestCase(String name)
{
super(name);
}
public static Test suite() throws Exception
{
TestSuite suite = new TestSuite();
suite.addTest(new TestSuite(TwiddleUnitTestCase.class));
return suite;
}
/**
* This really just tests that twiddle can be invoked.
*/
public void testHelp() throws Exception
{
String result = runTwiddle("-h");
assertTrue(result.contains("usage: twiddle"));
assertTrue(result.contains("[options] <command> [command_arguments]"));
}
/**
* Test getting an attribute value from an MBean.
*/
public void testGet() throws Exception
{
String result = runTwiddle("get", "\"jboss.system:type=Server\"", "Started");
assertTrue(result.startsWith("Started=true"));
}
/**
* Test invoking an operation on an MBean
*/
public void testInvoke() throws Exception
{
try
{
// JBAS-5108 - check also that returned objects without
// an available property editor are printed out
deploy("twiddle-test.sar");
String result = runTwiddle("invoke", "\"test:service=SimpleService\"", "showHashMapAttr");
assertTrue(result.indexOf("Exec failed") == -1);
}
finally
{
undeploy("twiddle-test.sar");
}
}
/**
* Run twiddle with the given arguments. This method relies on finding the twiddle
* bat or sh file using the jboss.dist system property. It will automatically pass
* in the -s parameter for the host of the server being used for testing.
*
* @param args The arguments passed to twiddle.
*/
protected String runTwiddle(String... args) throws IOException, InterruptedException
{
List<String> command = new ArrayList<String>();
if (isWindows())
{
command.add("cmd");
command.add("/C");
command.add("twiddle");
command.add("-s");
command.add(getServerHost());
command.addAll(Arrays.asList(args));
}
else
{
command.add("/bin/sh");
command.add("-c");
String twiddleCmd = "./twiddle.sh ";
twiddleCmd += "-s ";
twiddleCmd += getServerHost();
twiddleCmd += makeTwiddleArgs(args);
command.add(twiddleCmd);
}
ProcessBuilder builder = new ProcessBuilder(command);
builder.directory(getTwiddleWorkingDir());
builder.environment().put("JBOSS_HOME", getJBossHome());
Process proc = builder.start();
StringBuilder buffer = readStream(proc.getInputStream());
if (log.isDebugEnabled()) debugTwiddle(builder, buffer, proc.getErrorStream());
return buffer.toString();
}
protected StringBuilder readStream(InputStream in) throws IOException
{
StringBuilder buffer = new StringBuilder();
int readByte = 0;
while (readByte != -1)
{
readByte = in.read();
if (readByte != -1)
{
buffer.append((char)readByte);
}
}
return buffer;
}
protected String makeTwiddleArgs(String[] args)
{
String result = "";
for (int i=0; i < args.length; i++)
{
result += " ";
result += args[i];
}
return result;
}
protected void debugTwiddle(ProcessBuilder builder,
StringBuilder buffer,
InputStream errorStream) throws IOException
{
String command = "";
for (String param: builder.command() )
{
command += param;
command += " ";
}
log.debug("executed: " + command);
log.debug("returned: " + buffer.toString());
log.debug("error stream: " + readStream(errorStream).toString());
}
protected boolean isWindows()
{
return System.getProperty("os.name").toLowerCase().startsWith("windows");
}
protected String getJBossHome()
{
// usually, the jboss.dist system property is set in the ant <junit> task using
// <sysproperty key="jboss.dist" value="${jboss.dist}"/>
String jbossDist = System.getProperty("jboss.dist");
if (jbossDist == null) throw new IllegalStateException("jboss.dist System property is not set");
return jbossDist;
}
protected File getTwiddleWorkingDir()
{
String jbossBin = getJBossHome() + "/bin";
log.debug("Twiddle working dir = " + jbossBin);
return new File(jbossBin);
}
}