/* * 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.runtime.core; import org.apache.felix.ipojo.Factory; import org.apache.felix.ipojo.architecture.ComponentTypeDescription; import org.apache.felix.ipojo.architecture.PropertyDescription; import org.apache.felix.ipojo.metadata.Element; import org.apache.felix.ipojo.runtime.core.services.BarService; import org.apache.felix.ipojo.runtime.core.services.FooService; import org.junit.Before; import org.junit.Test; import org.osgi.framework.ServiceReference; import java.util.Arrays; import static junit.framework.Assert.assertEquals; import static org.junit.Assert.*; /** * Check component type description. */ public class TestComponentDesc extends Common { ServiceReference sr_fooProvider1; ServiceReference sr_fooProvider2; ServiceReference sr_fooProviderDyn2; ServiceReference sr_fooProvider3; ServiceReference sr_foobarProvider; Factory fooProvider1; Factory fooProvider2; Factory fooProviderDyn2; Factory fooProvider3; Factory foobarProvider; @Before public void setUp() { sr_fooProvider1 = osgiHelper.getServiceReferenceByPID(Factory.class, "Factories-FooProviderType-1"); sr_fooProvider2 = osgiHelper.getServiceReferenceByPID(Factory.class, "Factories-FooProviderType-2"); sr_fooProviderDyn2 = osgiHelper.getServiceReferenceByPID(Factory.class, "Factories-FooProviderType-Dyn2"); sr_fooProvider3 = osgiHelper.getServiceReferenceByPID(Factory.class, "Factories-FooProviderType-3"); sr_foobarProvider = osgiHelper.getServiceReferenceByPID(Factory.class, "Factories-FooBarProviderType-1"); fooProvider1 = ipojoHelper.getFactory("Factories-FooProviderType-1"); fooProvider2 = ipojoHelper.getFactory("Factories-FooProviderType-2"); fooProviderDyn2 = ipojoHelper.getFactory("Factories-FooProviderType-Dyn2"); fooProvider3 = ipojoHelper.getFactory("Factories-FooProviderType-3"); foobarProvider = ipojoHelper.getFactory("Factories-FooBarProviderType-1"); } /** * Check simple providing. */ @Test public void testFooProvider1() { // Test SR properties // String impl = (String) sr_fooProvider1.getProperty("component.class"); // assertEquals("Check component.class", impl, "org.apache.felix.ipojo.test.scenarios.component.FooProviderType1"); String[] specs = (String[]) sr_fooProvider1.getProperty("component.providedServiceSpecifications"); assertEquals("Check component.providedServiceSpecifications length", specs.length, 1); assertEquals("Check component.providedServiceSpecifications", FooService.class.getName(), specs[0]); PropertyDescription[] pd = (PropertyDescription[]) sr_fooProvider1.getProperty("component.properties"); assertEquals("Check component.properties length", pd.length, 0); // Test factory assertEquals("Check factory name", fooProvider1.getName(), "Factories-FooProviderType-1"); Element cd = fooProvider1.getDescription(); // assertEquals("Check implementation class ", cd.getAttribute("implementation-class"), impl); Element[] specs2 = cd.getElements("provides"); assertEquals("Check specs length", specs2.length, 1); assertEquals("Check specs", FooService.class.getName(), specs2[0].getAttribute("specification")); Element[] pd2 = cd.getElements("property"); assertNull("Check props null", pd2); // Check Description equality ComponentTypeDescription desc = (ComponentTypeDescription) sr_fooProvider1.getProperty("component.description"); assertNotNull("check description equality", desc); } /** * Check component properties. */ @Test public void testFooProvider2() { // Test SR properties // String impl = (String) sr_fooProvider2.getProperty("component.class"); // assertEquals("Check component.class", impl, "org.apache.felix.ipojo.test.scenarios.component.FooProviderType1"); String[] specs = (String[]) sr_fooProvider2.getProperty("component.providedServiceSpecifications"); assertEquals("Check component.providedServiceSpecifications length", specs.length, 1); assertEquals("Check component.providedServiceSpecifications", FooService.class.getName(), specs[0]); PropertyDescription[] pd = (PropertyDescription[]) sr_fooProvider2.getProperty("component.properties"); assertEquals("Check component.properties length", pd.length, 5); assertEquals("Check component.properties name [" + 0 + "]", "int", pd[0].getName()); assertEquals("Check component.properties type [" + 0 + "]", "int", pd[0].getType()); assertEquals("Check component.properties value [" + 0 + "]", "2", pd[0].getValue()); assertEquals("Check component.properties name [" + 1 + "]", "long", pd[1].getName()); assertEquals("Check component.properties type [" + 1 + "]", "long", pd[1].getType()); assertEquals("Check component.properties value [" + 1 + "]", "40", pd[1].getValue()); assertEquals("Check component.properties name [" + 2 + "]", "string", pd[2].getName()); assertEquals("Check component.properties type [" + 2 + "]", "java.lang.String", pd[2].getType()); assertEquals("Check component.properties value [" + 2 + "]", "foo", pd[2].getValue()); assertEquals("Check component.properties name [" + 3 + "]", "strAProp", pd[3].getName()); assertEquals("Check component.properties type [" + 3 + "]", "java.lang.String[]", pd[3].getType()); assertEquals("Check component.properties name [" + 4 + "]", "intAProp", pd[4].getName()); assertEquals("Check component.properties type [" + 4 + "]", "int[]", pd[4].getType()); // Test factory assertEquals("Check factory name", fooProvider2.getName(), "Factories-FooProviderType-2"); Element cd = fooProvider2.getDescription(); // assertEquals("Check implementation class ", cd.getAttribute("implementation-class"), impl); Element[] specs2 = cd.getElements("provides"); assertEquals("Check specs length", specs2.length, 1); assertEquals("Check specs", FooService.class.getName(), specs2[0].getAttribute("specification")); Element[] pd2 = cd.getElements("property"); assertEquals("Check props length", pd2.length, 5); assertEquals("Check component.properties name [" + 0 + "]", "int", pd2[0].getAttribute("name")); assertEquals("Check component.properties type [" + 0 + "]", "int", pd2[0].getAttribute("type")); assertEquals("Check component.properties value [" + 0 + "]", "2", pd2[0].getAttribute("value")); assertEquals("Check component.properties name [" + 1 + "]", "long", pd2[1].getAttribute("name")); assertEquals("Check component.properties type [" + 1 + "]", "long", pd2[1].getAttribute("type")); assertEquals("Check component.properties value [" + 1 + "]", "40", pd2[1].getAttribute("value")); assertEquals("Check component.properties name [" + 2 + "]", "string", pd2[2].getAttribute("name")); assertEquals("Check component.properties type [" + 2 + "]", "java.lang.String", pd2[2].getAttribute("type")); assertEquals("Check component.properties value [" + 2 + "]", "foo", pd2[2].getAttribute("value")); assertEquals("Check component.properties name [" + 3 + "]", "strAProp", pd2[3].getAttribute("name")); assertEquals("Check component.properties type [" + 3 + "]", "java.lang.String[]", pd2[3].getAttribute("type")); assertEquals("Check component.properties name [" + 4 + "]", "intAProp", pd2[4].getAttribute("name")); assertEquals("Check component.properties type [" + 4 + "]", "int[]", pd2[4].getAttribute("type")); // Check Description equality ComponentTypeDescription desc = (ComponentTypeDescription) sr_fooProvider2.getProperty("component.description"); assertNotNull("check description equality", desc); // Check that we have the complete metadata assertNotNull(fooProvider2.getComponentMetadata()); } /** * Check component properties (dynamic). */ @Test public void testFooProviderDyn2() { // Test SR properties // String impl = (String) sr_fooProviderDyn2.getProperty("component.class"); // assertEquals("Check component.class", impl, "org.apache.felix.ipojo.test.scenarios.component.FooProviderTypeDyn2"); String[] specs = (String[]) sr_fooProviderDyn2.getProperty("component.providedServiceSpecifications"); assertEquals("Check component.providedServiceSpecifications length", specs.length, 1); assertEquals("Check component.providedServiceSpecifications", FooService.class.getName(), specs[0]); PropertyDescription[] pd = (PropertyDescription[]) sr_fooProviderDyn2.getProperty("component.properties"); assertEquals("Check component.properties length", pd.length, 5); assertEquals("Check component.properties name [" + 0 + "]", "int", pd[0].getName()); assertEquals("Check component.properties type [" + 0 + "]", "int", pd[0].getType()); assertEquals("Check component.properties value [" + 0 + "]", "4", pd[0].getValue()); assertEquals("Check component.properties name [" + 1 + "]", "boolean", pd[1].getName()); assertEquals("Check component.properties type [" + 1 + "]", "boolean", pd[1].getType()); assertEquals("Check component.properties name [" + 2 + "]", "string", pd[2].getName()); assertEquals("Check component.properties type [" + 2 + "]", "java.lang.String", pd[2].getType()); assertEquals("Check component.properties name [" + 3 + "]", "strAProp", pd[3].getName()); assertEquals("Check component.properties type [" + 3 + "]", "java.lang.String[]", pd[3].getType()); assertEquals("Check component.properties name [" + 4 + "]", "intAProp", pd[4].getName()); assertEquals("Check component.properties type [" + 4 + "]", "int[]", pd[4].getType()); // Test factory assertEquals("Check factory name", fooProviderDyn2.getName(), "Factories-FooProviderType-Dyn2"); Element cd = fooProviderDyn2.getDescription(); // assertEquals("Check implementation class ", cd.getAttribute("implementation-class"), impl); Element[] specs2 = cd.getElements("provides"); assertEquals("Check specs length", specs2.length, 1); assertEquals("Check specs", FooService.class.getName(), specs2[0].getAttribute("specification")); Element[] pd2 = cd.getElements("property"); assertEquals("Check props length", pd2.length, 5); assertEquals("Check component.properties name [" + 0 + "]", "int", pd2[0].getAttribute("name")); assertEquals("Check component.properties type [" + 0 + "]", "int", pd2[0].getAttribute("type")); assertEquals("Check component.properties value [" + 0 + "]", "4", pd2[0].getAttribute("value")); assertEquals("Check component.properties name [" + 1 + "]", "boolean", pd2[1].getAttribute("name")); assertEquals("Check component.properties type [" + 1 + "]", "boolean", pd2[1].getAttribute("type")); assertEquals("Check component.properties name [" + 2 + "]", "string", pd2[2].getAttribute("name")); assertEquals("Check component.properties type [" + 2 + "]", "java.lang.String", pd2[2].getAttribute("type")); assertEquals("Check component.properties name [" + 3 + "]", "strAProp", pd2[3].getAttribute("name")); assertEquals("Check component.properties type [" + 3 + "]", "java.lang.String[]", pd2[3].getAttribute("type")); assertEquals("Check component.properties name [" + 4 + "]", "intAProp", pd2[4].getAttribute("name")); assertEquals("Check component.properties type [" + 4 + "]", "int[]", pd2[4].getAttribute("type")); // Check Description equality ComponentTypeDescription desc = (ComponentTypeDescription) sr_fooProviderDyn2.getProperty("component.description"); assertNotNull("check description equality", desc); // Check that we have the complete metadata assertNotNull(fooProvider2.getComponentMetadata()); } /** * Check component properties. */ @Test public void testFooProvider3() { // Test SR properties // String impl = (String) sr_fooProvider3.getProperty("component.class"); // assertEquals("Check component.class", impl, "org.apache.felix.ipojo.test.scenarios.component.FooProviderType1"); String[] specs = (String[]) sr_fooProvider3.getProperty("component.providedServiceSpecifications"); assertEquals("Check component.providedServiceSpecifications length", specs.length, 1); assertEquals("Check component.providedServiceSpecifications", FooService.class.getName(), specs[0]); PropertyDescription[] pd = (PropertyDescription[]) sr_fooProvider3.getProperty("component.properties"); assertEquals("Check component.properties length (" + pd.length +")", pd.length, 3); assertEquals("Check component.properties name [" + 0 + "]", "foo", pd[0].getName()); assertEquals("Check component.properties name [" + 1 + "]", "bar", pd[1].getName()); assertEquals("Check component.properties name [" + 2 + "]", "baz", pd[2].getName()); assertEquals("Check component.properties type [" + 2 + "]", "java.lang.String", pd[2].getType()); // Test factory assertEquals("Check factory name", fooProvider3.getName(), "Factories-FooProviderType-3"); Element cd = fooProvider3.getDescription(); // assertEquals("Check implementation class ", cd.getAttribute("implementation-class"), impl); Element[] specs2 = cd.getElements("provides"); assertEquals("Check specs length", specs2.length, 1); assertEquals("Check specs", FooService.class.getName(), specs2[0].getAttribute("specification")); Element[] pd2 = cd.getElements("property"); assertEquals("Check props length", pd2.length, 3); assertEquals("Check component.properties name [" + 0 + "]", "foo", pd2[0].getAttribute("name")); assertEquals("Check component.properties name [" + 1 + "]", "bar", pd2[1].getAttribute("name")); assertEquals("Check component.properties name [" + 2 + "]", "baz", pd2[2].getAttribute("name")); assertEquals("Check component.properties type [" + 2 + "]", "java.lang.String", pd2[2].getAttribute("type")); // Check Description equality ComponentTypeDescription desc = (ComponentTypeDescription) sr_fooProvider3.getProperty("component.description"); assertNotNull("check description equality", desc); } /** * Test two services provider. */ @Test public void testFooBar() { // Test SR properties // String impl = (String) sr_foobarProvider.getProperty("component.class"); // assertEquals("Check component.class", impl, "org.apache.felix.ipojo.test.scenarios.component.FooBarProviderType1"); String[] specs = (String[]) sr_foobarProvider.getProperty("component.providedServiceSpecifications"); assertEquals("Check component.providedServiceSpecifications length", specs.length, 2); assertContains("Check component.providedServiceSpecifications 1", specs, FooService.class.getName()); assertContains("Check component.providedServiceSpecifications 2", specs, BarService.class.getName()); PropertyDescription[] pd = (PropertyDescription[]) sr_foobarProvider.getProperty("component.properties"); assertEquals("Check component.properties length", pd.length, 0); // Test factory assertEquals("Check factory name", foobarProvider.getName(), "Factories-FooBarProviderType-1"); Element cd = foobarProvider.getDescription(); // assertEquals("Check implementation class ", cd.getAttribute("implementation-class"), impl); Element[] specs2 = cd.getElements("provides"); assertEquals("Check specs length", specs2.length, 2); assertTrue("Check specs", containsSpecification(FooService.class.getName(), specs2)); assertTrue("Check specs", containsSpecification(BarService.class.getName(), specs2)); Element[] pd2 = cd.getElements("property"); assertNull("Check props null", pd2); // Check Description equality ComponentTypeDescription desc = (ComponentTypeDescription) sr_foobarProvider.getProperty("component.description"); assertNotNull("check description equality", desc); // Check that we have the complete metadata assertNotNull(foobarProvider.getComponentMetadata()); } private boolean containsSpecification(String value, Element[] array) { for (int i = 0; array != null && i < array.length; i++) { if (array[i] != null && array[i].containsAttribute("specification") && array[i].getAttribute("specification").equals(value)) { return true; } } return false; } }