[jboss-cvs] JBossAS SVN: r94121 - in projects/jboss-osgi/projects/aQute/trunk/bnd: src and 3 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Sep 29 16:13:30 EDT 2009


Author: thomas.diesler at jboss.com
Date: 2009-09-29 16:13:29 -0400 (Tue, 29 Sep 2009)
New Revision: 94121

Added:
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/AnalyzerTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/AnnotationsTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/AttributesTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/BuilderTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ClassParserTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ClassReferenceTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ClasspathTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/CorruptManifest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/DiffTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ExportHeaderTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/FilterTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/IncludeHeaderTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/InlineTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/JarTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/MacroTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/MakeTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ManifestTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/MavenTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/MergeTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/NativeHeader.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/NoUsesTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ParseHeaderTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/PluginTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ProcessorTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ProjectTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/PropertiesTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/RepoBuilderTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ResourcesTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/SpringTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/TestBndBook.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/TestComponent.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/TestQuotedTokenizer.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/VerifierTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/VersionPolicyTest.java
   projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/WorkspaceTest.java
Modified:
   projects/jboss-osgi/projects/aQute/trunk/bnd/.classpath
   projects/jboss-osgi/projects/aQute/trunk/bnd/pom.xml
Log:
Add bnd test cases with excludes

Modified: projects/jboss-osgi/projects/aQute/trunk/bnd/.classpath
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/.classpath	2009-09-29 20:12:47 UTC (rev 94120)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/.classpath	2009-09-29 20:13:29 UTC (rev 94121)
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry kind="src" output="target/classes" path="src/main/java"/>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
 	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
 	<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>

Modified: projects/jboss-osgi/projects/aQute/trunk/bnd/pom.xml
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/pom.xml	2009-09-29 20:12:47 UTC (rev 94120)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/pom.xml	2009-09-29 20:13:29 UTC (rev 94121)
@@ -9,8 +9,7 @@
   <!--                                                                        -->
   <!-- ====================================================================== -->
 
-  <!-- $Id: pom.xml 93592 2009-09-16 09:00:08Z thomas.diesler at jboss.com $
--->
+  <!-- $Id: pom.xml 93592 2009-09-16 09:00:08Z thomas.diesler at jboss.com $ -->
 
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
@@ -30,7 +29,7 @@
 
   <!-- Dependencies -->
   <dependencies>
-  
+
     <!-- aQute -->
     <dependency>
       <groupId>biz.aQute</groupId>
@@ -61,7 +60,7 @@
       <groupId>org.osgi</groupId>
       <artifactId>org.osgi.compendium</artifactId>
     </dependency>
-    
+
     <!-- Eclipse -->
     <dependency>
       <groupId>org.eclipse.core</groupId>
@@ -258,12 +257,12 @@
             <Bundle-Activator>aQute.bnd.plugin.Activator</Bundle-Activator>
             <Bundle-DocURL>http://www.aQute.biz/Code/Bnd</Bundle-DocURL>
             <Bundle-Copyright>
-              All files contained in this JAR are licensed under the Apache 2.0 license, 
+              All files contained in this JAR are licensed under the Apache 2.0 license,
               unless noted differently in their source (see swing2swt).
             </Bundle-Copyright>
             <Bundle-License>
-              http://www.opensource.org/licenses/apache2.0.php; 
-              description="All files contained in this JAR are licensed under the Apache 2.0 license, 
+              http://www.opensource.org/licenses/apache2.0.php;
+              description="All files contained in this JAR are licensed under the Apache 2.0 license,
               unless noted differently in their source (see swing2swt)."; link=LICENSE
             </Bundle-License>
             <Bundle-RequiredExecutionEnvironment>J2SE-1.5</Bundle-RequiredExecutionEnvironment>
@@ -326,14 +325,14 @@
               aQute.lib.osgi,aQute.libg.reporter,
               aQute.libg.sed,aQute.libg.version,
               javax.xml.parsers,
-              junit.framework, 
+              junit.framework,
               org.apache.tools.ant,
               org.apache.tools.ant.types,
               org.osgi.framework,
-              org.osgi.framework.launch, 
+              org.osgi.framework.launch,
               org.osgi.service.log,
               org.osgi.service.packageadmin,
-              org.osgi.service.permissionadmin, 
+              org.osgi.service.permissionadmin,
               org.osgi.util.tracker,
               org.w3c.dom,org.xml.sax,
               sun.security.util;resolution:=optional,
@@ -370,27 +369,62 @@
               icons,
             </Private-Package>
             <Require-Bundle>
-              org.apache.ant; resolution:=optional, 
-              org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)"; resolution:=optional, 
-              org.eclipse.debug.ui;bundle-version="[3.3.0,4.0.0)"; resolution:=optional, 
-              org.eclipse.jdt.core;bundle-version="[3.3.0,4.0.0)"; resolution:=optional, 
-              org.eclipse.jdt.debug.ui;bundle-version="[3.2.0,4.0.0)"; resolution:=optional, 
-              org.eclipse.jdt.junit;bundle-version="[3.2.0,4.0.0)"; resolution:=optional, 
-              org.eclipse.jdt.launching;bundle-version="[3.2.0,4.0.0)"; resolution:=optional, 
-              org.eclipse.jdt.ui;bundle-version="[3.3.0,4.0.0)"; resolution:=optional, 
-              org.eclipse.jface.text;bundle-version="[3.3.0,4.0.0)"; resolution:=optional, 
-              org.eclipse.ui;bundle-version="[3.3.0,4.0.0)"; resolution:=optional, 
+              org.apache.ant; resolution:=optional,
+              org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)"; resolution:=optional,
+              org.eclipse.debug.ui;bundle-version="[3.3.0,4.0.0)"; resolution:=optional,
+              org.eclipse.jdt.core;bundle-version="[3.3.0,4.0.0)"; resolution:=optional,
+              org.eclipse.jdt.debug.ui;bundle-version="[3.2.0,4.0.0)"; resolution:=optional,
+              org.eclipse.jdt.junit;bundle-version="[3.2.0,4.0.0)"; resolution:=optional,
+              org.eclipse.jdt.launching;bundle-version="[3.2.0,4.0.0)"; resolution:=optional,
+              org.eclipse.jdt.ui;bundle-version="[3.3.0,4.0.0)"; resolution:=optional,
+              org.eclipse.jface.text;bundle-version="[3.3.0,4.0.0)"; resolution:=optional,
+              org.eclipse.ui;bundle-version="[3.3.0,4.0.0)"; resolution:=optional,
               org.eclipse.ui.console; resolution:=optional,
-              org.eclipse.ui.editors;bundle-version="[3.3.0,4.0.0)"; resolution:=optional, 
-              org.eclipse.ui.ide; bundle-version="[3.3.0,4.0.0)"; resolution:=optional, 
-              org.eclipse.ui.workbench.texteditor;bundle-version="[3.3.0,4.0.0)"; resolution:=optional, 
-              org.junit; resolution:=optional, 
+              org.eclipse.ui.editors;bundle-version="[3.3.0,4.0.0)"; resolution:=optional,
+              org.eclipse.ui.ide;
+              bundle-version="[3.3.0,4.0.0)"; resolution:=optional,
+              org.eclipse.ui.workbench.texteditor;bundle-version="[3.3.0,4.0.0)"; resolution:=optional,
+              org.junit;
+              resolution:=optional, 
             </Require-Bundle>
             <Main-Class>aQute.bnd.main.bnd</Main-Class>
           </instructions>
         </configuration>
       </plugin>
+      <plugin>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <excludes>
+            <exclude>test/AnalyzerTest.java</exclude>
+            <exclude>test/AnnotationsTest.java</exclude>
+            <exclude>test/AttributesTest.java</exclude>
+            <exclude>test/BuilderTest.java</exclude>
+            <exclude>test/ClassParserTest.java</exclude>
+            <exclude>test/ClasspathTest.java</exclude>
+            <exclude>test/ClassReferenceTest.java</exclude>
+            <exclude>test/DiffTest.java</exclude>
+            <exclude>test/ExportHeaderTest.java</exclude>
+            <exclude>test/IncludeHeaderTest.java</exclude>
+            <exclude>test/InlineTest.java</exclude>
+            <exclude>test/JarTest.java</exclude>
+            <exclude>test/MacroTest.java</exclude>
+            <exclude>test/MakeTest.java</exclude>
+            <exclude>test/ManifestTest.java</exclude>
+            <exclude>test/MavenTest.java</exclude>
+            <exclude>test/MergeTest.java</exclude>
+            <exclude>test/NoUsesTest.java</exclude>
+            <exclude>test/PluginTest.java</exclude>
+            <exclude>test/ProjectTest.java</exclude>
+            <exclude>test/PropertiesTest.java</exclude>
+            <exclude>test/ResourcesTest.java</exclude>
+            <exclude>test/TestBndBook.java</exclude>
+            <exclude>test/TestComponent.java</exclude>
+            <exclude>test/VerifierTest.java</exclude>
+            <exclude>test/VersionPolicyTest.java</exclude>
+          </excludes>
+        </configuration>
+      </plugin>
     </plugins>
   </build>
-  
+
 </project>

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/AnalyzerTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/AnalyzerTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/AnalyzerTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,458 @@
+package test;
+
+import java.io.*;
+import java.util.*;
+import java.util.jar.*;
+
+import junit.framework.*;
+import aQute.lib.osgi.*;
+
+class T0 {}
+abstract class T1 extends T0 {
+}
+
+class T2 extends T1 {
+}
+
+class T3 extends T2 {
+}
+
+public class AnalyzerTest extends TestCase {
+
+    public void testMultilevelInheritance() throws Exception {
+        Analyzer a = new Analyzer();
+        a.setJar(new File("bin"));
+        a.analyze();
+
+        String result = a._classes("cmd", "named", "*T?", "extends",
+                "test.T0", "concrete");
+        System.out.println(result);
+        assertTrue(result.contains("test.T2"));
+        assertTrue(result.contains("test.T3"));
+    }
+
+    public void testClassQuery() throws Exception {
+        Analyzer a = new Analyzer();
+        a.setJar(new File("jar/osgi.jar"));
+        a.analyze();
+
+        String result = a._classes("cmd", "named", "org.osgi.service.http.*",
+                "abstract");
+        TreeSet<String> r = new TreeSet<String>(Processor.split(result));
+        assertEquals(new TreeSet<String>(Arrays.asList(
+                "org.osgi.service.http.HttpContext",
+                "org.osgi.service.http.HttpService")), r);
+    }
+
+    /**
+     * Use a private activator, check it is not imported.
+     * 
+     * @throws Exception
+     */
+    public void testEmptyHeader() throws Exception {
+        Builder a = new Builder();
+        a.setProperty("Bundle-Blueprint", "  <<EMPTY>> ");
+        a.setProperty("Export-Package", "org.osgi.framework");
+        a.addClasspath(new File("jar/osgi.jar"));
+        a.build();
+        Manifest manifest = a.getJar().getManifest();
+        System.out.println(a.getErrors());
+        System.out.println(a.getWarnings());
+        assertEquals(0, a.getErrors().size());
+        assertEquals(0, a.getWarnings().size());
+        String bb = manifest.getMainAttributes().getValue("Bundle-Blueprint");
+        System.out.println(bb);
+        assertNotNull(bb);
+        assertEquals("", bb);
+    }
+
+    /**
+     * Test name section.
+     */
+
+    public void testNameSection() throws Exception {
+        Builder a = new Builder();
+        a.setProperty("Export-Package",
+                "org.osgi.service.event, org.osgi.service.io");
+        a.addClasspath(new File("jar/osgi.jar"));
+        a.setProperty("@org at osgi@service at event@Specification-Title",
+                "spec title");
+        a.setProperty("@org at osgi@service at io@Specification-Title",
+                "spec title io");
+        a.setProperty("@org at osgi@service at event@Specification-Version", "1.1");
+        a.setProperty("@org at osgi@service at event@Implementation-Version", "5.1");
+        Jar jar = a.build();
+        Manifest m = jar.getManifest();
+        Attributes attrs = m.getAttributes("org/osgi/service/event");
+        assertNotNull(attrs);
+        assertEquals("5.1", attrs.getValue("Implementation-Version"));
+        assertEquals("1.1", attrs.getValue("Specification-Version"));
+        assertEquals("spec title", attrs.getValue("Specification-Title"));
+
+        attrs = m.getAttributes("org/osgi/service/io");
+        assertNotNull(attrs);
+        assertEquals("spec title io", attrs.getValue("Specification-Title"));
+    }
+
+    /**
+     * Check if calcManifest sets the version
+     */
+
+    /**
+     * Test if mandatory attributes are augmented even when the version is not
+     * set.
+     */
+    public void testMandatoryWithoutVersion() throws Exception {
+        Builder a = new Builder();
+        Properties p = new Properties();
+        p.put("Import-Package", "*");
+        p.put("Private-Package", "org.apache.mina.management.*");
+        a.setClasspath(new Jar[] { new Jar(new File(
+                "jar/mandatorynoversion.jar")) });
+        a.setProperties(p);
+        Jar jar = a.build();
+        String imports = jar.getManifest().getMainAttributes().getValue(
+                "Import-Package");
+        System.out.println(imports);
+        assertTrue(imports.indexOf("x=1") >= 0);
+        assertTrue(imports.indexOf("y=2") >= 0);
+    }
+
+    /**
+     * Use a private activator, check it is not imported.
+     * 
+     * @throws Exception
+     */
+    public void testPrivataBundleActivatorNotImported() throws Exception {
+        Builder a = new Builder();
+        Properties p = new Properties();
+        p.put("Import-Package", "*");
+        p.put("Private-Package", "org.objectweb.*");
+        p.put("Bundle-Activator", "org.objectweb.asm.Item");
+        a.setClasspath(new Jar[] { new Jar(new File("jar/asm.jar")) });
+        a.setProperties(p);
+        a.build();
+        Manifest manifest = a.getJar().getManifest();
+        System.out.println(a.getErrors());
+        System.out.println(a.getWarnings());
+        assertEquals(0, a.getErrors().size());
+        assertEquals(0, a.getWarnings().size());
+        String imports = manifest.getMainAttributes()
+                .getValue("Import-Package");
+        System.out.println(imports);
+        assertNull(imports);
+    }
+
+    /**
+     * Use an activator that is not in the bundle but do not allow it to be
+     * imported, this should generate an error.
+     * 
+     * @throws Exception
+     */
+    public void testBundleActivatorNotImported() throws Exception {
+        Builder a = new Builder();
+        Properties p = new Properties();
+        p.put("Import-Package", "!org.osgi.framework,*");
+        p.put("Private-Package", "org.objectweb.*");
+        p.put("Bundle-Activator", "org.osgi.framework.BundleActivator");
+        a.setClasspath(new Jar[] { new Jar(new File("jar/asm.jar")),
+                new Jar(new File("jar/osgi.jar")) });
+        a.setProperties(p);
+        a.build();
+        Manifest manifest = a.getJar().getManifest();
+        System.out.println(a.getErrors());
+        System.out.println(a.getWarnings());
+        assertEquals(1, a.getErrors().size());
+        assertTrue(a.getErrors().get(0).indexOf("Bundle-Activator not found") >= 0);
+        // assertTrue(a.getErrors().get(1).indexOf("Unresolved references to")
+        // >= 0);
+        assertEquals(0, a.getWarnings().size());
+        String imports = manifest.getMainAttributes()
+                .getValue("Import-Package");
+        assertNull(imports);
+    }
+
+    /**
+     * Use an activator that is on the class path but that is not in the bundle.
+     * 
+     * @throws Exception
+     */
+    public void testBundleActivatorImport() throws Exception {
+        Builder a = new Builder();
+        Properties p = new Properties();
+        p.put("Private-Package", "org.objectweb.*");
+        p.put("Bundle-Activator", "org.osgi.framework.BundleActivator");
+        a.setClasspath(new Jar[] { new Jar(new File("jar/asm.jar")),
+                new Jar(new File("jar/osgi.jar")) });
+        a.setProperties(p);
+        a.build();
+        Manifest manifest = a.getJar().getManifest();
+        System.out.println(a.getErrors());
+        System.out.println(a.getWarnings());
+        assertEquals(0, a.getErrors().size());
+        assertEquals(0, a.getWarnings().size());
+        String imports = manifest.getMainAttributes()
+                .getValue("Import-Package");
+        assertNotNull(imports);
+        assertTrue(imports.indexOf("org.osgi.framework") >= 0);
+    }
+
+    /**
+     * The -removeheaders header removes any necessary after the manifest is
+     * calculated.
+     */
+
+    public void testRemoveheaders() throws Exception {
+        Analyzer a = new Analyzer();
+        a.setJar(new File("jar/asm.jar"));
+        Manifest m = a.calcManifest();
+        assertNotNull(m.getMainAttributes().getValue("Implementation-Title"));
+        a = new Analyzer();
+        a.setJar(new File("jar/asm.jar"));
+        a.setProperty("-removeheaders", "Implementation-Title");
+        m = a.calcManifest();
+        assertNull(m.getMainAttributes().getValue("Implementation-Title"));
+    }
+
+    /**
+     * There was an export generated for a jar file.
+     * 
+     * @throws Exception
+     */
+    public void testExportForJar() throws Exception {
+        Jar jar = new Jar("dot");
+        jar.putResource("target/aopalliance.jar", new FileResource(new File(
+                "jar/asm.jar")));
+        Analyzer an = new Analyzer();
+        an.setJar(jar);
+        Properties p = new Properties();
+        p.put("Export-Package", "*");
+        an.setProperties(p);
+        Manifest manifest = an.calcManifest();
+        String exports = manifest.getMainAttributes().getValue(
+                Analyzer.EXPORT_PACKAGE);
+        Map<String, Map<String, String>> map = Analyzer.parseHeader(exports,
+                null);
+        assertEquals(1, map.size());
+        assertEquals("target", map.keySet().iterator().next());
+    }
+
+    /**
+     * asm is a simple library with two packages. No imports are done.
+     * 
+     */
+    public void testAsm3() throws Exception {
+        Properties p = Analyzer.getManifest(new File("jar/asm.jar"));
+        String imports = p.getProperty(Analyzer.IMPORT_PACKAGE);
+        String exports = p.getProperty(Analyzer.EXPORT_PACKAGE);
+
+        assertTrue(exports.indexOf("org.objectweb.asm.signature") >= 0);
+        assertTrue(exports.indexOf("org.objectweb.asm") >= 0);
+        assertTrue(imports.indexOf("org.objectweb.asm.signature") >= 0);
+        assertTrue(imports.indexOf("org.objectweb.asm") >= 0);
+    }
+
+    /**
+     * Test if version works
+     */
+
+    public void testVersion() {
+        Analyzer a = new Analyzer();
+        String v = a.getVersion();
+        assertNotNull(v);
+    }
+
+    /**
+     * asm is a simple library with two packages. No imports are done.
+     * 
+     */
+    public void testAsm() throws Exception {
+        Properties base = new Properties();
+        base.put(Analyzer.IMPORT_PACKAGE, "*");
+        base.put(Analyzer.EXPORT_PACKAGE, "*;-noimport:=true");
+
+        Analyzer analyzer = new Analyzer();
+        analyzer.setJar(new File("jar/asm.jar"));
+        analyzer.setProperties(base);
+        analyzer.calcManifest().write(System.out);
+        assertTrue(analyzer.getExports().containsKey(
+                "org.objectweb.asm.signature"));
+        assertTrue(analyzer.getExports().containsKey("org.objectweb.asm"));
+        assertFalse(analyzer.getImports().containsKey(
+                "org.objectweb.asm.signature"));
+        assertFalse(analyzer.getImports().containsKey("org.objectweb.asm"));
+        assertEquals("Expected size", 2, analyzer.getExports().size());
+    }
+
+    /**
+     * See if we set attributes on export
+     * 
+     * @throws IOException
+     */
+    public void testAsm2() throws IOException {
+        Properties base = new Properties();
+        base.put(Analyzer.IMPORT_PACKAGE, "*");
+        base
+                .put(Analyzer.EXPORT_PACKAGE,
+                        "org.objectweb.asm;name=short, org.objectweb.asm.signature;name=long");
+        Analyzer h = new Analyzer();
+        h.setJar(new File("jar/asm.jar"));
+        h.setProperties(base);
+        h.calcManifest().write(System.out);
+        assertPresent(h.getExports(),
+                "org.objectweb.asm.signature, org.objectweb.asm");
+        assertPresent(h.getImports(),
+                "org.objectweb.asm.signature, org.objectweb.asm");
+        assertEquals("Expected size", 2, h.getExports().size());
+        assertEquals("short", get(h.getExports(), "org.objectweb.asm", "name"));
+        assertEquals("long", get(h.getExports(), "org.objectweb.asm.signature",
+                "name"));
+    }
+
+    public void testDs() throws IOException {
+        Properties base = new Properties();
+        base.put(Analyzer.IMPORT_PACKAGE, "*");
+        base.put(Analyzer.EXPORT_PACKAGE, "*;-noimport:=true");
+        File tmp = new File("jar/ds.jar");
+        Analyzer analyzer = new Analyzer();
+        analyzer.setJar(tmp);
+        analyzer.setProperties(base);
+        System.out.println(analyzer.calcManifest());
+        assertPresent(analyzer.getImports(), "org.osgi.service.packageadmin, "
+                + "org.xml.sax, org.osgi.service.log," + " javax.xml.parsers,"
+                + " org.xml.sax.helpers," + " org.osgi.framework,"
+                + " org.eclipse.osgi.util," + " org.osgi.util.tracker, "
+                + "org.osgi.service.component, " + "org.osgi.service.cm");
+        assertPresent(analyzer.getExports(), "org.eclipse.equinox.ds.parser, "
+                + "org.eclipse.equinox.ds.tracker, "
+                + "org.eclipse.equinox.ds, "
+                + "org.eclipse.equinox.ds.instance, "
+                + "org.eclipse.equinox.ds.model, "
+                + "org.eclipse.equinox.ds.resolver, "
+                + "org.eclipse.equinox.ds.workqueue");
+
+    }
+
+    public void testDsSkipOsgiImport() throws IOException {
+        Properties base = new Properties();
+        base.put(Analyzer.IMPORT_PACKAGE, "!org.osgi.*, *");
+        base.put(Analyzer.EXPORT_PACKAGE, "*;-noimport:=true");
+        File tmp = new File("jar/ds.jar");
+        Analyzer h = new Analyzer();
+        h.setJar(tmp);
+        h.setProperties(base);
+        h.calcManifest().write(System.out);
+        assertPresent(h.getImports(), "org.xml.sax, " + " javax.xml.parsers,"
+                + " org.xml.sax.helpers," + " org.eclipse.osgi.util");
+
+        System.out.println("IMports " + h.getImports());
+        assertNotPresent(h.getImports(), "org.osgi.service.packageadmin, "
+                + "org.osgi.service.log," + " org.osgi.framework,"
+                + " org.osgi.util.tracker, " + "org.osgi.service.component, "
+                + "org.osgi.service.cm");
+        assertPresent(h.getExports(), "org.eclipse.equinox.ds.parser, "
+                + "org.eclipse.equinox.ds.tracker, "
+                + "org.eclipse.equinox.ds, "
+                + "org.eclipse.equinox.ds.instance, "
+                + "org.eclipse.equinox.ds.model, "
+                + "org.eclipse.equinox.ds.resolver, "
+                + "org.eclipse.equinox.ds.workqueue");
+    }
+
+    public void testDsNoExport() throws IOException {
+        Properties base = new Properties();
+        base.put(Analyzer.IMPORT_PACKAGE, "*");
+        base.put(Analyzer.EXPORT_PACKAGE, "!*");
+        File tmp = new File("jar/ds.jar");
+        Analyzer h = new Analyzer();
+        h.setJar(tmp);
+        h.setProperties(base);
+        h.calcManifest().write(System.out);
+        assertPresent(h.getImports(), "org.osgi.service.packageadmin, "
+                + "org.xml.sax, org.osgi.service.log," + " javax.xml.parsers,"
+                + " org.xml.sax.helpers," + " org.osgi.framework,"
+                + " org.eclipse.osgi.util," + " org.osgi.util.tracker, "
+                + "org.osgi.service.component, " + "org.osgi.service.cm");
+        assertNotPresent(h.getExports(), "org.eclipse.equinox.ds.parser, "
+                + "org.eclipse.equinox.ds.tracker, "
+                + "org.eclipse.equinox.ds, "
+                + "org.eclipse.equinox.ds.instance, "
+                + "org.eclipse.equinox.ds.model, "
+                + "org.eclipse.equinox.ds.resolver, "
+                + "org.eclipse.equinox.ds.workqueue");
+        System.out.println(h.getUnreachable());
+    }
+
+    public void testClasspath() throws IOException {
+        Properties base = new Properties();
+        base.put(Analyzer.IMPORT_PACKAGE, "*");
+        base.put(Analyzer.EXPORT_PACKAGE, "*;-noimport:=true");
+        File tmp = new File("jar/ds.jar");
+        File osgi = new File("jar/osgi.jar");
+        Analyzer h = new Analyzer();
+        h.setJar(tmp);
+        h.setProperties(base);
+        h.setClasspath(new File[] { osgi });
+        h.calcManifest().write(System.out);
+        assertEquals("Version from osgi.jar", "1.2", get(h.getImports(),
+                "org.osgi.service.packageadmin", "version"));
+        assertEquals("Version from osgi.jar", "1.3", get(h.getImports(),
+                "org.osgi.util.tracker", "version"));
+        assertEquals("Version from osgi.jar", null, get(h.getImports(),
+                "org.xml.sax", "version"));
+
+    }
+
+    /**
+     * We detect that there are instruction on im/export package headers that
+     * are never used. This usually indicates a misunderstanding or a change in
+     * the underlying classpath. These are reflected as warnings. If there is an
+     * extra import, and it contains no wildcards, then it is treated as a
+     * wildcard
+     * 
+     * @throws IOException
+     */
+    public void testSuperfluous() throws IOException {
+        Properties base = new Properties();
+        base.put(Analyzer.IMPORT_PACKAGE, "*, com.foo, com.foo.bar.*");
+        base.put(Analyzer.EXPORT_PACKAGE, "*, com.bar");
+        File tmp = new File("jar/ds.jar");
+        Analyzer h = new Analyzer();
+        h.setJar(tmp);
+        h.setProperties(base);
+        h.calcManifest().write(System.out);
+        List<String> warnings = h.getWarnings();
+        assertEquals(warnings.size(), 2);
+        assertEquals("Superfluous export-package instructions: [com.bar]",
+                warnings.get(0));
+        assertEquals("Did not find matching referal for com.foo.bar.*",
+                warnings.get(1));
+        assertTrue(h.getImports().containsKey("com.foo"));
+    }
+
+    void assertNotPresent(Map<String, ?> map, String string) {
+        StringTokenizer st = new StringTokenizer(string, ", ");
+        while (st.hasMoreTokens()) {
+            String packageName = st.nextToken();
+            assertFalse("Must not contain package " + packageName, map
+                    .containsKey(packageName));
+        }
+    }
+
+    void assertPresent(Map<String, ?> map, String string) {
+        StringTokenizer st = new StringTokenizer(string, ", ");
+        while (st.hasMoreTokens()) {
+            String packageName = st.nextToken();
+            assertTrue("Must contain package " + packageName, map
+                    .containsKey(packageName));
+        }
+    }
+
+    String get(Map<String, Map<String, String>> headers, String packageName,
+            String attr) {
+        Map<String, String> clauses = headers.get(packageName);
+        if (clauses == null)
+            return null;
+        return (String) clauses.get(attr);
+    }
+}


