package org.infinispan.it.osgi.features;
import static org.infinispan.it.osgi.util.IspnKarafOptions.commonOptions;
import static org.ops4j.pax.exam.CoreOptions.options;
import java.net.URI;
import java.util.Properties;
import org.apache.karaf.features.FeaturesService;
import org.infinispan.commons.test.skip.SkipOnOs;
import org.infinispan.commons.test.skip.SkipOnOsRule;
import org.infinispan.it.osgi.util.MavenUtils;
import org.infinispan.it.osgi.util.PaxExamUtils;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import org.ops4j.pax.exam.Configuration;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.ProbeBuilder;
import org.ops4j.pax.exam.TestProbeBuilder;
import org.ops4j.pax.exam.junit.PaxExam;
import org.ops4j.pax.exam.karaf.options.KarafDistributionOption;
import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
import org.ops4j.pax.exam.spi.reactors.PerClass;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
/**
* Tests features.xml definitions for OSGi bundles.
*/
@RunWith(PaxExam.class)
@ExamReactorStrategy(PerClass.class)
@Category(PerClass.class)
public class OSGiKarafFeaturesTest {
@Rule
public final SkipOnOsRule skipOnOsRule = new SkipOnOsRule();
private static final String PROP_PROJECT_VERSION = "project.version";
@Configuration
public Option[] config() throws Exception {
return options(
commonOptions(),
KarafDistributionOption.editConfigurationFileExtend("etc/config.properties", "org.osgi.framework.executionenvironment", "JavaSE-1.8")
);
}
@ProbeBuilder
public TestProbeBuilder builder(TestProbeBuilder probeBuilder) {
return PaxExamUtils.probeIsolationWorkaround(probeBuilder);
}
/**
* Verifies that Karaf Features install correctly on clean containers.
*/
@Test
@SkipOnOs({SkipOnOs.OS.WINDOWS, SkipOnOs.OS.SOLARIS})
public void testCleanInstall() throws Exception {
Bundle bundle = FrameworkUtil.getBundle(getClass());
Assert.assertNotNull("Failed to find class bundle.", bundle);
BundleContext context = bundle.getBundleContext();
ServiceReference<FeaturesService> serviceReference = context.getServiceReference(FeaturesService.class);
Assert.assertNotNull("Failed to obtain a reference to the FeaturesService.", serviceReference);
FeaturesService service = context.getService(serviceReference);
Assert.assertNotNull("Failed to obtain a FeaturesService instance.", service);
Properties mavenProps = MavenUtils.getProperties();
String version = mavenProps.getProperty(PROP_PROJECT_VERSION);
Assert.assertNotNull("Failed to obtain the project version from maven.", version);
checkInstall(service, "infinispan-commons", "infinispan-commons", version);
checkInstall(service, "infinispan-core", "infinispan-core", version);
checkInstall(service, "infinispan-client-hotrod", /* deprecated */ "hotrod-client", version);
checkInstall(service, "infinispan-client-hotrod", /* deprecated */ "hotrod-client-with-query", version);
checkInstall(service, "infinispan-client-hotrod", "infinispan-client-hotrod", version);
checkInstall(service, "infinispan-client-hotrod", "infinispan-client-hotrod-with-query", version);
checkInstall(service, "infinispan-cachestore-jdbc", "infinispan-cachestore-jdbc", version);
checkInstall(service, "infinispan-cachestore-remote", "infinispan-cachestore-remote", version);
checkInstall(service, "infinispan-cachestore-rocksdb", "infinispan-cachestore-rocksdb", version);
checkInstall(service, "infinispan-cachestore-jpa", "infinispan-cachestore-jpa", version);
checkInstall(service, "infinispan-osgi", "infinispan-osgi", version);
checkInstall(service, "infinispan-embedded", "infinispan-embedded", version);
checkInstall(service, "infinispan-remote", "infinispan-remote", version);
}
private void checkInstall(FeaturesService service, String artifactId, String feature, String version) throws Exception {
Assert.assertNull(String.format("Feature '%s' version '%s' is present in the container before install!", feature, version),
service.getFeature(feature, version));
try {
service.installFeature(feature, version);
Assert.fail("Feature install should fail before the repository is added.");
} catch (Exception ex) {
}
URI repoUri = new URI(String.format("mvn:org.infinispan/%s/%s/xml/features", artifactId, version));
service.addRepository(repoUri);
service.installFeature(feature, version);
Assert.assertNotNull(String.format("Feature '%s' version '%s' install failed.", feature, version),
service.getFeature(feature, version));
/* Clean-up. */
service.uninstallFeature(feature, version);
service.removeRepository(repoUri);
Assert.assertNull(String.format("Feature '%s' version '%s' is still present in the container after uninstall!", feature, version),
service.getFeature(feature, version));
}
}