| /* |
| * 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.jmx.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.PerClass; |
| import org.ops4j.pax.tinybundles.core.TinyBundle; |
| import org.ops4j.pax.tinybundles.core.TinyBundles; |
| import org.osgi.framework.Bundle; |
| 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.*; |
| |
| /** |
| * Bootstrap the test from this project |
| */ |
| @RunWith(PaxExam.class) |
| @ExamReactorStrategy(PerClass.class) |
| public class Common { |
| |
| @Inject |
| BundleContext bc; |
| |
| OSGiHelper osgiHelper; |
| IPOJOHelper ipojoHelper; |
| |
| Bundle testedBundle; |
| |
| @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(), |
| systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("WARN") |
| ); |
| } |
| |
| 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") |
| ); |
| } |
| |
| @Before |
| public void commonSetUp() { |
| osgiHelper = new OSGiHelper(bc); |
| ipojoHelper = new IPOJOHelper(bc); |
| |
| testedBundle = osgiHelper.getBundle("test.bundle"); |
| |
| // 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 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.jmx").versionAsInProject() |
| ); |
| } |
| |
| 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); |
| } |
| |
| |
| } |