package test; import java.util.Arrays; import java.util.List; import java.util.Map; import aQute.bnd.header.Attrs; import aQute.bnd.header.Attrs.Type; import aQute.bnd.header.OSGiHeader; import aQute.bnd.header.Parameters; import aQute.bnd.osgi.Processor; import aQute.bnd.version.Version; import junit.framework.TestCase; public class ParseHeaderTest extends TestCase { public void testTyped() { Parameters p = new Parameters("a;a:Long=1;b:Double=3.2;c:String=abc;d:Version=1" + ";e:List<Long>='1,2,3';f:List<Double>='1.0,1.1,1.2';g:List<String>='abc,def,ghi';h:List<Version>='1.0.1,1.0.2'"); String s = p.toString(); System.out.println(s); assertEquals( "a;a:Long=1;b:Double=\"3.2\";c:String=abc;d:Version=1;" + "e:List<Long>=\"1,2,3\";f:List<Double>=\"1.0,1.1,1.2\";g:List<String>=\"abc,def,ghi\";h:List<Version>=\"1.0.1,1.0.2\"", s); Attrs attrs = p.get("a"); assertNotNull(attrs); assertEquals(1L, attrs.getTyped("a")); assertEquals(3.2d, attrs.getTyped("b")); assertEquals("abc", attrs.getTyped("c")); assertEquals(new Version("1"), attrs.getTyped("d")); assertEquals(Arrays.asList(1L, 2L, 3L), attrs.getTyped("e")); assertEquals(Arrays.asList(1.0D, 1.1D, 1.2D), attrs.getTyped("f")); assertEquals(Arrays.asList("abc", "def", "ghi"), attrs.getTyped("g")); assertEquals(Arrays.asList(new Version("1.0.1"), new Version("1.0.2")), attrs.getTyped("h")); } public void testMergeWithOverrideFalse() { Parameters a = new Parameters("a;a=value_a;av:Version=\"1.0.0\""); Parameters b = new Parameters("b;b=metal;bv:Version=\"1.0.0\""); try { a.mergeWith(b, false); } catch (Exception e) { fail(e.toString()); } } public void testEscaping() { { // Spaces at end of quoted string Parameters pp = new Parameters("a;string.list3:List<String>=\" aString , bString , cString \""); assertEquals("a;string.list3:List<String>=\" aString , bString , cString \"", pp.toString()); } { // It should be string.list2:List="a\"quote,a\,comma, aSpace // ,\"start,\,start,end\",end\," (not handling escape of comma) Parameters pp = new Parameters( "a;b:List=\"a\\\"quote,a\\\\backslash,a\\,comma, aSpace ,\\\"start,\\,start\\,end\""); assertEquals("a;b:List=\"a\\\"quote,a\\\\backslash,a\\,comma, aSpace ,\\\"start,\\,start\\,end\"", pp.toString()); } { Parameters pp = new Parameters("a;a:List<String>='abc'"); assertEquals("a;a:List<String>=abc", pp.toString()); } } public static void testPropertiesSimple() { Map<String,String> p = OSGiHeader.parseProperties("a=1, b=\"3 3\", c=c"); assertEquals("c", p.get("c")); assertEquals("1", p.get("a")); assertEquals("3 3", p.get("b")); } /** * #385 If you set a single Runtime Property in a bndrun with no value, it * will be ignored. For example: osgi.console If you add an additional * Runtime Property, then the first property with no value will be set * properly. For example:: osgi.console osgi.service.http.port 8080 It also * appears that order matters. The following does not work: -runproperties: * osgi.service.http.port=8180,\ osgi.console= while the following does * work: -runproperties: osgi.console=,\ osgi.service.http.port=8180 */ public static void testUnfinishedProperties() { Map<String,String> p = OSGiHeader.parseProperties("osgi.console"); assertEquals("", p.get("osgi.console")); p = OSGiHeader.parseProperties("osgi.console="); assertEquals("", p.get("osgi.console")); p = OSGiHeader.parseProperties("osgi.console=,x=1"); assertEquals("", p.get("osgi.console")); p = OSGiHeader.parseProperties("osgi.console,x=1"); assertEquals("", p.get("osgi.console")); p = OSGiHeader.parseProperties("a=1,osgi.console=,x=1"); assertEquals("", p.get("osgi.console")); p = OSGiHeader.parseProperties("a=1,osgi.console="); assertEquals("", p.get("osgi.console")); p = OSGiHeader.parseProperties("a=1,osgi.console"); assertEquals("", p.get("osgi.console")); } public static void testClauseName() { assertNames("a,b,c;", new String[] { "a", "b", "c" }); assertNames("a,b,c", new String[] { "a", "b", "c" }); assertNames("a;x=0,b;x=0,c;x=0", new String[] { "a", "b", "c" }); assertNames("a;b;c;x=0", new String[] { "a", "b", "c" }); assertNames(",", new String[] {}, null, "Empty clause, usually caused"); assertNames("a;a,b", new String[] { "a", "a~", "b" }, null, "Duplicate name a used in header"); assertNames("a;x=0;b", new String[] { "a", "b" }, "Header contains name field after attribute or directive", null); assertNames("a;x=0;x=0,b", new String[] { "a", "b" }, null, "Duplicate attribute/directive name"); assertNames("a;;;,b", new String[] { "a", "b" }); assertNames(",,a,,", new String[] { "a" }, null, "Empty clause, usually caused by repeating"); assertNames(",a", new String[] { "a" }, null, "Empty clause, usually caused"); assertNames(",a,b,c,", new String[] { "a", "b", "c" }, null, "Empty clause, usually caused"); assertNames("a,b,c,", new String[] { "a", "b", "c" }, null, "Empty clause, usually caused"); assertNames("a,b,,c", new String[] { "a", "b", "c" }, null, "Empty clause, usually caused"); } static void assertNames(String header, String[] keys) { assertNames(header, keys, null, null); } static void assertNames(String header, String[] keys, String expectedError, String expectedWarning) { Processor p = new Processor(); p.setPedantic(true); Parameters map = Processor.parseHeader(header, p); for (String key : keys) assertTrue(map.containsKey(key)); assertEquals(keys.length, map.size()); if (expectedError != null) { System.err.println(p.getErrors()); assertTrue(p.getErrors().size() > 0); assertTrue(p.getErrors().get(0).indexOf(expectedError) >= 0); } else assertEquals(0, p.getErrors().size()); if (expectedWarning != null) { System.err.println(p.getWarnings()); assertTrue(p.getWarnings().size() > 0); String w = p.getWarnings().get(0); assertTrue(w.contains(expectedWarning)); } else assertEquals(0, p.getWarnings().size()); } public static void testSimple() { String s = "a;a=a1;b=a2;c=a3, b;a=b1;b=b2;c=b3, c;d;e;a=x1"; Parameters map = Processor.parseHeader(s, null); assertEquals(5, map.size()); Map<String,String> a = map.get("a"); assertEquals("a1", a.get("a")); assertEquals("a2", a.get("b")); assertEquals("a3", a.get("c")); Map<String,String> d = map.get("d"); assertEquals("x1", d.get("a")); Map<String,String> e = map.get("e"); assertEquals(e, d); System.err.println(map); } public static void testParseMultiValueAttribute() { String s = "capability;foo:List<String>=\"MacOSX,Mac OS X\";version:List<Version>=\"1.0, 2.0, 2.1\""; Parameters map = Processor.parseHeader(s, null); Attrs attrs = map.get("capability"); assertEquals(Type.STRINGS, attrs.getType("foo")); List<String> foo = attrs.getTyped(Attrs.LIST_STRING, "foo"); assertEquals(2, foo.size()); assertEquals("MacOSX", foo.get(0)); assertEquals("Mac OS X", foo.get(1)); assertEquals(Type.VERSIONS, attrs.getType("version")); List<Version> version = attrs.getTyped(Attrs.LIST_VERSION, "version"); assertEquals(3, version.size()); assertEquals(new Version(1), version.get(0)); assertEquals(new Version(2), version.get(1)); assertEquals(new Version(2, 1), version.get(2)); } }