Property changes on: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/AnalyzerTest.java
___________________________________________________________________
Name: svn:executable
   + *

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/AnnotationsTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/AnnotationsTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/AnnotationsTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,115 @@
+package test;
+
+import java.io.*;
+import java.util.*;
+import java.util.jar.*;
+
+import junit.framework.*;
+
+import org.osgi.service.log.*;
+
+import aQute.bnd.annotation.*;
+import aQute.bnd.make.*;
+import aQute.lib.osgi.*;
+
+public class AnnotationsTest extends TestCase {
+    
+    @Component(name="mycomp", enabled=true, factory="usb", immediate=false, provides=LogService.class, serviceFactory=true)
+    static class MyComponent implements Serializable {        
+        private static final long serialVersionUID = 1L;
+        LogService log;
+        
+        @Activate
+        void activate() {            
+        }
+        @Reference(type='~')
+        void setLog(LogService log) {
+            this.log = log;
+        }
+        @Unreference
+        void unsetLog(LogService log) {
+            this.log = null;
+        }
+    }
+
+    
+    public void testComponentReader() throws Exception {
+        File f = new File("bin/test/AnnotationsTest$MyComponent.class");
+        ComponentDef def = AnnotationReader.getComponentDef(f);
+        
+        def.append(System.out);
+        System.out.println();
+        
+    }
+    
+    public void testComponentAnnotation() throws Exception {
+        Builder b = new Builder();
+        b.setProperty("Private-Package", "test");
+        b.addClasspath( new File("bin"));
+        Jar jar = b.build();
+        
+        Manifest m = jar.getManifest();
+        // assert
+    }
+
+    public void testSimple() throws Exception {
+        Clazz clazz = new Clazz("", null);
+        ClassDataCollector cd = new ClassDataCollector() {
+            public void addReference(String token) {
+            }
+
+            public void annotation(Annotation annotation) {
+                System.out.println("Annotation " + annotation);
+            }
+
+            public void classBegin(int access, String name) {
+                System.out.println("Class " + name);
+            }
+
+            public void classEnd() {
+                System.out.println("Class end ");
+            }
+
+            public void extendsClass(String name) {
+                System.out.println("extends " + name);                
+            }
+
+            public void field(int access, String descriptor) {
+                System.out.println("field " + descriptor);
+            }
+
+            public void implementsInterfaces(String[] name) {
+                System.out.println("implements " + Arrays.toString(name));
+                
+            }
+
+            public void constructor(int access, String descriptor) {
+                System.out.println("constructor " + descriptor);
+            }
+
+            public void method(int access, String name, String descriptor) {
+                System.out.println("method " + name + descriptor);
+            }
+
+            public void parameter(int p) {
+                System.out.println("parameter " + p);
+            }
+            
+        };
+        
+        clazz.parseClassFile(getClass().getResourceAsStream("Target.class"), cd);
+    }
+}
+
+ at Component
+class Target {
+    @Activate
+    void activate() {
+        
+    }
+    
+    @Reference
+    void setLog(LogService log) {
+        
+    }
+}

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/AttributesTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/AttributesTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/AttributesTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,139 @@
+package test;
+
+import java.io.*;
+import java.util.*;
+import java.util.jar.*;
+
+import junit.framework.*;
+import aQute.lib.osgi.*;
+
+public class AttributesTest extends TestCase {
+
+	/**
+	 * Remove a version attribute 
+	 * 
+	 * A mandatory attribute adds the common and tst properties to the
+	 * import. We remove them using remove:=*
+	 * @throws Exception
+	 */
+	public void testRemoveDirective() throws Exception {
+		Jar javax  = new Jar("test");
+		Manifest m = new Manifest();
+		m.getMainAttributes().putValue("Export-Package", "javax.microedition.io;a1=exp-1;a2=exp-2;a3=exp-3;x1=x1;x2=x2;x3=x3;mandatory:=\"a1,a2,a3,x1,x2,x3\"");
+		javax.setManifest(m);
+		
+		Jar cp[] = { javax, new Jar(new File("jar/osgi.jar")) };
+		Builder bmaker = new Builder();
+		Properties p = new Properties();
+		p.put("Import-Package", "javax.microedition.io;-remove-attribute:=a1|x?;a2=imp-2,*");
+		p.put("Export-Package", "org.osgi.service.io");
+		bmaker.setClasspath(cp);
+		bmaker.setProperties(p);
+		Jar jar = bmaker.build();
+		// System.out.println(bmaker.getExports());
+		System.out.println("Warnings: " + bmaker.getWarnings());
+		System.out.println("Errors  : " + bmaker.getErrors());
+		jar.getManifest().write(System.out);
+		Manifest manifest = jar.getManifest();
+		Attributes main = manifest.getMainAttributes();
+		String imprt = main.getValue("Import-Package");
+		assertNotNull("Import package header", imprt );
+		Map<String,Map<String,String>> map = Processor.parseHeader(imprt, null);
+		Map<String,String> attrs = map.get("javax.microedition.io");
+		assertNotNull(attrs);
+		assertNull(attrs.get("a1"));
+		assertNull(attrs.get("x1"));
+		assertNull(attrs.get("x2"));
+		assertNull(attrs.get("x3"));
+		assertEquals("imp-2", attrs.get("a2"));
+		assertEquals("exp-3", attrs.get("a3"));
+	}
+
+	/**
+	 * Remove a version attribute 
+	 * 
+	 * @throws Exception
+	 */
+	public void testRemoveAttribute() throws Exception {
+		Jar javax  = new Jar("test");
+		Manifest m = new Manifest();
+		m.getMainAttributes().putValue("Export-Package", "javax.microedition.io;common=split;test=abc;mandatory:=\"common,test\"");
+		javax.setManifest(m);
+		
+		Jar cp[] = { javax, new Jar(new File("jar/osgi.jar")) };
+		Builder bmaker = new Builder();
+		Properties p = new Properties();
+		p.put("Import-Package", "javax.microedition.io;common=!;test=abc,*");
+		p.put("Export-Package", "org.osgi.service.io");
+		bmaker.setClasspath(cp);
+		bmaker.setProperties(p);
+		Jar jar = bmaker.build();
+		System.out.println(jar.getResources());
+		// System.out.println(bmaker.getExports());
+		System.out.println("Warnings: " + bmaker.getWarnings());
+		System.out.println("Errors  : " + bmaker.getErrors());
+		jar.getManifest().write(System.out);
+		Manifest manifest = jar.getManifest();
+		Attributes main = manifest.getMainAttributes();
+		String imprt = main.getValue("Import-Package");
+		assertNotNull("Import package header", imprt );
+		Map<String,Map<String,String>> map = Processor.parseHeader(imprt, null);
+		Map<String,String> attrs = map.get("javax.microedition.io");
+		assertNotNull(attrs);
+		assertNull(attrs.get("common"));
+	}
+	
+	/**
+	 * Override a version attribute 
+	 * 
+	 * @throws Exception
+	 */
+	public void testOverrideAttribute() throws Exception {
+		File cp[] = { new File("jar/osgi.jar") };
+		Builder bmaker = new Builder();
+		Properties p = new Properties();
+		p.put("Export-Package", "org.osgi.framework;version=1.1");
+		bmaker.setClasspath(cp);
+		bmaker.setProperties(p);
+		Jar jar = bmaker.build();
+		System.out.println(jar.getResources());
+		// System.out.println(bmaker.getExports());
+		System.out.println("Warnings: " + bmaker.getWarnings());
+		System.out.println("Errors  : " + bmaker.getErrors());
+		jar.getManifest().write(System.out);
+		Manifest manifest = jar.getManifest();
+		Attributes main = manifest.getMainAttributes();
+		String export = main.getValue("Export-Package");
+		assertNotNull("Export package header", export );
+		Map<String,Map<String,String>> map = Processor.parseHeader(export, null);
+		assertEquals( "1.1", map.get("org.osgi.framework").get("version"));
+	}
+
+	
+	/**
+	 * See if we inherit the version from the osgi.jar file.
+	 * 
+	 * @throws Exception
+	 */
+	public void testSimple() throws Exception {
+		File cp[] = { new File("jar/osgi.jar") };
+		Builder bmaker = new Builder();
+		Properties p = new Properties();
+		p.put("Export-Package", "org.osgi.framework");
+		bmaker.setClasspath(cp);
+		bmaker.setProperties(p);
+		Jar jar = bmaker.build();
+		System.out.println(jar.getResources());
+		// System.out.println(bmaker.getExports());
+		System.out.println("Warnings: " + bmaker.getWarnings());
+		System.out.println("Errors  : " + bmaker.getErrors());
+		jar.getManifest().write(System.out);
+		Manifest manifest = jar.getManifest();
+		Attributes main = manifest.getMainAttributes();
+		String export = main.getValue("Export-Package");
+		assertNotNull("Export package header", export );
+		Map<String,Map<String,String>> map = Processor.parseHeader(export, null);
+		assertEquals( "1.3", map.get("org.osgi.framework").get("version"));
+	}
+
+}

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/BuilderTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/BuilderTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/BuilderTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,1137 @@
+package test;
+
+import java.io.*;
+import java.util.*;
+import java.util.jar.*;
+
+import junit.framework.*;
+import aQute.lib.osgi.*;
+
+public class BuilderTest extends TestCase {
+
+    public void testExtra() throws Exception {
+        Builder b = new Builder();
+        b
+                .setProperty("Include-Resource",
+                        "jar/osgi.jar;extra=itworks, www/xyz.jar=jar/osgi.jar;extra='italsoworks'");
+        b.setProperty("-resourceonly", "true");
+        Jar jar = b.build();
+        Resource r = jar.getResource("osgi.jar");
+        assertNotNull(r);
+        assertEquals("itworks", r.getExtra());
+        Resource r2 = jar.getResource("www/xyz.jar");
+        assertNotNull(r2);
+        assertEquals("italsoworks", r2.getExtra());
+    }
+
+    /**
+     * Create a jar with something in the default package.
+     */
+
+    public void testIncludeDefaultPackage() {
+        Builder b = new Builder();
+        b.setProperty("Private-Package", ".");
+    }
+
+    /**
+     * Got a split package warning during verify when private overlaps with
+     * export
+     */
+    public void testSplitWhenPrivateOverlapsExport() throws Exception {
+        Builder b = new Builder();
+        b.addClasspath(new File("jar/osgi.jar"));
+        b.setProperty("Private-Package", "org.osgi.service.*");
+        b.setProperty("Export-Package", "org.osgi.service.event");
+        b.build();
+        ok(b);
+    }
+
+    static void ok(Processor p) {
+        System.out.println("Errors  " + p.getErrors());
+        System.out.println("Warnings  " + p.getWarnings());
+        assertEquals(0, p.getErrors().size());
+        assertEquals(0, p.getWarnings().size());
+    }
+
+    public void testMacroBasedExpansion() throws Exception {
+        Processor proc = new Processor();
+
+        Builder builder = new Builder(proc);
+        builder.setProperty("Export-Package", "${spec.packages}");
+        proc.setProperty("spec.packages",
+                "${core.packages}, ${cmpn.packages}, ${mobile.packages}");
+        proc
+                .setProperty("core.specs",
+                        "org.osgi.service.packageadmin, org.osgi.service.permissionadmin");
+        proc.setProperty("core.packages", "${replace;${core.specs};.+;$0.*}");
+        proc.setProperty("cmpn.specs",
+                "org.osgi.service.event, org.osgi.service.cu");
+        proc.setProperty("cmpn.packages", "${replace;${cmpn.specs};.+;$0.*}");
+        proc
+                .setProperty("mobile.specs",
+                        "org.osgi.service.wireadmin, org.osgi.service.log, org.osgi.service.cu");
+        proc.setProperty("mobile.packages",
+                "${replace;${mobile.specs};.+;$0.*}");
+        builder.addClasspath(new File("jar/osgi.jar"));
+
+        Jar jar = builder.build();
+
+        System.out.println("Warnings: " + builder.getWarnings());
+        System.out.println("Errors  : " + builder.getErrors());
+        assertEquals(1, builder.getErrors().size());
+        assertEquals(0, builder.getWarnings().size());
+        assertTrue(builder.getErrors().get(0).contains("service.cu.*"));
+        Manifest m = jar.getManifest();
+        String exports = m.getMainAttributes().getValue("Export-Package");
+        System.out.println(exports);
+        assertTrue(exports.contains("*"));
+    }
+
+    /**
+     * Make resolution dependent on the fact that a package is on the classpath
+     * or not
+     */
+
+    public void testConditionalResolution() throws Exception {
+        Builder b = new Builder();
+        b.setProperty("res",
+                "${if;${exporters;${@package}};mandatory;optional}");
+        b.setProperty("Import-Package", "*;resolution:=\\${res}");
+        b.setProperty("Export-Package",
+                "org.osgi.service.io, org.osgi.service.log");
+        b.addClasspath(new File("jar/osgi.jar"));
+        b.build();
+
+        Map<String, String> ioimports = b.getImports().get(
+                "javax.microedition.io");
+        Map<String, String> fwimports = b.getImports()
+                .get("org.osgi.framework");
+
+        assertNotNull(ioimports);
+        assertNotNull(fwimports);
+        assertTrue(ioimports.containsKey("resolution:"));
+        assertTrue(fwimports.containsKey("resolution:"));
+        assertEquals("optional", ioimports.get("resolution:"));
+        assertEquals("mandatory", fwimports.get("resolution:"));
+    }
+
+    /**
+     * Test private imports. We first build a jar with a import:=private packge.
+     * Then place it
+     * 
+     * @throws Exception
+     */
+
+    // public void testPrivateImport() throws Exception {
+    // Builder b = new Builder();
+    // b.addClasspath(new File("jar/osgi.jar"));
+    // b
+    // .setProperty("Export-Package",
+    // "org.osgi.service.cm;-import:=private,
+    // org.osgi.framework;-import:=private");
+    // Jar osgi = b.build();
+    // assertTrue(osgi.hasDirectory("org/osgi/framework"));
+    // assertTrue(osgi.hasDirectory("org/osgi/service/cm"));
+    // System.out.println("export " +
+    // b.getExports().get("org.osgi.service.cm"));
+    // assertTrue(b.getExports().get("org.osgi.service.cm").containsKey(Constants.IMPORT_DIRECTIVE));
+    // assertTrue(b.getExports().get("org.osgi.framework").containsKey(Constants.IMPORT_DIRECTIVE));
+    //        
+    // Builder c = new Builder();
+    // c.addClasspath(osgi);
+    // c.addClasspath(new File("bin"));
+    // c.setProperty("Private-Package", "test.privateimport");
+    // Jar pi = c.build();
+    //        
+    // assertTrue(pi.getDirectories().containsKey("org/osgi/framework"));
+    // assertTrue(pi.getDirectories().containsKey("org/osgi/service/cm"));
+    // assertEquals("no error", 0, b.getErrors().size());
+    // assertEquals("no error", 0, c.getErrors().size());
+    // assertEquals("no warning", 0, b.getWarnings().size());
+    // assertEquals("no warning", 0, c.getWarnings().size());
+    // }
+    public void testClassnames() throws Exception {
+        Builder b = new Builder();
+        b.addClasspath(new File("jar/osgi.jar"));
+        b.addClasspath(new File("jar/ds.jar"));
+        b.addClasspath(new File("jar/ifc112.jar"));
+        b.setProperty("Export-Package", "*");
+        b.setProperty("C1",
+                "${classes;implementing;org.osgi.service.component.*}");
+        b.setProperty("C2", "${classes;extending;org.xml.sax.helpers.*}");
+        b.setProperty("C3", "${classes;importing;org.xml.sax}");
+        b.setProperty("C3", "${classes;importing;org.xml.sax}");
+        b.setProperty("C4", "${classes;named;*Parser*}");
+        b.setProperty("C5", "${classes;named;*Parser*;version;45.*}");
+        Jar jar = b.build();
+        Manifest m = jar.getManifest();
+        Attributes main = m.getMainAttributes();
+        assertList(
+                asl("org.eclipse.equinox.ds.service.ComponentContextImpl,org.eclipse.equinox.ds.service.ComponentFactoryImpl,org.eclipse.equinox.ds.service.ComponentInstanceImpl"),
+                asl(main.getValue("C1")));
+        assertList(asl("org.eclipse.equinox.ds.parser.ElementHandler, "
+                + "org.eclipse.equinox.ds.parser.IgnoredElement,"
+                + "org.eclipse.equinox.ds.parser.ImplementationElement,"
+                + "org.eclipse.equinox.ds.parser.ParserHandler, "
+                + "org.eclipse.equinox.ds.parser.PropertiesElement,"
+                + "org.eclipse.equinox.ds.parser.PropertyElement, "
+                + "org.eclipse.equinox.ds.parser.ProvideElement, "
+                + "org.eclipse.equinox.ds.parser.ReferenceElement, "
+                + "org.eclipse.equinox.ds.parser.ServiceElement,"
+                + "org.eclipse.equinox.ds.parser.ComponentElement"), asl(main
+                .getValue("C2")));
+        assertList(
+                asl("org.eclipse.equinox.ds.parser.ComponentElement,org.eclipse.equinox.ds.parser.ElementHandler,org.eclipse.equinox.ds.parser.IgnoredElement,org.eclipse.equinox.ds.parser.ImplementationElement,org.eclipse.equinox.ds.parser.Parser,org.eclipse.equinox.ds.parser.ParserHandler,org.eclipse.equinox.ds.parser.PropertiesElement,org.eclipse.equinox.ds.parser.PropertyElement,org.eclipse.equinox.ds.parser.ProvideElement,org.eclipse.equinox.ds.parser.ReferenceElement,org.eclipse.equinox.ds.parser.ServiceElement"),
+                asl(main.getValue("C3")));
+        assertList(
+                asl("org.eclipse.equinox.ds.parser.XMLParserNotAvailableException,org.eclipse.equinox.ds.parser.Parser,org.eclipse.equinox.ds.parser.ParserHandler,netscape.application.HTMLParser,org.eclipse.equinox.ds.parser.ParserConstants,org.osgi.util.xml.XMLParserActivator"),
+                asl(main.getValue("C4")));
+        assertEquals("netscape.application.HTMLParser", main.getValue("C5"));
+    }
+
+    void assertList(Collection<String> a, Collection<String> b) {
+        List<String> onlyInA = new ArrayList<String>();
+        onlyInA.addAll(a);
+        onlyInA.removeAll(b);
+
+        List<String> onlyInB = new ArrayList<String>();
+        onlyInB.addAll(b);
+        onlyInB.removeAll(a);
+
+        if (onlyInA.isEmpty() && onlyInB.isEmpty())
+            return;
+
+        fail("Lists are not equal, only in A: " + onlyInA
+                + ",\n   and only in B: " + onlyInB);
+    }
+
+    Collection<String> asl(String s) {
+        return new TreeSet<String>(Processor.split(s));
+    }
+
+    public void testImportMicroNotTruncated() throws Exception {
+        Builder b = new Builder();
+        b.addClasspath(new File("jar/osgi.jar"));
+        b.setProperty("Import-Package", "org.osgi.service.event;version=${@}");
+        b.build();
+        String s = b.getImports().get("org.osgi.service.event").get("version");
+        assertEquals("1.0.1", s);
+    }
+
+    public void testImportMicroTruncated() throws Exception {
+        Builder b = new Builder();
+        b.addClasspath(new File("jar/osgi.jar"));
+        b.setProperty("Import-Package", "org.osgi.service.event");
+        b.build();
+        String s = b.getImports().get("org.osgi.service.event").get("version");
+        assertEquals("1.0", s);
+    }
+
+    /*
+     * Bnd must expand the bnd.info file in a package.
+     */
+    public void testBndInfo() throws Exception {
+        Builder b = new Builder();
+        b.addClasspath(new File("bin"));
+        b.setProperty("Export-Package", "test");
+        b.setProperty("a", "aaa");
+        Jar jar = b.build();
+
+        Resource r = jar.getResource("test/bnd.info");
+        Properties bndinfo = new Properties();
+        InputStream in = r.openInputStream();
+        bndinfo.load(in);
+        in.close();
+        assertEquals("aaa", bndinfo.getProperty("a"));
+        assertEquals("${b}", bndinfo.getProperty("b"));
+    }
+
+    public void testMultipleExport2() throws Exception {
+        File cp[] = { new File("jar/asm.jar") };
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.setProperty("Import-Package", "*");
+        p
+                .setProperty(
+                        "Export-Package",
+                        "org.objectweb.asm;version=1.1, org.objectweb.asm~;version=1.2, org.objectweb.asm~~;version=1.3");
+        bmaker.setProperties(p);
+        bmaker.setClasspath(cp);
+        Jar jar = bmaker.build();
+        System.out.println(jar.getResources());
+        // System.out.println(bmaker.getExports());
+        System.out.println("Warnings: " + bmaker.getWarnings());
+        System.out.println("Errors  : " + bmaker.getErrors());
+        jar.getManifest().write(System.out);
+        System.out.println("Warnings " + bmaker.getWarnings());
+        System.out.println("Errors   " + bmaker.getErrors());
+        assertEquals(0, bmaker.getWarnings().size());
+        assertEquals(0, bmaker.getErrors().size());
+        Manifest m = jar.getManifest();
+        String ip = m.getMainAttributes().getValue("Export-Package");
+        assertTrue(ip.indexOf("org.objectweb.asm;version=\"1.1\"") >= 0);
+        assertTrue(ip.indexOf("org.objectweb.asm;version=\"1.2\"") >= 0);
+        assertTrue(ip.indexOf("org.objectweb.asm;version=\"1.3\"") >= 0);
+    }
+
+    public void testBsnAssignmentNoFile() throws Exception {
+        Properties p = new Properties();
+        p.setProperty("Private-Package", "org.objectweb.asm");
+        Attributes m = setup(p, null).getMainAttributes();
+
+        // We use properties so the default BSN is then the project name
+        // because that is the base directory
+        assertEquals(m.getValue("Bundle-SymbolicName"), "aQute.bnd");
+
+        // The file name for the properties is not bnd.bnd, so the
+        // name of the properties file is the default bsn
+        m = setup(null, new File("src/test/com.acme/defaultbsn.bnd"))
+                .getMainAttributes();
+        assertEquals("defaultbsn", m.getValue("Bundle-SymbolicName"));
+
+        // If the file is called bnd.bnd, then we take the parent directory
+        m = setup(null, new File("src/test/com.acme/bnd.bnd"))
+                .getMainAttributes();
+        assertEquals("com.acme", m.getValue("Bundle-SymbolicName"));
+
+        // If the file is called bnd.bnd, then we take the parent directory
+        m = setup(null, new File("src/test/com.acme/setsbsn.bnd"))
+                .getMainAttributes();
+        assertEquals("is.a.set.bsn", m.getValue("Bundle-SymbolicName"));
+
+        // This sets the bsn, se we should see it back
+        p.setProperty("Bundle-SymbolicName", "this.is.my.test");
+        m = setup(p, null).getMainAttributes();
+        assertEquals(m.getValue("Bundle-SymbolicName"), "this.is.my.test");
+    }
+
+    public Manifest setup(Properties p, File f) throws Exception {
+        File cp[] = { new File("jar/asm.jar") };
+        Builder bmaker = new Builder();
+        if (f != null)
+            bmaker.setProperties(f);
+        else
+            bmaker.setProperties(p);
+        bmaker.setClasspath(cp);
+        Jar jar = bmaker.build();
+        System.out.println(jar.getResources());
+        // System.out.println(bmaker.getExports());
+        System.out.println("Warnings: " + bmaker.getWarnings());
+        System.out.println("Errors  : " + bmaker.getErrors());
+        jar.getManifest().write(System.out);
+        assertEquals(0, bmaker.getWarnings().size());
+        assertEquals(0, bmaker.getErrors().size());
+        Manifest m = jar.getManifest();
+        return m;
+    }
+
+    public void testDuplicateExport() throws Exception {
+        File cp[] = { new File("jar/asm.jar") };
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.setProperty("Import-Package", "*");
+        p.setProperty("Export-Package",
+                "org.*;version=1.2,org.objectweb.asm~;version=1.3");
+        bmaker.setProperties(p);
+        bmaker.setClasspath(cp);
+        Jar jar = bmaker.build();
+        System.out.println(jar.getResources());
+        // System.out.println(bmaker.getExports());
+        System.out.println("Warnings: " + bmaker.getWarnings());
+        System.out.println("Errors  : " + bmaker.getErrors());
+        jar.getManifest().write(System.out);
+        assertEquals(0, bmaker.getWarnings().size());
+        assertEquals(0, bmaker.getErrors().size());
+        Manifest m = jar.getManifest();
+        String ip = m.getMainAttributes().getValue("Export-Package");
+        assertTrue(ip.indexOf("org.objectweb.asm;version=\"1.2\"") >= 0);
+    }
+
+    public void testNoExport() throws Exception {
+        File cp[] = { new File("jar/asm.jar") };
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.setProperty("Import-Package", "*");
+        p.setProperty("Export-Package", "org.*'");
+        bmaker.setProperties(p);
+        bmaker.setClasspath(cp);
+        Jar jar = bmaker.build();
+        System.out.println(jar.getResources());
+        // System.out.println(bmaker.getExports());
+        System.out.println("Warnings: " + bmaker.getWarnings());
+        System.out.println("Errors  : " + bmaker.getErrors());
+        jar.getManifest().write(System.out);
+        assertEquals(0, bmaker.getWarnings().size());
+        assertEquals(0, bmaker.getErrors().size());
+        Manifest m = jar.getManifest();
+        String ip = m.getMainAttributes().getValue("Export-Package");
+        assertTrue(ip.indexOf("org.objectweb.asm") >= 0);
+    }
+
+    public void testHardcodedImport() throws Exception {
+        File cp[] = { new File("jar/asm.jar") };
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.setProperty("Import-Package", "whatever,*");
+        p.setProperty("Export-Package", "org.*");
+        bmaker.setProperties(p);
+        bmaker.setClasspath(cp);
+        Jar jar = bmaker.build();
+        System.out.println(jar.getResources());
+        // System.out.println(bmaker.getExports());
+        System.out.println("Warnings: " + bmaker.getWarnings());
+        System.out.println("Errors  : " + bmaker.getErrors());
+        jar.getManifest().write(System.out);
+        assertEquals(0, bmaker.getWarnings().size());
+        assertEquals(0, bmaker.getErrors().size());
+        Manifest m = jar.getManifest();
+        String ip = m.getMainAttributes().getValue("Import-Package");
+        assertTrue(ip.indexOf("whatever") >= 0);
+    }
+
+    public void testCopyDirectory() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.setProperty("-resourceonly", "true");
+        p.setProperty("Include-Resource", "bnd=bnd");
+        bmaker.setProperties(p);
+        Jar jar = bmaker.build();
+        Map<String, Resource> map = jar.getDirectories().get("bnd");
+        assertNotNull(map);
+        assertEquals(2, map.size());
+        assertEquals(0, bmaker.getErrors().size());
+        assertEquals(0, bmaker.getWarnings().size());
+    }
+
+    /**
+     * There is an error that gives a split package when you export a package
+     * that is also private I think.
+     * 
+     * @throws Exception
+     */
+    public void testSplitOnExportAndPrivate() throws Exception {
+        File cp[] = { new File("jar/asm.jar") };
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.setProperty("Export-Package", "org.objectweb.asm.signature");
+        p.setProperty("Private-Package", "org.objectweb.asm");
+        bmaker.setProperties(p);
+        bmaker.setClasspath(cp);
+        bmaker.build();
+        System.out.println("Warnings: " + bmaker.getWarnings());
+        System.out.println("Errors  : " + bmaker.getErrors());
+        assertEquals(0, bmaker.getWarnings().size());
+        assertEquals(0, bmaker.getErrors().size());
+    }
+
+    public void testConduit() throws Exception {
+        Properties p = new Properties();
+        p.setProperty("-conduit", "jar/asm.jar");
+        Builder b = new Builder();
+        b.setProperties(p);
+        Jar jars[] = b.builds();
+        assertNotNull(jars);
+        assertEquals(1, jars.length);
+        assertEquals("ASM", jars[0].getManifest().getMainAttributes().getValue(
+                "Implementation-Title"));
+    }
+
+    /**
+     * Export a package that was loaded with resources
+     * 
+     * @throws Exception
+     */
+    public void testExportSyntheticPackage() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.setProperty("-resourceonly", "true");
+        p.setProperty("Include-Resource", "resources=jar");
+        p.setProperty("-exportcontents", "resources");
+        bmaker.setProperties(p);
+        Jar jar = bmaker.build();
+        System.out.println(jar.getResources());
+        // System.out.println(bmaker.getExports());
+        System.out.println("Errors  : " + bmaker.getErrors());
+        System.out.println("Warnings  : " + bmaker.getWarnings());
+        assertEquals("Warnings: ", 0, bmaker.getWarnings().size());
+        assertEquals("Errors  : ", 0, bmaker.getErrors().size());
+        Manifest manifest = jar.getManifest();
+        String header = manifest.getMainAttributes().getValue("Export-Package");
+        System.out.println(header);
+        assertTrue(header.indexOf("resources") >= 0);
+    }
+
+    /**
+     * Exporting packages in META-INF
+     * 
+     * @throws Exception
+     */
+    public void testMETAINF() throws Exception {
+        File cp[] = { new File("src"), new File("jar/asm.jar") };
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.setProperty("Include-Resource", "META-INF/xyz/asm.jar=jar/asm.jar");
+        p.setProperty("Export-Package", "META-INF/xyz, org.*");
+        bmaker.setProperties(p);
+        bmaker.setClasspath(cp);
+        Jar jar = bmaker.build();
+        System.out.println(jar.getResources());
+        // System.out.println(bmaker.getExports());
+        System.out.println("Warnings: " + bmaker.getWarnings());
+        System.out.println("Errors  : " + bmaker.getErrors());
+        jar.getManifest().write(System.out);
+        Manifest manifest = jar.getManifest();
+        String header = manifest.getMainAttributes().getValue("Export-Package");
+        assertTrue(header.indexOf("META-INF") > 0);
+    }
+
+    /**
+     * Bnd cleans up versions if they do not follow the OSGi rule. Check a
+     * number of those versions.
+     * 
+     * @throws Exception
+     */
+    public void testVersionCleanup() throws Exception {
+        assertVersion("1.3.0.0-0-01-0-SNAPSHOT", "1.3.0.0-0-01-0-SNAPSHOT");
+        assertVersion("1.3.0.0-0-01-0", "1.3.0.0-0-01-0");
+        assertVersion("0.9.0.1.2.3.4.5-incubator-SNAPSHOT",
+                "0.9.0.incubator-SNAPSHOT");
+        assertVersion("0.4aug123", "0.0.0.4aug123");
+        assertVersion("0.9.4aug123", "0.9.0.4aug123");
+        assertVersion("0.9.0.4aug123", "0.9.0.4aug123");
+
+        assertVersion("1.2.3", "1.2.3");
+        assertVersion("1.2.3-123", "1.2.3.123");
+        assertVersion("1.2.3.123", "1.2.3.123");
+        assertVersion("1.2.3.123x", "1.2.3.123x");
+        assertVersion("1.123x", "1.0.0.123x");
+
+        assertVersion("0.9.0.4.3.2.1.0.4aug123", "0.9.0.4aug123");
+        assertVersion("0.9.0.4aug123", "0.9.0.4aug123");
+
+        assertVersion("0.9.0.4.3.4.5.6.6", "0.9.0.6");
+
+        assertVersion("0.9.0-incubator-SNAPSHOT", "0.9.0.incubator-SNAPSHOT");
+        assertVersion("1.2.3.x", "1.2.3.x");
+        assertVersion("1.2.3", "1.2.3");
+        assertVersion("1.2", "1.2");
+        assertVersion("1", "1");
+        assertVersion("1.2.x", "1.2.0.x");
+        assertVersion("1.x", "1.0.0.x");
+        assertVersion("1.2.3-x", "1.2.3.x");
+        assertVersion("1.2:x", "1.2.0.x");
+        assertVersion("1.2-snapshot", "1.2.0.snapshot");
+        assertVersion("1#x", "1.0.0.x");
+        assertVersion("1.&^%$#date2007/03/04", "1.0.0.date20070304");
+    }
+
+    void assertVersion(String input, String expected) {
+        assertEquals(expected, Builder.cleanupVersion(input));
+    }
+
+    /**
+     * -exportcontents provides a header that is only relevant in the analyze
+     * phase, it augments the Export-Package header.
+     */
+
+    public void testExportContents() throws Exception {
+        Builder builder = new Builder();
+        builder.setProperty(Analyzer.INCLUDE_RESOURCE,
+                "test/activator=src/test/activator");
+        builder.setProperty("-exportcontents", "*;x=true");
+        builder.build();
+        Manifest manifest = builder.calcManifest();
+        Attributes main = manifest.getMainAttributes();
+        assertEquals("test.activator;x=true", main.getValue("Export-Package"));
+    }
+
+    /**
+     * I am having some problems with split packages in 170. I get this output:
+     * 
+     * [java] 1 : There are split packages, use directive split-package:=merge
+     * on instruction to get rid of this warning: my.package
+     * 
+     * First of all, this warning is falsely occurring. The classpath to the bnd
+     * task contains something like:
+     * 
+     * my/package/foo.class my/package/sub/bar.class
+     * 
+     * and the export is:
+     * 
+     * Export-Package: my.package*;version=${version}
+     * 
+     * so my.package and my.package.sub are being incorrectly considered as the
+     * same package by bnd.
+     * 
+     */
+    public void testSplitOverlappingPackages() throws Exception {
+        Builder b = new Builder();
+        b.setClasspath(new File[] { new File("bin") });
+        Properties p = new Properties();
+        p.put("Export-Package", "test*;version=3.1");
+        b.setProperties(p);
+        b.setPedantic(true);
+        b.build();
+        System.out.println("Errors     :" + b.getErrors());
+        System.out.println("Warnings   :" + b.getWarnings());
+        assertEquals(0, b.getErrors().size());
+        assertEquals(0, b.getWarnings().size());
+    }
+
+    /**
+     * It looks like Conditional-Package can add the same package multiple
+     * times. So lets test this.
+     */
+    public void testConditional2() throws Exception {
+        Properties base = new Properties();
+        base.put(Analyzer.EXPORT_PACKAGE, "org.osgi.service.log");
+        base.put(Analyzer.CONDITIONAL_PACKAGE, "org.osgi.*");
+        Builder analyzer = new Builder();
+        analyzer.setProperties(base);
+        analyzer.setClasspath(new File[] { new File("jar/osgi.jar") });
+        analyzer.build();
+        Jar jar = analyzer.getJar();
+        assertNotNull(jar.getDirectories().get("org/osgi/framework"));
+        System.out.println("Errors: " + analyzer.getErrors());
+        System.out.println("Warnings: " + analyzer.getWarnings());
+        assertEquals(0, analyzer.getErrors().size());
+        assertEquals(0, analyzer.getWarnings().size());
+    }
+
+    /**
+     * Test the strategy: error
+     */
+    public void testStrategyError() throws Exception {
+        Properties base = new Properties();
+        base.put(Analyzer.EXPORT_PACKAGE, "*;-split-package:=error");
+        Builder analyzer = new Builder();
+        analyzer.setClasspath(new File[] { new File("jar/asm.jar"),
+                new File("jar/asm.jar") });
+        analyzer.setProperties(base);
+        analyzer.build();
+        System.out.println("Errors: " + analyzer.getErrors());
+        assertEquals(3, analyzer.getErrors().size());
+        assertEquals(0, analyzer.getWarnings().size());
+        assertTrue(((String) analyzer.getErrors().get(0))
+                .indexOf("Split package") >= 0);
+    }
+
+    /**
+     * Test the strategy: default
+     */
+    public void testStrategyDefault() throws Exception {
+        Properties base = new Properties();
+        base.put(Analyzer.EXPORT_PACKAGE, "*");
+        Builder analyzer = new Builder();
+        analyzer.setClasspath(new File[] { new File("jar/asm.jar"),
+                new File("jar/asm.jar") });
+        analyzer.setProperties(base);
+        analyzer.build();
+        System.out.println("Warnings: " + analyzer.getWarnings());
+        assertEquals(0, analyzer.getErrors().size());
+        assertEquals(3, analyzer.getWarnings().size());
+        assertTrue(((String) analyzer.getWarnings().get(0))
+                .indexOf("split-package") >= 0);
+    }
+
+    /**
+     * Test the strategy: merge-first
+     */
+    public void testStrategyMergeFirst() throws Exception {
+        Properties base = new Properties();
+        base.put(Analyzer.EXPORT_PACKAGE, "*;-split-package:=merge-first");
+        Builder analyzer = new Builder();
+        analyzer.setClasspath(new File[] { new File("jar/asm.jar"),
+                new File("jar/asm.jar") });
+        analyzer.setProperties(base);
+        analyzer.build();
+        System.out.println("Errors: " + analyzer.getErrors());
+        assertEquals(0, analyzer.getErrors().size());
+        assertEquals(0, analyzer.getWarnings().size());
+        // assertTrue( ((String)analyzer.getErrors().get(0)).contains("file does
+        // not exist"));
+    }
+
+    /**
+     * Test the strategy: merge-last
+     */
+    public void testStrategyMergeLast() throws Exception {
+        Properties base = new Properties();
+        base.put(Analyzer.EXPORT_PACKAGE, "*;-split-package:=merge-last");
+        Builder analyzer = new Builder();
+        analyzer.setClasspath(new File[] { new File("jar/asm.jar"),
+                new File("jar/asm.jar") });
+        analyzer.setProperties(base);
+        analyzer.build();
+        System.out.println("Errors: " + analyzer.getErrors());
+        assertEquals(0, analyzer.getErrors().size());
+        assertEquals(0, analyzer.getWarnings().size());
+        // assertTrue( ((String)analyzer.getErrors().get(0)).contains("file does
+        // not exist"));
+    }
+
+    /**
+     * Test Resource inclusion that do not exist
+     * 
+     * @throws Exception
+     */
+    public void testResourceNotFound() throws Exception {
+        Properties base = new Properties();
+        base.put(Analyzer.EXPORT_PACKAGE, "*;test:=true");
+        base.put(Analyzer.INCLUDE_RESOURCE, "does_not_exist");
+        Builder analyzer = new Builder();
+        analyzer.setClasspath(new File[] { new File("jar/asm.jar") });
+        analyzer.setProperties(base);
+        analyzer.build();
+        System.out.println("Errors: " + analyzer.getErrors());
+        assertEquals(1, analyzer.getErrors().size());
+        assertTrue(((String) analyzer.getErrors().get(0))
+                .indexOf("file does not exist") >= 0);
+    }
+
+    /**
+     * Spaces at the end of a clause cause the preprocess to fail.
+     * 
+     * @throws Exception
+     */
+    public void testPreProcess() throws Exception {
+        Properties base = new Properties();
+        base.put(Analyzer.INCLUDE_RESOURCE, "{src/test/top.mf}     ");
+        Builder analyzer = new Builder();
+        analyzer.setProperties(base);
+        analyzer.build();
+        Jar jar = analyzer.getJar();
+        assertTrue(jar.getResource("top.mf") != null);
+    }
+
+    /**
+     * Check if we can use findpath to build the Bundle-Classpath.
+     */
+
+    public void testFindPathInBundleClasspath() throws Exception {
+        Properties base = new Properties();
+        base.put(Analyzer.INCLUDE_RESOURCE, "jar=jar");
+        base.put(Analyzer.BUNDLE_CLASSPATH, "${findpath;jar/.{1,4}\\.jar}");
+        Builder analyzer = new Builder();
+        analyzer.setProperties(base);
+        analyzer.build();
+
+        Manifest manifest = analyzer.getJar().getManifest();
+        String bcp = manifest.getMainAttributes().getValue("Bundle-Classpath");
+
+        assertTrue(bcp.indexOf("ds.jar") >= 0);
+        assertTrue(bcp.indexOf("asm.jar") >= 0);
+        assertTrue(bcp.indexOf("bcel.jar") >= 0);
+        assertTrue(bcp.indexOf("mina.jar") >= 0);
+        assertTrue(bcp.indexOf("rox.jar") >= 0);
+        assertTrue(bcp.indexOf("osgi.jar") >= 0);
+    }
+
+    /**
+     * Check if we export META-INF when we export the complete classpath.
+     */
+
+    public void testVersionCleanupAll() throws Exception {
+        Properties base = new Properties();
+        base.put(Analyzer.EXPORT_PACKAGE, "*");
+        base.put(Analyzer.BUNDLE_VERSION, "0.9.0-incubator-SNAPSHOT");
+        Builder analyzer = new Builder();
+        analyzer.setClasspath(new File[] { new File("jar/asm.jar") });
+        analyzer.setProperties(base);
+        analyzer.build();
+        Manifest manifest = analyzer.getJar().getManifest();
+        String version = manifest.getMainAttributes().getValue(
+                Analyzer.BUNDLE_VERSION);
+        assertEquals("0.9.0.incubator-SNAPSHOT", version);
+    }
+
+    /**
+     * We are only adding privately the core equinox ds package. We then add
+     * conditionally all packages that should belong to this as well as any OSGi
+     * interfaces.
+     * 
+     * @throws Exception
+     */
+    public void testConditional() throws Exception {
+        File cp[] = { new File("jar/osgi.jar"), new File("jar/ds.jar") };
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.put("Import-Package", "*");
+        p.put("Private-Package", "org.eclipse.equinox.ds");
+        p.put("Conditional-Package",
+                "org.eclipse.equinox.ds.*, org.osgi.service.*");
+        bmaker.setProperties(p);
+        bmaker.setClasspath(cp);
+        bmaker.build();
+        assertTrue(bmaker.getContained().containsKey(
+                "org.eclipse.equinox.ds.instance"));
+        assertTrue(bmaker.getContained().containsKey(
+                "org.eclipse.equinox.ds.model"));
+        assertTrue(bmaker.getContained().containsKey(
+                "org.eclipse.equinox.ds.parser"));
+        assertTrue(bmaker.getContained().containsKey("org.osgi.service.cm"));
+        assertTrue(bmaker.getContained().containsKey(
+                "org.osgi.service.component"));
+        assertFalse(bmaker.getContained().containsKey(
+                "org.osgi.service.wireadmin"));
+    }
+
+    /**
+     * Check if we export META-INF when we export the complete classpath.
+     */
+
+    public void testMetaInfExport() throws Exception {
+        Properties base = new Properties();
+        base.put(Analyzer.EXPORT_PACKAGE, "*");
+        Builder analyzer = new Builder();
+        analyzer.setClasspath(new File[] { new File("jar/asm.jar") });
+        analyzer.setProperties(base);
+        analyzer.build();
+        assertFalse(analyzer.getExports().containsKey("META-INF"));
+        assertTrue(analyzer.getExports().containsKey("org.objectweb.asm"));
+    }
+
+    /**
+     * Check that the activator is found.
+     * 
+     * @throws Exception
+     */
+    public void testFindActivator() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.put("Bundle-Activator", "test.activator.Activator");
+        p.put("Private-Package", "test.*");
+        bmaker.setProperties(p);
+        bmaker.setClasspath(new File[] { new File("bin") });
+        Jar jar = bmaker.build();
+        report("testFindActivator", bmaker, jar);
+        assertEquals(0, bmaker.getErrors().size());
+        assertEquals(0, bmaker.getWarnings().size());
+    }
+
+    public void testImportVersionRange() throws Exception {
+        assertVersionEquals("[1.1,2.0)", "[1.1,2.0)");
+        assertVersionEquals("[${@},2.0)", "[1.3,2.0)");
+        assertVersionEquals("[${@},${@}]", "[1.3,1.3]");
+    }
+
+    void assertVersionEquals(String input, String output) throws Exception {
+        File cp[] = { new File("jar/osgi.jar") };
+        Builder bmaker = new Builder();
+        bmaker.setClasspath(cp);
+        Properties p = new Properties();
+        p.put(Analyzer.EXPORT_PACKAGE, "test.activator");
+        p.put(Analyzer.IMPORT_PACKAGE, "org.osgi.framework;version=\"" + input
+                + "\"");
+        bmaker.setProperties(p);
+        bmaker.build();
+        Map<String, Map<String, String>> imports = bmaker.getImports();
+        Map<String, String> framework = imports.get("org.osgi.framework");
+        assertEquals(output, framework.get("version"));
+    }
+
+    public void testImportExportBadVersion() throws Exception {
+        File cp[] = { new File("jar/asm.jar") };
+        Builder bmaker = new Builder();
+        bmaker.setClasspath(cp);
+        Properties p = new Properties();
+        p.put(Analyzer.BUNDLE_VERSION, "0.9.5-@#SNAPSHOT");
+        p.put(Analyzer.EXPORT_PACKAGE, "*;version=0.9.5-@#SNAPSHOT");
+        p.put(Analyzer.IMPORT_PACKAGE, "*;version=0.9.5-@#SNAPSHOT");
+        bmaker.setProperties(p);
+        Jar jar = bmaker.build();
+        assertEquals(jar.getManifest().getMainAttributes().getValue(
+                "Bundle-Version"), "0.9.5.SNAPSHOT");
+        Map<String, String> map = bmaker.getExports().get("org.objectweb.asm");
+        assertEquals(map.get("version"), "0.9.5.SNAPSHOT");
+        map = bmaker.getImports().get("java.lang.reflect");
+        assertEquals(map.get("version"), "0.9.5.SNAPSHOT");
+    }
+
+    /**
+     * Check if can find an activator in the bundle while using a complex bundle
+     * classpath.
+     * 
+     * @throws Exception
+     */
+    public void testBundleClasspath3() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.put("Export-Package", "test.activator;-split-package:=merge-first");
+        p.put("Bundle-Activator", "test.activator.Activator");
+        p.put("Import-Package", "*");
+        p.put("Include-Resource", "ds.jar=jar/ds.jar");
+        p.put("Bundle-ClassPath", ".,ds.jar");
+        bmaker.setProperties(p);
+        bmaker.setClasspath(new File[] { new File("bin"), new File("src") });
+        Jar jar = bmaker.build();
+        report("testBundleClasspath3", bmaker, jar);
+        assertEquals(0, bmaker.getErrors().size());
+        assertEquals(0, bmaker.getWarnings().size());
+    }
+
+    /**
+     * Check if can find an activator in a embedded jar while using a complex
+     * bundle classpath.
+     * 
+     * @throws Exception
+     */
+    public void testBundleClasspath2() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.put("Bundle-Activator", "org.eclipse.equinox.ds.Activator");
+        p.put("Private-Package", "test.activator;-split-package:=merge-first");
+        p.put("Import-Package", "*");
+        p.put("Include-Resource", "ds.jar=jar/ds.jar");
+        p.put("Bundle-ClassPath", ".,ds.jar");
+        bmaker.setProperties(p);
+        bmaker.setClasspath(new File[] { new File("bin"), new File("src") });
+        Jar jar = bmaker.build();
+        report("testBundleClasspath2", bmaker, jar);
+        assertEquals(bmaker.getErrors().size(), 0);
+        assertEquals(bmaker.getWarnings().size(), 0);
+    }
+
+    public void testBundleClasspath() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.put("Export-Package", "test.activator;-split-package:=merge-first");
+        p.put("Bundle-Activator", "test.activator.Activator");
+        p.put("Import-Package", "*");
+        p.put("Bundle-ClassPath", ".");
+        bmaker.setProperties(p);
+        bmaker.setClasspath(new File[] { new File("bin"), new File("src") });
+        Jar jar = bmaker.build();
+        report("testBundleClasspath", bmaker, jar);
+        jar.exists("test/activator/Activator.class");
+        assertEquals(bmaker.getErrors().size(), 0);
+        assertEquals(bmaker.getWarnings().size(), 0);
+    }
+
+    public void testUnreferredImport() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+
+        p.put("-classpath", "jar/mina.jar");
+        p.put("Export-Package", "!META-INF.*,*");
+        p.put("Import-Package", "org.apache.commons.collections.map,*");
+        bmaker.setProperties(p);
+        Jar jar = bmaker.build();
+        report("testUnreferredImport", bmaker, jar);
+
+    }
+
+    public void testIncludeResourceResourcesOnlyJar2() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+
+        p.put("-classpath", "jar/ro.jar");
+        p.put("Export-Package", "*");
+        p.put("Import-Package", "");
+        bmaker.setProperties(p);
+        Jar jar = bmaker.build();
+        report("testIncludeResourceResourcesOnlyJar2", bmaker, jar);
+        assertTrue(bmaker.getExports().containsKey("ro"));
+        assertFalse(bmaker.getExports().containsKey("META-INF"));
+
+        assertEquals(0, bmaker.getWarnings().size());
+        assertEquals(0, bmaker.getErrors().size());
+        assertEquals(3, jar.getResources().size());
+
+    }
+
+    public void testClasspathFileNotExist() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        File cp[] = new File[] { new File("jar/idonotexist.jar") };
+
+        bmaker.setProperties(p);
+        bmaker.setClasspath(cp);
+        bmaker.build();
+        assertEquals(2, bmaker.getErrors().size());
+    }
+
+    public void testExpandWithNegate() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        File cp[] = new File[] { new File("jar/asm.jar") };
+
+        p.put("Export-Package", "!org.objectweb.asm,*");
+        bmaker.setProperties(p);
+        bmaker.setClasspath(cp);
+        Jar jar = bmaker.build();
+        assertNull(jar.getDirectories().get("org/objectweb/asm"));
+        assertNotNull(jar.getDirectories().get("org/objectweb/asm/signature"));
+        assertEquals(0, bmaker.getWarnings().size());
+        assertEquals(0, bmaker.getErrors().size());
+        assertEquals(3, jar.getResources().size());
+    }
+
+    public void testIncludeResourceResourcesOnlyJar() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        File cp[] = new File[] { new File("jar/ro.jar") };
+
+        p.put("Export-Package", "*");
+        p.put("Import-Package", "");
+        bmaker.setProperties(p);
+        bmaker.setClasspath(cp);
+        Jar jar = bmaker.build();
+        assertEquals(0, bmaker.getWarnings().size());
+        assertEquals(0, bmaker.getErrors().size());
+        assertEquals(3, jar.getResources().size());
+
+    }
+
+    public void testIncludeResourceResourcesOnly() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        File cp[] = new File[] { new File("src") };
+
+        p.put("Import-Package", "");
+        p.put("Private-Package", "test.resourcesonly");
+        bmaker.setProperties(p);
+        bmaker.setClasspath(cp);
+        Jar jar = bmaker.build();
+        assertEquals(0, bmaker.getWarnings().size());
+        assertEquals(0, bmaker.getErrors().size());
+        assertEquals(4, jar.getResources().size());
+
+    }
+
+    public void testIncludeResourceFromZipDefault() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.put("Include-Resource", "@jar/easymock.jar");
+        bmaker.setProperties(p);
+        Jar jar = bmaker.build();
+
+        assertEquals(1, bmaker.getWarnings().size());
+        assertEquals(0, bmaker.getErrors().size());
+        assertEquals(59, jar.getResources().size());
+
+    }
+
+    public void testIncludeResourceFromZipDeep() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.put("Include-Resource", "@jar/easymock.jar!/**");
+        bmaker.setProperties(p);
+        Jar jar = bmaker.build();
+
+        assertEquals(1, bmaker.getWarnings().size());
+        assertEquals(0, bmaker.getErrors().size());
+        assertEquals(59, jar.getResources().size());
+
+    }
+
+    public void testIncludeResourceFromZipOneDirectory() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.put("Import-Package", "!*");
+        p.put("Include-Resource", "@jar/easymock.jar!/org/easymock/**");
+        bmaker.setProperties(p);
+        Jar jar = bmaker.build();
+        assertEquals(1, bmaker.getWarnings().size());
+        assertEquals(0, bmaker.getErrors().size());
+        assertEquals(59, jar.getResources().size());
+    }
+
+    public void testIncludeResourceFromZipRecurseDirectory() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.put("Import-Package", "!*");
+        p.put("Include-Resource", "@jar/easymock.jar!/org/easymock/**");
+        bmaker.setProperties(p);
+        Jar jar = bmaker.build();
+
+        assertEquals(1, bmaker.getWarnings().size());
+        assertEquals(0, bmaker.getErrors().size());
+        assertEquals(59, jar.getResources().size());
+    }
+
+    public void testIncludeLicenseFromZip() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.put("Import-Package", "");
+        p.put("Include-Resource", "@jar/osgi.jar!/LICENSE");
+        bmaker.setProperties(p);
+        Jar jar = bmaker.build();
+        assertEquals(1, jar.getResources().size());
+        assertNotNull(jar.getResource("LICENSE"));
+        assertEquals(1, bmaker.getWarnings().size());
+        assertEquals(0, bmaker.getErrors().size());
+    }
+
+    public void testEasymock() throws Exception {
+        File cp[] = { new File("jar/easymock.jar") };
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.put("Import-Package", "*");
+        p.put("Export-Package", "*");
+        p.put("Bundle-SymbolicName", "easymock");
+        p.put("Bundle-Version", "2.2");
+        bmaker.setProperties(p);
+        bmaker.setClasspath(cp);
+        Jar jar = bmaker.build();
+        jar.getManifest().write(System.out);
+    }
+
+    public void testSources() throws Exception {
+        File cp[] = { new File("src"), new File("jar/asm.jar") };
+        Builder bmaker = new Builder();
+        bmaker.setClasspath(cp);
+        bmaker.setSourcepath(new File[] { new File("src") });
+        Properties properties = new Properties();
+        properties.put("-sources", "true");
+        properties.put("Export-Package", "*");
+        bmaker.setProperties(properties);
+        Jar jar = bmaker.build();
+        System.out.println(jar.getResources());
+        // System.out.println(bmaker.getExports());
+        System.out.println("Warnings: " + bmaker.getWarnings());
+        System.out.println("Errors  : " + bmaker.getErrors());
+        jar.getManifest().write(System.out);
+    }
+
+    public void testSimple() throws Exception {
+        File cp[] = { new File("src"), new File("jar/asm.jar") };
+        Builder bmaker = new Builder();
+        bmaker.setProperties(new File("src/test/simple.mf"));
+        bmaker.setClasspath(cp);
+        Jar jar = bmaker.build();
+        System.out.println(jar.getResources());
+        // System.out.println(bmaker.getExports());
+        System.out.println("Warnings: " + bmaker.getWarnings());
+        System.out.println("Errors  : " + bmaker.getErrors());
+        jar.getManifest().write(System.out);
+    }
+
+    public void testVerifyResult() throws Exception {
+        System.out.println("Verify what we just built: test.jar");
+        Jar jar = new Jar("test", getClass().getResourceAsStream("test.jar"));
+        Verifier verifier = new Verifier(jar);
+        verifier.verify();
+        System.out.println("Warnings: " + verifier.getWarnings());
+        System.out.println("Errors  : " + verifier.getErrors());
+    }
+
+    public void testVerify() throws Exception {
+        System.out.println("Erroneous bundle: tb1.jar");
+        Jar jar = new Jar("test", getClass().getResourceAsStream("tb1.jar"));
+        Verifier verifier = new Verifier(jar);
+        verifier.verify();
+        System.out.println("Warnings: " + verifier.getWarnings());
+        System.out.println("Errors  : " + verifier.getErrors());
+        verifier.info();
+    }
+
+    public void report(String title, Analyzer builder, Jar jar) {
+        System.out.println("Directories " + jar.getDirectories().keySet());
+        System.out.println("Warnings    " + builder.getWarnings());
+        System.out.println("Errors      " + builder.getErrors());
+        System.out.println("Exports     " + builder.getExports());
+        System.out.println("Imports     " + builder.getImports());
+    }
+
+}


