package org.example.tests.cli; import static org.example.tests.utils.Utils.copyToTempFile; import static org.example.tests.utils.Utils.createTempDir; import static org.example.tests.utils.Utils.deleteWithException; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.LinkedList; import java.util.List; import java.util.Properties; import java.util.zip.GZIPInputStream; import org.example.tests.utils.Utils; import aQute.bnd.build.Project; import aQute.bnd.build.Workspace; import aQute.bnd.service.Strategy; import aQute.lib.io.IO; import junit.framework.TestCase; @SuppressWarnings("restriction") public class TestCommandLine extends TestCase { private static final String CLI = "org.osgi.impl.bundle.repoindex.cli"; private File tempDir; private Workspace ws; private File jarFile; @Override protected void setUp() throws Exception { ws = new Workspace(IO.getFile("..")); Project cli = ws.getProject(CLI); jarFile = cli.getBundle(CLI, "latest", Strategy.HIGHEST, null).getFile(); File index = new File("index.xml"); if (index.exists()) index.delete(); File gzipIndex = new File("index.xml.gz"); if (gzipIndex.exists()) gzipIndex.delete(); tempDir = createTempDir(); } @Override protected void tearDown() throws Exception { ws.close(); deleteWithException(tempDir); } private void execute(String[] args) throws Exception { execute(args, false); } private void execute(String[] args, boolean runInTempDir) throws Exception { List<String> cmdLine = new LinkedList<String>(); cmdLine.add("java"); // cmdLine.add("-Xdebug // -Xrunjdwp:transport=dt_socket,server=y,address=9001,suspend=y"); cmdLine.add("-jar"); cmdLine.add(jarFile.getAbsolutePath()); // set root URL if (!runInTempDir) { cmdLine.add("-d"); cmdLine.add(tempDir.getAbsolutePath()); } for (String arg : args) { cmdLine.add(arg); } File runDir = runInTempDir ? tempDir : new File("generated").getAbsoluteFile(); System.out.println("Executing: " + cmdLine + " in directory " + runDir); ProcessBuilder builder = new ProcessBuilder(cmdLine).directory(runDir).redirectErrorStream(true); Process process = builder.start(); String processOutput = Utils.readStream(process.getInputStream()); System.err.println(processOutput); int returnCode = process.waitFor(); if (returnCode != 0) throw new Exception("Process returned code " + returnCode); } public void testBasicCommandLine() throws Exception { File tempFile = copyToTempFile(tempDir, "testdata/01-bsn+version.jar"); String[] args = new String[] { "--noincrement", tempFile.getAbsolutePath() }; execute(args); assertTrue(new File("generated/index.xml.gz").exists()); String formatted = Utils.readStream(getClass().getResourceAsStream("/testdata/expect.xml")); String expected = formatted.replaceAll("\\r?\\n|\\t", ""); String actual = Utils.readStream(new GZIPInputStream(new FileInputStream("generated/index.xml.gz"))); assertEquals(expected, actual); } public void testResourceInWorkingDir() throws Exception { File tempFile = new File(tempDir, "01-bsn+version.jar"); Utils.copyFully(Utils.class.getResourceAsStream("/testdata/01-bsn+version.jar"), new FileOutputStream(tempFile)); String[] args = new String[] { "--noincrement", "01-bsn+version.jar" }; execute(args, true); File outputFile = new File(tempDir, "index.xml.gz"); assertTrue(outputFile.exists()); String formatted = Utils.readStream(getClass().getResourceAsStream("/testdata/expect-workingdir.xml")); String expected = formatted.replaceAll("\\r?\\n|\\t", ""); String actual = Utils.readStream(new GZIPInputStream(new FileInputStream(outputFile))); assertEquals(expected, actual); } public void testUnknownArg() throws Exception { File tempFile = copyToTempFile(tempDir, "testdata/01-bsn+version.jar"); String[] args = new String[] { "--nonsense", tempFile.getAbsolutePath() }; try { execute(args); fail("Expected exception"); } catch (Exception e) {} } public void testPrettyPrint() throws Exception { File tempFile = copyToTempFile(tempDir, "testdata/01-bsn+version.jar"); String[] args = new String[] { "--pretty", "--noincrement", tempFile.getAbsolutePath() }; execute(args); assertTrue(new File("generated/index.xml").exists()); String expected = Utils.readStream(getClass().getResourceAsStream("/testdata/expect-pretty.xml")); String actual = Utils.readStream(new FileInputStream("generated/index.xml")); assertEquals(expected, actual); } public void testKnownBundleRecognition() throws Exception { File tempFile = copyToTempFile(tempDir, "testdata/org.eclipse.equinox.ds-1.4.0.jar"); String[] args = new String[] { "--pretty", "--noincrement", tempFile.getAbsolutePath() }; execute(args); assertTrue(new File("generated/index.xml").exists()); String expected = Utils .readStream(getClass().getResourceAsStream("/testdata/org.eclipse.equinox.ds-1.4.0.xml")); String actual = Utils.readStream(new FileInputStream("generated/index.xml")); assertEquals(expected, actual); } public void testKnownBundleOverride() throws Exception { File tempFile = copyToTempFile(tempDir, "testdata/org.eclipse.equinox.ds-1.4.0.jar"); String[] args = new String[] { "--pretty", "--noincrement", "-K", tempFile.getAbsolutePath() }; execute(args); assertTrue(new File("generated/index.xml").exists()); String expected = Utils .readStream(getClass().getResourceAsStream("/testdata/org.eclipse.equinox.ds-1.4.0-overridden.xml")); String actual = Utils.readStream(new FileInputStream("generated/index.xml")); assertEquals(expected, actual); } public void testKnownBundleExtra() throws Exception { Properties props = new Properties(); props.setProperty("org.eclipse.equinox.ds;[1.4,1.5)", "cap=extra;extra=wibble"); File knownBundlesFile = File.createTempFile("known", ".properties", new File("generated")); knownBundlesFile.deleteOnExit(); props.store(new FileOutputStream(knownBundlesFile), ""); File tempFile = copyToTempFile(tempDir, "testdata/org.eclipse.equinox.ds-1.4.0.jar"); String[] args = new String[] { "--pretty", "--noincrement", "-k", knownBundlesFile.getName(), tempFile.getAbsolutePath() }; execute(args); assertTrue(new File("generated/index.xml").exists()); String expected = Utils .readStream(getClass().getResourceAsStream("/testdata/org.eclipse.equinox.ds-1.4.0-extra.xml")); String actual = Utils.readStream(new FileInputStream("generated/index.xml")); assertEquals(expected, actual); } }