/* * 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.handler.transaction.test; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import org.apache.commons.io.FileUtils; import org.apache.commons.io.filefilter.TrueFileFilter; import org.junit.After; import org.junit.Before; import org.junit.runner.RunWith; import org.ops4j.pax.exam.Configuration; import org.ops4j.pax.exam.CoreOptions; import org.ops4j.pax.exam.Option; import org.ops4j.pax.exam.junit.PaxExam; import org.ops4j.pax.exam.options.CompositeOption; import org.ops4j.pax.exam.options.DefaultCompositeOption; import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy; import org.ops4j.pax.exam.spi.reactors.PerMethod; import org.ops4j.pax.tinybundles.core.TinyBundle; import org.ops4j.pax.tinybundles.core.TinyBundles; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; import org.ow2.chameleon.testing.helpers.IPOJOHelper; import org.ow2.chameleon.testing.helpers.OSGiHelper; import org.ow2.chameleon.testing.tinybundles.ipojo.IPOJOStrategy; import org.slf4j.LoggerFactory; import javax.inject.Inject; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import static junit.framework.Assert.fail; import static org.ops4j.pax.exam.CoreOptions.*; import static org.ops4j.pax.exam.MavenUtils.asInProject; /** * Bootstrap the test from this project */ @RunWith(PaxExam.class) @ExamReactorStrategy(PerMethod.class) public class Common { @Inject BundleContext context; OSGiHelper osgiHelper; IPOJOHelper ipojoHelper; public static Option junitAndMockitoBundles() { return new DefaultCompositeOption( // Repository required to load harmcrest (OSGi-fied version). repository("http://repository.springsource.com/maven/bundles/external").id( "com.springsource.repository.bundles.external"), // Hamcrest with a version matching the range expected by Mockito mavenBundle("org.hamcrest", "com.springsource.org.hamcrest.core", "1.1.0"), // Mockito core does not includes Hamcrest mavenBundle("org.mockito", "mockito-core", "1.9.5"), // Objenesis with a version matching the range expected by Mockito wrappedBundle(mavenBundle("org.objenesis", "objenesis", "1.2")) .exports("*;version=1.2"), // The default JUnit bundle also exports Hamcrest, but with an (incorrect) version of // 4.9 which does not match the Mockito import. When deployed after the hamcrest bundles, it gets // resolved correctly. CoreOptions.junitBundles(), /* * Felix has implicit boot delegation enabled by default. It conflicts with Mockito: * java.lang.LinkageError: loader constraint violation in interface itable initialization: * when resolving method "org.osgi.service.useradmin.User$$EnhancerByMockitoWithCGLIB$$dd2f81dc * .newInstance(Lorg/mockito/cglib/proxy/Callback;)Ljava/lang/Object;" the class loader * (instance of org/mockito/internal/creation/jmock/SearchingClassLoader) of the current class, * org/osgi/service/useradmin/User$$EnhancerByMockitoWithCGLIB$$dd2f81dc, and the class loader * (instance of org/apache/felix/framework/BundleWiringImpl$BundleClassLoaderJava5) for interface * org/mockito/cglib/proxy/Factory have different Class objects for the type org/mockito/cglib/ * proxy/Callback used in the signature * * So we disable the bootdelegation. this property has no effect on the other OSGi implementation. */ frameworkProperty("felix.bootdelegation.implicit").value("false") ); } public static CompositeOption ipojoBundles() { return new DefaultCompositeOption( mavenBundle("org.apache.felix", "org.apache.felix.ipojo").versionAsInProject(), mavenBundle("org.ow2.chameleon.testing", "osgi-helpers").versionAsInProject(), // The tested handler mavenBundle("org.apache.felix", "org.apache.felix.ipojo.handler.transaction").versionAsInProject() ); } @Configuration public Option[] config() throws IOException { Logger root = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); root.setLevel(Level.DEBUG); return options( cleanCaches(), ipojoBundles(), junitBundles(), //testedBundle(), // Each test is doing its own deployment. systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("WARN"), provision( mavenBundle().groupId("org.ow2.chameleon.transaction").artifactId("geronimo-transaction-service").version(asInProject()) ), systemPackage("javax.transaction;version>=1.1.0") ); } @Before public void commonSetUp() { osgiHelper = new OSGiHelper(context); ipojoHelper = new IPOJOHelper(context); // Dump OSGi Framework information String vendor = (String) osgiHelper.getBundle(0).getHeaders().get(Constants.BUNDLE_VENDOR); if (vendor == null) { vendor = (String) osgiHelper.getBundle(0).getHeaders().get(Constants.BUNDLE_SYMBOLICNAME); } String version = (String) osgiHelper.getBundle(0).getHeaders().get(Constants.BUNDLE_VERSION); System.out.println("OSGi Framework : " + vendor + " - " + version); } @After public void commonTearDown() { ipojoHelper.dispose(); osgiHelper.dispose(); } public Option testedBundle() throws MalformedURLException { File out = new File("target/tested/bundle.jar"); TinyBundle tested = TinyBundles.bundle(); // We look inside target/classes to find the class and resources File classes = new File("target/classes"); Collection<File> files = FileUtils.listFilesAndDirs(classes, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE); List<File> services = new ArrayList<File>(); for (File file : files) { if (file.isDirectory()) { // By convention we export of .services and .service package if (file.getName().endsWith("services") || file.getName().endsWith("service")) { services.add(file); } } else { // We need to compute the path String path = file.getAbsolutePath().substring(classes.getAbsolutePath().length() + 1); tested.add(path, file.toURI().toURL()); System.out.println(file.getName() + " added to " + path); } } String export = ""; for (File file : services) { if (export.length() > 0) { export += ", "; } String path = file.getAbsolutePath().substring(classes.getAbsolutePath().length() + 1); String packageName = path.replace('/', '.'); export += packageName; } System.out.println("Exported packages : " + export); InputStream inputStream = tested .set(Constants.BUNDLE_SYMBOLICNAME, "test.bundle") //.set(Constants.IMPORT_PACKAGE, "*") //.set(Constants.EXPORT_PACKAGE, export) // No export... .build(IPOJOStrategy.withiPOJO(new File("src/main/resources"))); try { FileUtils.copyInputStreamToFile(inputStream, out); return bundle(out.toURI().toURL().toExternalForm()); } catch (MalformedURLException e) { throw new RuntimeException("Cannot compute the url of the manipulated bundle"); } catch (IOException e) { throw new RuntimeException("Cannot write of the manipulated bundle"); } } public void assertContains(String s, String[] arrays, String object) { for (String suspect : arrays) { if (object.equals(suspect)) { return; } } fail("Assertion failed : " + s); } }