Property changes on: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/BuilderTest.java
___________________________________________________________________
Name: svn:executable
   + *

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ClassParserTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ClassParserTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ClassParserTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,206 @@
+package test;
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+
+import junit.framework.*;
+import aQute.lib.osgi.*;
+
+interface WithGenerics<VERYLONGTYPE, X extends Jar> {
+    List<? super VERYLONGTYPE> baz2();
+    List<? extends Jar> field=null;
+    
+    WithGenerics<URL,Jar> x=null;
+}
+
+class Generics {
+    Map<ClassParserTest,?> baz() { return null; }
+    Map<ClassParserTest,?> baz1() { return null; }
+    Map<? extends String,?> baz2() { return null; }
+    List<ClassParserTest> foo() { return null; }
+    Map<ClassParserTest,Clazz> bar() { return null; }
+    WithGenerics<List<Jar>, Jar> xyz() { return null; }
+}
+
+
+public class ClassParserTest extends TestCase {
+    
+    public void testWildcards() throws Exception {
+        Clazz c = new Clazz("genericstest", null);
+        c.parseClassFile(getClass().getResourceAsStream("WithGenerics.class"));
+        System.out.println(c.getReferred());
+        assertEquals( "size ", 5, c.getReferred().size());
+        assertTrue( c.getReferred().containsKey("aQute.lib.osgi"));
+        assertTrue( c.getReferred().containsKey("java.util"));
+        assertTrue( c.getReferred().containsKey("java.net"));
+        assertTrue( c.getReferred().containsKey("java.lang"));
+    }
+    
+    public void testWeirdClass() throws Exception {
+        Builder b = new Builder();
+        b.setProperty("Private-Package", "crap");
+        b.addClasspath(new File("test/craptest"));
+        Jar j = b.build();
+        System.out.println(b.getWarnings());
+        assertEquals(0, b.getErrors().size());
+        assertEquals(0, b.getWarnings().size());
+        
+        
+    }
+    
+    public void testGenericsSignature3() throws Exception {
+        Clazz c = new Clazz("genericstest", null);
+        c.parseClassFile(getClass().getResourceAsStream("Generics.class"));
+        assertTrue(c.getReferred().containsKey("test"));
+        assertTrue(c.getReferred().containsKey("aQute.lib.osgi"));
+    }
+    
+    public void testGenericsSignature2() throws Exception {
+        Clazz c = new Clazz("genericstest", new FileResource(new File("src/test/generics.clazz")));
+        c.parseClassFile();
+        assertTrue(c.getReferred().containsKey("javax.swing.table"));
+        assertTrue(c.getReferred().containsKey("javax.swing"));
+    }
+   
+
+    public void testGenericsSignature() throws Exception {
+        Clazz c = new Clazz("genericstest", new FileResource(new File("src/test/generics.clazz")));
+        c.parseClassFile();
+        assertTrue(c.getReferred().containsKey("javax.swing.table"));
+        assertTrue(c.getReferred().containsKey("javax.swing"));
+    }
+
+    /**
+     * @Neil: I'm trying to use bnd to bundleize a library called JQuantLib, but it
+     * causes an ArrayIndexOutOfBoundsException while parsing a class. The
+     * problem is reproducible and I have even rebuilt the library from source
+     * and get the same problem.
+     * 
+     * Here's the stack trace:
+     * 
+     * java.lang.ArrayIndexOutOfBoundsException: -29373 at
+     * aQute.lib.osgi.Clazz.parseClassFile(Clazz.java:262) at
+     * aQute.lib.osgi.Clazz.<init>(Clazz.java:101) at
+     * aQute.lib.osgi.Analyzer.analyzeJar(Analyzer.java:1647) at
+     * aQute.lib.osgi.Analyzer.analyzeBundleClasspath(Analyzer.java:1563) at
+     * aQute.lib.osgi.Analyzer.analyze(Analyzer.java:108) at
+     * aQute.lib.osgi.Builder.analyze(Builder.java:192) at
+     * aQute.lib.osgi.Builder.doConditional(Builder.java:158) at
+     * aQute.lib.osgi.Builder.build(Builder.java:71) at
+     * aQute.bnd.main.bnd.doBuild(bnd.java:379) at
+     * aQute.bnd.main.bnd.run(bnd.java:130) at
+     * aQute.bnd.main.bnd.main(bnd.java:39)
+     * 
+     * @throws Exception
+     */
+
+    public void testJQuantlib() throws Exception {
+        Builder b = new Builder();
+        b.addClasspath(new File("test/jquantlib-0.1.2.jar"));
+        b.setProperty("Export-Package", "*");
+        Jar jar = b.build();
+    }
+    
+    public void testMissingPackage2() throws Exception {
+        InputStream in = getClass().getResourceAsStream("JobsService.clazz");
+        assertNotNull(in);
+        Clazz clazz = new Clazz("test", null);
+        clazz.parseClassFile(in);
+        assertTrue(clazz.getReferred().containsKey(
+                "com.linkedin.member2.pub.profile.core.view"));
+    }
+
+    public void testMissingPackage1() throws Exception {
+        InputStream in = getClass().getResourceAsStream("JobsService.clazz");
+        assertNotNull(in);
+        Clazz clazz = new Clazz("test", null);
+        clazz.parseClassFile(in);
+        
+        System.out.println(clazz.getReferred());
+        clazz
+                .parseDescriptor("(IILcom/linkedin/member2/pub/profile/core/view/I18nPositionViews;)Lcom/linkedin/leo/cloud/overlap/api/OverlapQuery;");
+        assertTrue(clazz.getReferred().containsKey(
+                "com.linkedin.member2.pub.profile.core.view"));
+    }
+
+    public void testGeneratedClass() throws IOException {
+        InputStream in = getClass().getResourceAsStream("XDbCmpXView.clazz");
+        assertNotNull(in);
+        Clazz clazz = new Clazz("test",null);
+        clazz.parseClassFile(in);
+        clazz.getReferred();
+    }
+
+    public void testParameterAnnotation() throws IOException {
+        InputStream in = getClass().getResourceAsStream("Test2.jclass");
+        assertNotNull(in);
+        Clazz clazz = new Clazz("test", null);
+        clazz.parseClassFile(in);
+        Map<String, Map<String, String>> map = clazz.getReferred();
+        assertTrue(map.containsKey("test"));
+        assertTrue(map.containsKey("test.annotations"));
+    }
+
+    public void testLargeClass2() throws IOException {
+        try {
+            URL url = new URL(
+                    "jar:file:jar/ecj_3.2.2.jar!/org/eclipse/jdt/internal/compiler/parser/Parser.class");
+            InputStream in = url.openStream();
+            assertNotNull(in);
+            Clazz clazz = new Clazz("test", null);
+            clazz.parseClassFile(in);
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * Still problems with the stuff in ecj
+     */
+    public void testEcj() throws Exception {
+        Builder builder = new Builder();
+        builder.setClasspath(new File[] { new File("jar/ecj_3.2.2.jar") });
+        builder.setProperty(Analyzer.EXPORT_PACKAGE, "org.eclipse.*");
+        builder.build();
+        System.out.println(builder.getErrors());
+        assertEquals(0, builder.getErrors().size());
+        assertEquals(0, builder.getWarnings().size());
+        System.out.println(builder.getErrors());
+        System.out.println(builder.getWarnings());
+    }
+
+    /**
+     * This class threw an exception because we were using skip instead of
+     * skipBytes. skip is not guaranteed to real skip the amount of bytes, not
+     * even if there are still bytes left. It seems to be able to stop skipping
+     * if it is at the end of a buffer or so :-( Idiots.
+     * 
+     * The DataInputStream.skipBytes works correctly.
+     * 
+     * @throws IOException
+     */
+    public void testLargeClass() throws IOException {
+        InputStream in = getClass().getResourceAsStream("Parser.jclass");
+        assertNotNull(in);
+        try {
+            Clazz clazz = new Clazz("test", null);
+            clazz.parseClassFile(in);
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    public void testSimple() throws IOException {
+        InputStream in = getClass().getResourceAsStream(
+                "WithAnnotations.jclass");
+        assertNotNull(in);
+        Clazz clazz = new Clazz("test", null);
+        clazz.parseClassFile(in);
+        Map<String, Map<String, String>> map = clazz.getReferred();
+        assertTrue(map.containsKey("test"));
+        assertTrue(map.containsKey("test.annotations"));
+    }
+}


Property changes on: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ClassParserTest.java
___________________________________________________________________
Name: svn:executable
   + *

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ClassReferenceTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ClassReferenceTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ClassReferenceTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,49 @@
+package test;
+
+import java.util.*;
+import java.util.jar.*;
+
+import junit.framework.*;
+import aQute.lib.osgi.*;
+
+public class ClassReferenceTest extends TestCase {
+	class Inner {
+		
+	}
+	
+	static {
+		System.out.println(Inner.class);
+	}
+	/**
+	 * We create a JAR with the test.classreferenc.ClassReference class. This
+	 * class contains a javax.swing.Box.class reference Prior to Java 1.5, this
+	 * was done in a silly way that is handled specially. After 1.5 it is a
+	 * normal reference.
+	 * 
+	 * @throws Exception
+	 */
+	public void testReference() throws Exception {
+		Properties properties = new Properties();
+		properties.put("-classpath", "compilerversions/compilerversions.jar");
+		String[] packages = { "sun_1_1", "sun_1_6", "eclipse_1_1", "sun_1_2", "sun_1_3", "sun_1_4",
+				"sun_1_5", "eclipse_1_5", "eclipse_1_6", "eclipse_1_2",
+				"eclipse_1_3", "eclipse_1_4" };
+		for ( int i =0; i<packages.length; i++ ) {
+			Builder builder = new Builder();
+			properties.put("Export-Package", packages[i]);
+			builder.setProperties(properties);
+			Jar jar = builder.build();
+			System.out.println(builder.getErrors());
+			System.out.println(builder.getWarnings());
+			assertEquals(0,builder.getErrors().size());
+			assertEquals(0,builder.getWarnings().size());
+
+			Manifest manifest = jar.getManifest();
+			String imports = manifest.getMainAttributes()
+					.getValue("Import-Package");
+			assertTrue("Package " + packages[i] + "contains name", imports.indexOf(packages[i])>=0);			
+			assertTrue("Package " + packages[i] + "contains swing ref", imports.indexOf("javax.swing")>=0);			
+			assertFalse("Package " + packages[i] + "should not contain ClassRef", imports.indexOf("ClassRef")>=0);			
+		}
+	}
+}


Property changes on: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ClassReferenceTest.java
___________________________________________________________________
Name: svn:executable
   + *

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ClasspathTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ClasspathTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ClasspathTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,68 @@
+package test;
+
+import java.io.*;
+import java.util.*;
+import java.util.jar.*;
+
+import junit.framework.*;
+import aQute.lib.osgi.*;
+
+public class ClasspathTest extends TestCase {
+
+    /**
+     * Test if we can refer to the jars on the classpath by their file name (
+     * ignoring the path)
+     * 
+     * @throws Exception
+     */
+    public void testBundleClasspath() throws Exception {
+        Builder b = new Builder();
+        b.setProperty("Include-Resource", "bin=bin");
+        b.setProperty("Bundle-Classpath", "bin");
+
+        Jar jar = b.build();
+        assertNotNull(jar.getResource("bin/aQute/lib/osgi/Verifier.class")); // from
+                                                                    // test.jar
+    }
+    
+	/**
+	 * Test if we can refer to the jars on the classpath by their file name (
+	 * ignoring the path)
+	 * 
+	 * @throws Exception
+	 */
+	public void testFindJarOnClasspath() throws Exception {
+		Properties p = new Properties();
+		p.put("Include-Resource", "tb1.jar, @test.jar");
+
+		Builder b = new Builder();
+		b.setClasspath(new String[] { "src", "src/test/test.jar",
+				"src/test/tb1.jar" });
+		b.setProperties(p);
+		Jar jar = b.build();
+		assertNotNull(jar.getResource("aQute/lib/aim/AIM.class")); // from
+																	// test.jar
+		assertNotNull(jar.getResource("tb1.jar"));
+	}
+
+	/**
+	 * Test if we can use URLs on the classpath
+	 * 
+	 * @throws Exception
+	 */
+	public void testSimple() throws Exception {
+		Properties p = new Properties();
+		p.put("-classpath", new File("src/test/test.jar").toURL().toString());
+		p.put("Import-Package", "*");
+		p.put("Export-Package", "aQute.bean");
+
+		Builder b = new Builder();
+		b.setClasspath(new String[] { "src" });
+		b.setProperties(p);
+		Jar jar = b.build();
+		Manifest m = jar.getManifest();
+		String importPackage = m.getMainAttributes().getValue("Import-Package");
+		assertEquals("aQute.bean;version=\"1.0\"", importPackage);
+	}
+
+}


Property changes on: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ClasspathTest.java
___________________________________________________________________
Name: svn:executable
   + *

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/CorruptManifest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/CorruptManifest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/CorruptManifest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,47 @@
+package test;
+
+import java.io.*;
+import java.util.jar.*;
+
+import junit.framework.*;
+import aQute.lib.osgi.*;
+
+public class CorruptManifest extends TestCase {
+	static String ltext= "bla bla \nbla bla bla bla \nbla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla ";
+	
+	public void testCorruptJar() throws Exception  {
+		Builder b = new Builder();
+		b.setProperty("NL1", "\n");
+		b.setProperty("NL2", "\r\n");
+		b.setProperty("NL3", ".");
+		b.setProperty("NL4", ".\n.\n");
+		b.setProperty("NL5", ltext);
+		b.setProperty("Export-Package", "*");
+		b.setClasspath( new File[] {new File("jar/asm.jar")});
+		Jar jar  = b.build();
+		Manifest manifest = jar.getManifest();
+		jar.writeManifest(System.out);
+		
+		Attributes main = manifest.getMainAttributes();
+		assertNull(main.getValue("NL1"));
+		assertNull(main.getValue("NL2"));
+		assertEquals(".", main.getValue("NL3"));
+		assertEquals(".\n.\n", main.getValue("NL4"));
+		assertEquals(ltext, main.getValue("NL5"));
+		
+		ByteArrayOutputStream bout = new ByteArrayOutputStream();
+		jar.writeManifest(bout);
+		bout.flush();
+		System.out.println("-----");
+		System.out.write(bout.toByteArray());
+        System.out.println("-----");
+		ByteArrayInputStream bin = new ByteArrayInputStream( bout.toByteArray());
+		manifest = new Manifest(bin);
+		
+		main = manifest.getMainAttributes();
+		assertNull(main.getValue("NL1"));
+		assertNull(main.getValue("NL2"));
+		assertEquals(".", main.getValue("NL3"));
+		assertEquals("..", main.getValue("NL4"));
+	}
+}


Property changes on: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/CorruptManifest.java
___________________________________________________________________
Name: svn:executable
   + *

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/DiffTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/DiffTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/DiffTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,18 @@
+package test;
+
+import java.io.*;
+import java.util.*;
+
+import junit.framework.*;
+import aQute.lib.jardiff.*;
+import aQute.lib.osgi.*;
+
+public class DiffTest extends TestCase {
+
+    public void testSimple() throws IOException {
+        aQute.lib.jardiff.Diff diff = new Diff();
+        Map<String,Object> map = diff.diff(new Jar(new File("jar/ds.jar")), new Jar(new File("jar/asm.jar")), false);
+        
+        diff.print(System.out, map, 0);
+    }
+}

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ExportHeaderTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ExportHeaderTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ExportHeaderTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,60 @@
+package test;
+
+import java.io.*;
+import java.util.*;
+import java.util.jar.*;
+
+import junit.framework.*;
+import aQute.lib.osgi.*;
+
+public class ExportHeaderTest extends TestCase {
+    
+
+    /**
+     * If you import a range then the maven guys can have the silly -SNAPSHOT in the
+     * version. This tests if ranges are correcly cleaned up.
+     * @throws Exception
+     */
+    public void testImportHeaderWithMessedUpRange() throws Exception {
+        Builder builder = new Builder();
+        Jar bin = new Jar( new File("bin") );
+        builder.setClasspath( new Jar[]{bin});
+        Properties p = new Properties();
+        p.setProperty("Private-Package", "test.packageinfo.ref");
+        p.setProperty("Import-Package", "test.packageinfo;version=\"[1.1.1-SNAPSHOT,1.1.1-SNAPSHOT]");
+        builder.setProperties(p);
+        Jar jar = builder.build();
+        Manifest manifest = jar.getManifest();
+        
+        String imph = manifest.getMainAttributes().getValue("Import-Package");
+        assertEquals("test.packageinfo;version=\"[1.1.1.SNAPSHOT,1.1.1.SNAPSHOT]\"", imph);   
+    }
+    
+    public void testPickupExportVersion() throws Exception {
+        Builder builder = new Builder();
+        Jar bin = new Jar( new File("bin") );
+        builder.setClasspath( new Jar[]{bin});
+        Properties p = new Properties();
+        p.setProperty("Private-Package", "test.packageinfo.ref");
+        builder.setProperties(p);
+        Jar jar = builder.build();
+        Manifest manifest = jar.getManifest();
+        
+        String imph = manifest.getMainAttributes().getValue("Import-Package");
+        assertEquals("test.packageinfo;version=\"1.0\"", imph);     
+    }
+    public void testExportVersionWithPackageInfo() throws Exception {
+        Builder builder = new Builder();
+        Jar bin = new Jar( new File("bin") );
+        builder.setClasspath( new Jar[]{bin});
+        Properties p = new Properties();
+        p.setProperty("Export-Package", "test.packageinfo");
+        builder.setProperties(p);
+
+        Jar jar = builder.build();
+        Manifest manifest = jar.getManifest();
+        
+        String exph = manifest.getMainAttributes().getValue("Export-Package");
+        assertEquals("test.packageinfo;version=\"1.0.0.SNAPSHOT\"", exph);
+    }
+}

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/FilterTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/FilterTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/FilterTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,16 @@
+package test;
+
+import junit.framework.*;
+import aQute.lib.osgi.*;
+
+public class FilterTest extends TestCase {
+
+    public void testFilter() {
+        Verifier v = new Verifier();
+        v.verifyFilter("(org.osgi.framework.windowing.system=xyz)");
+        System.out.println(v.getErrors());
+        System.out.println(v.getWarnings());
+        assertEquals(0, v.getErrors().size());
+        assertEquals(0, v.getWarnings().size());
+    }
+}

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/IncludeHeaderTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/IncludeHeaderTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/IncludeHeaderTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,122 @@
+package test;
+
+import java.io.*;
+import java.util.*;
+
+import junit.framework.*;
+import aQute.lib.osgi.*;
+
+public class IncludeHeaderTest extends TestCase {
+    
+    public void testTopBottom() throws Exception {
+        Analyzer analyzer = new Analyzer();
+        analyzer.setProperties(new File("src/test/include.bnd/top.bnd"));
+        assertEquals("0.0.257", analyzer.getProperty("Bundle-Version"));
+    }
+
+	public void testPrecedence() throws Exception {
+		File base  = new File("src/test");
+		String a = "a=a.props\n";
+		String b = "a=b.props\n";
+		File aa = new File(base,"a.props");
+		File bb = new File(base,"b.props");
+		write(aa, a);
+		write(bb, b );
+		
+		
+		Analyzer analyzer = new Analyzer();
+		analyzer.setBase(base);
+		Properties x = new Properties();
+		x.put("a", "x");		
+		x.put("-include", "a.props, b.props");
+		analyzer.setProperties(x);		
+		assertEquals("b.props", analyzer.getProperty("a")); 	// from org
+		
+		analyzer = new Analyzer();
+        analyzer.setBase(base);
+		x = new Properties();
+		x.put("a", "x");		
+		x.put("-include", "~a.props, b.props");
+		analyzer.setProperties(x);		
+		assertEquals("b.props", analyzer.getProperty("a")); 	// from org
+
+        analyzer = new Analyzer();
+        analyzer.setBase(base);
+		x = new Properties();
+		x.put("a", "x");		
+		x.put("-include", "a.props, ~b.props");
+		analyzer.setProperties(x);		
+		assertEquals("a.props", analyzer.getProperty("a")); 	// from org
+
+        analyzer = new Analyzer();
+        analyzer.setBase(base);
+		x = new Properties();
+		x.put("a", "x");		
+		x.put("-include", "~a.props, ~b.props");
+		analyzer.setProperties(x);		
+		assertEquals("x", analyzer.getProperty("a")); 	// from org
+
+		aa.delete();
+		bb.delete();
+	}
+	
+	private void write(File file, String b) throws Exception {
+		FileOutputStream out = new FileOutputStream( file);
+		out.write( b.getBytes());
+		out.close();		
+	}
+
+	public void testAbsentIncludes() throws IOException {
+		Analyzer analyzer = new Analyzer();
+		analyzer.setBase(new File("src/test"));
+		Properties p = new Properties();
+		p.put("-include", "-iamnotthere.txt");
+		analyzer.setProperties(p);
+		System.out.println(analyzer.getErrors());
+		assertEquals(0, analyzer.getErrors().size());
+	}
+
+	public void testIncludeWithProperty() throws IOException {
+		File home = new File(System.getProperty("user.home"));
+		File include = new File(home, "includeheadertest.txt");
+		try {
+			FileOutputStream fw = new FileOutputStream(include);
+			fw.write("IncludeHeaderTest: yes\n\r".getBytes());
+			fw.write("a: 2\n\r".getBytes());
+			fw.write("b: ${a}\n\r".getBytes());
+			fw.close();
+			Analyzer analyzer = new Analyzer();
+			analyzer.setBase(new File("src/test"));
+			Properties p = new Properties();
+			p.put("a", "1");
+			p
+					.put("-include",
+							"-iamnotthere.txt, ${user.home}/includeheadertest.txt");
+			analyzer.setProperties(p);
+			String value = analyzer.getProperty("IncludeHeaderTest");
+			assertEquals("yes", value);
+			assertEquals("2", analyzer.getProperty("a"));
+			assertEquals("2", analyzer.getProperty("b"));
+			assertEquals(0, analyzer.getErrors().size());
+		} finally {
+			include.delete();
+		}
+	}
+
+	public void testIncludeHeader() throws IOException {
+		Analyzer analyzer = new Analyzer();
+		analyzer.setBase(new File("src/test"));
+		Properties p = new Properties();
+		p.put("a", "1");
+		p.put("-include", "includeheadertest.mf, includeheadertest.prop");
+		analyzer.setProperties(p);
+		System.out.println(analyzer.getProperties());
+		assertEquals("1", analyzer.getProperty("a"));
+		assertEquals("end", analyzer.getProperty("last-props"));
+		assertEquals("end", analyzer.getProperty("last-manifest"));
+		assertEquals("abcd", analyzer.getProperty("manifest"));
+		assertEquals("abcd", analyzer.getProperty("props"));
+		assertEquals("1", analyzer.getProperty("test"));
+	}
+
+}


Property changes on: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/IncludeHeaderTest.java
___________________________________________________________________
Name: svn:executable
   + *

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/InlineTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/InlineTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/InlineTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,25 @@
+package test;
+
+import java.util.jar.*;
+
+import aQute.lib.osgi.*;
+
+import junit.framework.*;
+
+public class InlineTest extends TestCase {
+	public void testSimple() throws Exception {
+		Builder builder = new Builder();
+		builder.setProperty("Include-Resource", "@jar/osgi.jar");
+		Jar jar = builder.build();
+		Manifest manifest = jar.getManifest();
+		
+		// See if the version is the default and not copied from the inline
+		// bundle.
+		String version = manifest.getMainAttributes().getValue("Bundle-Version");
+		assertEquals("0", version );
+		
+		// Check if we got some relevant directories
+		assertTrue(jar.getDirectories().containsKey("org/osgi/framework"));
+		assertTrue(jar.getDirectories().containsKey("org/osgi/util/tracker"));
+	}
+}

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/JarTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/JarTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/JarTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,49 @@
+package test;
+
+import java.io.*;
+import java.util.jar.*;
+import java.util.zip.*;
+
+import junit.framework.*;
+import aQute.lib.osgi.*;
+
+public class JarTest extends TestCase {
+    
+    public void testNoManifest() throws Exception {
+        Jar jar = new Jar("dot");
+        jar.setManifest(new Manifest());
+        jar.setNoManifest(true);
+        jar.putResource("a/b", new FileResource(new File("test/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 void testSimple() throws ZipException, IOException {
+		File file = new File("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 );
+		
+		// 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());		
+	}
+}


Property changes on: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/JarTest.java
___________________________________________________________________
Name: svn:executable
   + *

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/MacroTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/MacroTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/MacroTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,410 @@
+package test;
+
+import java.io.*;
+import java.util.*;
+import java.util.jar.*;
+
+import junit.framework.*;
+import aQute.lib.osgi.*;
+
+public class MacroTest extends TestCase {
+    Processor proc = new Processor();
+    
+    
+    /**
+     * Testing an example with nesting that was supposd not to work
+     */
+    
+    public void testNesting2() {
+        Processor p = new Processor();
+        p.setProperty("groupId", "com.trivadis.tomas");
+        p.setProperty("artifactId", "common");
+        p.setProperty("bsn", "${if;${symbolicName};${symbolicName};${groupId}.${artifactId}}");
+        p.setProperty("Bundle-SymbolicName", "${bsn}");       
+        p.setProperty("symbolicName", "");
+
+        // Not set, so get the maven name
+        assertEquals("com.trivadis.tomas.common", p.getProperty("Bundle-SymbolicName"));
+        
+        // Set it
+        p.setProperty("symbolicName", "testing");
+        assertEquals("testing", p.getProperty("Bundle-SymbolicName"));
+
+        // And remove it
+        p.setProperty("symbolicName", "");
+        assertEquals("com.trivadis.tomas.common", p.getProperty("Bundle-SymbolicName"));
+    }
+    
+    /** 
+     * Verify system command
+     */
+    
+    public void testSystem() throws Exception {
+        Properties p = new Properties();
+        Macro macro = new Macro(p,proc);
+        assertEquals("Hello World", macro.process("${system;echo Hello World}"));        
+        assertTrue( macro.process("${system;wc;Hello World}").matches("[0-9]+\\s*[0-9]+\\s*[0-9]+"));        
+    }
+
+    /**
+     * Check that variables override macros.
+     */
+    public void testPriority(){
+        Properties p = new Properties();
+        p.put("now", "not set");
+        Macro macro = new Macro(p,proc);
+        assertEquals("not set", macro.process("${now}"));
+        
+    }
+    public void testNames() {
+        Properties p = new Properties();
+        p.put("a", "a");
+        p.put("aa", "aa");
+        Macro macro = new Macro(p,proc);
+        
+        assertEquals("aa", macro.process("${${a}${a}}"));
+    }
+    
+    public void testVersion() throws Exception {
+        Properties p = new Properties();
+        Macro macro = new Macro(p,proc);
+        assertEquals( "1.0.0", macro.process("${version;===;1.0.0}"));
+        assertEquals( "1.0.1", macro.process("${version;==+;1.0.0}"));
+        assertEquals( "1.1.1", macro.process("${version;=++;1.0.0}"));
+        assertEquals( "2.1.1", macro.process("${version;+++;1.0.0}"));
+        assertEquals( "0.1.1", macro.process("${version;-++;1.0.0}"));
+        assertEquals( "0.1.1", macro.process("${version;-++;1.0.0}"));
+        assertEquals( "0.0.0", macro.process("${version;---;1.1.1}"));
+        assertEquals( "0.0", macro.process("${version;--;1.1.1}"));
+        assertEquals( "1", macro.process("${version;=;1.1.1}"));
+        assertEquals( "[1.1,1.2)", macro.process("[${version;==;1.1.1},${version;=+;1.1.1})"));
+        assertEquals( "1.1", macro.process("${version;==;1.1.1}"));
+        assertEquals( "0.1.0", macro.process("${version;=+0;0.0.1}"));
+        assertEquals( "1.0.0", macro.process("${version;+00;0.1.1}"));
+        
+    }
+    
+    
+    /**
+     * Test the wc function
+     */
+    
+    public void testWc() {
+        Properties p = new Properties();
+        Macro macro = new Macro(p,proc);
+        String a = macro.process("${lsr;" + new File("src/test").getAbsolutePath() + ";*.java}");
+        assertTrue( a.contains("MacroTest.java"));
+        assertTrue( a.contains("ManifestTest.java"));
+        assertFalse( a.contains(".classpath"));
+        assertFalse( a.contains("src/test/MacroTest.java"));
+        assertFalse( a.contains("src/test/ManifestTest.java"));
+
+        String b = macro.process("${lsa;" + new File("src/test").getAbsolutePath() + ";*.java}");
+        assertTrue( b.contains("src/test/MacroTest.java"));
+        assertTrue( b.contains("src/test/ManifestTest.java"));
+    }
+    /**
+     * Check the uniq command
+     */
+    
+    public void testUniq() {
+        Builder builder = new Builder();
+        Properties p = new Properties();
+        p.setProperty("a" , "${uniq;1}");
+        p.setProperty("b" , "${uniq;1,2}");
+        p.setProperty("c" , "${uniq;1;2}");
+        p.setProperty("d" , "${uniq;1; 1,  2 , 3}");
+        p.setProperty("e" , "${uniq;1; 1 , 2 ;      3;3,4,5,6}");
+        builder.setProperties(p);
+        assertEquals( "1,2,3", builder.getProperty("d"));
+        assertEquals( "1,2", builder.getProperty("b"));
+        assertEquals( "1", builder.getProperty("a"));
+        assertEquals( "1,2", builder.getProperty("c"));
+        assertEquals( "1,2,3", builder.getProperty("d"));
+        assertEquals( "1,2,3,4,5,6", builder.getProperty("e"));
+        
+    }
+    /**
+     * Test arguments with difficult characters like ;
+     */
+    
+    public void testEscapedArgs() {
+        Builder builder = new Builder();
+        Properties p = new Properties();
+        p.setProperty("x" , "${replace;1,2,3;.+;$0\\;version=1}");
+        builder.setProperties(p);
+        assertEquals( "1;version=1, 2;version=1, 3;version=1", builder.getProperty("x"));
+        
+    }
+    /**
+     * Check if variables that contain variables, ad nauseum, really wrk
+     */
+    public void testNested() {
+        Builder builder = new Builder();
+        Properties p = new Properties();
+        p.setProperty("a", ".");
+        p.setProperty("b", "${a}");
+        p.setProperty("c", "${b}");
+        
+        p.setProperty("d", "${tstamp;${format};${aug152008}}");
+        p.setProperty("format", "yyyy");
+        p.setProperty("aug152008", "1218810097322");
+
+        p.setProperty("f", "${d}");
+        p.setProperty("aug152008", "1218810097322");
+
+        builder.setProperties(p);
+        assertEquals( ".", builder.getProperty("c"));
+        assertEquals( "2008", builder.getProperty("d"));
+        assertEquals( builder.getProperty("f"), builder.getProperty("d"));
+    }
+    
+    public void testLoop() {
+        Builder builder = new Builder();
+        Properties p = new Properties();
+        p.setProperty("a", "${b}");
+        p.setProperty("b", "${a}");
+        
+        p.setProperty("d", "${e}");
+        p.setProperty("e", "${f}");
+        p.setProperty("f", "${g}");
+        p.setProperty("g", "${h}");
+        p.setProperty("h", "${d}");
+        
+        builder.setProperties(p);
+        assertEquals( "${infinite:[a,b]}", builder.getProperty("a"));
+        assertEquals( "${infinite:[d,h,g,f,e]}", builder.getProperty("d"));
+    }
+    
+    public void testTstamp() {
+        String aug152008 = "1218810097322";
+        Properties p = new Properties();
+        Macro m = new Macro(p, proc);
+        assertEquals("200808151621", m.process("${tstamp;yyyyMMddHHmm;"+aug152008+"}"));
+        //assertEquals( "2008", m.process("${tstamp;yyyy}"));
+    }
+    public void testIsfile() {
+        Properties p = new Properties();
+        Macro m = new Macro(p, proc);
+        assertEquals("true", m.process("${isfile;.project}"));
+        assertEquals("false", m.process("${isfile;thisfiledoesnotexist}"));
+    }
+
+    public void testParentFile() {
+        Properties p = new Properties();
+        Macro m = new Macro(p, proc);
+        assertTrue(m.process("${dir;.project}").endsWith("aQute.bnd"));
+    }
+
+    public void testBasename() {
+        Properties p = new Properties();
+        Macro m = new Macro(p, proc);
+        assertEquals("aQute.bnd", m.process("${basename;${dir;.project}}"));
+    }
+
+    public void testMavenVersionMacro() throws Exception {
+        Builder builder = new Builder();
+        Properties p = new Properties();
+        p.setProperty("Export-Package", "org.objectweb.*;version=1.5-SNAPSHOT");
+        builder.setProperties(p);
+        builder.setClasspath(new File[] { new File("jar/asm.jar") });
+        Jar jar = builder.build();
+        Manifest manifest = jar.getManifest();
+        String export = manifest.getMainAttributes().getValue("Export-Package");
+        assertNotNull(export);
+        assertTrue("Test snapshot version", export.contains("1.5.0.SNAPSHOT"));
+    }
+
+    /**
+     * Check if we can check for the defintion of a variable
+     */
+
+    public void testDef() {
+        Properties p = new Properties();
+        p.put("set.1", "1");
+        p.put("set.2", "2");
+        Macro m = new Macro(p, proc);
+        assertEquals("NO", m.process("${if;${def;set.3};YES;NO}"));
+        assertEquals("YES", m.process("${if;${def;set.1};YES;NO}"));
+        assertEquals("YES", m.process("${if;${def;set.2};YES;NO}"));
+    }
+
+    /**
+     * NEW
+     */
+    public void testReplace() {
+        Properties p = new Properties();
+        p.put("specs", "a,b, c,    d");
+        Macro m = new Macro(p, proc);
+        assertEquals("xay, xby, xcy, xdy", m
+                .process("${replace;${specs};([^\\s]+);x$1y}"));
+    }
+
+    public void testToClassName() {
+        Properties p = new Properties();
+        proc = new Processor();
+        Macro m = new Macro(p, proc);
+        assertEquals("com.acme.test.Test", m
+                .process("${toclassname;com/acme/test/Test.class}"));
+        assertEquals("Test", m.process("$<toclassname;Test.class>"));
+        assertEquals("Test,com.acme.test.Test", m
+                .process("${toclassname;Test.class, com/acme/test/Test.class}"));
+        assertEquals("", m.process("$(toclassname;Test)"));
+        assertEquals("com/acme/test/Test.class", m
+                .process("$[toclasspath;com.acme.test.Test]"));
+        assertEquals("Test.class", m.process("${toclasspath;Test}"));
+        assertEquals("Test.class,com/acme/test/Test.class", m
+                .process("${toclasspath;Test,com.acme.test.Test}"));
+    }
+
+    public void testFindPath() throws IOException {
+        Analyzer analyzer = new Analyzer();
+        analyzer.setJar(new File("jar/asm.jar"));
+        Properties p = new Properties();
+        Macro m = new Macro(p, analyzer);
+
+        assertTrue(m.process("${findname;(.*)\\.class;$1.xyz}").indexOf(
+                "FieldVisitor.xyz,") >= 0);
+        assertTrue(m.process("${findname;(.*)\\.class;$1.xyz}").indexOf(
+                "MethodVisitor.xyz,") >= 0);
+        assertTrue(m.process("${findpath;(.*)\\.class}").indexOf(
+                "org/objectweb/asm/AnnotationVisitor.class,") >= 0);
+        assertTrue(m
+                .process("${findpath;(.*)\\.class}")
+                .indexOf(
+                        "org/objectweb/asm/ByteVector.class, org/objectweb/asm/ClassAdapter.class,") >= 0);
+        assertEquals("META-INF/MANIFEST.MF", m
+                .process("${findpath;META-INF/MANIFEST.MF}"));
+        assertEquals("Label.class", m.process("${findname;Label\\..*}"));
+        assertEquals("Adapter, Visitor, Writer", m
+                .process("${findname;Method(.*)\\.class;$1}"));
+    }
+
+    public void testWarning() {
+        Properties p = new Properties();
+        p.put("three", "333");
+        p.put("empty", "");
+        p.put("real", "true");
+        proc = new Processor();
+        Macro m = new Macro(p, proc);
+
+        m.process("    ${warning;xw;1;2;3 ${three}}");
+        m.process("    ${error;xe;1;2;3 ${three}}");
+        m.process("    ${if;1;$<a>}");
+        assertEquals("xw", proc.getWarnings().get(0));
+        assertEquals("1", proc.getWarnings().get(1));
+        assertEquals("2", proc.getWarnings().get(2));
+        assertEquals("3 333", proc.getWarnings().get(3));
+
+        assertEquals("xe", proc.getErrors().get(0));
+        assertEquals("1", proc.getErrors().get(1));
+        assertEquals("2", proc.getErrors().get(2));
+        assertEquals("3 333", proc.getErrors().get(3));
+    }
+
+    public void testNestedReplace() {
+        Properties p = new Properties();
+        Macro m = new Macro(p, proc);
+        String value = m
+                .process("xx$(replace;1.2.3-SNAPSHOT;(\\d(\\.\\d)+).*;$1)xx");
+        System.out.println(proc.getWarnings());
+        assertEquals("xx1.2.3xx", value);
+
+        assertEquals(
+                "xx1.222.3xx",
+                m
+                        .process("xx$(replace;1.222.3-SNAPSHOT;(\\d+(\\.\\d+)+).*;$1)xx"));
+
+        p.put("a", "aaaa");
+        assertEquals("[cac]", m.process("$[replace;acaca;a(.*)a;[$1]]"));
+        assertEquals("xxx", m.process("$(replace;yxxxy;[^x]*(x+)[^x]*;$1)"));
+        assertEquals("xxx", m.process("$(replace;yxxxy;([^x]*(x+)[^x]*);$2)"));
+
+    }
+
+    public void testParentheses() {
+        Properties p = new Properties();
+        Macro m = new Macro(p, proc);
+        String value = m.process("$(replace;();(\\(\\));$1)");
+        assertEquals("()", value);
+    }
+
+    public void testSimple() {
+        Properties p = new Properties();
+        p.put("a", "aaaa");
+        Macro m = new Macro(p, proc);
+        assertEquals("aaaa", m.process("${a}"));
+        assertEquals("aaaa", m.process("$<a>"));
+        assertEquals("aaaa", m.process("$(a)"));
+        assertEquals("aaaa", m.process("$[a]"));
+        assertEquals("aaaa", m.process("$«a»"));
+        assertEquals("aaaa", m.process("$‹a›"));
+
+        assertEquals("xaaaax", m.process("x${a}x"));
+        assertEquals("xaaaaxaaaax", m.process("x${a}x${a}x"));
+    }
+
+    public void testFilter() {
+        Properties p = new Properties();
+        p.put("a", "aaaa");
+        Macro m = new Macro(p, proc);
+        assertEquals("aa,cc,ee", m
+                .process("${filter;aa,bb,cc,dd,ee,ff;[ace]+}"));
+        assertEquals("aaaa,cc,ee", m
+                .process("${filter;${a},bb,cc,dd,ee,ff;[ace]+}"));
+        assertEquals("bb,dd,ff", m
+                .process("${filter;${a},bb,cc,dd,ee,ff;[^ace]+}"));
+    }
+
+    public void testFilterOut() {
+        Properties p = new Properties();
+        p.put("a", "aaaa");
+        Macro m = new Macro(p, proc);
+        assertEquals("bb,dd,ff", m
+                .process("${filterout;aa,bb,cc,dd,ee,ff;[ace]+}"));
+        assertEquals("bb,dd,ff", m
+                .process("${filterout;${a},bb,cc,dd,ee,ff;[ace]+}"));
+        assertEquals("aaaa,cc,ee", m
+                .process("${filterout;${a},bb,cc,dd,ee,ff;[^ace]+}"));
+    }
+
+    public void testSort() {
+        Properties p = new Properties();
+        p.put("a", "aaaa");
+        Macro m = new Macro(p, proc);
+        assertEquals("aa,bb,cc,dd,ee,ff", m
+                .process("${sort;aa,bb,cc,dd,ee,ff}"));
+        assertEquals("aa,bb,cc,dd,ee,ff", m
+                .process("${sort;ff,ee,cc,bb,dd,aa}"));
+        assertEquals("aaaa,bb,cc,dd,ee,ff", m
+                .process("${sort;ff,ee,cc,bb,dd,$<a>}"));
+    }
+
+    public void testJoin() {
+        Properties p = new Properties();
+        p.put("a", "aaaa");
+        Macro m = new Macro(p, proc);
+        assertEquals("aa,bb,cc,dd,ee,ff", m
+                .process("${join;aa,bb,cc,dd,ee,ff}"));
+        assertEquals("aa,bb,cc,dd,ee,ff", m
+                .process("${join;aa,bb,cc;dd,ee,ff}"));
+        assertEquals("aa,bb,cc,dd,ee,ff", m
+                .process("${join;aa;bb;cc;dd;ee,ff}"));
+    }
+
+    public void testIf() {
+        Properties p = new Properties();
+        p.put("a", "aaaa");
+        Macro m = new Macro(p, proc);
+        assertEquals("aaaa", m.process("${if;1;$<a>}"));
+        assertEquals("", m.process("${if;;$<a>}"));
+        assertEquals("yes", m.process("${if;;$<a>;yes}"));
+    }
+
+    public void testLiteral() {
+        Properties p = new Properties();
+        p.put("a", "aaaa");
+        Macro m = new Macro(p, proc);
+        assertEquals("${aaaa}", m.process("${literal;$<a>}"));
+    }
+}


Property changes on: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/MacroTest.java
___________________________________________________________________
Name: svn:executable
   + *

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/MakeTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/MakeTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/MakeTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,114 @@
+package test;
+
+import java.io.*;
+import java.util.*;
+
+import junit.framework.*;
+import aQute.lib.osgi.*;
+
+/**
+ * Tests the make functionality.
+ * 
+ * @author aqute
+ *
+ */
+public class MakeTest extends TestCase {
+    
+    /**
+     * Test a make plugin
+     */
+    
+    public void testMakePlugin() throws Exception {
+        Builder b = new Builder();
+        b.setProperty("Export-Package", "*");
+        b.setProperty("Include-Resource", "jar/asm.jar.md5");
+        b.setProperty("-make", "(*).md5;type=md5;file=$1");        
+        b.setProperty("-plugin", "test.make.MD5");
+        b.addClasspath( new File("jar/osgi.jar"));
+        Jar jar = b.build();
+        System.out.println(b.getErrors());
+        System.out.println(b.getWarnings());
+        assertEquals(0, b.getErrors().size());
+        assertEquals(0, b.getWarnings().size());
+        assertNotNull( jar.getResource("asm.jar.md5"));
+    }
+    
+    /**
+     * Check if we can get a resource through the make copy facility.
+     * 
+     * @throws Exception
+     */
+    public void testCopy() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.setProperty("-resourceonly","true");
+        p.setProperty("-plugin", "aQute.bnd.make.MakeBnd, aQute.bnd.make.MakeCopy");
+        p.setProperty("-make", "(*).jar;type=bnd;recipe=bnd/$1.bnd, (*).jar;type=copy;from=jar/$1.jar");
+        p.setProperty("Include-Resource", "asm.jar,xyz=asm.jar");
+        bmaker.setProperties(p);
+        Jar jar = bmaker.build();
+        assertNotNull(jar.getResource("asm.jar"));
+        assertNotNull(jar.getResource("xyz"));
+        report(bmaker);
+        
+    }
+    
+    
+ 
+    /**
+     * Check if we can create a JAR recursively
+     * 
+     * @throws Exception
+     */
+    public void testJarInJarInJar() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.setProperty("-plugin", "aQute.bnd.make.MakeBnd, aQute.bnd.make.MakeCopy");
+        p.setProperty("-resourceonly","true");
+        p.setProperty("-make", "(*).jar;type=bnd;recipe=bnd/$1.bnd");
+        p.setProperty("Include-Resource", "makesondemand.jar");
+        bmaker.setProperties(p);
+        bmaker.setClasspath( new String[] {"src"});
+        Jar jar = bmaker.build();
+        JarResource resource = (JarResource) jar.getResource("makesondemand.jar");
+        assertNotNull(resource);
+        
+        jar = resource.getJar();
+        resource = (JarResource) jar.getResource("ondemand.jar");
+        assertNotNull(resource);
+        
+        report(bmaker);        
+    }
+    /**
+     * Check if we can create a jar on demand through the make
+     * facility with a new name.
+     * 
+     * @throws Exception
+     */
+    public void testComplexOnDemand() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.setProperty("-resourceonly","true");
+        p.setProperty("-plugin", "aQute.bnd.make.MakeBnd, aQute.bnd.make.MakeCopy");
+        p.setProperty("-make", "(*).jar;type=bnd;recipe=bnd/$1.bnd");
+        p.setProperty("Include-Resource", "www/xyz.jar=ondemand.jar");
+        bmaker.setProperties(p);
+        bmaker.setClasspath( new String[] {"src"});
+        Jar jar = bmaker.build();
+        Resource resource =jar.getResource("www/xyz.jar");
+        assertNotNull(resource);
+        assertTrue( resource instanceof JarResource );
+        report(bmaker);
+        
+    }
+    void report(Processor processor) {
+        System.out.println();
+        for ( int i=0; i<processor.getErrors().size(); i++ )
+            System.out.println(processor.getErrors().get(i));
+        for ( int i=0; i<processor.getWarnings().size(); i++ )
+            System.out.println(processor.getWarnings().get(i));
+        assertEquals(0, processor.getErrors().size());
+        assertEquals(0, processor.getWarnings().size());
+    }
+
+}

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ManifestTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ManifestTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ManifestTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,68 @@
+package test;
+
+import java.io.*;
+import java.util.*;
+import java.util.jar.*;
+
+import junit.framework.*;
+import aQute.lib.osgi.*;
+
+public class ManifestTest extends TestCase {
+    
+    
+    public void testNoManifest() throws Exception {
+        Builder b = new Builder();
+        b.setProperty("-nomanifest","true");
+        b.setProperty("Export-Package","org.osgi.service.event.*");
+        b.addClasspath(new File("jar/osgi.jar"));
+        Jar jar = b.build();
+        assertNull( jar.getResource("META-INF/MANIFEST.MF"));
+    }
+    
+    
+    public 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.out.println( new String(result));
+    }
+    
+
+    public 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.out.println( new String(result));
+    }
+    
+	public void testQuotes() {
+		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);
+	}
+}


Property changes on: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ManifestTest.java
___________________________________________________________________
Name: svn:executable
   + *

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/MavenTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/MavenTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/MavenTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,39 @@
+package test;
+
+import java.io.*;
+import java.util.*;
+
+import junit.framework.*;
+import aQute.bnd.maven.*;
+import aQute.lib.osgi.*;
+
+public class MavenTest extends TestCase {
+    Processor processor = new Processor();
+    
+    public void testMaven() {
+        MavenRepository maven = new MavenRepository();
+        maven.setReporter(processor);
+        maven.setProperties( new HashMap<String,String>());
+        List<String> x = maven.list(null);
+        System.out.println(x);
+    }
+
+
+    public void testMavenBsnMapping() throws Exception {
+        Processor processor = new Processor();
+        processor.setProperty("-plugin", "aQute.bnd.maven.MavenGroup; groupId=org.apache.felix, aQute.bnd.maven.MavenRepository");
+        MavenRepository maven = new MavenRepository();
+        maven.setReporter(processor);
+        Map<String,String> map = new HashMap<String,String>();
+        map.put("root", "test/maven-repo");
+        maven.setProperties(map);
+
+        File    files[]= maven.get("org.apache.felix.framework", null);
+        assertNotNull(files);;
+        assertEquals(1, files.length);
+
+        files = maven.get("biz.aQute.bndlib", null);
+        assertNotNull(files);;
+        assertEquals(5, files.length);
+   }
+}

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/MergeTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/MergeTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/MergeTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,70 @@
+package test;
+
+import java.io.*;
+import java.util.*;
+
+import junit.framework.*;
+
+import aQute.lib.osgi.*;
+
+public class MergeTest extends TestCase {
+
+	public void testFirst() throws Exception {
+		testMerge("first", new String[] { "A", "C" }, new String[] { "B" },
+				"first", 0, 0);
+	}
+	
+	public void testMergeFirst() throws Exception {
+		testMerge("merge-first", new String[] { "A", "B", "C" },
+				new String[] { "" }, "first", 0, 0);
+	}
+	
+	public void testDefault() throws Exception {
+		testMerge(null, new String[] { "A", "B", "C" }, new String[] { },
+				"first", 0, 1);
+	}
+	
+	public void testMergeLast() throws Exception {
+		testMerge("merge-last", new String[] { "A", "B", "C" },
+				new String[] { "" }, "last", 0, 0);
+	}
+	
+	public void testError() throws Exception {
+		testMerge("error", null, null,null, 1, 0);
+	}
+
+	void testMerge(String type, String[] in, String[] out, String c,
+			int errors, int warnings) throws Exception {
+		Builder b = new Builder();
+		b.setClasspath(new File[] { new File("src/test/split/split-a.jar"),
+				new File("src/test/split/split-b.jar") });
+		Properties p = new Properties();
+		if (type != null)
+			p.put("Export-Package", "test.split;-split-package:=" + type);
+		else
+			p.put("Export-Package", "test.split");
+		p.put("Import-Package", "");
+		b.setProperties(p);
+		Jar jar = b.build();
+		System.out.println("Errors     :" + b.getErrors());
+		System.out.println("Warnings   :" + b.getWarnings());
+		assertEquals(errors, b.getErrors().size());
+		assertEquals(warnings, b.getWarnings().size());
+		if (errors != 0)
+			return;
+
+		for (int i = 0; in != null && i < in.length; i++)
+			assertNotNull("Contains " + in[i], jar.getResource("test/split/"
+					+ in[i]));
+		for (int i = 0; out != null && i < out.length; i++)
+			assertNull("Does not contain " + out[i], jar
+					.getResource("test/split/" + out[i]));
+
+		Resource r = jar.getResource("test/split/C");
+		InputStream is = r.openInputStream();
+		BufferedReader dis = new BufferedReader( new InputStreamReader(is));
+		String s = dis.readLine();
+		assertEquals(s, c);
+	}
+
+}

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/NativeHeader.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/NativeHeader.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/NativeHeader.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,59 @@
+package test;
+
+import java.util.*;
+
+import junit.framework.*;
+import aQute.lib.osgi.*;
+
+public class NativeHeader extends TestCase {
+    
+        public void testFunnyHeader() throws Exception {
+            Verifier v = new Verifier();
+            v.doNative("org/osgi/test/cases/framework/fragments/tb8/linux_x86/libNative.so; osname=Linux; processor=x86; osversion=\"(1000,10000]\",");
+            assertBad(v, "name");
+        }
+        
+        public void testWildcardNotAtEnd() throws Exception {
+            Verifier v = new Verifier();
+            v.doNative("x.so;osname=win32,*,x.dll");
+            assertBad(v, "may only END in wildcard");
+        }
+        
+
+    public void testWildcard() throws Exception {
+        Verifier v = new Verifier();
+        v.doNative("x.so ;y.so;osname=Linux;processor=amd64,*");
+        assertOk(v);
+    }
+    
+	public void testSimple() throws Exception {
+		Verifier v = new Verifier();
+		v.doNative("\rnative/libclib_jiio.so ;\r"
+				+ "native/libmlib_jai.so;\r" + "osname=Linux ;\r"
+				+ "processor=amd64\r");
+        assertOk(v);
+	}
+
+
+    void assertOk(Processor v) {
+        System.err.println(v.getWarnings());
+        System.err.println(v.getErrors());
+        assertEquals(0, v.getErrors().size());
+        assertEquals(0, v.getWarnings().size());        
+    }
+    
+    void assertBad(Processor v, String ok) {
+        assertEmptyAfterRemove(v.getErrors(), ok);
+        assertEmptyAfterRemove(v.getWarnings(), ok);
+    }
+
+
+    private void assertEmptyAfterRemove(List<String> errors, String ok) {
+        for ( String s: errors ) {
+            if ( s.indexOf(ok)<0)
+                fail("Found error/warning that can not be removed: " + s + " : " + ok);
+        }        
+    }
+    
+   
+}


Property changes on: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/NativeHeader.java
___________________________________________________________________
Name: svn:executable
   + *

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/NoUsesTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/NoUsesTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/NoUsesTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,127 @@
+package test;
+
+import java.io.*;
+import java.util.*;
+
+import junit.framework.*;
+import aQute.lib.osgi.*;
+
+public class NoUsesTest extends TestCase {
+
+	/*
+	 * Check if we explicitly set a uses directive, prepend the calculated
+	 * but the calculated is empty. This should remove the extraneuous comma
+	 */
+	public void testExplicitUsesWithPrependZeroUses() throws Exception {
+		Builder bmaker = new Builder();
+		bmaker.setProperty("Private-Package", "org.osgi.framework");
+		bmaker.setProperty("Export-Package", "org.osgi.util.tracker;uses:=\"<<USES>>,not.used\"");
+		String uses = findUses(bmaker, "org.osgi.util.tracker");
+		assertEquals("not.used", uses);
+	}
+	
+	/*
+	 * Check if we explicitly set a uses directive, but append it
+	 * with the calculated directive
+	 */
+	public void testExplicitUsesWithAppend() throws Exception {
+		Builder bmaker = new Builder();
+		bmaker.setProperty("Export-Package", "org.osgi.util.tracker;uses:=\"not.used,<<USES>>\"");
+		String uses = findUses(bmaker, "org.osgi.util.tracker");
+		assertTrue("not.used", uses.indexOf("not.used")>=0);
+		assertTrue("org.osgi.framework", uses.indexOf("org.osgi.framework")>=0);
+	}
+
+	/*
+	 * Check if we explicitly set a uses directive, append the calculated
+	 * but the calculated is empty. This should remove the extraneuous comma
+	 */
+	public void testExplicitUsesWithAppendZeroUses() throws Exception {
+		Builder bmaker = new Builder();
+		bmaker.setProperty("Private-Package", "org.osgi.framework");
+		bmaker.setProperty("Export-Package", "org.osgi.util.tracker;uses:=\"not.used,<<USES>>\"");
+		String uses = findUses(bmaker, "org.osgi.util.tracker");
+		assertEquals("not.used", uses);
+	}
+	
+	/*
+	 * Check if we explicitly set a uses directive, but append it
+	 * with the calculated directive
+	 */
+	public void testExplicitUsesWithPrepend() throws Exception {
+		Builder bmaker = new Builder();
+		bmaker.setProperty("Export-Package", "org.osgi.util.tracker;uses:=\"<<USES>>,not.used\"");
+		String uses = findUses(bmaker, "org.osgi.util.tracker");
+		assertTrue("not.used", uses.indexOf("not.used")>=0);
+		assertTrue("org.osgi.framework", uses.indexOf("org.osgi.framework")>=0);
+	}
+	/*
+	 * Check if we explicitly set a uses directive
+	 */
+	public void testExplicitUses() throws Exception {
+		Builder bmaker = new Builder();
+		bmaker.setProperty("Export-Package", "org.osgi.util.tracker;uses:=\"not.used\"");
+		String uses = findUses(bmaker, "org.osgi.util.tracker");
+		assertEquals("not.used", uses);
+	}
+	
+	public void testExportedUses() throws Exception {
+		Builder bmaker = new Builder();
+		bmaker.setProperty("Export-Package", "org.osgi.util.tracker, org.osgi.framework");
+		String uses = findUses(bmaker, "org.osgi.util.tracker");
+		assertEquals("org.osgi.framework", uses);
+	}
+	
+
+	public void testPrivateUses() throws Exception {
+		Builder bmaker = new Builder();
+		bmaker.setProperty("Private-Package", "org.osgi.framework");
+		bmaker.setProperty("Export-Package", "org.osgi.util.tracker");
+		String uses = findUses(bmaker, "org.osgi.util.tracker");
+		assertNull("org.osgi.framework", uses);
+	}
+	
+	public void testHasUses() throws Exception {
+		Builder bmaker = new Builder();
+		bmaker.setProperty("Export-Package", "test.activator");
+		String uses = findUses(bmaker, "test.activator");
+		assertEquals("org.osgi.framework", uses);
+	}
+
+	public void testNoUses() throws Exception {
+		Builder bmaker = new Builder();
+		bmaker.setProperty("Export-Package", "test.activator");
+		bmaker.setProperty("-nouses", "true");
+		String uses = findUses(bmaker, "test.activator");
+		assertNull("org.osgi.framework", uses);
+	}
+
+
+	
+	String findUses(Builder bmaker, String pack ) throws Exception {
+			File cp[] = { new File("bin"), new File("jar/osgi.jar") };
+			bmaker.setClasspath(cp);
+			Jar jar = bmaker.build();
+			assertOk(bmaker);
+			String exports = jar.getManifest().getMainAttributes().getValue("Export-Package");
+			assertNotNull("exports", exports );
+			Map<String,Map<String,String>> map = Processor.parseHeader(exports, null);
+			if ( map == null )
+				return null;
+			
+			Map<String,String> clause = map.get(pack);
+			if ( clause == null )
+				return null;
+			
+			return (String) clause.get("uses:");			
+	}
+	
+	void assertOk(Analyzer bmaker) throws IOException {
+		System.out.println(bmaker.getErrors());
+		System.out.println(bmaker.getWarnings());
+		bmaker.getJar().getManifest().write(System.out);
+		assertEquals(0,bmaker.getErrors().size());
+		assertEquals(0,bmaker.getWarnings().size());
+		
+	}
+}

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ParseHeaderTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ParseHeaderTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ParseHeaderTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,81 @@
+package test;
+
+import java.util.*;
+
+import aQute.lib.osgi.*;
+import aQute.libg.header.*;
+import junit.framework.*;
+
+public class ParseHeaderTest extends TestCase {
+
+    public void testPropertiesSimple() {
+        Map<String,String> p = OSGiHeader.parseProperties("a=1, b=\"3   3\", c=c");
+        assertEquals("1", p.get("a"));
+        assertEquals("3   3", p.get("b"));
+        assertEquals("c", p.get("c"));
+    }
+    
+	public 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");
+	}
+
+	
+	
+	void assertNames(String header, String[] keys) {
+		assertNames(header,keys, null, null);
+	}
+	void assertNames(String header, String[] keys, String expectedError, String expectedWarning) {
+		Processor p = new Processor();
+		p.setPedantic(true);
+		Map<String,Map<String,String>> map = Processor.parseHeader(header, p);
+		for (String key : keys )
+			assertTrue(map.containsKey(key));
+		
+		assertEquals(keys.length, map.size());
+		if (expectedError != null) {
+			System.out.println(p.getErrors());
+			assertTrue(p.getErrors().size()>0);
+			assertTrue(((String) p.getErrors().get(0)).indexOf(expectedError) >= 0);
+		} else
+			assertEquals(0, p.getErrors().size());
+		if (expectedWarning != null) {
+			System.out.println(p.getWarnings());
+			assertTrue(p.getWarnings().size()>0);
+			String w = (String) p.getWarnings().get(0);
+			assertTrue(w.startsWith(expectedWarning));
+		} else
+			assertEquals(0, p.getWarnings().size());
+	}
+
+	public void testSimple() {
+		String s = "a;a=a1;b=a2;c=a3, b;a=b1;b=b2;c=b3, c;d;e;a=x1";
+		Map<String,Map<String,String>> 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.out.println(map);
+	}
+}


Property changes on: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ParseHeaderTest.java
___________________________________________________________________
Name: svn:executable
   + *

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/PluginTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/PluginTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/PluginTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,55 @@
+package test;
+
+import java.applet.*;
+import java.util.*;
+
+import junit.framework.*;
+import aQute.bnd.service.*;
+import aQute.lib.osgi.*;
+import aQute.libg.reporter.*;
+
+public class PluginTest extends TestCase {
+    static Processor main = new Processor();
+    
+    public void testMissingPluginNotUsed() throws Exception {
+        Builder p = new Builder();
+        p.setProperty("-plugin", "missing;command:=\"-abc,-def\"");
+        /*List<?> plugins =*/ p.getPlugins(Object.class);
+        assertEquals(0, p.getErrors().size());
+        
+        p.setProperty("-abc", "whatever");
+        p.setProperty("-resourceonly", "true");
+        p.setProperty("Include-Resource", "jar/osgi.jar");
+        p.build();
+        assertEquals(1, p.getErrors().size());
+        assertTrue(p.getErrors().get(0).contains("Missing plugin"));
+    }
+
+    static class TPlugin implements Plugin {
+        Map<String,String> properties;
+        
+        public void setProperties(Map<String, String> map) {
+            properties = map;
+        }
+
+        public void setReporter(Reporter processor) {
+            assertEquals(main, processor );
+        }
+    }
+    public void testPlugin() {
+        main.setProperty(Constants.PLUGIN, "test.PluginTest.TPlugin;a=1;b=2");
+        
+        for ( TPlugin plugin : main.getPlugins(TPlugin.class)) {
+            assertEquals( test.PluginTest.TPlugin.class, plugin.getClass());
+            assertEquals( "1", plugin.properties.get("a"));
+            assertEquals( "2", plugin.properties.get("b"));
+        }
+    }
+
+    public void testLoadPlugin() {
+        main.setProperty(Constants.PLUGIN, "thinlet.Thinlet;path:=jar/thinlet.jar");
+        for ( Applet applet : main.getPlugins(Applet.class)) {
+            assertEquals( "thinlet.Thinlet", applet.getClass().getName());
+        }        
+    }
+}

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ProcessorTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ProcessorTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ProcessorTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,40 @@
+package test;
+
+import junit.framework.*;
+import aQute.lib.osgi.*;
+
+public class ProcessorTest extends TestCase{
+
+    public void testDuplicates() {
+        assertEquals("", Processor.removeDuplicateMarker("~") );
+        
+        assertTrue( Processor.isDuplicate("abc~"));
+        assertTrue( Processor.isDuplicate("abc~~~~~~~~~"));
+        assertTrue( Processor.isDuplicate("~"));
+        assertFalse( Processor.isDuplicate(""));
+        assertFalse( Processor.isDuplicate("abc"));
+        assertFalse( Processor.isDuplicate("ab~c"));
+        assertFalse( Processor.isDuplicate("~abc"));
+        
+        assertEquals("abc", Processor.removeDuplicateMarker("abc~") );
+        assertEquals("abc", Processor.removeDuplicateMarker("abc~~~~~~~") );
+        assertEquals("abc", Processor.removeDuplicateMarker("abc") );
+        assertEquals("ab~c", Processor.removeDuplicateMarker("ab~c") );
+        assertEquals("~abc", Processor.removeDuplicateMarker("~abc") );
+        assertEquals("", Processor.removeDuplicateMarker("") );
+        assertEquals("", Processor.removeDuplicateMarker("~~~~~~~~~~~~~~") );
+    }
+    
+    
+    public void appendPathTest() throws Exception {
+        assertEquals("a/b/c", Processor.appendPath("","a/b/c/"));
+        assertEquals("a/b/c", Processor.appendPath("","/a/b/c"));
+        assertEquals("a/b/c", Processor.appendPath("/","/a/b/c/"));
+        assertEquals("a/b/c", Processor.appendPath("a","b/c/"));
+        assertEquals("a/b/c", Processor.appendPath("a","b","c"));
+        assertEquals("a/b/c", Processor.appendPath("a","b","/c/"));
+        assertEquals("a/b/c", Processor.appendPath("/","a","b","/c/"));
+        assertEquals("a/b/c", Processor.appendPath("////////","////a////b///c//"));
+        
+    }
+}

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ProjectTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ProjectTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ProjectTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,37 @@
+package test;
+
+import java.io.*;
+
+import junit.framework.*;
+import aQute.bnd.build.*;
+import aQute.lib.osgi.*;
+import aQute.lib.osgi.eclipse.*;
+import aQute.libg.version.*;
+
+public class ProjectTest extends TestCase {
+
+	public void testClasspath() throws Exception {
+		File	project = new File("").getAbsoluteFile();
+		File workspace = project.getParentFile();
+		Processor processor = new Processor();
+		EclipseClasspath p = new EclipseClasspath( processor, workspace, project );
+		System.out.println( p.getDependents());
+		System.out.println( p.getClasspath());
+		System.out.println( p.getSourcepath());
+		System.out.println( p.getOutput());
+	}
+	
+	public void testBump() throws Exception {
+	    Workspace ws = Workspace.getWorkspace(new File("test/ws"));
+	    Project project = ws.getProject("p1");
+	    int size = project.getProperties().size();
+	    Version old = new Version(project.getProperty("Bundle-Version"));
+	    project.bump("=+0");
+	    Version newv = new Version(project.getProperty("Bundle-Version"));
+        assertEquals( old.getMajor(), newv.getMajor());
+        assertEquals( old.getMinor()+1, newv.getMinor());
+        assertEquals( 0, newv.getMicro());
+        assertEquals( size, project.getProperties().size());
+        assertEquals( "sometime", newv.getQualifier());
+	}
+}


Property changes on: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ProjectTest.java
___________________________________________________________________
Name: svn:executable
   + *

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/PropertiesTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/PropertiesTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/PropertiesTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,129 @@
+package test;
+
+import java.io.*;
+import java.util.*;
+import java.util.jar.*;
+
+import junit.framework.*;
+import aQute.lib.osgi.*;
+
+public class PropertiesTest extends TestCase {
+    static <T> T notNull(T t) { assertNotNull(t); return t; }
+    
+    public 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 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 void testUnicode() {
+        StringBuffer sb = new StringBuffer();
+        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.out.println(sb);
+    }
+
+    public  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 void testInternationalCharacters() throws Exception {
+        String test="#comment\n"
+            + "abc=ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß\n"
+            + "Namex=Loïc Cotonéa\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("ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß", p.get("abc"));
+        assertEquals("Loïc Cotonéa", p.get("Namex"));
+        
+        // Now test if we can make the round trip
+        Builder b  = new Builder();
+        b.setProperties(p);
+        b.addClasspath( new File("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ïc Cotonéa", m.getMainAttributes().getValue("Namex"));
+    }
+	public void testBadProperties() throws Exception {
+		Analyzer	analyzer = new Analyzer();
+		analyzer.setPedantic(true);
+		analyzer.setProperties(new File("src/test/badproperties.prop"));
+		String  s = analyzer.getProperty(Analyzer.IMPORT_PACKAGE);
+		Map<String,Map<String,String>> 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.out.println(analyzer.getWarnings());
+        assertTrue(analyzer.getWarnings().get(0).indexOf("Empty clause, usually caused by repeating a comma without")>=0);
+		System.out.println(analyzer.getWarnings());
+	}
+	
+	public void testProperties() throws Exception {
+		Analyzer	analyzer = new Analyzer();
+		analyzer.setProperties(new File("src/test/variables.mf"));
+		
+		assertEquals("aQute.test", analyzer.getProperty("Header"));
+		System.out.println("property " + analyzer.getProperty("Header"));
+	}
+}


Property changes on: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/PropertiesTest.java
___________________________________________________________________
Name: svn:executable
   + *

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/RepoBuilderTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/RepoBuilderTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/RepoBuilderTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,47 @@
+package test;
+
+import junit.framework.*;
+
+public class RepoBuilderTest extends TestCase {
+
+    public void testA() {}
+    
+//    public void testSimple() {
+//        assertBundles("osgi", RepoBuilder.STRATEGY_LOWEST, new String[]{"osgi-3.0.0.jar"});
+//        assertBundles("osgi", RepoBuilder.STRATEGY_HIGHEST, new String[]{"osgi-4.2.0.jar"});
+//        assertBundles("osgi;version=4.1", RepoBuilder.STRATEGY_HIGHEST, new String[]{"osgi-4.2.0.jar"});
+//        assertBundles("osgi;version=4.1", RepoBuilder.STRATEGY_LOWEST, new String[]{"osgi-4.1.0.jar"});
+//        assertBundles("osgi;version=4.1.1", RepoBuilder.STRATEGY_LOWEST, new String[]{"osgi-4.2.0.jar"});
+//        assertBundles("osgi;version=\"(4.1,5)\"", RepoBuilder.STRATEGY_LOWEST, new String[]{"osgi-4.2.0.jar"});
+//        assertBundles("osgi;version=\"[4.1,5)\"", RepoBuilder.STRATEGY_LOWEST, new String[]{"osgi-4.1.0.jar"});
+//        assertBundles("osgi;version=\"[4.1,5)\"", RepoBuilder.STRATEGY_HIGHEST, new String[]{"osgi-4.2.0.jar"});
+//        assertBundles("osgi;version=\"[3,4)\"", RepoBuilder.STRATEGY_HIGHEST, new String[]{"osgi-3.0.0.jar"});
+//        //assertBundles("osgi,org.osgi.impl.service.log,org.osgi.impl.service.cm", RepoBuilder.STRATEGY_LOWEST, new String[]{"osgi-3.0.0.jar", "org.osgi.impl.service.cm-2.1.1.jar"});
+//    }
+//    
+//    
+//    void assertBundles(String bundles, int strategy, String endsWith[]) {        
+//        RepoBuilder r = new RepoBuilder();
+//        Properties p = new Properties();
+//        p.setProperty("-plugin", "aQute.lib.deployer.FileRepo;location=src/test/repo");
+//        p.setProperty("-bundles", bundles );
+//        r.setProperties(p);
+//        List<Container> b = r.getBundles(strategy, r.getProperty("-bundles"));
+//        List<File> l = new ArrayList<File>();
+//        for ( Container c : b ) 
+//            l.add(c.getFile());
+//        check(r);
+//        assertEquals( endsWith.length, b.size());
+//        for ( int i =0; i<endsWith.length; i++ ) {
+//            assertTrue(endsWith[i] + " : " + l.get(i), l.get(i).toString().endsWith(endsWith[i]));
+//        }
+//        System.out.println(b);        
+//    }
+//    
+//    void check(Analyzer r) {
+//        System.out.println(r.getErrors());
+//        System.out.println(r.getWarnings());
+//        assertEquals(0, r.getWarnings().size());
+//        assertEquals(0, r.getErrors().size());
+//    }
+}

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ResourcesTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ResourcesTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/ResourcesTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,189 @@
+package test;
+
+import java.util.*;
+import java.util.regex.Pattern;
+
+import junit.framework.*;
+import aQute.lib.osgi.*;
+
+public class ResourcesTest extends TestCase {
+
+    
+    public void testCopyToRoot() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.setProperty("-resourceonly", "true");
+        p.setProperty("Include-Resource", "/=src/test/activator");
+        bmaker.setProperties(p);
+        Jar jar = bmaker.build();
+        for ( String s : jar.getResources().keySet() )
+            System.out.println( s);
+        assertNotNull(jar.getResource("Activator.java"));
+        assertEquals( 0, bmaker.getErrors().size() );
+        assertEquals( 0, bmaker.getWarnings().size() );
+    }
+    
+    public void testIncludeResourceDirectivesDefault() throws Exception {
+        Builder b = new Builder();
+        b.setProperty("Include-Resource", "TargetFolder=test/ws/p2/Resources");
+        b.setProperty("-resourceonly", "true");
+        Jar jar = b.build();
+        Resource r = jar.getResource("TargetFolder/resource3.txt");
+        assertNotNull(r);
+        r = jar.getResource("TargetFolder/resource4.txt");
+        assertNotNull(r);
+        r = jar.getResource("TargetFolder/more/resource6.txt");
+        assertNotNull(r);
+        r = jar.getResource("TargetFolder/more/resource7.txt");
+        assertNotNull(r);
+        r = jar.getResource("TargetFolder/stuff/resource9.res");
+        assertNotNull(r);
+        r = jar.getResource("TargetFolder/text.txt");
+        assertNotNull(r);
+
+    }
+    public void testIncludeResourceDoNotCopy() throws Exception {
+        Builder b = new Builder();
+        
+        // Use Properties file otherwise -donotcopy is not picked up
+        Properties p = new Properties();
+        p.put("-donotcopy", "CVS|.svn|stuff");
+        p.put("Include-Resource", "TargetFolder=test/ws/p2/Resources");
+        p.put("-resourceonly", "true");
+        b.setProperties(p);
+        
+        Jar jar = b.build();
+        Resource r = jar.getResource("TargetFolder/resource3.txt");
+        assertNotNull(r);
+        r = jar.getResource("TargetFolder/resource4.txt");
+        assertNotNull(r);
+        r = jar.getResource("TargetFolder/more/resource6.txt");
+        assertNotNull(r);
+        r = jar.getResource("TargetFolder/more/resource7.txt");
+        assertNotNull(r);
+        r = jar.getResource("TargetFolder/stuff/resource9.res");
+        assertNull(r);
+        r = jar.getResource("TargetFolder/text.txt");
+        assertNotNull(r);
+
+    }
+
+    public void testIncludeResourceDirectivesFilterRecursive() throws Exception {
+        Builder b = new Builder();
+        b.setProperty("Include-Resource", "TargetFolder=test/ws/p2/Resources;filter:=re*.txt");
+        b.setProperty("-resourceonly", "true");
+        Jar jar = b.build();
+        Resource r = jar.getResource("TargetFolder/resource3.txt");
+        assertNotNull(r);
+        r = jar.getResource("TargetFolder/resource4.txt");
+        assertNotNull(r);
+        r = jar.getResource("TargetFolder/more/resource6.txt");
+        assertNotNull(r);
+        r = jar.getResource("TargetFolder/more/resource7.txt");
+        assertNotNull(r);
+        r = jar.getResource("TargetFolder/text.txt");
+        assertNull(r);
+
+    }
+
+    public void testIncludeResourceDirectivesFilterNonRecursive() throws Exception {
+        Builder b = new Builder();
+        b.setProperty("Include-Resource", "TargetFolder=test/ws/p2/Resources;filter:=re*.txt;recursive:=false");
+        b.setProperty("-resourceonly", "true");
+        Jar jar = b.build();
+        Resource r = jar.getResource("TargetFolder/resource3.txt");
+        assertNotNull(r);
+        r = jar.getResource("TargetFolder/resource4.txt");
+        assertNotNull(r);
+        r = jar.getResource("TargetFolder/more/resource6.txt");
+        assertNull(r);
+        r = jar.getResource("TargetFolder/more/resource7.txt");
+        assertNull(r);
+    }
+
+    public void testIncludeResourceDirectivesFilterRecursiveFlatten() throws Exception {
+    	Builder b = new Builder();
+    	b.setProperty("Include-Resource", "TargetFolder=test/ws/p2/Resources;filter:=re*.txt;flatten:=true");
+        b.setProperty("-resourceonly", "true");
+        Jar jar = b.build();
+        
+        Resource r = jar.getResource("TargetFolder/resource3.txt");
+        assertNotNull(r);
+        r = jar.getResource("TargetFolder/resource4.txt");
+        assertNotNull(r);
+        r = jar.getResource("TargetFolder/resource6.txt");
+        assertNotNull(r);
+        r = jar.getResource("TargetFolder/resource7.txt");
+        assertNotNull(r);
+        r = jar.getResource("TargetFolder/resource1.res");
+        assertNull(r);
+
+    }
+ 
+    public void testEmpty() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.setProperty("-resourceonly", "true");
+        p.setProperty("Include-Resource", "  ");
+        bmaker.setProperties(p);
+        Jar jar = bmaker.build();
+        assertEquals( 0, jar.getResources().size());
+        assertEquals( 1, bmaker.getErrors().size() );
+        assertTrue( bmaker.getErrors().get(0).equalsIgnoreCase("The JAR is empty"));
+        assertEquals( 0, bmaker.getWarnings().size() );
+    }
+    
+    
+    public void testLiteral() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.setProperty("-resourceonly","true");
+        p.setProperty("Include-Resource", "text;literal=TEXT;extra='hello/world;charset=UTF-8'");
+        bmaker.setProperties(p);
+        bmaker.setClasspath( new String[] {"src"});
+        Jar jar = bmaker.build();
+        Resource resource =jar.getResource("text");
+        assertNotNull(resource);
+        byte buffer[] = new byte[1000];
+        int size = resource.openInputStream().read(buffer);
+        String s= new String(buffer,0,size);
+        assertEquals("TEXT",s);
+        assertEquals("hello/world;charset=UTF-8", resource.getExtra());
+        report(bmaker);
+        
+    }
+    
+    
+    /**
+     * Check if we can create a jar on demand through the make
+     * facility.
+     * 
+     * @throws Exception
+     */
+    public void testOnDemandResource() throws Exception {
+        Builder bmaker = new Builder();
+        Properties p = new Properties();
+        p.setProperty("-resourceonly","true");
+        p.setProperty("-plugin", "aQute.bnd.make.MakeBnd, aQute.bnd.make.MakeCopy");
+        p.setProperty("-make", "(*).jar;type=bnd;recipe=bnd/$1.bnd");
+        p.setProperty("Include-Resource", "ondemand.jar");
+        bmaker.setProperties(p);
+        bmaker.setClasspath( new String[] {"src"});
+        Jar jar = bmaker.build();
+        Resource resource =jar.getResource("ondemand.jar");
+        assertNotNull(resource);
+        assertTrue( resource instanceof JarResource );
+        report(bmaker);
+        
+    }
+    
+    void report(Processor processor) {
+        System.out.println();
+        for ( int i=0; i<processor.getErrors().size(); i++ )
+            System.out.println(processor.getErrors().get(i));
+        for ( int i=0; i<processor.getWarnings().size(); i++ )
+            System.out.println(processor.getWarnings().get(i));
+        assertEquals(0, processor.getErrors().size());
+        assertEquals(0, processor.getWarnings().size());
+    }
+}

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/SpringTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/SpringTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/SpringTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,91 @@
+package test;
+
+import junit.framework.*;
+import aQute.lib.osgi.*;
+
+public class SpringTest extends TestCase {
+
+	/**
+	 * Basic test to see if the analzyer works. We read the sprint-test1.xml and
+	 * see if we can detect all the different packages.
+	 * 
+	 * @throws Exception
+	 */
+	public void testSimple() throws Exception {
+	    
+//		InputStream in = getClass().getResourceAsStream("spring-test1.xml");
+//		Set set = SpringComponent.analyze(in);
+//		System.out.println(set);
+//		assertTrue(set.contains("com.foo.one"));
+//		assertTrue(set.contains("com.foo.one.one"));
+//		assertTrue(set.contains("com.foo.one.two"));
+//		assertTrue(set.contains("value_type"));
+//		assertTrue(set.contains("a.b"));
+//		assertTrue(set.contains("c.d"));
+//		assertTrue(set.contains("e.f"));
+//		assertTrue(set.contains("interfaces_1"));
+//		assertTrue(set.contains("interfaces_2"));
+//		assertFalse(set.contains("interfaces_3"));
+//		assertFalse(set.contains("I-am-not-here"));
+	}
+
+	/**
+	 * Now check if the plugin works, we create a dummy bundle and put the
+	 * spring-test1.xml in the appropriate place. This means that the
+	 * import-header contains all the the packages.
+	 * 
+	 * @throws Exception
+	public void testPlugin() throws Exception {
+		Builder b = new Builder();
+		b.setProperty(Analyzer.INCLUDE_RESOURCE,
+				"META-INF/spring/one.xml=src/test/spring-test1.xml");
+		b.setProperty(Analyzer.IMPORT_PACKAGE, "*");
+		b.setProperty(Analyzer.EXPORT_PACKAGE, "*");
+		b.setClasspath(new File[] { new File("jar/asm.jar") });
+		Jar jar = b.build();
+		checkMessages(b,0,0);
+		test(jar);
+	}
+	 */
+
+	/**
+	 * See what happens if we put the spring file in the wrong place.
+	 * We should have no import packages.
+	 * 
+	 * @throws Exception
+	 */
+//	public void testPluginWrongPlace() throws Exception {
+//		Builder b = new Builder();
+//		b.setProperty(Analyzer.INCLUDE_RESOURCE,
+//				"META-INF/not-spring/one.xml=src/test/spring-test1.xml");
+//		Jar jar = b.build();
+//		checkMessages(b,0,2);
+//		Manifest m = jar.getManifest();
+//		assertNull(m.getMainAttributes().getValue(Analyzer.IMPORT_PACKAGE));
+//	}
+//
+//	void test(Jar jar) throws Exception {
+//		Manifest m = jar.getManifest();
+//		String header = m.getMainAttributes().getValue("Import-Package");
+//		assertTrue(header.indexOf("com.foo.one") >= 0);
+//		assertTrue(header.indexOf("com.foo.one.one") >= 0);
+//		assertTrue(header.indexOf("com.foo.one.two") >= 0);
+//		assertTrue(header.indexOf("value_type") >= 0);
+//		assertTrue(header.indexOf("a.b") >= 0);
+//		assertTrue(header.indexOf("c.d") >= 0);
+//		assertTrue(header.indexOf("e.f") >= 0);
+//		assertTrue(header.indexOf("interfaces_1") >= 0);
+//		assertTrue(header.indexOf("interfaces_2") >= 0);
+//		assertFalse(header.indexOf("interfaces_3") >= 0);
+//		assertFalse(header.indexOf("I-am-not-here") >= 0);
+//
+//	}
+
+	public void checkMessages(Processor processor, int errors, int warnings) {
+		System.out.println("Errors:    " + processor.getErrors());
+		System.out.println("Warnings:  " + processor.getWarnings());
+		assertEquals(errors, processor.getErrors().size());
+		assertEquals(warnings, processor.getWarnings().size());
+
+	}
+}

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/TestBndBook.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/TestBndBook.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/TestBndBook.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,29 @@
+package test;
+
+import java.io.*;
+
+import junit.framework.*;
+import aQute.lib.osgi.*;
+
+public class TestBndBook extends TestCase {
+
+    public void testFilterout() throws Exception {
+        Builder b = new Builder();
+        b.addClasspath( new File("jar/osgi.jar"));
+        b.addClasspath( new File("jar/ds.jar"));
+        b.setProperty("Export-Package", "org.eclipse.*, org.osgi.*");
+        b.setProperty("fwusers", "${classes;importing;org.osgi.framework}");
+        b.setProperty("foo", "${filterout;${fwusers};org\\.osgi\\..*}");
+        b.build();
+        String fwusers = b.getProperty("fwusers");
+        String foo = b.getProperty("foo");
+        assertTrue( fwusers.length() > foo.length() );
+        assertTrue( fwusers.indexOf("org.osgi.framework.ServicePermission")>=0 );
+        assertTrue( fwusers.indexOf("org.eclipse.equinox.ds.instance.BuildDispose")>=0 );
+        assertFalse( foo.indexOf("org.osgi.framework.ServicePermission")>=0 );
+        assertTrue( foo.indexOf("org.eclipse.equinox.ds.instance.BuildDispose")>=0 );
+        System.out.println(b.getProperty("fwusers"));
+        System.out.println(b.getProperty("foo"));
+        
+    }
+}

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/TestComponent.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/TestComponent.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/TestComponent.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,312 @@
+package test;
+
+import java.io.*;
+import java.util.*;
+
+import javax.xml.parsers.*;
+
+import junit.framework.*;
+
+import org.w3c.dom.*;
+import org.xml.sax.*;
+
+import aQute.lib.osgi.*;
+
+public class TestComponent extends TestCase {
+
+    
+    
+    public void testV1_1Directives() throws Exception {
+        Element component = setup("test.activator.Activator;factory:=blabla;immediate:=true;enabled:=false;configuration-policy:=optional;activate:=start;deactivate:=stop;modified:=modified");
+        assertEquals("http://www.osgi.org/xmlns/scr/v1.1.0", component.getNamespaceURI());
+        assertEquals( "blabla", component.getAttribute("factory"));
+        assertEquals( "false", component.getAttribute("enabled"));
+        assertEquals( "optional", component.getAttribute("configuration-policy"));
+        assertEquals( "start", component.getAttribute("activate"));
+        assertEquals( "stop", component.getAttribute("deactivate"));
+        assertEquals( "modified", component.getAttribute("modified"));
+    }
+
+    public void testNoNamespace() throws Exception {
+        Element component = setup("test.activator.Activator");
+        assertEquals(null, component.getNamespaceURI());
+    }
+
+    public void testAutoNamespace() throws Exception {
+        Element component = setup("test.activator.Activator;activate:='start';deactivate:='stop'");
+        assertEquals("http://www.osgi.org/xmlns/scr/v1.1.0", component
+                .getNamespaceURI());
+
+    }
+
+    public void testCustomNamespace() throws Exception {
+        Element component = setup("test.activator.Activator;version:=2");
+        assertEquals("http://www.osgi.org/xmlns/scr/v2.0.0", component
+                .getNamespaceURI());
+
+    }
+
+    Element setup(String header) throws Exception {
+        Builder b = new Builder();
+        b.setProperty(Analyzer.SERVICE_COMPONENT, header);
+        b
+                .setClasspath(new File[] { new File("bin"),
+                        new File("jar/osgi.jar") });
+        b.setProperty("Private-Package", "test.activator, org.osgi.service.http.*");
+        b.build();
+
+        System.out.println(b.getErrors());
+        System.out.println(b.getWarnings());
+        assertEquals(0, b.getErrors().size());
+        assertEquals(0, b.getWarnings().size());
+
+        print(b.getJar().getResource("OSGI-INF/test.activator.Activator.xml"),
+                System.out);
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        factory.setNamespaceAware(true);
+        DocumentBuilder builder = factory.newDocumentBuilder();
+        Document doc = builder.parse(new InputSource(b.getJar().getResource(
+                "OSGI-INF/test.activator.Activator.xml").openInputStream()));
+
+        return doc.getDocumentElement();
+    }
+
+    private void print(Resource resource, OutputStream out) throws IOException {
+        InputStream in = resource.openInputStream();
+        try {
+            byte[] buffer = new byte[1024];
+            int size = in.read(buffer);
+            while (size > 0) {
+                out.write(buffer, 0, size);
+                size = in.read(buffer);
+            }
+            out.flush();
+        } finally {
+            in.close();
+        }
+    }
+
+    /*
+     * public void testWildcards() throws Exception { Builder b = new Builder();
+     * b .setProperty(Analyzer.SERVICE_COMPONENT, "test/component/*.xml");
+     * b.setProperty("-resourceonly", "true"); b.setProperty("Include-Resource",
+     * "test/component=test/component"); Jar jar = b.build();
+     * System.out.println(b.getErrors()); System.out.println(b.getWarnings());
+     * assertEquals(0, b.getErrors().size()); assertEquals(0,
+     * b.getWarnings().size()); }
+     */
+    public void testImplementation() throws Exception {
+        Builder b = new Builder();
+        b
+                .setProperty(Analyzer.SERVICE_COMPONENT,
+                        "silly.name;implementation:=test.activator.Activator;servicefactory:=true");
+        b
+                .setClasspath(new File[] { new File("bin"),
+                        new File("jar/osgi.jar") });
+        b.setProperty("Private-Package", "test.activator");
+        b.build();
+        System.out.println(b.getErrors());
+        System.out.println(b.getWarnings());
+        assertEquals(0, b.getErrors().size());
+        assertEquals(0, b.getWarnings().size());
+
+        Jar jar = b.getJar();
+
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        DocumentBuilder builder = factory.newDocumentBuilder();
+        Document doc = builder.parse(new InputSource(jar.getResource(
+                "OSGI-INF/silly.name.xml").openInputStream()));
+
+        assertEquals("test.activator.Activator", doc.getElementsByTagName(
+                "implementation").item(0).getAttributes().getNamedItem("class")
+                .getNodeValue());
+    }
+
+    /**
+     * Standard activator with reference to http.
+     * 
+     * @throws Exception
+     */
+    public void testProperties() throws Exception {
+        java.util.Properties p = new Properties();
+        p.put(Analyzer.EXPORT_PACKAGE, "test.activator,org.osgi.service.http");
+        p.put(Analyzer.IMPORT_PACKAGE, "*");
+        p.put(Analyzer.SERVICE_COMPONENT,
+                "test.activator.Activator;properties:=\"a=3|4,b=1|2|3\"");
+        Builder b = new Builder();
+        b
+                .setClasspath(new File[] { new File("bin"),
+                        new File("jar/osgi.jar") });
+        b.setProperties(p);
+        b.build();
+        assertEquals(0, b.getErrors().size());
+        assertEquals(0, b.getWarnings().size());
+
+        Jar jar = b.getJar();
+
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        DocumentBuilder builder = factory.newDocumentBuilder();
+        Document doc = builder.parse(new InputSource(jar.getResource(
+                "OSGI-INF/test.activator.Activator.xml").openInputStream()));
+
+        NodeList l = doc.getElementsByTagName("property");
+        assertEquals(2, l.getLength());
+        Node n = l.item(0);
+        System.out.println(n.getFirstChild().getNodeValue());
+        assertEquals("3\n4", l.item(0).getFirstChild().getNodeValue().trim());
+        assertEquals("1\n2\n3", l.item(1).getFirstChild().getNodeValue().trim());
+
+        assertEquals("test.activator.Activator", doc.getElementsByTagName(
+                "implementation").item(0).getAttributes().getNamedItem("class")
+                .getNodeValue());
+        // assertEquals("test.activator.Activator", xp.evaluate(
+        // "/component/implementation/@class", doc));
+        // assertEquals("org.osgi.service.http.HttpService", xp.evaluate(
+        // "/component/reference[@name='http']/@interface", doc));
+        // assertEquals("setHttp", xp.evaluate(
+        // "/component/reference[@name='http']/@bind", doc));
+        // assertEquals("unsetHttp", xp.evaluate(
+        // "/component/reference[@name='http']/@unbind", doc));
+        // assertEquals("", xp.evaluate(
+        // "/component/reference[@name='http']/@target", doc));
+    }
+
+    /**
+     * Check if all the directives work
+     * 
+     * @throws Exception
+     */
+    public void testUnknownDirective() throws Exception {
+        java.util.Properties p = new Properties();
+        p.put(Analyzer.EXPORT_PACKAGE, "test.activator,org.osgi.service.http");
+        p.put(Analyzer.IMPORT_PACKAGE, "*");
+        p.put(Analyzer.SERVICE_COMPONENT,
+                "test.activator.Activator;provides:=true");
+        Builder b = new Builder();
+        b
+                .setClasspath(new File[] { new File("bin"),
+                        new File("jar/osgi.jar") });
+        b.setProperties(p);
+        b.build();
+        assertEquals(1, b.getErrors().size());
+        assertTrue(((String) b.getErrors().get(0))
+                .indexOf("Unrecognized directive") >= 0);
+        assertEquals(0, b.getWarnings().size());
+    }
+
+    /**
+     * Check if all the directives work
+     * 
+     * @throws Exception
+     */
+    public void testDirectives() throws Exception {
+        Element component = setup("test.activator.Activator;http=org.osgi.service.http.HttpService;dynamic:=http;optional:=http;provide:=test.activator.Activator; multiple:=http");
+        
+        // assertEquals("test.activator.Activator", xp.evaluate(
+        // "/component/implementation/@class", doc));
+        // assertEquals("org.osgi.service.http.HttpService", xp.evaluate(
+        // "/component/reference[@name='http']/@interface", doc));
+        // assertEquals("setHttp", xp.evaluate(
+        // "/component/reference[@name='http']/@bind", doc));
+        // assertEquals("unsetHttp", xp.evaluate(
+        // "/component/reference[@name='http']/@unbind", doc));
+        // assertEquals("0..n", xp.evaluate(
+        // "/component/reference[@name='http']/@cardinality", doc));
+        // assertEquals("dynamic", xp.evaluate(
+        // "/component/reference[@name='http']/@policy", doc));
+        // assertEquals("test.activator.Activator", xp.evaluate(
+        // "/component/service/provide/@interface", doc));
+    }
+
+    /**
+     * Check if a bad filter on a service component causes an error.
+     * 
+     * @throws Exception
+     */
+    public void testBadFilter() throws Exception {
+//        java.util.Properties p = new Properties();
+//        p.put(Analyzer.EXPORT_PACKAGE, "test.activator,org.osgi.service.http");
+//        p.put(Analyzer.IMPORT_PACKAGE, "*");
+//        p
+//                .put(
+//                        Analyzer.SERVICE_COMPONENT,
+//                        "test.activator.Activator;http=\"org.osgi.service.http.HttpService(|p=1)(p=2))\"");
+//        Builder b = new Builder();
+//        b
+//                .setClasspath(new File[] { new File("bin"),
+//                        new File("jar/osgi.jar") });
+//        b.setProperties(p);
+//        b.build();
+//        assertEquals(1, b.getErrors().size());
+//        assertTrue(((String) b.getErrors().get(0))
+//                .indexOf("is not a correct filter") >= 0);
+//        assertEquals(0, b.getWarnings().size());
+    }
+
+    /**
+     * Check if we can set a target filter
+     * 
+     * @throws Exception
+     */
+    public void testFilter() throws Exception {
+        Element component = setup("test.activator.Activator;http=\"org.osgi.service.http.HttpService(|(p=1)(p=2))\"");
+        Element implementation = (Element) component.getElementsByTagName("implementation").item(0);
+        assertEquals(null, implementation.getNamespaceURI());
+        assertEquals("test.activator.Activator", implementation.getAttribute("class"));
+        
+        Element reference = (Element) component.getElementsByTagName("reference").item(0);
+        assertEquals("org.osgi.service.http.HttpService", reference.getAttribute("interface"));
+        assertEquals("setHttp", reference.getAttribute("bind"));
+        assertEquals("unsetHttp", reference.getAttribute("unbind"));
+        assertEquals("(|(p=1)(p=2))", reference.getAttribute("target"));
+    }
+    
+    /**
+     * Standard activator with reference to http.
+     * 
+     * @throws Exception
+     */
+    public void testSimple() throws Exception {
+        Element component = setup("test.activator.Activator;http=org.osgi.service.http.HttpService?");
+        Element implementation = (Element) component.getElementsByTagName("implementation").item(0);
+        assertEquals(null, implementation.getNamespaceURI());
+        assertEquals("test.activator.Activator", implementation.getAttribute("class"));
+        
+        Element reference = (Element) component.getElementsByTagName("reference").item(0);
+        assertEquals("org.osgi.service.http.HttpService", reference.getAttribute("interface"));
+        assertEquals("setHttp", reference.getAttribute("bind"));
+        assertEquals("unsetHttp", reference.getAttribute("unbind"));
+        assertEquals("", reference.getAttribute("target"));
+        assertEquals("0..1", reference.getAttribute("cardinality"));
+        assertEquals("dynamic", reference.getAttribute("policy"));
+    }
+    /**
+     * Standard activator with reference to http.
+     * 
+     * @throws Exception
+     */
+    public void testQuestion() throws Exception {
+        Element component = setup("test.activator.Activator;http=org.osgi.service.http.HttpService?");
+        Element reference = (Element) component.getElementsByTagName("reference").item(0);
+        assertEquals("0..1", reference.getAttribute("cardinality"));
+        assertEquals("dynamic", reference.getAttribute("policy"));
+    }
+    public void testStar() throws Exception {
+        Element component = setup("test.activator.Activator;http=org.osgi.service.http.HttpService*");
+        Element reference = (Element) component.getElementsByTagName("reference").item(0);
+        assertEquals("0..n", reference.getAttribute("cardinality"));
+        assertEquals("dynamic", reference.getAttribute("policy"));
+    }
+    public void testPlus() throws Exception {
+        Element component = setup("test.activator.Activator;http=org.osgi.service.http.HttpService+");
+        Element reference = (Element) component.getElementsByTagName("reference").item(0);
+        assertEquals("1..n", reference.getAttribute("cardinality"));
+        assertEquals("dynamic", reference.getAttribute("policy"));
+    }
+    public void testTilde() throws Exception {
+        Element component = setup("test.activator.Activator;http=org.osgi.service.http.HttpService~");
+        Element reference = (Element) component.getElementsByTagName("reference").item(0);
+        assertEquals("0..1", reference.getAttribute("cardinality"));
+        assertEquals("", reference.getAttribute("policy"));
+    }
+}


