package org.infinispan.it.osgi; import static org.infinispan.it.osgi.util.PaxExamUtils.exportTestPackages; import static org.infinispan.it.osgi.util.PaxExamUtils.probeIsolationWorkaround; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import java.util.Collection; import java.util.Dictionary; import java.util.Hashtable; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import org.infinispan.it.osgi.util.IspnKarafOptions; import org.infinispan.it.osgi.util.OSGiTestUtils; import org.infinispan.manager.EmbeddedCacheManager; import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; 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.PerMethod; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceEvent; import org.osgi.framework.ServiceListener; import org.osgi.framework.ServiceReference; import org.osgi.service.cm.Configuration; import org.osgi.service.cm.ConfigurationAdmin; @RunWith(PaxExam.class) @ExamReactorStrategy(PerMethod.class) @Category(PerMethod.class) public class InfinispanEmbeddedServiceFactoryTest { @org.ops4j.pax.exam.Configuration public Option[] config() throws Exception { return new Option[] { IspnKarafOptions.commonOptions(), /* The blueprint contained in this bundle will register a ManagedServiceFactory. */ IspnKarafOptions.mvnFeature("org.infinispan", "infinispan-osgi", "infinispan-osgi"), KarafDistributionOption.replaceConfigurationFile("/etc/custom-etc-infinispan-config.xml", OSGiTestUtils.getResourceFile("org/infinispan/it/osgi/custom-config-3.xml")), KarafDistributionOption.editConfigurationFileExtend("etc/config.properties", "org.osgi.framework.executionenvironment", "JavaSE-1.8") }; } @ProbeBuilder public TestProbeBuilder probe(TestProbeBuilder probeBuilder) { /* Export the test package (it contains the custom configuration files used in the tests). */ return exportTestPackages(probeIsolationWorkaround(probeBuilder)); } /** * If no configurations are present embedded cache manager instances are not created. * * @throws Exception */ @Test public void testNoConfiguration() throws Exception { BundleContext bundleContext = OSGiTestUtils.getBundleContext(this); ConfigurationAdmin configurationService = OSGiTestUtils.getService(bundleContext, ConfigurationAdmin.class); /* No pre-existing configurations are expected. */ Configuration[] configurations = configurationService.listConfigurations("(service.pid=org.infinispan.manager.embedded)"); assertNull("No configurations are expected.", configurations); Collection<ServiceReference<EmbeddedCacheManager>> serviceReferences; serviceReferences = bundleContext.getServiceReferences(EmbeddedCacheManager.class, "(service.pid=org.infinispan.manager.embedded)"); assertEquals("No service is expected.", 0, serviceReferences.size()); } /** * No services are created if the configuration doesn't contain the required properties. * * @throws Exception */ @Test public void testMissingConfigProperties() throws Exception { BundleContext bundleContext = OSGiTestUtils.getBundleContext(this); ConfigurationAdmin configurationService = OSGiTestUtils.getService(bundleContext, ConfigurationAdmin.class); /* No pre-existing configurations are expected. */ Configuration[] configurations = configurationService.listConfigurations("(service.pid=org.infinispan.manager.embedded)"); assertNull("No configurations are expected.", configurations); /* Create a new empty configuration for the service PID. */ Configuration configuration = configurationService.createFactoryConfiguration("org.infinispan.manager.embedded", null); configuration.update(); /* No services are expected as the 'config' parameter is not set. */ Collection<ServiceReference<EmbeddedCacheManager>> serviceReferences; serviceReferences = bundleContext.getServiceReferences(EmbeddedCacheManager.class, "(service.pid=org.infinispan.manager.embedded)"); assertNotNull("No service is expected.", serviceReferences); assertEquals("No service is expected.", 0, serviceReferences.size()); } @Test public void testConfigurationPresent() throws Exception { BundleContext bundleContext = OSGiTestUtils.getBundleContext(this); final CountDownLatch expectedServiceRegistrations = new CountDownLatch(3); /* Add a listener which updates the service registration counter. */ bundleContext.addServiceListener(new ServiceListener() { @Override public void serviceChanged(ServiceEvent event) { if (event.getType() == ServiceEvent.REGISTERED) { expectedServiceRegistrations.countDown(); } } }, "(objectClass=org.infinispan.manager.EmbeddedCacheManager)"); ConfigurationAdmin configurationService = OSGiTestUtils.getService(bundleContext, ConfigurationAdmin.class); /* No pre-existing configurations are expected. */ Configuration[] configurations = configurationService.listConfigurations("(service.pid=org.infinispan.manager.embedded)"); assertNull("No configurations are expected.", configurations); /* Create new empty configurations for the service PID. */ Configuration configuration; Dictionary<String, Object> configProperties; /* First config. */ configProperties = new Hashtable<String, Object>(); configProperties.put("instanceId", "instance1"); configProperties.put("config", "org/infinispan/it/osgi/custom-config-1.xml"); configuration = configurationService.createFactoryConfiguration("org.infinispan.manager.embedded", null); configuration.update(configProperties); /* Second config. */ configProperties = new Hashtable<String, Object>(); configProperties.put("instanceId", "instance2"); configProperties.put("config", "org/infinispan/it/osgi/custom-config-2.xml"); configuration = configurationService.createFactoryConfiguration("org.infinispan.manager.embedded", null); configuration.update(configProperties); /* Third config is from the etc/ Karaf directory. */ configProperties = new Hashtable<String, Object>(); configProperties.put("instanceId", "instance3"); configProperties.put("config", "etc/custom-etc-infinispan-config.xml"); configuration = configurationService.createFactoryConfiguration("org.infinispan.manager.embedded", null); configuration.update(configProperties); /* Configuration updating and service registration are done concurrently. Await for then to complete first. */ expectedServiceRegistrations.await(10, TimeUnit.SECONDS); Collection<ServiceReference<EmbeddedCacheManager>> serviceReferences; serviceReferences = bundleContext.getServiceReferences(EmbeddedCacheManager.class, "(instanceId=instance1)"); assertEquals("Expecting the service to be registered through the mananged service factory.", 1, serviceReferences.size()); serviceReferences = bundleContext.getServiceReferences(EmbeddedCacheManager.class, "(instanceId=instance2)"); assertEquals("Expecting the service to be registered through the mananged service factory.", 1, serviceReferences.size()); serviceReferences = bundleContext.getServiceReferences(EmbeddedCacheManager.class, "(instanceId=instance3)"); assertEquals("Expecting the service to be registered through the mananged service factory.", 1, serviceReferences.size()); } }