/*
* 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 WARRANTIESOR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.aries.util.manifest;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.aries.util.VersionRange;
import org.apache.aries.util.manifest.ManifestHeaderProcessor.GenericMetadata;
import org.apache.aries.util.manifest.ManifestHeaderProcessor.NameValuePair;
import org.junit.Test;
import org.osgi.framework.Version;
public class ManifestHeaderProcessorTest
{
@Test
public void testNameValuePair() throws Exception {
HashMap<String, String> attrs = new HashMap<String, String>();
attrs.put("some", "value");
NameValuePair nvp = new NameValuePair("key", attrs);
assertEquals("The name value pair is not set properly.", nvp.getName(), "key");
assertEquals("The value is not set properly.", nvp.getAttributes().get("some"), "value");
attrs = new HashMap<String, String>();
attrs.put("some", "value");
NameValuePair anotherNvp = new NameValuePair("key", attrs);
assertEquals("The two objects of NameValuePair is not equal.", nvp, anotherNvp);
nvp.setName("newKey");
attrs = new HashMap<String, String>();
attrs.put("some", "newValue");
nvp.setAttributes(attrs);
assertEquals("The name value pair is not set properly.", nvp.getName(), "newKey");
assertEquals("The value is not set properly.", nvp.getAttributes().get("some"), "newValue");
Map<String,String> nvm1 = new HashMap<String,String>();
nvm1.put("a","b");
nvm1.put("c","d");
Map<String,String> nvm2 = new HashMap<String,String>();
nvm2.put("c","d");
nvm2.put("a","b");
assertEquals("The maps are not equal.", nvm1, nvm2);
nvm2.put("e","f");
assertNotSame("The maps are the same.", nvm1, nvm2);
NameValuePair nvp1 = new NameValuePair("one",nvm1);
NameValuePair nvp2 = new NameValuePair("one",nvm2);
assertNotSame("The pairs are identical ",nvp1,nvp2);
nvm1.put("e","f");
assertEquals("The pairs are not equal.", nvp1,nvp2);
List<NameValuePair> bundleInfoList1 = new ArrayList<NameValuePair>();
bundleInfoList1.add(nvp1);
List<NameValuePair> bundleInfoList2 = new ArrayList<NameValuePair>();
bundleInfoList2.add(nvp1);
bundleInfoList1.removeAll(bundleInfoList2);
assertEquals("The List should be empty", bundleInfoList1.isEmpty(), true);
assertNotSame("The two objects of NameValuePair is not equal.", nvp, anotherNvp);
}
/**
* Test the Bundle manifest header entry of
* Bundle-SymbolicName: com.acme.foo;singleton:=true
*/
@Test
public void testParseBundleSymbolicName()
{
String bundleSymbolicNameEntry = "com.acme.foo;singleton:=true;fragment-attachment:=always";
NameValuePair nvp = ManifestHeaderProcessor.parseBundleSymbolicName(bundleSymbolicNameEntry);
assertEquals("The symbolic name is wrong.", nvp.getName(), "com.acme.foo");
assertEquals("The value is wrong.", "true", nvp.getAttributes().get("singleton:") );
assertEquals("The directive is wrong.", "always", nvp.getAttributes().get("fragment-attachment:") );
String bundleSymbolicNameEntry2 = "com.acme.foo";
NameValuePair nvp2 = ManifestHeaderProcessor.parseBundleSymbolicName(bundleSymbolicNameEntry2);
assertEquals("The symbolic name is wrong.", nvp2.getName(), "com.acme.foo");
}
/**
* Test the import package and import service
* Import-Package: com.acme.foo;come.acm,e.bar;version="[1.23,1.24.5]";resolution:=mandatory
*/
@Test
public void testParseImportString()
{
String importPackage = "com.acme.foo,come.acm.e.bar;version=\"[1.23,1.24.5]\";resolution:=mandatory;company=\"ACME\",a.b.c;version=1.2.3;company=com";
Map<String, Map<String, String>> importPackageReturn = ManifestHeaderProcessor.parseImportString(importPackage);
assertTrue("The package is not set.", importPackageReturn.containsKey("com.acme.foo"));
assertTrue("The package is not set.", importPackageReturn.containsKey("come.acm.e.bar"));
assertTrue("The package is not set.", importPackageReturn.containsKey("come.acm.e.bar"));
assertTrue("The package is not set.", importPackageReturn.containsKey("a.b.c"));
assertTrue("The package should not contain any attributes.", importPackageReturn.get("com.acme.foo").isEmpty());
assertEquals("The directive is not set correctly.", "[1.23,1.24.5]", importPackageReturn.get("come.acm.e.bar").get("version"));
assertEquals("The directive is not set correctly.", "mandatory", importPackageReturn.get("come.acm.e.bar").get("resolution:"));
assertEquals("The directive is not set correctly.", "ACME", importPackageReturn.get("come.acm.e.bar").get("company"));
assertEquals("The directive is not set correctly.", "1.2.3", importPackageReturn.get("a.b.c").get("version"));
assertEquals("The directive is not set correctly.", "com", importPackageReturn.get("a.b.c").get("company"));
importPackage="com.acme.foo";
assertTrue("The package is not set.", importPackageReturn.containsKey("com.acme.foo"));
assertTrue("The package should not contain any attributes.", importPackageReturn.get("com.acme.foo").isEmpty());
importPackage="com.acme.foo;com.acme.bar;version=2";
Map<String, Map<String, String>> importPackageReturn2 = ManifestHeaderProcessor.parseImportString(importPackage);
assertTrue("The package is not set.", importPackageReturn2.containsKey("com.acme.foo"));
assertTrue("The package is not set.", importPackageReturn2.containsKey("com.acme.bar"));
assertEquals("The directive is not set correctly.", "2", importPackageReturn2.get("com.acme.foo").get("version"));
assertEquals("The directive is not set correctly.", "2", importPackageReturn2.get("com.acme.bar").get("version"));
}
@Test
public void testParseExportString()
{
String exportPackage = "com.acme.foo,com.acme.bar;version=1,com.acme.bar;version=2;uses:=\"a.b.c,d.e.f\";security=false;mandatory:=security";
List<NameValuePair> exportPackageReturn = ManifestHeaderProcessor.parseExportString(exportPackage);
int i =0;
assertEquals("The number of the packages is wrong.", 3, exportPackageReturn.size());
for (NameValuePair nvp : exportPackageReturn) {
if (nvp.getName().equals("com.acme.foo")) {
i++;
assertTrue("The directive or attribute should not be set.", nvp.getAttributes().isEmpty() );
} else if ((nvp.getName().equals("com.acme.bar")) && ("2".equals(nvp.getAttributes().get("version")))) {
i++;
assertEquals("The directive is wrong.", "a.b.c,d.e.f", nvp.getAttributes().get("uses:"));
assertEquals("The directive is wrong.", "false", nvp.getAttributes().get("security"));
assertEquals("The directive is wrong.", "security", nvp.getAttributes().get("mandatory:"));
} else if ((nvp.getName().equals("com.acme.bar")) && ("1".equals(nvp.getAttributes().get("version")))) {
i++;
assertNull("The directive is wrong.", nvp.getAttributes().get("uses:"));
assertNull("The directive is wrong.", nvp.getAttributes().get("security"));
assertNull("The directive is wrong.", nvp.getAttributes().get("mandatory:"));
}
}
// make sure all three packages stored
assertEquals("The names of the packages are wrong.", 3, i);
exportPackage = "com.acme.foo";
exportPackageReturn = ManifestHeaderProcessor.parseExportString(exportPackage);
int k =0;
assertEquals("The number of the packages is wrong.", 1, exportPackageReturn.size());
for (NameValuePair nvp : exportPackageReturn) {
if (nvp.getName().equals("com.acme.foo")) {
k++;
assertTrue("The directive or attribute should not be set.", nvp.getAttributes().isEmpty() );
}
}
assertEquals("The names of the packages are wrong.", 1, k);
// test multiple packages separated by ;
exportPackage = "com.acme.foo;com.acme.bar;version=\"2\";resolution:=optional";
exportPackageReturn = ManifestHeaderProcessor.parseExportString(exportPackage);
k =0;
assertEquals("The number of the packages is wrong.", 2, exportPackageReturn.size());
for (NameValuePair nvp : exportPackageReturn) {
if (nvp.getName().equals("com.acme.foo")) {
k++;
assertEquals("The attribute is wrong.", "2", nvp.getAttributes().get("version") );
assertEquals("The attribute is wrong.", "optional", nvp.getAttributes().get("resolution:"));
} else if (nvp.getName().equals("com.acme.bar")) {
k++;
assertEquals("The attribute is wrong.", "2", nvp.getAttributes().get("version") );
assertEquals("The attribute is wrong.", "optional", nvp.getAttributes().get("resolution:"));
}
}
assertEquals("The names of the packages are wrong.", 2, k);
exportPackageReturn = ManifestHeaderProcessor.parseExportString("some.export.with.space.in;directive := spacey");
assertEquals(exportPackageReturn.toString(), "spacey", exportPackageReturn.get(0).getAttributes().get("directive:"));
}
@Test
public void testExportMandatoryAttributes() {
String exportPackage = "com.acme.foo,com.acme.bar;version=2;company=dodo;security=false;mandatory:=\"security,company\"";
List<NameValuePair> exportPackageReturn = ManifestHeaderProcessor.parseExportString(exportPackage);
int i =0;
assertEquals("The number of the packages is wrong.", 2, exportPackageReturn.size());
for (NameValuePair nvp : exportPackageReturn) {
if (nvp.getName().equals("com.acme.foo")) {
i++;
assertTrue("The directive or attribute should not be set.", nvp.getAttributes().isEmpty() );
} else if ((nvp.getName().equals("com.acme.bar")) && ("2".equals(nvp.getAttributes().get("version")))) {
i++;
assertEquals("The directive is wrong.", "dodo", nvp.getAttributes().get("company"));
assertEquals("The directive is wrong.", "false", nvp.getAttributes().get("security"));
assertEquals("The directive is wrong.", "security,company", nvp.getAttributes().get("mandatory:"));
}
}
// make sure all three packages stored
assertEquals("The names of the packages are wrong.", 2, i);
}
private String createExpectedFilter(Map<String, String> values, String ... parts)
{
StringBuilder builder = new StringBuilder(parts[0]);
for (Map.Entry<String, String> entry : values.entrySet()) {
if ("version".equals(entry.getKey())) builder.append(parts[2]);
else if ("company".equals(entry.getKey())) builder.append(parts[1]);
}
builder.append(parts[3]);
return builder.toString();
}
/**
* Test the filter generated correctly
* @throws Exception
*/
@Test
public void testGenerateFilter() throws Exception {
Map<String, String> valueMap = new HashMap<String, String>();
valueMap.put("version", "[1.2, 2.3]");
valueMap.put("resulution:", "mandatory");
valueMap.put("company", "com");
String filter = ManifestHeaderProcessor.generateFilter("symbolic-name", "com.ibm.foo", valueMap);
String expected = createExpectedFilter(valueMap, "(&(symbolic-name=com.ibm.foo)", "(company=com)", "(version>=1.2.0)(version<=2.3.0)", "(mandatory:<*company))");
assertEquals("The filter is wrong.", expected, filter );
valueMap.clear();
valueMap.put("version", "(1.2, 2.3]");
valueMap.put("resulution:", "mandatory");
valueMap.put("company", "com");
filter = ManifestHeaderProcessor.generateFilter("symbolic-name", "com.ibm.foo", valueMap);
expected = createExpectedFilter(valueMap, "(&(symbolic-name=com.ibm.foo)", "(company=com)", "(version>=1.2.0)(version<=2.3.0)(!(version=1.2.0))", "(mandatory:<*company))");
assertEquals("The filter is wrong.", expected, filter );
valueMap.clear();
valueMap.put("version", "(1.2, 2.3)");
valueMap.put("resulution:", "mandatory");
valueMap.put("company", "com");
filter = ManifestHeaderProcessor.generateFilter("symbolic-name", "com.ibm.foo", valueMap);
expected = createExpectedFilter(valueMap, "(&(symbolic-name=com.ibm.foo)", "(company=com)", "(version>=1.2.0)(version<=2.3.0)(!(version=1.2.0))(!(version=2.3.0))", "(mandatory:<*company))");
assertEquals("The filter is wrong.", expected, filter );
valueMap.clear();
valueMap.put("version", "1.2");
valueMap.put("resulution:", "mandatory");
valueMap.put("company", "com");
filter = ManifestHeaderProcessor.generateFilter("symbolic-name", "com.ibm.foo", valueMap);
expected = createExpectedFilter(valueMap, "(&(symbolic-name=com.ibm.foo)", "(company=com)", "(version>=1.2.0)", "(mandatory:<*company))");
assertEquals("The filter is wrong.", expected, filter );
valueMap.clear();
valueMap.put("resulution:", "mandatory");
valueMap.put("company", "com");
filter = ManifestHeaderProcessor.generateFilter("symbolic-name", "com.ibm.foo", valueMap);
expected = createExpectedFilter(valueMap, "(&(symbolic-name=com.ibm.foo)", "(company=com)", "", "(mandatory:<*company))");
assertEquals("The filter is wrong.", expected, filter );
}
/**
* Test the version range created correctly
* @throws Exception
*/
@Test
public void testVersionRange() throws Exception {
String version1 = "[1.2.3, 4.5.6]";
String version2="(1, 2]";
String version3="[2,4)";
String version4="(1,2)";
String version5="2";
String version6 = "2.3";
String version7="[1.2.3.q, 2.3.4.p)";
String version8="1.2.2.5";
String version9="a.b.c";
String version10=null;
String version11="";
String version12="\"[1.2.3, 4.5.6]\"";
VersionRange vr = ManifestHeaderProcessor.parseVersionRange(version1);
assertEquals("The value is wrong", "1.2.3", vr.getMinimumVersion().toString());
assertFalse("The value is wrong", vr.isMinimumExclusive());
assertEquals("The value is wrong", "4.5.6", vr.getMaximumVersion().toString());
assertFalse("The value is wrong", vr.isMaximumExclusive());
vr = ManifestHeaderProcessor.parseVersionRange(version2);
assertEquals("The value is wrong", "1.0.0", vr.getMinimumVersion().toString());
assertTrue("The value is wrong", vr.isMinimumExclusive());
assertEquals("The value is wrong", "2.0.0", vr.getMaximumVersion().toString());
assertFalse("The value is wrong", vr.isMaximumExclusive());
vr = ManifestHeaderProcessor.parseVersionRange(version3);
assertEquals("The value is wrong", "2.0.0", vr.getMinimumVersion().toString());
assertFalse("The value is wrong", vr.isMinimumExclusive());
assertEquals("The value is wrong", "4.0.0", vr.getMaximumVersion().toString());
assertTrue("The value is wrong", vr.isMaximumExclusive());
vr = ManifestHeaderProcessor.parseVersionRange(version4);
assertEquals("The value is wrong", "1.0.0", vr.getMinimumVersion().toString());
assertTrue("The value is wrong", vr.isMinimumExclusive());
assertEquals("The value is wrong", "2.0.0", vr.getMaximumVersion().toString());
assertTrue("The value is wrong", vr.isMaximumExclusive());
vr = ManifestHeaderProcessor.parseVersionRange(version5);
assertEquals("The value is wrong", "2.0.0", vr.getMinimumVersion().toString());
assertFalse("The value is wrong", vr.isMinimumExclusive());
assertNull("The value is wrong", vr.getMaximumVersion());
assertFalse("The value is wrong", vr.isMaximumExclusive());
vr = ManifestHeaderProcessor.parseVersionRange(version6);
assertEquals("The value is wrong", "2.3.0", vr.getMinimumVersion().toString());
assertFalse("The value is wrong", vr.isMinimumExclusive());
assertNull("The value is wrong", vr.getMaximumVersion());
assertFalse("The value is wrong", vr.isMaximumExclusive());
vr = ManifestHeaderProcessor.parseVersionRange(version7);
assertEquals("The value is wrong", "1.2.3.q", vr.getMinimumVersion().toString());
assertFalse("The value is wrong", vr.isMinimumExclusive());
assertEquals("The value is wrong", "2.3.4.p", vr.getMaximumVersion().toString());
assertTrue("The value is wrong", vr.isMaximumExclusive());
vr = ManifestHeaderProcessor.parseVersionRange(version8);
assertEquals("The value is wrong", "1.2.2.5", vr.getMinimumVersion().toString());
assertFalse("The value is wrong", vr.isMinimumExclusive());
assertNull("The value is wrong", vr.getMaximumVersion());
assertFalse("The value is wrong", vr.isMaximumExclusive());
boolean exception = false;
try {
vr = ManifestHeaderProcessor.parseVersionRange(version9);
} catch (Exception e){
exception = true;
}
assertTrue("The value is wrong", exception);
boolean exceptionNull = false;
try {
vr = ManifestHeaderProcessor.parseVersionRange(version10);
} catch (Exception e){
exceptionNull = true;
}
assertTrue("The value is wrong", exceptionNull);
// empty version should be defaulted to >=0.0.0
vr = ManifestHeaderProcessor.parseVersionRange(version11);
assertEquals("The value is wrong", "0.0.0", vr.getMinimumVersion().toString());
assertFalse("The value is wrong", vr.isMinimumExclusive());
assertNull("The value is wrong", vr.getMaximumVersion());
assertFalse("The value is wrong", vr.isMaximumExclusive());
vr = ManifestHeaderProcessor.parseVersionRange(version12);
assertEquals("The value is wrong", "1.2.3", vr.getMinimumVersion().toString());
assertFalse("The value is wrong", vr.isMinimumExclusive());
assertEquals("The value is wrong", "4.5.6", vr.getMaximumVersion().toString());
assertFalse("The value is wrong", vr.isMaximumExclusive());
}
@Test
public void testInvalidVersions() throws Exception
{
try {
ManifestHeaderProcessor.parseVersionRange("a");
assertTrue("Should have thrown an exception", false);
} catch (IllegalArgumentException e) {
// assertEquals(MessageUtil.getMessage("APPUTILS0009E", "a"), e.getMessage());
}
try {
ManifestHeaderProcessor.parseVersionRange("[1.0.0,1.0.1]", true);
assertTrue("Should have thrown an exception", false);
} catch (IllegalArgumentException e) {
// assertEquals(MessageUtil.getMessage("APPUTILS0011E", "[1.0.0,1.0.1]"), e.getMessage());
}
}
@Test
public void testSplit() throws Exception {
String export = "com.ibm.ws.eba.obr.fep.bundle122;version=\"3\";company=mood;local=yes;security=yes;mandatory:=\"mood,security\"";
List<String> result = ManifestHeaderProcessor.split(export, ",");
assertEquals("The result is wrong.", export, result.get(0));
assertEquals("The result is wrong.", 1, result.size());
String aString = "com.acme.foo;weirdAttr=\"one;two;three\";weirdDir:=\"1;2;3\"";
result = ManifestHeaderProcessor.split(aString, ";");
assertEquals("The result is wrong.", "com.acme.foo", result.get(0));
assertEquals("The result is wrong.", "weirdAttr=\"one;two;three\"", result.get(1));
assertEquals("The result is wrong.", "weirdDir:=\"1;2;3\"", result.get(2));
assertEquals("The result is wrong.", 3, result.size());
String pkg1 = "com.ibm.ws.eba.example.helloIsolation;version=\"1.0.0\" ";
String pkg2 = "com.ibm.ws.eba.helloWorldService;version=\"[1.0.0,1.0.0]\"";
String pkg3 = " com.ibm.ws.eba.helloWorldService;version=\"1.0.0\"";
String pkg4 = "com.ibm.ws.eba.helloWorldService;version=\"[1.0.0,1.0.0]\";sharing:=shared" ;
String pkg5 = "com.ibm.ws.eba.helloWorldService;sharing:=shared;version=\"[1.0.0,1.0.0]\"";
String appContent1 = pkg1 + ", " + pkg2 + ", " + pkg3;
String appContent2 = pkg2 + ", " + pkg1 + ", " + pkg3;
String appContent3 = pkg1 + ", " + pkg3 + ", " + pkg2;
String appContent4 = pkg1 + ", " + pkg3 + ", " + pkg4;
String appContent5 = pkg1 + ", " + pkg3 + ", " + pkg5;
List<String> splitList = ManifestHeaderProcessor.split(appContent1, ",");
assertEquals(pkg1.trim(), splitList.get(0));
assertEquals(pkg2.trim(), splitList.get(1));
assertEquals(pkg3.trim(), splitList.get(2));
splitList = ManifestHeaderProcessor.split(appContent2, ",");
assertEquals(pkg2.trim(), splitList.get(0));
assertEquals(pkg1.trim(), splitList.get(1));
assertEquals(pkg3.trim(), splitList.get(2));
splitList = ManifestHeaderProcessor.split(appContent3, ",");
assertEquals(pkg1.trim(), splitList.get(0));
assertEquals(pkg3.trim(), splitList.get(1));
assertEquals(pkg2.trim(), splitList.get(2));
splitList = ManifestHeaderProcessor.split(appContent4, ",");
assertEquals(pkg1.trim(), splitList.get(0));
assertEquals(pkg3.trim(), splitList.get(1));
assertEquals(pkg4.trim(), splitList.get(2));
splitList = ManifestHeaderProcessor.split(appContent5, ",");
assertEquals(pkg1.trim(), splitList.get(0));
assertEquals(pkg3.trim(), splitList.get(1));
assertEquals(pkg5.trim(), splitList.get(2));
}
@Test
public void testParseFilter()
{
Map<String,String> attrs = ManifestHeaderProcessor.parseFilter("(package=com.ibm.test)");
assertEquals("com.ibm.test", attrs.get("package"));
attrs = ManifestHeaderProcessor.parseFilter("(&(package=com.ibm.test)(attr=value))");
assertEquals("com.ibm.test", attrs.get("package"));
assertEquals("value", attrs.get("attr"));
assertEquals(2, attrs.size());
attrs = ManifestHeaderProcessor.parseFilter("(&(version>=1.0.0))");
assertEquals("1.0.0", attrs.get("version"));
attrs = ManifestHeaderProcessor.parseFilter("(&(version>=1.0.0)(version<=2.0.0))");
assertEquals("[1.0.0,2.0.0]", attrs.get("version"));
attrs = ManifestHeaderProcessor.parseFilter("(&(version>=1.0.0)(version<=2.0.0)(!(version=1.0.0)))");
assertEquals("(1.0.0,2.0.0]", attrs.get("version"));
attrs = ManifestHeaderProcessor.parseFilter("(&(!(version=2.0.0))(!(version=1.0.0))(version>=1.0.0)(version<=2.0.0))");
assertEquals("(1.0.0,2.0.0)", attrs.get("version"));
}
@Test
public void testExactVersion() throws Exception
{
VersionRange vr;
try {
vr = ManifestHeaderProcessor.parseVersionRange("[1.0.0, 2.0.0]", true);
fail("should not get here 1");
} catch (IllegalArgumentException e) {
// expected
}
vr = ManifestHeaderProcessor.parseVersionRange("[1.0.0, 1.0.0]", true);
assertTrue(vr.isExactVersion());
try {
vr = ManifestHeaderProcessor.parseVersionRange("(1.0.0, 1.0.0]", true);
fail("should not get here 2");
} catch (IllegalArgumentException e) {
// expected
}
try {
vr = ManifestHeaderProcessor.parseVersionRange("[1.0.0, 1.0.0)", true);
fail("should not get here 3");
} catch (IllegalArgumentException e) {
// expected
}
vr = ManifestHeaderProcessor.parseVersionRange("[1.0.0, 2.0.0]");
assertFalse(vr.isExactVersion());
vr = ManifestHeaderProcessor.parseVersionRange("[1.0.0, 1.0.0]");
assertTrue(vr.isExactVersion());
}
@Test
public void testCapabilityHeader() throws Exception {
String s =
"com.acme.dictionary; effective:=resolve; from:String=nl; to=de; version:Version=3.4.0.test;somedir:=test, " +
"com.acme.dictionary; filter:=\"(&(width>=1000)(height>=1000))\", " +
"com.acme.ip2location;country:List<String>=\"nl,be,fr,uk\";version:Version=1.3;long:Long=" + Long.MAX_VALUE + ";d:Double=\"3.141592653589793\"";
List<GenericMetadata> capabilities = ManifestHeaderProcessor.parseCapabilityString(s);
testCapabilitiesOrRequirements(capabilities);
}
@Test
public void testRequirementHeader() throws Exception {
String s =
"com.acme.dictionary; effective:=resolve; from:String=nl; to=de; version:Version=3.4.0.test;somedir:=test, " +
"com.acme.dictionary; filter:=\"(&(width>=1000)(height>=1000))\", " +
"com.acme.ip2location;country:List<String>=\"nl,be,fr,uk\";version:Version=1.3;long:Long=" + Long.MAX_VALUE + ";d:Double=\"3.141592653589793\"";
List<GenericMetadata> capabilities = ManifestHeaderProcessor.parseRequirementString(s);
testCapabilitiesOrRequirements(capabilities);
}
private void testCapabilitiesOrRequirements(List<GenericMetadata> metadata) {
assertEquals(3, metadata.size());
boolean found1 = false, found2 = false, found3 = false;
for (GenericMetadata cap : metadata) {
if ("com.acme.dictionary".equals(cap.getNamespace()) && cap.getDirectives().containsKey("effective")) {
testDictionaryCapability1(cap);
found1 = true;
} else if ("com.acme.dictionary".equals(cap.getNamespace()) && cap.getDirectives().containsKey("filter")) {
testDictionaryCapability2(cap);
found2 = true;
} else if ("com.acme.ip2location".equals(cap.getNamespace())) {
testIP2LocationCapability(cap);
found3 = true;
}
}
assertTrue(found1);
assertTrue(found2);
assertTrue(found3);
}
private void testDictionaryCapability1(GenericMetadata cap) {
assertEquals(2, cap.getDirectives().size());
assertEquals("resolve", cap.getDirectives().get("effective"));
assertEquals("test", cap.getDirectives().get("somedir"));
assertEquals(3, cap.getAttributes().size());
assertEquals("nl", cap.getAttributes().get("from"));
assertEquals("de", cap.getAttributes().get("to"));
assertEquals(new Version(3, 4, 0, "test"), cap.getAttributes().get("version"));
}
private void testDictionaryCapability2(GenericMetadata cap) {
assertEquals(1, cap.getDirectives().size());
assertEquals("(&(width>=1000)(height>=1000))", cap.getDirectives().get("filter"));
assertEquals(0, cap.getAttributes().size());
}
private void testIP2LocationCapability(GenericMetadata cap) {
assertEquals(0, cap.getDirectives().size());
assertEquals(4, cap.getAttributes().size());
assertEquals(new Version(1, 3, 0), cap.getAttributes().get("version"));
assertEquals(Arrays.asList("nl", "be", "fr", "uk"), cap.getAttributes().get("country"));
assertEquals(Long.MAX_VALUE, cap.getAttributes().get("long"));
assertEquals(0, new Double("3.141592653589793").compareTo((Double) cap.getAttributes().get("d")));
}
}