package test;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import org.osgi.resource.Capability;
import aQute.bnd.osgi.Constants;
import aQute.bnd.osgi.OSInformation;
import aQute.bnd.osgi.Processor;
import aQute.bnd.osgi.resource.RequirementBuilder;
import aQute.bnd.osgi.resource.ResourceBuilder;
import aQute.bnd.osgi.resource.ResourceUtils;
import aQute.lib.strings.Strings;
import junit.framework.TestCase;
public class ProcessorTest extends TestCase {
public void testFixupMerge() throws IOException {
Processor p = new Processor();
p.setProperty("-fixupmessages.foo", "foo");
p.setProperty("-fixupmessages.bar", "bar");
p.error("foo");
p.error("bar");
assertTrue(p.check());
p.close();
}
public void testFixupMacro() throws IOException {
Processor p = new Processor();
p.setProperty("skip", "foo");
p.setProperty("-fixupmessages", "${skip},bar");
p.error("foo");
p.error("bar");
assertTrue(p.check());
p.close();
}
public void testNative() throws Exception {
assertNative("osname=linux;osversion=2.3;processor=arm_le", "(osgi.native.osname~=LINUX)");
assertNative("osname=Windows;osversion=10.0;processor=x86", "(osgi.native.osname~=Win32)");
assertNative("osname=Windows;osversion=10.0;processor=x86", "(osgi.native.processor~=pentium)");
assertNative("osname=Windows;osversion=10.0;processor=x86-64", "(osgi.native.processor~=amd64)");
assertNative("osname=Linux;osversion=5.1.0;processor=arm", "(osgi.native.processor~=arm)",
"The 'arm' processor is deprecated");
}
public void testNativeDefaults() throws Exception {
try (Processor p = new Processor();) {
p.setProperty("a", "${native_capability}");
// Use the current OS first to enable loading things like default
// file system before we change system properties.
assertNativeDefault(System.getProperty("os.name"), System.getProperty("os.version"),
System.getProperty("os.arch"),
"(&(osgi.native.osname=*)(osgi.native.osversion=*)(osgi.native.processor=*)(osgi.native.language=*))");
//
// Mac OS
//
assertNativeDefault("Mac OS X", "10.8.2", "x86_64",
"(&(osgi.native.osname~=MacOSX)(osgi.native.osname~=Mac OS X))");
assertNativeDefault("Mac OS X", "10.8.2", "x86_64", "(osgi.native.osversion=0010.8.2)");
assertNativeDefault("Mac OS X", "10.8.2", "x86_64",
"(&(osgi.native.processor=x86-64)(osgi.native.processor=amd64)(osgi.native.processor=em64t)(osgi.native.processor=x86_64))");
//
// Linux
//
assertNativeDefault("Linux", "3.8.8-202.fc18.x86_64", "amd64",
"(&(osgi.native.osname~=linux)(osgi.native.processor=*)(osgi.native.osversion=3.8.8.-202_fc18_x86_64))");
assertNativeDefault("Linux", "3.8.8-202.fc18.x86_64", "em64t",
"(&(osgi.native.osname~=linux)(osgi.native.processor=em64t)(osgi.native.osversion=3.8.8.-202_fc18_x86_64))");
//
// Windows
//
assertNativeDefault("Windows XP", "5.1.7601.17514", "x86",
"(&(osgi.native.osname~=WindowsXP)(osgi.native.osname~=WinXP)(osgi.native.osname~=Windows XP)(osgi.native.osname~=Win32))");
assertNativeDefault("Windows XP", "5.1.7601.17514", "x86",
"(&(osgi.native.processor~=x86)(osgi.native.processor~=pentium)(osgi.native.processor~=i386)(osgi.native.processor~=i486)(osgi.native.processor~=i686)(osgi.native.processor~=i586))");
assertNativeDefault("Windows XP", "5.1.7601.17514", "x86", "(&(osgi.native.osversion=5.1.0))");
assertNativeDefault("Windows Vista", "6.0.7601.17514", "x86",
"(&(osgi.native.osname~=WindowsVista)(osgi.native.osname~=WinVista)(osgi.native.osname~=Windows Vista)(osgi.native.osname~=Win32))");
assertNativeDefault("Windows 7", "6.1.7601.17514", "x86",
"(&(osgi.native.osname~=Windows7)(osgi.native.osname~=Windows 7)(osgi.native.osname~=Win32)(osgi.native.osversion=6.1.0))");
assertNativeDefault("Windows 8", "6.2.7601.17514", "x86",
"(&(osgi.native.osname~=Windows8)(osgi.native.osname~=Windows 8)(osgi.native.osname~=Win32)(osgi.native.osversion=6.2.0))");
}
}
public void testOperatingSystems() {
assertIn(OSInformation.getOperatingSystemAliases("Windows XP", "5.1.x").osnames, "WindowsXP", "Windows XP",
"WinXP", "Win32");
assertIn(OSInformation.getOperatingSystemAliases("Windows Vista", "6.0.x").osnames, "WindowsVista",
"Windows Vista", "WinVista", "Win32");
assertIn(OSInformation.getOperatingSystemAliases("Solaris", "3.8").osnames, "Solaris");
assertIn(OSInformation.getOperatingSystemAliases("AIX", "3.8").osnames, "AIX");
assertIn(OSInformation.getOperatingSystemAliases("HP-UX", "3.8").osnames, "HPUX", "hp-ux");
}
private void assertIn(String osnames, String... members) {
List<String> split = Strings.split(osnames);
for (String member : members) {
if (!split.contains(member))
fail(member + " is not a member of " + split);
}
}
public void testUnknownProcessor() throws Exception {
try (Processor p = new Processor();) {
assertNative("osname=linux;osversion=2.3;processor=FOO;processor=BLA",
"(&(osgi.native.processor~=FOO)(osgi.native.processor~=BLA))");
}
}
public void testUnknownOsname() throws Exception {
try (Processor p = new Processor();) {
assertNative("osname=Beos;osversion=2.3;processor=FOO;processor=BLA", "(&(osgi.native.osname~=beos))");
fail("Expected failure because we use an unknown name");
} catch (IllegalArgumentException e) {
// ok
}
}
public void testNoOsVersion() throws Exception {
try (Processor p = new Processor();) {
String cap = p._native_capability("native_capability", "processor=x86", "osname=Linux");
System.out.println(cap);
} catch (IllegalArgumentException e) {
System.out.println(e);
}
}
private void assertNativeDefault(String osname, String osversion, String processor, String filter)
throws Exception {
String origOsName = System.getProperty("os.name");
String origOsVersion = System.getProperty("os.version");
String origOsArch = System.getProperty("os.arch");
String processed;
try {
System.setProperty("os.name", osname);
System.setProperty("os.version", osversion);
System.setProperty("os.arch", processor);
assertNative(null, filter);
} finally {
System.setProperty("os.name", origOsName);
System.setProperty("os.version", origOsVersion);
System.setProperty("os.arch", origOsArch);
}
}
private void assertNative(String in, String filter, String... fixup) throws Exception {
List<String> split = in == null ? new ArrayList<String>() : Strings.split("\\s*;\\s*", in);
split.add(0, "native_capability");
try (Processor p = new Processor();) {
String s = p._native_capability(split.toArray(new String[0]));
assertNotNull(s);
System.out.println(s);
ResourceBuilder rb = new ResourceBuilder();
List<Capability> capabilities = rb.addProvideCapabilities(s);
RequirementBuilder qb = new RequirementBuilder("osgi.native");
qb.addDirective("filter", filter);
List<Capability> found = ResourceUtils.findProviders(qb.synthetic(), capabilities);
assertTrue(!found.isEmpty());
assertTrue(p.check(fixup));
}
}
public static void testPlugins() {
}
public void testFixupMessages() throws IOException {
Processor p = new Processor();
p.setTrace(true);
p.error("abc");
assertFalse(p.isOk());
p.error("abc");
p.setProperty(Constants.FIXUPMESSAGES, "abc;restrict:=warning");
assertEquals(1, p.getErrors().size());
assertEquals(0, p.getWarnings().size());
p.error("abc");
p.setProperty(Constants.FIXUPMESSAGES, "abc");
assertEquals(0, p.getErrors().size());
assertEquals(0, p.getWarnings().size());
p.error("abc");
p.setProperty(Constants.FIXUPMESSAGES, "abc;is:=error");
assertEquals(1, p.getErrors().size());
assertEquals(0, p.getWarnings().size());
p.clear();
p.error("abc");
p.setProperty(Constants.FIXUPMESSAGES, "abc;is:=warning");
assertEquals(0, p.getErrors().size());
assertEquals(1, p.getWarnings().size());
p.clear();
p.error("abc");
p.setProperty(Constants.FIXUPMESSAGES, "abc;replace:=def");
assertEquals("def", p.getErrors().get(0));
assertEquals(0, p.getWarnings().size());
p.clear();
p.setProperty(Constants.FIXUPMESSAGES, "'abc def\\s*ghi';is:=warning");
p.error("abc def \t\t ghi");
assertEquals(0, p.getErrors().size());
assertEquals(1, p.getWarnings().size());
p.error("abc");
p.setProperty(Constants.FIXUPMESSAGES, "abc;replace:=def;is:=warning");
assertEquals("def", p.getWarnings().get(0));
assertEquals(0, p.getErrors().size());
p.clear();
p.warning("abc");
p.setProperty(Constants.FIXUPMESSAGES, "abc;restrict:=error");
assertEquals(0, p.getErrors().size());
assertEquals(1, p.getWarnings().size());
p.clear();
p.warning("abc");
p.setProperty(Constants.FIXUPMESSAGES, "abc");
assertEquals(0, p.getErrors().size());
assertEquals(0, p.getWarnings().size());
p.clear();
p.warning("abc");
p.setProperty(Constants.FIXUPMESSAGES, "abc;is:=warning");
assertEquals(0, p.getErrors().size());
assertEquals(1, p.getWarnings().size());
p.clear();
p.warning("abc");
p.setProperty(Constants.FIXUPMESSAGES, "abc;is:=error");
assertEquals(1, p.getErrors().size());
assertEquals(0, p.getWarnings().size());
p.clear();
p.warning("abc");
p.setProperty(Constants.FIXUPMESSAGES, "abc;replace:=def");
assertEquals("def", p.getWarnings().get(0));
assertEquals(0, p.getErrors().size());
p.clear();
p.warning("abc");
p.setProperty(Constants.FIXUPMESSAGES, "abc;replace:=def;is:=error");
assertEquals("def", p.getErrors().get(0));
assertEquals(0, p.getWarnings().size());
p.close();
}
public static 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 static 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//"));
}
public void testUriMacro() throws Exception {
try (Processor p = new Processor()) {
String baseURI = p.getBaseURI().toString();
String otherURI = new URI("file:/some/dir/").toString();
p.setProperty("uri1", "${uri;dist/bundles}");
p.setProperty("uri2", "${uri;/dist/bundles}");
p.setProperty("uri3", "${uri;file:dist/bundles}");
p.setProperty("uri4", "${uri;file:/dist/bundles}");
p.setProperty("uri5", "${uri;dist/bundles;" + otherURI + "}");
p.setProperty("uri6", "${uri;/dist/bundles;" + otherURI + "}");
p.setProperty("uri7", "${uri;file:dist/bundles;" + otherURI + "}");
p.setProperty("uri8", "${uri;file:/dist/bundles;" + otherURI + "}");
p.setProperty("uri9", "${uri;http://foo.com/dist/bundles}");
p.setProperty("uri10", "${uri;http://foo.com/dist/bundles;" + otherURI + "}");
p.setProperty("uri11", "${uri;.}");
String uri1 = p.getProperty("uri1");
String uri2 = p.getProperty("uri2");
String uri3 = p.getProperty("uri3");
String uri4 = p.getProperty("uri4");
String uri5 = p.getProperty("uri5");
String uri6 = p.getProperty("uri6");
String uri7 = p.getProperty("uri7");
String uri8 = p.getProperty("uri8");
String uri9 = p.getProperty("uri9");
String uri10 = p.getProperty("uri10");
String uri11 = p.getProperty("uri11");
assertEquals(baseURI + "dist/bundles", uri1);
assertEquals("file:/dist/bundles", uri2);
assertEquals(baseURI + "dist/bundles", uri3);
assertEquals("file:/dist/bundles", uri4);
assertEquals(otherURI + "dist/bundles", uri5);
assertEquals("file:/dist/bundles", uri6);
assertEquals(otherURI + "dist/bundles", uri7);
assertEquals("file:/dist/bundles", uri8);
assertEquals("http://foo.com/dist/bundles", uri9);
assertEquals("http://foo.com/dist/bundles", uri10);
assertEquals(baseURI, uri11);
assertTrue(p.check());
}
}
public void testUriMacroTooFew() throws IOException {
try (Processor p = new Processor()) {
p.setProperty("urix", "${uri}");
String uri = p.getProperty("urix");
assertTrue(p.check("too few arguments", "No translation found for macro: uri"));
}
}
public void testUriMacroTooMany() throws IOException {
try (Processor p = new Processor()) {
p.setProperty("urix", "${uri;file:/dist/bundles;file:/some/dir/;another}");
String uri = p.getProperty("urix");
assertTrue(p.check("too many arguments", "No translation found for macro: uri"));
}
}
public void testUriMacroNoBase() throws IOException {
try (Processor p = new Processor()) {
p.setBase(null);
p.setProperty("urix", "${uri;dist/bundles}");
String uri = p.getProperty("urix");
assertTrue(p.check("No base dir set", "No translation found for macro: uri"));
}
}
public void testFileUriMacro() throws Exception {
try (Processor p = new Processor()) {
String baseURI = p.getBaseURI().toString();
File some = new File("generated");
p.setProperty("uri1", "${fileuri;dist/bundles}");
p.setProperty("uri2", "${fileuri;" + some.getCanonicalPath() + "/dist/bundles}");
p.setProperty("uri3", "${fileuri;.}");
String uri1 = p.getProperty("uri1");
String uri2 = p.getProperty("uri2");
String uri3 = p.getProperty("uri3");
assertEquals(baseURI + "dist/bundles", uri1);
assertEquals(some.toURI() + "dist/bundles", uri2);
assertEquals(baseURI, uri3);
assertTrue(p.check());
}
}
}