package test; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.util.jar.JarInputStream; import java.util.jar.Manifest; import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipInputStream; import aQute.bnd.osgi.Builder; import aQute.bnd.osgi.Constants; import aQute.bnd.osgi.EmbeddedResource; import aQute.bnd.osgi.FileResource; import aQute.bnd.osgi.Jar; import aQute.bnd.osgi.Resource; import aQute.lib.io.IO; import junit.framework.TestCase; @SuppressWarnings("resource") public class JarTest extends TestCase { public void testDeletePrefix() { Resource r = new EmbeddedResource(new byte[1], 0); Jar jar = new Jar("test"); jar.putResource("META-INF/maven/org/osgi/test/test.pom", r); jar.putResource("META-INF/maven/org/osgi/test/test.properties", r); jar.putResource("META-INF/MANIFEST.MF", r); jar.putResource("com/example/foo.jar", r); assertTrue(jar.getDirectories().containsKey("META-INF/maven/org/osgi/test")); assertTrue(jar.getDirectories().containsKey("META-INF/maven")); jar.removePrefix("META-INF/maven/"); assertNotNull(jar.getResource("META-INF/MANIFEST.MF")); assertNotNull(jar.getResource("com/example/foo.jar")); assertNull(jar.getResource("META-INF/maven/org/osgi/test/test.pom")); assertNull(jar.getResource("META-INF/maven/org/osgi/test/test.properties")); assertFalse(jar.getDirectories().containsKey("META-INF/maven")); assertFalse(jar.getDirectories().containsKey("META-INF/maven/org/osgi/test")); } public static void testWriteFolder() throws Exception { File tmp = IO.getFile("generated/tmp"); IO.delete(tmp); tmp.mkdirs(); Builder b = new Builder(); b.setIncludeResource("/a/b.txt;literal='ab', /a/c.txt;literal='ac', /a/c/d/e.txt;literal='acde'"); b.build(); assertTrue(b.check()); b.getJar().writeFolder(tmp); assertTrue(IO.getFile(tmp, "META-INF/MANIFEST.MF").isFile()); assertEquals("ab", IO.collect(IO.getFile(tmp, "a/b.txt"))); assertEquals("acde", IO.collect(IO.getFile(tmp, "a/c/d/e.txt"))); IO.delete(tmp); } public static void testNoManifest() throws Exception { Jar jar = new Jar("dot"); jar.setManifest(new Manifest()); jar.setDoNotTouchManifest(); jar.putResource("a/b", new FileResource(IO.getFile("testresources/bnd.jar"))); ByteArrayOutputStream bout = new ByteArrayOutputStream(); jar.write(bout); Jar jin = new Jar("dotin", new ByteArrayInputStream(bout.toByteArray())); Resource m = jin.getResource("META-INF/MANIFEST.MF"); assertNull(m); Resource r = jin.getResource("a/b"); assertNotNull(r); } public static void testManualManifest() throws Exception { Jar jar = new Jar("dot"); jar.setManifest(new Manifest()); jar.setDoNotTouchManifest(); jar.putResource("a/b", new FileResource(IO.getFile("testresources/bnd.jar"))); jar.putResource("META-INF/MANIFEST.MF", new EmbeddedResource("Manifest-Version: 1\r\nX: 1\r\n\r\n".getBytes(), 0)); ByteArrayOutputStream bout = new ByteArrayOutputStream(); jar.write(bout); JarInputStream jin = new JarInputStream(new ByteArrayInputStream(bout.toByteArray())); Manifest m = jin.getManifest(); assertNotNull(m); assertEquals("1", m.getMainAttributes().getValue("X")); jin.close(); } public static void testRenameManifest() throws Exception { Jar jar = new Jar("dot"); Manifest manifest = new Manifest(); manifest.getMainAttributes().putValue("X", "1"); jar.setManifest(manifest); jar.setManifestName("META-INF/FESTYMAN.MF"); ByteArrayOutputStream bout = new ByteArrayOutputStream(); jar.write(bout); ZipInputStream zin = new ZipInputStream(new ByteArrayInputStream(bout.toByteArray())); ZipEntry firstEntry = zin.getNextEntry(); assertEquals("META-INF/FESTYMAN.MF", firstEntry.getName()); manifest = new Manifest(zin); assertEquals("1", manifest.getMainAttributes().getValue("X")); zin.close(); } public static void testSimple() throws ZipException, IOException { File file = IO.getFile("jar/asm.jar"); Jar jar = new Jar("asm.jar", file); long jarTime = jar.lastModified(); long fileTime = file.lastModified(); long now = System.currentTimeMillis(); // Sanity check assertTrue(jarTime < fileTime); assertTrue(fileTime <= now); // TODO see if we can improve this test case // // We should use the highest modification time // // of the files in the JAR not the JAR (though // // this is a backup if time is not set in the jar) // assertEquals(1144412850000L, jarTime); // Now add the file and check that // the modification time has changed jar.putResource("asm", new FileResource(file)); assertEquals(file.lastModified(), jar.lastModified()); } public static void testNewLine() throws Exception { Jar jar = new Jar("dot"); Manifest manifest = new Manifest(); jar.setManifest(manifest); String value = "Test\nTest\nTest\nTest"; String expectedValue = "Test Test Test Test"; manifest.getMainAttributes().putValue(Constants.BUNDLE_DESCRIPTION, value); ByteArrayOutputStream bout = new ByteArrayOutputStream(); jar.write(bout); JarInputStream jin = new JarInputStream(new ByteArrayInputStream(bout.toByteArray())); Manifest m = jin.getManifest(); assertNotNull(m); String parsedValue = m.getMainAttributes().getValue(Constants.BUNDLE_DESCRIPTION); assertEquals(expectedValue, parsedValue); } }