package test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Arrays;
import java.util.Properties;
import java.util.jar.Manifest;
import aQute.bnd.header.Parameters;
import aQute.bnd.osgi.Analyzer;
import aQute.bnd.osgi.Builder;
import aQute.bnd.osgi.Jar;
import aQute.bnd.osgi.Processor;
import aQute.lib.io.IO;
import junit.framework.TestCase;
@SuppressWarnings("resource")
public class PropertiesTest extends TestCase {
static <T> T notNull(T t) {
assertNotNull(t);
return t;
}
public static void testFlattening() throws Exception {
Processor p = new Processor();
p.setProperty("-versionpolicy", "${version;===;${@}}");
p.setProperty("x", "x");
p.setProperty("_x", "_x");
Properties flattened = notNull(p.getFlattenedProperties());
String x = notNull(flattened.getProperty("-versionpolicy"));
assertTrue(x.contains("@"));
notNull(flattened.getProperty("x"));
assertNull(flattened.getProperty("_x"));
assertEquals(2, flattened.size());
}
public static void testFilter() {
Processor p1 = new Processor();
p1.setProperty("dan", "bandera");
p1.setProperty("susan", "sarandon");
p1.setProperty("jon", "bostrom");
Processor p2 = new Processor(p1);
p2.setForceLocal(Arrays.asList("dan"));
p2.setProperty("susan", "schwarze");
assertNull(p2.getProperty("dan"));
assertEquals("schwarze", p2.getProperty("susan"));
assertEquals("bostrom", p2.getProperty("jon"));
}
public static void testUnicode() {
StringBuilder sb = new StringBuilder();
String s = "Loïc Cotonéa";
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c < 0x20 || c > 0x7F) {
sb.append("\\u");
sb.append(String.format("%04x", (int) c));
} else {
sb.append(c);
}
}
System.err.println(sb);
}
public static void testSpacesAround() throws Exception {
String test = "#comment\n" + " abc = abc\r\n" + "def = def\n\r" + " ghi = ghi\r"
+ " jkl = jkl";
byte[] bytes = test.getBytes("ISO8859-1");
ByteArrayInputStream bin = new ByteArrayInputStream(bytes);
Properties p = new Properties();
p.load(bin);
assertEquals("abc", p.get("abc"));
assertEquals("def", p.get("def"));
assertEquals("ghi", p.get("ghi"));
assertEquals("jkl", p.get("jkl"));
}
public static void testInternationalCharacters() throws Exception {
String test = "#comment\n" + "Namex=Lo\u00EFc Coton\u00E9a\n" + "Export-Package: *\n" + "Unicode=\\u0040\n"
+ "NameAgain=Loïc Cotonéa";
byte[] bytes = test.getBytes("ISO8859-1");
ByteArrayInputStream bin = new ByteArrayInputStream(bytes);
Properties p = new Properties();
p.load(bin);
assertEquals("@", p.get("Unicode"));
assertEquals("Lo\u00EFc Coton\u00E9a", p.get("Namex"));
// Now test if we can make the round trip
Builder b = new Builder();
b.setProperties(p);
b.addClasspath(IO.getFile("jar/asm.jar"));
Jar jar = b.build();
ByteArrayOutputStream bout = new ByteArrayOutputStream();
jar.getManifest().write(bout);
bin = new ByteArrayInputStream(bout.toByteArray());
Manifest m = new Manifest(bin);
assertEquals("Lo\u00EFc Coton\u00E9a", m.getMainAttributes().getValue("Namex"));
}
public static void testBadProperties() throws Exception {
Analyzer analyzer = new Analyzer();
analyzer.setPedantic(true);
analyzer.setProperties(IO.getFile("src/test/badproperties.prop"));
String s = analyzer.getProperty(Analyzer.IMPORT_PACKAGE);
Parameters map = analyzer.parseHeader(s);
assertEquals(2, map.size());
assertTrue(map.containsKey("org.osgi.service.cm"));
assertTrue(map.containsKey("org.osgi.util.tracker"));
assertEquals(1, analyzer.getWarnings().size());
System.err.println(analyzer.getWarnings());
assertTrue(analyzer.getWarnings()
.get(0)
.indexOf("Empty clause, usually caused by repeating a comma without") >= 0);
System.err.println(analyzer.getWarnings());
}
public static void testProperties() throws Exception {
Analyzer analyzer = new Analyzer();
analyzer.setProperties(IO.getFile("src/test/variables.mf"));
assertEquals("aQute.test", analyzer.getProperty("Header"));
System.err.println("property " + analyzer.getProperty("Header"));
}
}