/* * 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.apache.felix.ipojo.parser; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.jar.Manifest; import junit.framework.TestCase; import org.apache.felix.ipojo.metadata.Element; /** * Check manipulation metadata written in the manifest. */ public class ManipulationMetadataTest extends TestCase { private String header; public void setUp() { File manFile = new File("src/test/resources/manipulation/MANIFEST.MF"); Manifest manifest; try { manifest = new Manifest(new FileInputStream(manFile)); header = manifest.getMainAttributes().getValue("iPOJO-Components"); } catch (FileNotFoundException e) { fail(e.getMessage()); } catch (IOException e) { fail(e.getMessage()); } } public void testGetMetadata() { Element elem = null; try { elem = ManifestMetadataParser.parseHeaderMetadata(header); } catch (ParseException e) { fail("Parse Exception when parsing iPOJO-Component"); } assertNotNull("Check elem not null", elem); Element manip = getManipulationForComponent(elem, "ManipulationMetadata-FooProviderType-1"); assertNotNull("Check manipulation metadata not null for " + "FooProviderType-1", manip); } public void testInterface() { String comp_name = "ManipulationMetadata-FooProviderType-1"; Element manip = getManipulationForComponent(comp_name); Element[] itf = manip.getElements("Interface"); assertEquals("Check interfaces number", itf.length, 1); assertEquals("Check itf name", itf[0].getAttribute("name"), "org.apache.felix.ipojo.test.scenarios.manipulation.service.FooService"); } public void testInterfaces() { String comp_name = "ManipulationMetadata-FooBarProviderType-1"; Element manip = getManipulationForComponent(comp_name); Element[] itf = manip.getElements("Interface"); assertEquals("Check interfaces number", itf.length, 2); assertEquals("Check itf name", itf[0].getAttribute("name"), "org.apache.felix.ipojo.test.scenarios.manipulation.service.FooService"); assertEquals("Check itf name", itf[1].getAttribute("name"), "org.apache.felix.ipojo.test.scenarios.manipulation.service.BarService"); } public void testFields() { String comp_name = "ManipulationMetadata-FooProviderType-Dyn"; Element manip = getManipulationForComponent(comp_name); Element[] fields = manip.getElements("field"); assertEquals("Check field count " + fields.length, fields.length, 5); /* private int intProp; private String strProp; private String[] strAProp; private int[] intAProp; private boolean boolProp; */ Element field; field = getFieldFromName(manip, "intProp"); assertEquals("Check field name : " + field.getAttribute("name"), field.getAttribute("name"), "intProp"); assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "int"); field = getFieldFromName(manip, "strProp"); assertEquals("Check field name : " + field.getAttribute("name"), field.getAttribute("name"), "strProp"); assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "java.lang.String"); field = getFieldFromName(manip, "strAProp"); assertEquals("Check field name : " + field.getAttribute("name"), field.getAttribute("name"), "strAProp"); assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "java.lang.String[]"); field = getFieldFromName(manip, "intAProp"); assertEquals("Check field name : " + field.getAttribute("name"), field.getAttribute("name"), "intAProp"); assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "int[]"); field = getFieldFromName(manip, "boolProp"); assertEquals("Check field name : " + field.getAttribute("name"), field.getAttribute("name"), "boolProp"); assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "boolean"); } public void testPrimitivesFields() { String comp_name = "ManipulationMetadata-PrimitiveManipulationTester"; Element manip = getManipulationForComponent(comp_name); Element[] fields = manip.getElements("Field"); assertEquals("Check field count", fields.length, 16); /* byte b = 1; short s = 1; int i = 1; long l = 1; double d = 1.1; float f = 1.1f; char c = 'a'; boolean bool = false; byte[] bs = new byte[] {0,1,2}; short[] ss = new short[] {0,1,2}; int[] is = new int[] {0,1,2}; long[] ls = new long[] {0,1,2}; double[] ds = new double[] {0.0, 1.1, 2.2}; float[] fs = new float[] {0.0f, 1.1f, 2.2f}; char[] cs = new char[] {'a', 'b', 'c'}; boolean[] bools = new boolean[] {false, true, false}; */ Element field; field = getFieldFromName(manip, "b"); assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "byte"); field = getFieldFromName(manip, "s"); assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "short"); field = getFieldFromName(manip, "i"); assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "int"); field = getFieldFromName(manip, "l"); assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "long"); field = getFieldFromName(manip, "d"); assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "double"); field = getFieldFromName(manip, "f"); assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "float"); field = getFieldFromName(manip, "c"); assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "char"); field = getFieldFromName(manip, "bool"); assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "boolean"); field = getFieldFromName(manip, "bs"); assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "byte[]"); field = getFieldFromName(manip, "ss"); assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "short[]"); field = getFieldFromName(manip, "is"); assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "int[]"); field = getFieldFromName(manip, "ls"); assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "long[]"); field = getFieldFromName(manip, "ds"); assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "double[]"); field = getFieldFromName(manip, "fs"); assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "float[]"); field = getFieldFromName(manip, "cs"); assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "char[]"); field = getFieldFromName(manip, "bools"); assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "boolean[]"); } public void testNoArgMethod() { String comp_name = "ManipulationMetadata-SimpleMultipleCheckServiceProvider"; Element manip = getManipulationForComponent(comp_name); Element method = getMethodFromName(manip, "check"); assertFalse("Check no args", method.containsAttribute("arguments")); assertEquals("Check return", method.getAttribute("return"), "boolean"); } public void testOneArgsMethod() { String comp_name = "ManipulationMetadata-SimpleMultipleCheckServiceProvider"; Element manip = getManipulationForComponent(comp_name); Element method = getMethodFromName(manip, "refBind"); assertEquals("Check args", method.getAttribute("arguments"), "{org.osgi.framework.ServiceReference}"); assertEquals("Check args count", 1, ParseUtils.parseArrays("{org.osgi.framework.ServiceReference}").length); assertFalse("Check return", method.containsAttribute("return")); } public void testTwoArgsMethod() { String comp_name = "ManipulationMetadata-SimpleMultipleCheckServiceProvider"; Element manip = getManipulationForComponent(comp_name); Element method = getMethodFromName(manip, "doNothing"); assertEquals("Check args", method.getAttribute("arguments"), "{java.lang.Object,java.lang.String}"); assertEquals("Check args count", 2, ParseUtils.parseArrays("{java.lang.Object,java.lang.String}").length); assertEquals("Check return", method.getAttribute("return"), "java.lang.Object"); } private Element getManipulationForComponent(Element metadata, String comp_name) { Element[] comps = metadata.getElements("component"); for(int i = 0; i < comps.length; i++) { if(comps[i].containsAttribute("factory") && comps[i].getAttribute("factory").equals(comp_name)) { return comps[i].getElements("manipulation")[0]; } if(comps[i].containsAttribute("name") && comps[i].getAttribute("name").equals(comp_name)) { return comps[i].getElements("manipulation")[0]; } } return null; } private Element getManipulationForComponent(String comp_name) { Element elem = null; try { elem = ManifestMetadataParser.parseHeaderMetadata(header); } catch (ParseException e) { fail("Parse Exception when parsing iPOJO-Component"); } assertNotNull("Check elem not null", elem); Element manip = getManipulationForComponent(elem, comp_name); assertNotNull("Check manipulation metadata not null for " + comp_name, manip); return manip; } private Element getMethodFromName(Element manip, String name) { Element methods[] = manip.getElements("Method"); for(int i = 0; i < methods.length; i++) { if(methods[i].containsAttribute("name") && methods[i].getAttribute("name").equals(name)) { return methods[i]; } } fail("Method " + name + " not found"); return null; } private Element getFieldFromName(Element manip, String name) { Element fields[] = manip.getElements("Field"); for(int i = 0; i < fields.length; i++) { if(fields[i].containsAttribute("name") && fields[i].getAttribute("name").equals(name)) { return fields[i]; } } fail("Field " + name + " not found"); return null; } }