Property changes on: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/TestComponent.java
___________________________________________________________________
Name: svn:executable
   + *

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/TestQuotedTokenizer.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/TestQuotedTokenizer.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/TestQuotedTokenizer.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,61 @@
+package test;
+
+import junit.framework.*;
+import aQute.libg.qtokens.*;
+
+public class TestQuotedTokenizer extends TestCase {
+
+	public void testNativeSeps() {
+		String s[] = new QuotedTokenizer("x;c;d=4", ";,=", true).getTokens();
+		assertEquals("Length", 7, s.length);
+		assertEquals("x", s[0]);
+		assertEquals(";", s[1]);
+		assertEquals("c", s[2]);
+		assertEquals(";", s[3]);
+		assertEquals("d", s[4]);
+		assertEquals("=", s[5]);
+		assertEquals("4", s[6]);
+	}
+	
+	public void testSimple() {
+		String s[] = new QuotedTokenizer("1.jar, 2.jar,    \t   3.jar", ",").getTokens();
+		assertEquals("Length", 3, s.length);
+		assertEquals("1.jar", s[0]);
+		assertEquals("2.jar", s[1]);
+		assertEquals("3.jar", s[2]);
+	}
+	
+	public void testQuoted() {
+		String s[] = new QuotedTokenizer("'1 ,\t.jar'", ",").getTokens();
+		assertEquals("Length", 1, s.length);
+		assertEquals("1 ,\t.jar", s[0]);
+	}
+	
+	public void testWhiteSpace() {
+		String s[] = new QuotedTokenizer("               1.jar,               2.jar         ", ",").getTokens();
+		assertEquals("Length", 2, s.length);
+		assertEquals("1.jar", s[0]);
+		assertEquals("2.jar", s[1]);
+	}
+	
+	public void testMultipleSeps() {
+		String s[] = new QuotedTokenizer("1.jar,,,,,,,,,,,    , ,2.jar", ",").getTokens();
+		assertEquals("Length", 14, s.length);
+		assertEquals("1.jar", s[0]);
+		assertEquals("2.jar", s[13]);
+	}
+	
+	public void testNative() {
+		String s[] = new QuotedTokenizer("x.dll;y.dll;abc=3;def=5;version=\"1.2.34,123\"", ";,=").getTokens();
+		assertEquals("Length", 8, s.length);
+		assertEquals("x.dll", s[0]);
+		assertEquals("y.dll", s[1]);
+		assertEquals("abc", s[2]);
+		assertEquals("3", s[3]);
+		assertEquals("def", s[4]);
+		assertEquals("5", s[5]);
+		assertEquals("version", s[6]);
+		assertEquals("1.2.34,123", s[7]);
+	}
+	
+}


