package test; import java.io.File; import java.io.IOException; import java.util.Formatter; import aQute.bnd.header.Attrs; import aQute.bnd.header.Parameters; import aQute.bnd.osgi.Builder; import aQute.bnd.osgi.Constants; import aQute.bnd.osgi.Domain; import aQute.bnd.osgi.Jar; import aQute.bnd.osgi.Packages; import aQute.lib.io.IO; import junit.framework.TestCase; public class ContractTest extends TestCase { /** * Test the warnings that we have no no version * * @throws Exception */ public void testWarningVersion() throws Exception { Jar bjara = getContractExporter("abc", (String[]) null, "${exports}"); Builder a = newBuilder(); a.setTrace(true); a.addClasspath(bjara); a.setProperty(Constants.CONTRACT, "*"); a.setImportPackage("test.packageinfo,*"); a.setProperty("Export-Package", "test.refer"); Jar ajar = a.build(); assertTrue( a.check("Contract \\[name=abc;version=0.0.0;from=biz.aQute.bndlib.tests] does not declare a version")); Domain domain = Domain.domain(ajar.getManifest()); Parameters p = domain.getRequireCapability(); p.remove("osgi.ee"); assertEquals(0, p.size()); } /** * Test the warnings that we have no uses * * @throws Exception */ public void testWarningUses() throws Exception { Jar bjara = getContractExporter("abc", "2.5", null); Builder a = newBuilder(); a.setTrace(true); a.addClasspath(bjara); a.setProperty(Constants.CONTRACT, "*"); a.setImportPackage("test.packageinfo,*"); a.setProperty("Export-Package", "test.refer"); Jar ajar = a.build(); assertTrue(a.check("Contract abc has no uses: directive")); Domain domain = Domain.domain(ajar.getManifest()); Parameters p = domain.getRequireCapability(); p.remove("osgi.ee"); assertEquals(0, p.size()); } /** * Make sure we do not add a contract if not used * * @throws Exception */ public void testUnused() throws Exception { Jar bjara = getContractExporter("atest", "2.5", "${exports}"); Builder a = newBuilder(); a.setTrace(true); a.addClasspath(bjara); a.setProperty(Constants.CONTRACT, "*"); a.setImportPackage("test.packageinfo,*"); a.setProperty("Export-Package", "test.refer"); Jar ajar = a.build(); assertTrue(a.check()); Domain domain = Domain.domain(ajar.getManifest()); Parameters p = domain.getRequireCapability(); p.remove("osgi.ee"); assertEquals(0, p.size()); } /** * Test if we can select * * @throws Exception */ public void testSelect() throws Exception { Jar bjara = getContractExporter("atest", "2.5", "${exports}"); Jar bjarb = getContractExporter("btest", "2.5", "${exports}"); Builder a = newBuilder(); a.setTrace(true); a.addClasspath(bjara); // 1x a.addClasspath(bjarb); // 2x a.setProperty(Constants.CONTRACT, "atest;alpha=1"); a.setImportPackage("org.osgi.service.cm,*"); a.setProperty("Export-Package", "test.refer"); Jar ajar = a.build(); assertTrue(a.check()); ajar.getManifest().write(System.out); Domain domain = Domain.domain(ajar.getManifest()); Parameters p = domain.getRequireCapability(); p.remove("osgi.ee"); assertNotNull(p); assertEquals(1, p.size()); Attrs attrs = p.get("osgi.contract"); String alpha = attrs.get("alpha"); assertEquals("1", alpha); assertEquals("(&(osgi.contract=atest)(version=2.5.0))", attrs.get("filter:")); } /** * Test if we can detect an overlap, and then if we can control the overlap * * @throws Exception */ public void testOverlap() throws Exception { Jar bjar = getContractExporter("test", "2.5", "${exports}"); Builder a = newBuilder(); a.setTrace(true); a.addClasspath(bjar); // 1x a.addClasspath(bjar); // 2x a.setProperty(Constants.CONTRACT, "*"); a.setImportPackage("org.osgi.service.cm,*"); a.setProperty("Export-Package", "test.refer"); Jar ajar = a.build(); assertTrue(a.check( "Contracts \\[Contract \\[name=test;version=2.5.0;from=biz.aQute.bndlib.tests\\], Contract \\[name=test;version=2.5.0")); } public void testSimple() throws Exception { Jar bjar = getContractExporter("test", "2.5", "${exports}"); Builder a = newBuilder(); a.setTrace(true); a.addClasspath(bjar); a.setProperty(Constants.CONTRACT, "*"); a.setImportPackage("org.osgi.service.cm,*"); a.setProperty("Export-Package", "test.refer"); Jar ajar = a.build(); assertTrue(a.check()); Domain domain = Domain.domain(ajar.getManifest()); Parameters rc = domain.getRequireCapability(); rc.remove("osgi.ee"); System.out.println(rc); assertEquals(1, rc.size()); Packages ps = a.getImports(); assertTrue(ps.containsFQN("org.osgi.service.cm")); Attrs attrs = ps.getByFQN("org.osgi.service.cm"); assertNotNull(attrs); assertNull(attrs.getVersion()); } public void testMultiple() throws Exception { Jar bjar = getContractExporter("abc", new String[] { "2.5", "2.6", "3.0", "3.1" }, "${exports}"); Builder a = newBuilder(); a.setTrace(true); a.addClasspath(bjar); a.setProperty(Constants.CONTRACT, "*"); a.setImportPackage("org.osgi.service.cm,*"); a.setProperty("Export-Package", "test.refer"); Jar ajar = a.build(); assertTrue(a.check()); Domain domain = Domain.domain(ajar.getManifest()); Parameters rc = domain.getRequireCapability(); rc.remove("osgi.ee"); System.out.println(rc); assertEquals(1, rc.size()); assertNotNull(rc); assertEquals(1, rc.size()); Attrs attrs = rc.get("osgi.contract"); assertEquals("(&(osgi.contract=abc)(version=3.1.0))", attrs.get("filter:")); } private Jar getContractExporter(String name, String version, String uses) throws IOException, Exception { return getContractExporter(name, new String[] { version }, uses); } private Jar getContractExporter(String name, String[] versions, String uses) throws IOException, Exception { Builder b = newBuilder(); Formatter sb = new Formatter(); try { sb.format("osgi.contract"); if (name != null) sb.format(";osgi.contract=%s", name); if (versions != null) { if (versions.length > 1) { StringBuilder s = new StringBuilder(";version:List<Version>=\""); for (String version : versions) { s.append(version); s.append(","); } s.setLength(s.length() - 1); s.append("\""); sb.format(s.toString()); } else sb.format(";version:Version=%s", versions[0]); } if (uses != null) sb.format(";uses:='%s'", uses); b.setProperty("Provide-Capability", sb.toString()); b.setProperty("Export-Package", "org.osgi.service.eventadmin,org.osgi.service.cm"); Jar bjar = b.build(); assertTrue(b.check()); return bjar; } finally { sb.close(); } } private Builder newBuilder() throws IOException { Builder b = new Builder(); b.addClasspath(IO.getFile("jar/osgi.jar")); b.addClasspath(new File("bin")); return b; } }