blob: 4b9709c589ad086c8d22ca5cd0e2aaa5a1f5789a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.nbbuild;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
import org.apache.tools.ant.Task;
import org.netbeans.junit.NbTestCase;
import org.netbeans.nbbuild.MakeOSGi.Info;
public class MakeOSGiTest extends NbTestCase {
public MakeOSGiTest(String n) {
super(n);
}
@Override protected void setUp() throws Exception {
clearWorkDir();
}
public void testTranslate() throws Exception {
assertTranslation("{Bundle-SymbolicName=m, Require-Bundle=org.netbeans.core.osgi}",
"OpenIDE-Module: m\n", set(), set());
/* no longer testable:
assertTranslation("{Bundle-SymbolicName=m}",
"OpenIDE-Module: m\nOpenIDE-Module-Public-Packages: -\n", set(), set());
assertTranslation("{Bundle-SymbolicName=m, Export-Package=m1, m2}",
"OpenIDE-Module: m\nOpenIDE-Module-Public-Packages: m1.*, m2.*\n", set(), set());
assertTranslation("{Bundle-SymbolicName=m, Export-Package=nb.help, javax.help, javax.help.basic}",
"OpenIDE-Module: m\nOpenIDE-Module-Public-Packages: nb.help.*, javax.help.**\n", set(), set("nb.help", "javax.help", "javax.help.basic"));
assertTranslation("{Bundle-SymbolicName=m, Bundle-Version=1.0.0.3, Export-Package=api, impl}",
"OpenIDE-Module: m\nOpenIDE-Module-Public-Packages: api.*\n" +
"OpenIDE-Module-Specification-Version: 1.0\nOpenIDE-Module-Implementation-Version: 3\n", set(), set("api", "impl"));
*/
assertTranslation("{Bundle-SymbolicName=m, Import-Package=javax.swing, javax.swing.text, Require-Bundle=org.netbeans.core.osgi}",
"OpenIDE-Module: m\n", set("javax.swing", "javax.swing.text"), set());
assertTranslation("{Bundle-SymbolicName=m, DynamicImport-Package=com.sun.source.tree, " +
"Import-Package=javax.swing, Require-Bundle=org.netbeans.core.osgi}",
"OpenIDE-Module: m\n", set("javax.swing", "com.sun.source.tree"), set());
assertTranslation("{Bundle-SymbolicName=m, Require-Bundle=org.netbeans.core.osgi, some.lib;bundle-version='[101.0.0,200)'}",
"OpenIDE-Module: m\nOpenIDE-Module-Module-Dependencies: some.lib/1 > 1.0\n", set(), set());
// XXX test hiddenPackages, that deps are not imported, etc.
assertTranslation("{Bundle-SymbolicName=m, Require-Bundle=org.netbeans.core.osgi}",
"OpenIDE-Module: m\nOpenIDE-Module-Requires: org.openide.modules.ModuleFormat2\n", set(), set());
assertTranslation("{Bundle-SymbolicName=m, OpenIDE-Module-Requires=foo, Require-Bundle=org.netbeans.core.osgi}",
"OpenIDE-Module: m\nOpenIDE-Module-Requires: foo, org.openide.modules.ModuleFormat1\n", set(), set());
assertTranslation("{Bundle-SymbolicName=m, OpenIDE-Module-Requires=foo, bar, Require-Bundle=org.netbeans.core.osgi}",
"OpenIDE-Module: m\nOpenIDE-Module-Requires: foo, org.openide.modules.ModuleFormat1, bar\n", set(), set());
assertTranslation("{Bundle-SymbolicName=m, Require-Bundle=org.netbeans.core.osgi}",
"OpenIDE-Module: m\nOpenIDE-Module-Java-Dependencies: Java > 1.5\n", set(), set());
assertTranslation("{Bundle-RequiredExecutionEnvironment=JavaSE-1.6, Bundle-SymbolicName=m, Require-Bundle=org.netbeans.core.osgi}",
"OpenIDE-Module: m\nOpenIDE-Module-Java-Dependencies: Java > 1.6\n", set(), set());
assertTranslation("{Bundle-RequiredExecutionEnvironment=JavaSE-1.7, Bundle-SymbolicName=m, Require-Bundle=org.netbeans.core.osgi}",
"OpenIDE-Module: m\nOpenIDE-Module-Java-Dependencies: Java > 1.7\n", set(), set());
}
private void assertTranslation(String expectedOsgi, String netbeans, Set<String> importedPackages, Set<String> exportedPackages) throws Exception {
assertTrue(netbeans.endsWith("\n")); // JRE bug
Manifest nbmani = new Manifest(new ByteArrayInputStream(netbeans.getBytes()));
Attributes nbattr = nbmani.getMainAttributes();
Manifest osgimani = new Manifest();
Attributes osgi = osgimani.getMainAttributes();
Info info = new Info();
info.importedPackages.addAll(importedPackages);
info.exportedPackages.addAll(exportedPackages);
new MakeOSGi().translate(nbattr, osgi, Collections.singletonMap(nbattr.getValue("OpenIDE-Module"), info));
// boilerplate:
assertEquals("1.0", osgi.remove(new Attributes.Name("Manifest-Version")));
assertEquals("2", osgi.remove(new Attributes.Name("Bundle-ManifestVersion")));
SortedMap<String,String> osgiMap = new TreeMap<>();
for (Map.Entry<Object,Object> entry : osgi.entrySet()) {
osgiMap.put(((Attributes.Name) entry.getKey()).toString(), (String) entry.getValue());
}
assertEquals(expectedOsgi, osgiMap.toString().replace('"', '\''));
}
private static Set<String> set(String... items) {
return new TreeSet<>(Arrays.asList(items));
}
public void testTranslateDependency() throws Exception {
assertTranslateDependency("org.openide.util;bundle-version=\"[8.0.0,100)\"", "org.openide.util > 8.0");
assertTranslateDependency("org.netbeans.modules.lexer;bundle-version=\"[201.4.0,300)\"", "org.netbeans.modules.lexer/2 > 1.4");
assertTranslateDependency("what.ever;bundle-version=\"[0.0.0,100)\"", "what.ever");
assertTranslateDependency("org.netbeans.modules.java.sourceui", "org.netbeans.modules.java.sourceui = 15");
assertTranslateDependency("editor.indent.project;bundle-version=\"[1.0.0,200)\"", "editor.indent.project/0-1 > 1.0");
assertTranslateDependency("", "org.netbeans.libs.osgi > 1.0");
// XXX 3 or more items in sequence
}
private void assertTranslateDependency(String expected, String dependency) throws Exception {
StringBuilder b = new StringBuilder();
MakeOSGi.translateDependency(b, dependency);
assertEquals(expected, b.toString());
}
public void testFindFragmentHost() throws Exception {
assertEquals("org.netbeans.core.windows", MakeOSGi.findFragmentHost(new File(getWorkDir(), "modules/locale/org-netbeans-core-windows_nb.jar")));
assertEquals("org.netbeans.core.startup", MakeOSGi.findFragmentHost(new File(getWorkDir(), "core/locale/core_nb.jar")));
assertEquals("org.netbeans.bootstrap", MakeOSGi.findFragmentHost(new File(getWorkDir(), "lib/locale/boot_nb.jar")));
}
public void testPrescan() throws Exception {
File j = new File(getWorkDir(), "x.jar");
try (OutputStream os = new FileOutputStream(j)) {
JarOutputStream jos = new JarOutputStream(os, new Manifest(new ByteArrayInputStream("Manifest-Version: 1.0\nBundle-SymbolicName: org.eclipse.mylyn.bugzilla.core;singleton:=true\nExport-Package: org.eclipse.mylyn.internal.bugzilla.core;x-friends:=\"org.eclipse.mylyn.bugzilla.ide,org.eclipse.mylyn.bugzilla.ui\",org.eclipse.mylyn.internal.bugzilla.core.history;x-friends:=\"org.eclipse.mylyn.bugzilla.ide,org.eclipse.mylyn.bugzilla.ui\",org.eclipse.mylyn.internal.bugzilla.core.service;x-internal:=true\n".getBytes())));
jos.flush();
jos.close();
}
Info info = new MakeOSGi.Info();
JarFile jf = new JarFile(j);
try {
assertEquals("org.eclipse.mylyn.bugzilla.core", MakeOSGi.prescan(jf, info, new Task() {}));
} finally {
jf.close();
}
assertEquals("[org.eclipse.mylyn.internal.bugzilla.core, org.eclipse.mylyn.internal.bugzilla.core.history, org.eclipse.mylyn.internal.bugzilla.core.service]", info.exportedPackages.toString());
}
}