package org.embulk.cli; import static org.junit.Assert.assertEquals; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.IOException; import java.io.OutputStreamWriter; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.StandardOpenOption; import java.util.Arrays; import java.util.List; import org.junit.BeforeClass; import org.junit.Test; public class SelfrunTest { private static File testSelfrunFile; @BeforeClass public static void prepare() throws Exception { final File originalSelfrunFile = findSelfrun(); final FileSystem fileSystem = FileSystems.getDefault(); final File thisFolder = new File( SelfrunTest.class.getResource("/org/embulk/cli/SelfrunTest.class").toURI()).getParentFile(); testSelfrunFile = new File( thisFolder, System.getProperty("file.separator").equals("\\") ? "selfrun.bat" : "selfrun.sh"); final File classpath = thisFolder.getParentFile().getParentFile().getParentFile(); final String line = new String(Files.readAllBytes(fileSystem.getPath(originalSelfrunFile.getAbsolutePath())), Charset.defaultCharset()) .replaceAll("java ", "java -classpath " + classpath.getAbsolutePath().replaceAll("\\\\", "\\\\\\\\") + " org.embulk.cli.DummyMain "); // Modify selfrun so that arguments are written in 'args.txt' . Files.write(fileSystem.getPath(testSelfrunFile.getAbsolutePath()), line.getBytes(Charset.defaultCharset()), StandardOpenOption.CREATE); if (!testSelfrunFile.setExecutable(true)) { throw new Exception("Cannot set the copied selfrun file executable.."); } } @Test public void testNoArgument() throws Exception { List<String> args = execute(); assertEquals(Arrays.asList( "-XX:+AggressiveOpts", "-XX:+TieredCompilation", "-XX:TieredStopAtLevel=1", "-Xverify:none", "-jar", testSelfrunFile.getAbsolutePath()), args); } @Test public void testArguments() throws Exception { List<String> args = execute("a1", "a2", "\"a3=v3\""); assertEquals(Arrays.asList( "-XX:+AggressiveOpts", "-XX:+TieredCompilation", "-XX:TieredStopAtLevel=1", "-Xverify:none", "-jar", testSelfrunFile.getAbsolutePath(), "a1", "a2", "a3=v3"), args); } @Test public void testRun() throws Exception { List<String> args = execute("run", "a1"); assertEquals(Arrays.asList( "-XX:+AggressiveOpts", "-XX:+UseConcMarkSweepGC", "-jar", testSelfrunFile.getAbsolutePath(), "run", "a1"), args); } @Test public void testJpO() throws Exception { List<String> args = execute("-J+O", "a1", "a2"); assertEquals(Arrays.asList( "-XX:+AggressiveOpts", "-XX:+UseConcMarkSweepGC", "-jar", testSelfrunFile.getAbsolutePath(), "a1", "a2"), args); } @Test public void testJmO() throws Exception { List<String> args = execute("-J-O", "a1", "a2"); assertEquals(Arrays.asList( "-XX:+AggressiveOpts", "-XX:+TieredCompilation", "-XX:TieredStopAtLevel=1", "-Xverify:none", "-jar", testSelfrunFile.getAbsolutePath(), "a1", "a2"), args); } @Test public void testR1() throws Exception { List<String> args = execute("-Rr1", "a1", "a2"); assertEquals(Arrays.asList( "-XX:+AggressiveOpts", "-XX:+TieredCompilation", "-XX:TieredStopAtLevel=1", "-Xverify:none", "-jar", testSelfrunFile.getAbsolutePath(), "-Rr1", "a1", "a2"), args); } @Test public void testR2() throws Exception { List<String> args = execute("\"-Rr1=v1\"", "\"-Rr2=v2\"", "a1", "a2"); assertEquals(Arrays.asList( "-XX:+AggressiveOpts", "-XX:+TieredCompilation", "-XX:TieredStopAtLevel=1", "-Xverify:none", "-jar", testSelfrunFile.getAbsolutePath(), "-Rr1=v1", "-Rr2=v2", "a1", "a2"), args); } @Test public void testRRun() throws Exception { List<String> args = execute("-Rr1", "run", "a1"); assertEquals(Arrays.asList( "-XX:+AggressiveOpts", "-XX:+UseConcMarkSweepGC", "-jar", testSelfrunFile.getAbsolutePath(), "-Rr1", "run", "a1"), args); } @Test public void testJ1() throws Exception { List<String> args = execute("-J-Dj1", "a1", "a2"); assertEquals(Arrays.asList( "-XX:+AggressiveOpts", "-XX:+TieredCompilation", "-XX:TieredStopAtLevel=1", "-Xverify:none", "-Dj1", "-jar", testSelfrunFile.getAbsolutePath(), "a1", "a2"), args); } @Test public void testJ2() throws Exception { List<String> args = execute("\"-J-Dj1=v1\"", "\"-J-Dj2=v2\"", "a1", "a2"); assertEquals(Arrays.asList( "-XX:+AggressiveOpts", "-XX:+TieredCompilation", "-XX:TieredStopAtLevel=1", "-Xverify:none", "-Dj1=v1", "-Dj2=v2", "-jar", testSelfrunFile.getAbsolutePath(), "a1", "a2"), args); } @Test public void testJR() throws Exception { List<String> args = execute("-Jj1", "-Rr1", "a1", "a2"); assertEquals(Arrays.asList( "-XX:+AggressiveOpts", "-XX:+TieredCompilation", "-XX:TieredStopAtLevel=1", "-Xverify:none", "j1", "-jar", testSelfrunFile.getAbsolutePath(), "-Rr1", "a1", "a2"), args); } @Test public void testJFile() throws Exception { File javaArgsFile = new File(testSelfrunFile.getParentFile(), "java_args.txt"); FileSystem fileSystem = FileSystems.getDefault(); Files.write(fileSystem.getPath(javaArgsFile.getAbsolutePath()), "j1 j2 j3".getBytes(Charset.defaultCharset()), StandardOpenOption.CREATE); List<String> args = execute("-J", javaArgsFile.getAbsolutePath(), "a1", "a2"); assertEquals(Arrays.asList( "-XX:+AggressiveOpts", "-XX:+TieredCompilation", "-XX:TieredStopAtLevel=1", "-Xverify:none", "j1", "j2", "j3", "-jar", testSelfrunFile.getAbsolutePath(), "a1", "a2"), args); } private List<String> execute(String... arguments) throws Exception { File temp = new File(testSelfrunFile.getParentFile(), "call-" + testSelfrunFile.getName()); try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(temp), Charset.defaultCharset()))) { writer.write(testSelfrunFile.getAbsolutePath()); for (String argument : arguments) { writer.write(" "); writer.write(argument); } } if (!temp.setExecutable(true)) { throw new Exception("Cannot set the copied selfrun file executable.."); } File argsFile = new File(testSelfrunFile.getParentFile(), "args.txt"); if (argsFile.exists()) { if (!argsFile.delete()) { throw new IOException("Cannot delete " + argsFile); } } Process process = Runtime.getRuntime().exec(temp.getAbsolutePath()); int exitCode = process.waitFor(); if (exitCode != 0 || !argsFile.exists()) { StringBuilder builder = new StringBuilder(); try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream(), Charset.defaultCharset()))) { builder.append(reader.readLine()); builder.append(System.getProperty("line.separator")); } throw new Exception(builder.toString()); } FileSystem fileSystem = FileSystems.getDefault(); List<String> args = Files.readAllLines(fileSystem.getPath(argsFile.getAbsolutePath()), Charset.defaultCharset()); return args; } private static File findSelfrun() { File folder = new File("."); if (new File(folder, "embulk-cli").exists()) { folder = new File(folder, "embulk-cli"); } if (System.getProperty("file.separator").equals("\\")) { return new File(new File(new File(new File(folder, "src"), "main"), "bat"), "selfrun.bat"); } else { return new File(new File(new File(new File(folder, "src"), "main"), "sh"), "selfrun.sh"); } } }