| /* |
| * 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.tests.core; |
| |
| import org.apache.commons.io.FileUtils; |
| import org.apache.felix.ipojo.architecture.Architecture; |
| import org.apache.felix.ipojo.architecture.HandlerDescription; |
| import org.apache.felix.ipojo.core.tests.components.MyComponent; |
| import org.apache.felix.ipojo.core.tests.components.MyCons; |
| import org.apache.felix.ipojo.core.tests.services.MyService; |
| import org.apache.felix.ipojo.handlers.dependency.Dependency; |
| import org.apache.felix.ipojo.handlers.dependency.DependencyDescription; |
| import org.apache.felix.ipojo.handlers.dependency.DependencyHandlerDescription; |
| import org.junit.Assert; |
| import org.junit.Ignore; |
| import org.junit.Test; |
| import org.ops4j.pax.exam.Configuration; |
| import org.ops4j.pax.exam.Option; |
| import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy; |
| import org.ops4j.pax.exam.spi.reactors.PerMethod; |
| import org.ops4j.pax.tinybundles.core.TinyBundles; |
| import org.osgi.framework.*; |
| import org.ow2.chameleon.testing.helpers.Stability; |
| import org.ow2.chameleon.testing.tinybundles.ipojo.IPOJOStrategy; |
| |
| import javax.inject.Inject; |
| import java.io.File; |
| import java.io.IOException; |
| import java.net.MalformedURLException; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.List; |
| |
| import static org.ops4j.pax.exam.CoreOptions.options; |
| import static org.ops4j.pax.exam.CoreOptions.systemProperty; |
| import static org.ops4j.pax.tinybundles.core.TinyBundles.withBnd; |
| |
| @ExamReactorStrategy(PerMethod.class) |
| public class VersionConflictTest extends Common { |
| |
| @Inject |
| private BundleContext context; |
| |
| @Configuration |
| public Option[] config() throws IOException { |
| |
| List<Option> options = new ArrayList<Option>(); |
| options.addAll(Arrays.asList(super.config())); |
| |
| File tmp = new File("target/tmp"); |
| tmp.mkdirs(); |
| |
| File f1 = new File(tmp, "service-interface-v1.jar"); |
| FileUtils.copyInputStreamToFile( |
| TinyBundles.bundle() |
| .add(MyService.class) |
| .set(Constants.BUNDLE_SYMBOLICNAME, "ServiceInterfaceV1") |
| .set(Constants.EXPORT_PACKAGE, "org.apache.felix.ipojo.core.tests.services; version=\"1.0.0\"") |
| .build(withBnd()), |
| f1); |
| |
| File f2 = new File(tmp, "service-interface-v2.jar"); |
| FileUtils.copyInputStreamToFile( |
| TinyBundles.bundle() |
| .add(MyService.class) |
| .set(Constants.BUNDLE_SYMBOLICNAME, "ServiceInterfaceV2") |
| .set(Constants.BUNDLE_VERSION, "2.0.0") |
| .set(Constants.EXPORT_PACKAGE, "org.apache.felix.ipojo.core.tests.services; version=\"2.0.0\"") |
| .build(withBnd()), |
| f2); |
| |
| File c1 = new File(tmp, "component-v1.jar"); |
| FileUtils.copyInputStreamToFile( |
| TinyBundles.bundle() |
| .add(MyComponent.class) |
| .set(Constants.BUNDLE_SYMBOLICNAME, "ProviderV1") |
| .set(Constants.IMPORT_PACKAGE, "org.apache.felix.ipojo.core.tests.services; version=\"1.0.0\"") |
| .build(IPOJOStrategy.withiPOJO(new File("src/main/resources/vprovider-v1.xml"))), |
| c1); |
| |
| File c2 = new File(tmp, "component-v2.jar"); |
| FileUtils.copyInputStreamToFile( |
| TinyBundles.bundle() |
| .add(MyComponent.class) |
| .set(Constants.BUNDLE_SYMBOLICNAME, "ProviderV2") |
| .set(Constants.IMPORT_PACKAGE, "org.apache.felix.ipojo.core.tests.services; version=\"2.0.0\"") |
| .build(IPOJOStrategy.withiPOJO(new File("src/main/resources/vprovider-v2.xml"))), |
| c2); |
| |
| File cons = new File(tmp, "cons.jar"); |
| FileUtils.copyInputStreamToFile( |
| TinyBundles.bundle() |
| .add(MyCons.class) |
| .set(Constants.BUNDLE_SYMBOLICNAME, "MyCons") |
| .set(Constants.IMPORT_PACKAGE, "org.apache.felix.ipojo.core.tests.services; version=\"2.0.0\"") |
| .set(Constants.BUNDLE_VERSION, "2.0") |
| .build(IPOJOStrategy.withiPOJO(new File("src/main/resources/cons.xml"))), |
| cons); |
| |
| File consV1 = new File(tmp, "cons-v1.jar"); |
| FileUtils.copyInputStreamToFile( |
| TinyBundles.bundle() |
| .add(MyCons.class) |
| .set(Constants.BUNDLE_SYMBOLICNAME, "MyCons") |
| .set(Constants.IMPORT_PACKAGE, "org.apache.felix.ipojo.core.tests.services; version=\"[1.0.0, " + |
| "1.1.0)\"") |
| .set(Constants.BUNDLE_VERSION, "1.0") |
| .build(IPOJOStrategy.withiPOJO(new File("src/main/resources/cons.xml"))), |
| consV1); |
| |
| Option[] opt = options( |
| systemProperty("url1").value(f1.toURI().toURL().toExternalForm()), |
| systemProperty("url2").value(f2.toURI().toURL().toExternalForm()), |
| |
| systemProperty("c1").value(c1.toURI().toURL().toExternalForm()), |
| systemProperty("c2").value(c2.toURI().toURL().toExternalForm()), |
| systemProperty("cons").value(cons.toURI().toURL().toExternalForm()), |
| systemProperty("consV1").value(consV1.toURI().toURL().toExternalForm()) |
| ); |
| |
| options.addAll(Arrays.asList(opt)); |
| |
| return options.toArray(new Option[options.size()]); |
| } |
| |
| // @ProbeBuilder |
| // public TestProbeBuilder probe(TestProbeBuilder builder) { |
| // builder.setHeader(Constants.IMPORT_PACKAGE, "org.osgi.framework, org.apache.felix.ipojo, " + |
| // "org.ow2.chameleon.testing.helpers, org.osgi.service.packageadmin, " + |
| // "org.apache.felix.ipojo.architecture, org.apache.felix.ipojo.handlers.dependency"); |
| // builder.setHeader(Constants.DYNAMICIMPORT_PACKAGE, "org.ops4j.pax.exam,org.junit,javax.inject," + |
| // "org.ops4j.pax.exam.options"); |
| // builder.setHeader("Bundle-ManifestVersion", "2"); |
| // return builder; |
| // } |
| |
| public boolean isKF() { |
| return bc.getClass().toString().contains("knopflerfish"); |
| } |
| |
| @Test |
| public void deployBundlesAtRuntime() throws MalformedURLException, BundleException, InvalidSyntaxException { |
| if (isKF()) { |
| System.out.println("Test disabled on knopflerfish"); |
| return; |
| } |
| |
| Bundle b1 = context.installBundle(context.getProperty("url1")); |
| b1.start(); |
| |
| |
| Bundle b3 = context.installBundle(context.getProperty("c1")); |
| b3.start(); |
| |
| Bundle b2 = context.installBundle(context.getProperty("url2")); |
| b2.start(); |
| |
| Bundle b4 = context.installBundle(context.getProperty("c2")); |
| b4.start(); |
| |
| Bundle b5 = context.installBundle(context.getProperty("cons")); |
| b5.start(); |
| |
| Stability.waitForStability(bc); |
| |
| Bundle[] bundles = context.getBundles(); |
| for (Bundle bundle : bundles) { |
| System.out.println("bundle " + bundle.getSymbolicName() + " : " + (bundle.getState() == Bundle.ACTIVE)); |
| //Assert.assertEquals(bundles[i].getSymbolicName() + " is not active", Bundle.ACTIVE, bundles[i].getState()); |
| } |
| |
| // Bundle consBundle = osgiHelper.getBundle("MyCons"); |
| // BundleWiring wiring = consBundle.adapt(BundleWiring.class); |
| // System.out.println("Bundle Wiring req: "); |
| // for (BundleWire wire : wiring.getRequiredWires(null)) { |
| // System.out.println(wire.getCapability().getAttributes() + " - " + wire.getCapability().getDirectives()); |
| // } |
| |
| osgiHelper.waitForService(Architecture.class.getName(), "(architecture.instance=mycons)", 2000); |
| |
| // Check that the two services are provided. |
| ServiceReference[] refs = context.getAllServiceReferences("org.apache.felix.ipojo.core.tests.services.MyService", null); |
| Assert.assertNotNull(refs); |
| Assert.assertEquals(2, refs.length); |
| |
| ServiceReference refv1 = ipojoHelper.getServiceReferenceByName(Architecture.class.getName(), "mycons"); |
| Assert.assertNotNull(refv1); |
| Architecture arch = (Architecture) osgiHelper.getRawServiceObject(refv1); |
| |
| HandlerDescription desc = arch.getInstanceDescription().getHandlerDescription("org.apache.felix.ipojo:requires"); |
| Assert.assertNotNull(desc); |
| |
| DependencyHandlerDescription d = (DependencyHandlerDescription) desc; |
| Assert.assertNotNull(d.getDependencies()); |
| Assert.assertEquals(1, d.getDependencies().length); |
| |
| DependencyDescription dep = d.getDependencies()[0]; |
| Assert.assertEquals(Dependency.RESOLVED, dep.getState()); |
| |
| Assert.assertEquals(1, dep.getServiceReferences().size()); |
| ServiceReference r = dep.getServiceReferences().get(0); |
| Assert.assertEquals("provider", r.getProperty("factory.name")); |
| Assert.assertEquals("2.0", r.getProperty("factory.version")); |
| } |
| |
| @Test |
| @Ignore("Does not work anymore, but the scenario runs as expected in a regular framework. The check find the " + |
| "version 2.0 of the service instead of the 1.0") |
| public void deployBundlesAtRuntimeV1() throws MalformedURLException, BundleException, InvalidSyntaxException { |
| |
| Bundle b1 = context.installBundle(context.getProperty("url1")); |
| b1.start(); |
| |
| |
| Bundle b3 = context.installBundle(context.getProperty("c1")); |
| b3.start(); |
| |
| Bundle b2 = context.installBundle(context.getProperty("url2")); |
| b2.start(); |
| |
| Bundle b4 = context.installBundle(context.getProperty("c2")); |
| b4.start(); |
| |
| Bundle b5 = context.installBundle(context.getProperty("consV1")); |
| b5.start(); |
| |
| |
| Bundle[] bundles = context.getBundles(); |
| for (int i = 0; i < bundles.length; i++) { |
| System.out.println("bundle " + bundles[i].getSymbolicName() + " : " + (bundles[i].getState() == Bundle.ACTIVE)); |
| } |
| |
| osgiHelper.waitForService(Architecture.class.getName(), "(architecture.instance=mycons)", 2000); |
| |
| // Check that the two services are provided. |
| ServiceReference[] refs = context.getAllServiceReferences("org.apache.felix.ipojo.core.tests.services.MyService", null); |
| Assert.assertNotNull(refs); |
| Assert.assertEquals(2, refs.length); |
| |
| ServiceReference refv1 = ipojoHelper.getServiceReferenceByName(Architecture.class.getName(), "mycons"); |
| Assert.assertNotNull(refv1); |
| Architecture arch = (Architecture) osgiHelper.getRawServiceObject(refv1); |
| |
| HandlerDescription desc = arch.getInstanceDescription().getHandlerDescription("org.apache.felix.ipojo:requires"); |
| Assert.assertNotNull(desc); |
| |
| DependencyHandlerDescription d = (DependencyHandlerDescription) desc; |
| Assert.assertNotNull(d.getDependencies()); |
| Assert.assertEquals(1, d.getDependencies().length); |
| |
| DependencyDescription dep = d.getDependencies()[0]; |
| Assert.assertEquals(Dependency.RESOLVED, dep.getState()); |
| |
| Assert.assertEquals(1, dep.getServiceReferences().size()); |
| ServiceReference r = dep.getServiceReferences().get(0); |
| |
| Assert.assertEquals("provider", r.getProperty("factory.name")); |
| Assert.assertEquals("1.0", r.getProperty("factory.version")); |
| } |
| |
| |
| } |