Property changes on: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/TestQuotedTokenizer.java
___________________________________________________________________
Name: svn:executable
   + *

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/VerifierTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/VerifierTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/VerifierTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,94 @@
+package test;
+
+import java.io.File;
+import java.util.Properties;
+import java.util.jar.Manifest;
+
+import junit.framework.TestCase;
+import aQute.lib.osgi.*;
+
+public class VerifierTest extends TestCase {
+    
+    public void testBundleActivationPolicyNone() throws Exception {
+        Builder v = new Builder();
+        v.setProperty("-resourceonly", "true");
+        v.build();
+        assertEquals(0, v.getWarnings().size());
+        System.out.println(v.getErrors());
+        assertEquals(1, v.getErrors().size());
+    }
+
+    public void testBundleActivationPolicyBad() throws Exception {
+        Builder v = new Builder();
+        v.setProperty("-resourceonly", "true");
+        v.setProperty(Constants.BUNDLE_ACTIVATIONPOLICY, "eager");
+        v.build();
+       
+        assertEquals(1, v.getWarnings().size());
+        assertEquals(1, v.getErrors().size());
+    }
+
+    public void testBundleActivationPolicyGood() throws Exception {
+        Builder v = new Builder();
+        v.setProperty("-resourceonly", "true");
+        v.setProperty(Constants.BUNDLE_ACTIVATIONPOLICY, "lazy   ;   hello:=1");
+        v.build();
+       
+        assertEquals(0, v.getWarnings().size());
+        assertEquals(1, v.getErrors().size());
+    }
+
+    public void testBundleActivationPolicyMultiple() throws Exception {
+        Builder v = new Builder();
+        v.setProperty("-resourceonly", "true");
+        v.setProperty(Constants.BUNDLE_ACTIVATIONPOLICY, "lazy;hello:=1,2");
+        v.build();
+       
+        assertEquals(1, v.getWarnings().size());
+        assertEquals(1, v.getErrors().size());
+    }
+
+	public void testInvalidCaseForHeader() throws Exception {
+		Properties p = new Properties();
+		p.put("Export-package", "org.apache.mina.*");
+		p.put("Bundle-Classpath", ".");
+		Analyzer analyzer = new Analyzer();
+		analyzer.setProperties(p);
+		analyzer.getProperties();
+		System.out.println("Errors   " + analyzer.getErrors());
+		System.out.println("Warnings " + analyzer.getWarnings());
+		assertEquals(0, analyzer.getErrors().size());
+		assertEquals(2, analyzer.getWarnings().size());
+	}
+	
+	public void testSimple() throws Exception {
+		File cp[] = {new File("jar/mina.jar")};
+		Properties p = new Properties();
+		p.put("Export-Package", "org.apache.mina.*");
+		p.put("Import-Package", "*");
+		p.put("DynamicImport-Package", "org.slf4j");
+		Builder bmaker = new Builder();
+		bmaker.setProperties(p);
+		bmaker.setClasspath(cp);
+		
+		
+		Jar jar = bmaker.build();
+		Manifest  m = jar.getManifest();
+		assertFalse( m.getMainAttributes().getValue("Import-Package").indexOf("org.slf4j")>= 0 );
+		assertTrue( m.getMainAttributes().getValue("DynamicImport-Package").indexOf("org.slf4j")>= 0 );
+		assertTrue(bmaker.getErrors().size()==0);
+		assertTrue(bmaker.getWarnings().size()==0);
+	}
+
+	public void testVerifier() throws Exception {
+		Properties base = new Properties();
+		base.put(Analyzer.DYNAMICIMPORT_PACKAGE, "*");
+		
+		Builder builder = new Builder();
+		builder.setProperties(base);
+		builder.build();
+		System.out.println(builder.getErrors());
+		System.out.println(builder.getWarnings());
+	}
+	
+}


