blob: 5ea6c17b7751fcd62f0a3627c5312de7e0ab9aa3 [file] [log] [blame]
/*
* 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 aQute.lib.osgi.Constants;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.apache.felix.ipojo.ComponentInstance;
import org.apache.felix.ipojo.runtime.core.services.BazService;
import org.junit.Test;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.tinybundles.core.TinyBundle;
import org.ops4j.pax.tinybundles.core.TinyBundles;
import org.ow2.chameleon.testing.helpers.BaseTest;
import org.ow2.chameleon.testing.tinybundles.ipojo.IPOJOStrategy;
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.assertEquals;
import static org.apache.commons.io.FileUtils.copyInputStreamToFile;
import static org.ops4j.pax.exam.CoreOptions.bundle;
/**
* Checks that native methods can still be used in components.
*/
public class TestNativeMethod extends BaseTest {
private static final String NATIVE_CLAUSE = "" +
//Mac
"libs/mac/libfoo.jnilib;osname=MacOSX;osname=MacOS;processor=x86;processor=x86_64;processor=PowerPC," +
// Linux 32 bits
"libs/linux64/libfoo.so;processor=x86_64;osname=Linux," +
// Linux 64 bits
"libs/linux32/libfoo.so;processor=x86;osname=Linux";
/**
* We don't deploy the test bundle, a specific one will be built.
* On KF we still deploy the bundle as the probe bundles needs the components and services.
*/
@Override
public boolean deployTestBundle() {
return isKnopflerfish();
}
public boolean isKnopflerfish() {
if (context != null) {
return super.isKnopflerfish();
} else {
String pf = System.getProperty("pax.exam.framework");
return pf != null && pf.equalsIgnoreCase("knopflerfish");
}
}
@Override
protected Option[] getCustomOptions() {
// The native bundle cannot be deployed on kf,
// just skip
if (isKnopflerfish()) {
return new Option[0];
}
return new Option[] {
buildBundleWithNativeLibraries()
};
}
@Test
public void testComponentWithNativeMethod() {
if (isKnopflerfish()) {
System.out.println("Test not supported on knopflerfish");
return;
}
ComponentInstance ci = ipojoHelper.createComponentInstance("org.apache.felix.ipojo.runtime.core.components" +
".nativ.NativeComponent");
BazService baz = osgiHelper.getServiceObject(BazService.class, "(instance.name=" + ci.getInstanceName() +")");
assertEquals("foo: Test program of JNI.", baz.hello(""));
}
public static Option buildBundleWithNativeLibraries() {
File out = new File("target/tested/test-bundle-with-native.jar");
if (out.exists()) {
try {
return bundle(out.toURI().toURL().toExternalForm());
} catch (MalformedURLException e) {
// Ignore it.
}
}
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<String> exports = new ArrayList<String>();
for (File file : files) {
if (file.isDirectory()) {
// By convention we export of .services and .service package
if (file.getAbsolutePath().contains("/services") || file.getAbsolutePath().contains("/service")) {
String path = file.getAbsolutePath().substring(classes.getAbsolutePath().length() +1);
String packageName = path.replace('/', '.');
exports.add(packageName);
}
} else {
// We need to compute the path
String path = file.getAbsolutePath().substring(classes.getAbsolutePath().length() +1);
try {
tested.add(path, file.toURI().toURL());
} catch (MalformedURLException e) {
// Ignore it.
}
System.out.println(file.getName() + " added to " + path);
}
}
// Depending on the the order, the probe bundle may already have detected requirements on components.
String clause = "" +
"org.apache.felix.ipojo.runtime.core.components, " +
"org.apache.felix.ipojo.runtime.core.services, " +
"org.apache.felix.ipojo.runtime.core.services.A123";
for (String export : exports) {
if (export.length() > 0) { export += ", "; }
clause += export;
}
System.out.println("Exported packages : " + clause);
InputStream inputStream = tested
.set(Constants.BUNDLE_SYMBOLICNAME, BaseTest.TEST_BUNDLE_SYMBOLIC_NAME + "-with-native")
.set(Constants.IMPORT_PACKAGE, "*")
.set(Constants.EXPORT_PACKAGE, clause)
.set(Constants.BUNDLE_NATIVECODE, NATIVE_CLAUSE)
.build(IPOJOStrategy.withiPOJO(new File("src/main/resources")));
try {
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");
}
}
}