package cz.cuni.mff.d3s.been.hostruntime.task; import static cz.cuni.mff.d3s.been.hostruntime.task.JVMCmdLineBuilder.TASK_RUNNER_CLASS; import java.io.File; import org.apache.commons.exec.CommandLine; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import cz.cuni.mff.d3s.been.bpk.BpkNames; import cz.cuni.mff.d3s.been.bpk.JavaRuntime; import cz.cuni.mff.d3s.been.core.task.*; public class JVMCommandLineBuilderTest extends Assert { @Rule public TemporaryFolder tmpFolder = new TemporaryFolder(); private JavaRuntime runtime; private File taskDir; @Before public void setUp() throws Exception { taskDir = tmpFolder.newFolder(); runtime = new JavaRuntime(); } @Test public void testCompleteCommandLineIsBuilt() throws Exception { TaskDescriptor td = new TaskDescriptor(); td.setJava(createJavaWithOpts("opt1", "opt2")); td.setArguments(createArgs("arg1", "arg2")); td.setDebug(createDebug(ModeEnum.CONNECT, "host", 124)); JavaRuntime runtime = new JavaRuntime(); runtime.setJarFile("jarfile"); CommandLine cmdLine = new JVMCmdLineBuilder(taskDir, td, runtime).build(); assertEquals(8, cmdLine.getArguments().length); assertEquals("java", cmdLine.getExecutable()); assertEquals("-cp", cmdLine.getArguments()[0]); String filesCPart = new File(taskDir, BpkNames.FILES_DIR + File.separator + "*").getAbsolutePath(); String libsCPart = new File(taskDir, BpkNames.LIB_DIR + File.separator + "*").getAbsolutePath(); assertEquals(filesCPart + File.pathSeparator + libsCPart, cmdLine.getArguments()[1]); assertEquals("opt1", cmdLine.getArguments()[2]); assertEquals("opt2", cmdLine.getArguments()[3]); assertEquals("-agentlib:jdwp=transport=dt_socket,server=n,address=host:124,suspend=n", cmdLine.getArguments()[4]); assertEquals(TASK_RUNNER_CLASS, cmdLine.getArguments()[5]); assertEquals("arg1", cmdLine.getArguments()[6]); assertEquals("arg2", cmdLine.getArguments()[7]); } @Test public void testJavaOptsInBuiltCommandLine() throws Exception { String opt1 = "opt1"; String opt2 = "opt2"; TaskDescriptor td = new TaskDescriptor(); td.setJava(createJavaWithOpts(opt1, opt2)); CommandLine cmdLine = new JVMCmdLineBuilder(taskDir, td, runtime).build(); assertEquals(opt1, cmdLine.getArguments()[2]); assertEquals(opt2, cmdLine.getArguments()[3]); } @Test public void testArgsInBuiltCommandLine() throws Exception { String arg1 = "arg1"; String arg2 = "arg2"; TaskDescriptor td = new TaskDescriptor(); td.setArguments(createArgs(arg1, arg2)); td.setJava(new Java()); td.getJava().setMainClass("mainClass"); CommandLine cmdLine = new JVMCmdLineBuilder(taskDir, td, runtime).build(); assertEquals(TASK_RUNNER_CLASS, cmdLine.getArguments()[2]); assertEquals("mainClass", cmdLine.getArguments()[3]); assertEquals(arg1, cmdLine.getArguments()[4]); assertEquals(arg2, cmdLine.getArguments()[5]); } @Test public void testDebugParam_CONNECT_InBuiltCommandLine() throws Exception { ModeEnum mode = ModeEnum.CONNECT; String host = "host"; int port = 12345; TaskDescriptor td = new TaskDescriptor(); td.setJava(new Java()); td.getJava().setMainClass("mainClass"); td.setDebug(createDebug(mode, host, port)); TaskCommandLine cmdLine = new JVMCmdLineBuilder(taskDir, td, runtime).build(); assertEquals( "-agentlib:jdwp=transport=dt_socket,server=n,address=" + host + ":" + port + ",suspend=n", cmdLine.getArguments()[2]); assertFalse(cmdLine.isDebugListeningMode()); assertEquals(0, cmdLine.getDebugPort()); } @Test public void testDebugParam_LISTEN_InBuiltCommandLine() throws Exception { ModeEnum mode = ModeEnum.LISTEN; String host = "host"; int port = 12345; TaskDescriptor td = new TaskDescriptor(); td.setJava(new Java()); td.getJava().setMainClass("mainClass"); td.setDebug(createDebug(mode, host, port)); TaskCommandLine cmdLine = new JVMCmdLineBuilder(taskDir, td, runtime).build(); assertEquals( "-agentlib:jdwp=transport=dt_socket,server=y,address=" + port + ",suspend=n", cmdLine.getArguments()[2]); assertTrue(cmdLine.isDebugListeningMode()); assertTrue(cmdLine.getDebugPort() > 0); } @Test public void testDebugParam_NONE_InBuiltCommandLine() throws Exception { ModeEnum mode = ModeEnum.NONE; String host = "host"; int port = 12345; TaskDescriptor td = new TaskDescriptor(); td.setJava(new Java()); td.getJava().setMainClass("mainClass"); td.setDebug(createDebug(mode, host, port)); TaskCommandLine cmdLine = new JVMCmdLineBuilder(taskDir, td, runtime).build(); assertEquals(4, cmdLine.getArguments().length); assertFalse(cmdLine.isDebugListeningMode()); assertEquals(0, cmdLine.getDebugPort()); } private Debug createDebug(ModeEnum mode, String host, int port) { Debug debug = new Debug(); debug.setHost(host); debug.setPort(port); debug.setMode(mode); return debug; } private Java createJavaWithOpts(String opt1, String opt2) { Java java = new Java(); JavaOptions opts = new JavaOptions(); opts.getJavaOption().add(opt1); opts.getJavaOption().add(opt2); java.setJavaOptions(opts); return java; } private Arguments createArgs(String arg1, String arg2) { Arguments args = new Arguments(); args.getArgument().add(arg1); args.getArgument().add(arg2); return args; } }