Property changes on: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/VerifierTest.java
___________________________________________________________________
Name: svn:executable
   + *

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/VersionPolicyTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/VersionPolicyTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/VersionPolicyTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,133 @@
+package test;
+
+import java.io.*;
+import java.util.jar.*;
+
+import junit.framework.*;
+import aQute.lib.osgi.*;
+
+public class VersionPolicyTest extends TestCase {
+
+    /**
+     * hardcoded imports
+     */
+    public void testHardcodedImports() throws Exception {
+        Builder b = new Builder();
+        b.addClasspath(new File("jar/osgi.jar"));
+        b.setProperty("-versionpolicy", "[${version;==;${@}},${version;+;${@}})");
+        b.setProperty("Private-Package", "org.objectweb.asm");
+        b.setProperty("Import-Package",
+                "org.osgi.framework,org.objectweb.asm,abc;version=2.0.0,*");
+        b.build();
+        Manifest m = b.getJar().getManifest();
+        m.write(System.out);
+        String s = b.getImports().get("org.objectweb.asm").get("version");
+        assertNull(s);
+        s = b.getImports().get("abc").get("version");
+        assertEquals("2.0.0", s);
+        
+        s = b.getImports().get("org.osgi.framework").get("version");
+        assertEquals("[1.3,2)", s);
+        
+    }
+
+    /**
+     * Specify the version on the export and verify that the policy is applied
+     * on the matching import.
+     */
+    public void testExportsSpecifiesVersion() throws Exception {
+        Builder b = new Builder();
+        b.addClasspath(new File("jar/asm.jar"));
+        b.setProperty("Export-Package", "org.objectweb.asm;version=\"5.6.7\"");
+        b.build();
+        String s = b.getImports().get("org.objectweb.asm").get("version");
+        assertEquals("5.6", s);
+
+    }
+
+    /**
+     * See if we a can override the version from the export statement and the
+     * version from the source.
+     */
+    public void testImportOverridesDiscoveredVersion() throws Exception {
+        Builder b = new Builder();
+        b.addClasspath(new File("jar/osgi.jar"));
+        b.setProperty("Export-Package", "org.osgi.service.event;version=1.2.3");
+        b.setProperty("Import-Package",
+                "org.osgi.service.event;version=2.1.3.q");
+        b.build();
+        String s = b.getImports().get("org.osgi.service.event").get("version");
+        assertEquals("2.1.3.q", s);
+    }
+
+    /**
+     * Test if we can get the version from the source and apply the default
+     * policy.
+     */
+    public void testVersionPolicyImportedExportsDefaultPolicy()
+            throws Exception {
+        Builder b = new Builder();
+        b.addClasspath(new File("jar/osgi.jar"));
+        b.setProperty("Export-Package", "org.osgi.service.event");
+        b.build();
+        String s = b.getImports().get("org.osgi.service.event").get("version");
+        assertEquals("1.0", s);
+    }
+
+    /**
+     * Test if we can get the version from the source and apply a specific
+     * policy.
+     */
+    public void testVersionPolicyImportedExportsWithPolicy() throws Exception {
+        Builder b = new Builder();
+        b.addClasspath(new File("jar/osgi.jar"));
+        b.setProperty("-versionpolicy",
+                "[${version;==;${@}},${version;=+;${@}})");
+        b.setProperty("Export-Package", "org.osgi.service.event");
+        b.build();
+        String s = b.getImports().get("org.osgi.service.event").get("version");
+        assertEquals("[1.0,1.1)", s);
+    }
+
+    /**
+     * The default policy is truncate micro. Check if this is applied to the
+     * import.
+     */
+    public void testImportMicroTruncated() throws Exception {
+        Builder b = new Builder();
+        b.addClasspath(new File("jar/osgi.jar"));
+        b.setProperty("Import-Package", "org.osgi.service.event");
+        b.build();
+        String s = b.getImports().get("org.osgi.service.event").get("version");
+        assertEquals("1.0", s);
+    }
+
+    /**
+     * See if we can apply a policy to an import where we get the version from
+     * the source.
+     */
+    public void testVersionPolicy() throws Exception {
+        Builder b = new Builder();
+        b.addClasspath(new File("jar/osgi.jar"));
+        b.setProperty("-versionpolicy",
+                "[${version;==;${@}},${version;=+;${@}})");
+        b.setProperty("Import-Package", "org.osgi.service.event");
+        b.build();
+        String s = b.getImports().get("org.osgi.service.event").get("version");
+        assertEquals("[1.0,1.1)", s);
+    }
+
+    /**
+     * Check if we can set a specific version on the import that does not use a
+     * version policy.
+     */
+    public void testImportMicroNotTruncated() throws Exception {
+        Builder b = new Builder();
+        b.addClasspath(new File("jar/osgi.jar"));
+        b.setProperty("Import-Package", "org.osgi.service.event;version=${@}");
+        b.build();
+        String s = b.getImports().get("org.osgi.service.event").get("version");
+        assertEquals("1.0.1", s);
+    }
+
+}

Added: projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/WorkspaceTest.java
===================================================================
--- projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/WorkspaceTest.java	                        (rev 0)
+++ projects/jboss-osgi/projects/aQute/trunk/bnd/src/test/java/test/WorkspaceTest.java	2009-09-29 20:13:29 UTC (rev 94121)
@@ -0,0 +1,16 @@
+package test;
+
+import java.io.*;
+
+import junit.framework.*;
+import aQute.bnd.build.*;
+
+public class WorkspaceTest extends TestCase {
+    
+    public void testWorkspace() throws Exception {
+        Workspace ws = Workspace.getWorkspace( new File("test/w o r k s p a c e"));
+        String s = ws.getProperty("project");
+        System.out.println(s);
+    }
+
+}




More information about the jboss-cvs-commits mailing list