package test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.jar.Attributes;
import java.util.jar.JarInputStream;
import java.util.jar.Manifest;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import aQute.bnd.osgi.Builder;
import aQute.bnd.osgi.Jar;
import aQute.bnd.osgi.Processor;
import aQute.bnd.osgi.Resource;
import aQute.lib.io.IO;
import junit.framework.TestCase;
@SuppressWarnings("resource")
public class ManifestTest extends TestCase {
public static void testNameSection() throws Exception {
Builder b = new Builder();
b.setProperty("Export-Package", "org.osgi.framework");
b.addClasspath(IO.getFile("jar/osgi.jar"));
Jar jar = b.build();
jar.calcChecksums(null);
File f = File.createTempFile("abc", ".jar");
f.deleteOnExit();
jar.write(f);
jar = new Jar(f);
f.delete();
assertTrue(b.check());
Resource r = jar.getResource("META-INF/MANIFEST.MF");
assertNotNull(r);
// String ms = IO.collect( r.openInputStream());
Manifest m = new Manifest(r.openInputStream());
assertEquals(31, m.getEntries().size());
Attributes ba = m.getAttributes("org/osgi/framework/BundleActivator.class");
assertNotNull(ba);
assertEquals("RTRhr3kadnulINegRhpmog==", ba.getValue("MD5-Digest"));
Attributes bundle = m.getAttributes("org/osgi/framework/Bundle.class");
assertNotNull(bundle);
assertEquals("fpQdL60w3CQK+7xlXtM6oA==", bundle.getValue("MD5-Digest"));
Attributes sl = m.getAttributes("org/osgi/framework/ServiceListener.class");
assertNotNull(sl);
assertEquals("nzDRN19MrTJG+LP8ayKZITZ653g=", sl.getValue("SHA-Digest"));
}
public static void testUnicode() throws Exception {
Builder b = new Builder();
String longSentence = "\u1401\u1402\u1403\u1404\u1405\u1406\u1407\u1408\u1409\u140A\u140B\u140C\u140D\u140E\u140F\u1410\u1411\u1412\u1413\u1414\u1415\u1416\u1417\u1418\u1419\u141A\u141B\u141C\u141D\u141E\u141F\u1420\u1421\u1422\u1422\u1423\u1424\u1425\u1426\u1427\u1428\u1429\u1429\u142A\u142B\u142C\u142D\u142E\u142F\u1430\u1431\u1432\u1433\u1434\u1435\u1436\u1437\u1438\u1439\u143A\u143B\u143C\u143D\u143E\u143F\u1440\u1441\u1442\u1443\u1444\u1444\u1445\u1446\u1447\u1448\u1449\u144A\u144B\u144C\u144D";
String shortSentence = "\u1401\u1402\u1403\u1404\u1405\u1406\u1407\u1408\u1409\u140A\u140B\u140C\u140D\u140E\u140F\u1410\u1411\u1412\u1413\u1414\u1415\u1416";
assertEquals(66, shortSentence.getBytes("UTF-8").length);
assertEquals(22, shortSentence.length());
b.setProperty("A1", shortSentence);
b.setProperty("A11", shortSentence);
b.setProperty("A111", shortSentence);
b.setProperty("A1111", shortSentence);
b.setProperty("Long", longSentence);
b.setProperty("-resourceonly", "true");
b.setProperty("Include-Resource", "jar/osgi.jar");
Jar jar = b.build();
File f = File.createTempFile("abc", ".jar");
f.deleteOnExit();
jar.write(f);
jar = new Jar(f);
f.delete();
assertEquals(0, b.getErrors().size());
assertEquals(0, b.getWarnings().size());
Resource r = jar.getResource("META-INF/MANIFEST.MF");
assertNotNull(r);
Manifest m = new Manifest(r.openInputStream());
// String ms = IO.collect(r.openInputStream());
assertEquals(shortSentence, m.getMainAttributes().getValue("A1"));
assertEquals(shortSentence, m.getMainAttributes().getValue("A11"));
assertEquals(shortSentence, m.getMainAttributes().getValue("A111"));
assertEquals(shortSentence, m.getMainAttributes().getValue("A1111"));
assertEquals(longSentence, m.getMainAttributes().getValue("Long"));
}
public static void test72() throws Exception {
Builder b = new Builder();
b.setProperty("H65", "01234567890123456789012345678901234567890123456789012345678901234");
b.setProperty("H66", "012345678901234567890123456789012345678901234567890123456789012345");
b.setProperty("H67", "0123456789012345678901234567890123456789012345678901234567890123456");
b.setProperty("H68", "01234567890123456789012345678901234567890123456789012345678901234567");
b.setProperty("H69", "012345678901234567890123456789012345678901234567890123456789012345678");
b.setProperty("-resourceonly", "true");
b.setProperty("Include-Resource", "jar/osgi.jar");
Jar jar = b.build();
File f = File.createTempFile("abc", ".jar");
f.deleteOnExit();
jar.write(f);
jar = new Jar(f);
f.delete();
assertEquals(0, b.getErrors().size());
assertEquals(0, b.getWarnings().size());
Resource r = jar.getResource("META-INF/MANIFEST.MF");
assertNotNull(r);
Manifest m = new Manifest(r.openInputStream());
String ms = IO.collect(r.openInputStream());
assertEquals(65, m.getMainAttributes().getValue("H65").length());
assertEquals(66, m.getMainAttributes().getValue("H66").length());
assertEquals(67, m.getMainAttributes().getValue("H67").length());
assertEquals(68, m.getMainAttributes().getValue("H68").length());
assertEquals(69, m.getMainAttributes().getValue("H69").length());
assertTrue(Pattern.compile("H65: \\d{65}\r\n").matcher(ms).find());
assertTrue(Pattern.compile("H66: \\d{65}\r\n \\d{1}\r\n").matcher(ms).find());
assertTrue(Pattern.compile("H67: \\d{65}\r\n \\d{2}\r\n").matcher(ms).find());
assertTrue(Pattern.compile("H68: \\d{65}\r\n \\d{3}\r\n").matcher(ms).find());
assertTrue(Pattern.compile("H69: \\d{65}\r\n \\d{4}\r\n").matcher(ms).find());
}
public static void testNoManifest() throws Exception {
Builder b = new Builder();
b.setProperty("-nomanifest", "true");
b.setProperty("Export-Package", "org.osgi.service.event.*");
b.addClasspath(IO.getFile("jar/osgi.jar"));
Jar jar = b.build();
assertNull(jar.getResource("META-INF/MANIFEST.MF"));
ByteArrayOutputStream bout = new ByteArrayOutputStream();
jar.write(bout);
ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
JarInputStream in = new JarInputStream(bin);
ZipEntry entry = in.getNextEntry();
assertNotNull(entry);
assertNull(entry.getExtra());
}
public static void testRenameManifest() throws Exception {
Builder b = new Builder();
b.setProperty("-manifest-name", "META-INF/FESTYMAN.MF");
b.setProperty("Subsystem-Wibble", "hullo");
b.setProperty("Export-Package", "org.osgi.service.event.*");
b.addClasspath(IO.getFile("jar/osgi.jar"));
Jar jar = b.build();
ByteArrayOutputStream bout = new ByteArrayOutputStream();
jar.write(bout);
b.close();
jar.close();
ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
ZipInputStream zin = new ZipInputStream(bin);
assertEquals("META-INF/FESTYMAN.MF", zin.getNextEntry().getName());
Manifest manifest = new Manifest(zin);
assertEquals("hullo", manifest.getMainAttributes().getValue("Subsystem-Wibble"));
zin.close();
}
public static void testNames() throws Exception {
Manifest m = new Manifest();
m.getMainAttributes().putValue("Manifest-Version", "1.0");
m.getMainAttributes().putValue("x", "Loïc Cotonéa");
m.getMainAttributes().putValue("y", "Loïc Cotonéa");
m.getMainAttributes().putValue("z", "Loïc Cotonéa");
ByteArrayOutputStream bout = new ByteArrayOutputStream();
Jar.writeManifest(m, bout);
byte[] result = bout.toByteArray();
System.err.println(new String(result));
}
public static void testUTF8() throws Exception {
Manifest m = new Manifest();
m.getMainAttributes().putValue("Manifest-Version", "1.0");
m.getMainAttributes().putValue("x", "Loïc Cotonéa");
m.getMainAttributes().putValue("y", "Loïc Cotonéa");
m.getMainAttributes().putValue("z", "Loïc Cotonéa");
ByteArrayOutputStream bout = new ByteArrayOutputStream();
Jar.writeManifest(m, bout);
byte[] result = bout.toByteArray();
System.err.println(new String(result));
}
public static void testQuotes() throws IOException {
Map<String,Map<String,String>> map = new HashMap<String,Map<String,String>>();
Map<String,String> clause = new HashMap<String,String>();
clause.put("version1", "0");
clause.put("version2", "0.0");
clause.put("version3", "\"0.0\"");
clause.put("version4", " \"0.0\" ");
clause.put("version5", " 0.0 ");
map.put("alpha", clause);
String s = Processor.printClauses(map);
assertTrue(s.indexOf("version1=0") >= 0);
assertTrue(s.indexOf("version2=\"0.0\"") >= 0);
assertTrue(s.indexOf("version3=\"0.0\"") >= 0);
assertTrue(s.indexOf("version4=\"0.0\"") >= 0);
assertTrue(s.indexOf("version5=\"0.0\"") >= 0);
}
}