/* * #%L * Nazgul Project: nazgul-core-osgi-test * %% * Copyright (C) 2010 - 2017 jGuru Europe AB * %% * Licensed under the jGuru Europe AB license (the "License"), based * on Apache License, Version 2.0; you may not use this file except * in compliance with the License. * * You may obtain a copy of the License at * * http://www.jguru.se/licenses/jguruCorporateSourceLicense-2.0.txt * * 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. * #L% * */ package se.jguru.nazgul.test.osgi; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.osgi.framework.Bundle; import org.osgi.framework.BundleEvent; import org.osgi.framework.BundleException; import org.osgi.framework.Filter; import org.osgi.framework.FrameworkEvent; import org.osgi.framework.FrameworkListener; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceEvent; import org.osgi.framework.ServiceReference; import org.osgi.framework.ServiceRegistration; import se.jguru.nazgul.core.algorithms.event.api.producer.EventConsumerCallback; import se.jguru.nazgul.test.osgi.event.BundleListenerAdapter; import se.jguru.nazgul.test.osgi.event.ServiceListenerAdapter; import java.util.Arrays; import java.util.Date; import java.util.Hashtable; import java.util.List; /** * @author <a href="mailto:lj@jguru.se">Lennart Jörelid</a>, jGuru Europe AB */ public class MockBundleContextTest { // Shared state private final String osgiVersion = "2.3.4.FooBar"; private MockBundle bundle; private MockBundleContext unitUnderTest; @Before public void setupSharedState() { bundle = new MockBundle(osgiVersion); unitUnderTest = (MockBundleContext) bundle.getBundleContext(); } @Test public void validateEventPumpOnBundleStartAndStopped() throws Exception { // Assemble final TracingBundleListener eventListener = new TracingBundleListener(2, "testId"); unitUnderTest.addBundleListener(eventListener); // Act bundle.start(); bundle.stop(); eventListener.onEventLatch.await(); // Assert final List<BundleEvent> callTrace = eventListener.callTrace; Assert.assertEquals(2, callTrace.size()); Assert.assertEquals(BundleEvent.STARTED, callTrace.get(0).getType()); Assert.assertEquals(BundleEvent.STOPPED, callTrace.get(1).getType()); } @Test public void validateBundleListenerLifecycle() { // Assemble final TracingBundleListener listener1 = new TracingBundleListener("id1"); final TracingBundleListener listener2 = new TracingBundleListener("id2"); // Act unitUnderTest.addBundleListener(listener1); fireBundleEvent(BundleEvent.RESOLVED); unitUnderTest.addBundleListener(listener2); fireBundleEvent(BundleEvent.STARTED); unitUnderTest.removeBundleListener(listener1); fireBundleEvent(BundleEvent.STOPPING); unitUnderTest.removeBundleListener(listener2); fireBundleEvent(BundleEvent.STOPPED); // Assert final List<BundleEvent> callTrace1 = listener1.callTrace; final List<BundleEvent> callTrace2 = listener2.callTrace; Assert.assertEquals(2, callTrace1.size()); Assert.assertEquals(2, callTrace2.size()); Assert.assertEquals(BundleEvent.RESOLVED, callTrace1.get(0).getType()); Assert.assertEquals(BundleEvent.STARTED, callTrace1.get(1).getType()); Assert.assertEquals(BundleEvent.STARTED, callTrace2.get(0).getType()); Assert.assertEquals(BundleEvent.STOPPING, callTrace2.get(1).getType()); } @Test public void validateAcquiringBundles() { // Assemble final long bundleId = bundle.getBundleId(); // Act final Bundle result = unitUnderTest.getBundle(); final Bundle result2 = unitUnderTest.getBundle(bundleId); final Bundle result3 = unitUnderTest.getBundle("fooBar"); final Bundle[] result4 = unitUnderTest.getBundles(); // Assert Assert.assertSame(bundle, result); Assert.assertSame(bundle, result2); Assert.assertSame(bundle, result3); Assert.assertEquals(1, result4.length); Assert.assertSame(bundle, result4[0]); Assert.assertNull(unitUnderTest.getBundle(-24)); } @Test public void validateInstallingBundle() { // Assemble final MockBundle bundle = new MockBundle("2.75"); // Act final Bundle result = unitUnderTest.installBundle(bundle); final Bundle result2 = unitUnderTest.getBundle(bundle.getBundleId()); final Bundle[] result3 = unitUnderTest.getBundles(); // Assert Assert.assertSame(bundle, result); Assert.assertEquals(bundle, result2); Assert.assertEquals(2, result3.length); } @Test public void validateFilterCreationWithCorrectSyntax() throws InvalidSyntaxException { // Assemble final String filterDefinition = "(objectClass=org.osgi.service.blueprint.container.BlueprintContainer)"; // Act final Filter result = unitUnderTest.createFilter(filterDefinition); // Assert Assert.assertNotNull(result); } @Test(expected = InvalidSyntaxException.class) public void validateExceptionOnIncorrectLDAPFilterSyntax() throws InvalidSyntaxException { // Act & Assert unitUnderTest.createFilter("()))InvalidSyntax"); } @Test public void validateServiceListenerLifecycle() { // Assemble final TracingServiceListener listener1 = new TracingServiceListener("id1"); final TracingServiceListener listener2 = new TracingServiceListener("id2"); final MockBundle mockBundle1 = new MockBundle("11.22.33"); final MockBundle mockBundle2 = new MockBundle("4.52"); final MockServiceReference serviceReference1 = new MockServiceReference(mockBundle1, String.class.getName()); final MockServiceReference serviceReference2 = new MockServiceReference(mockBundle2, Date.class.getName()); // Act unitUnderTest.addServiceListener(listener1); fireServiceEvent(ServiceEvent.REGISTERED, serviceReference1); unitUnderTest.addServiceListener(listener2); fireServiceEvent(ServiceEvent.MODIFIED, serviceReference1); fireServiceEvent(ServiceEvent.MODIFIED, serviceReference2); unitUnderTest.removeServiceListener(listener2); fireServiceEvent(ServiceEvent.UNREGISTERING, serviceReference2); unitUnderTest.removeServiceListener(listener1); fireServiceEvent(ServiceEvent.UNREGISTERING, serviceReference1); // Assert final List<ServiceEvent> callTrace1 = listener1.callTrace; final List<ServiceEvent> callTrace2 = listener2.callTrace; Assert.assertEquals(4, callTrace1.size()); Assert.assertEquals(2, callTrace2.size()); final List<Integer> serviceEventTrace1 = Arrays.asList(ServiceEvent.REGISTERED, ServiceEvent.MODIFIED, ServiceEvent.MODIFIED, ServiceEvent.UNREGISTERING); for (int i = 0; i < serviceEventTrace1.size(); i++) { Assert.assertEquals((int) serviceEventTrace1.get(i), callTrace1.get(i).getType()); } Assert.assertSame(serviceReference1, callTrace1.get(1).getServiceReference()); Assert.assertSame(serviceReference2, callTrace1.get(2).getServiceReference()); Assert.assertEquals(ServiceEvent.MODIFIED, callTrace2.get(0).getType()); Assert.assertEquals(ServiceEvent.MODIFIED, callTrace2.get(1).getType()); Assert.assertSame(serviceReference1, callTrace2.get(0).getServiceReference()); Assert.assertSame(serviceReference2, callTrace2.get(1).getServiceReference()); } @Test public void validateTypedServiceRegistration() { // Assemble final Date service = new Date(); // Act final ServiceRegistration<Date> result = unitUnderTest.registerService( Date.class, service, new Hashtable<String, Object>()); final ServiceReference<Date> reference = result.getReference(); // Assert Assert.assertNotNull(reference); } @Test public void validateServiceRegistrationLifecycle() throws InvalidSyntaxException { // Assemble final TracingServiceListener listener = new TracingServiceListener("testListener"); final Date service = new Date(); final Hashtable<String, ?> registrationProperties = new Hashtable<String, Object>(); // Act #1 unitUnderTest.addServiceListener(listener); final ServiceRegistration<?> result = unitUnderTest.registerService( service.getClass().getName(), service, registrationProperties); final ServiceReference<?> serviceReference = result.getReference(); final ServiceReference<?>[] dateRefs = unitUnderTest.getServiceReferences(Date.class.getName(), null); final ServiceReference<?>[] serviceRefs = unitUnderTest.getServiceReferences((String) null, null); final ServiceReference<?>[] allRefs = unitUnderTest.getAllServiceReferences(null, null); // Assert #1 Assert.assertNotNull(result); Assert.assertNotNull(serviceReference); Assert.assertEquals(1, dateRefs.length); Assert.assertSame(serviceReference, dateRefs[0]); Assert.assertEquals(1, serviceRefs.length); Assert.assertSame(serviceReference, serviceRefs[0]); Assert.assertEquals(1, allRefs.length); Assert.assertSame(serviceReference, allRefs[0]); Assert.assertSame(serviceReference, unitUnderTest.getServiceReference(Date.class)); final List<ServiceEvent> callTrace = listener.callTrace; Assert.assertEquals(1, callTrace.size()); ServiceEvent serviceEvent = callTrace.get(0); Assert.assertSame(serviceReference, serviceEvent.getServiceReference()); Assert.assertSame(serviceReference, serviceEvent.getSource()); Assert.assertEquals(ServiceEvent.REGISTERED, serviceEvent.getType()); // Act #2 unitUnderTest.unregister(serviceReference); // Assert #2 Assert.assertEquals(2, callTrace.size()); serviceEvent = callTrace.get(1); Assert.assertSame(serviceReference, serviceEvent.getServiceReference()); Assert.assertEquals(ServiceEvent.UNREGISTERING, serviceEvent.getType()); } @Test(expected = UnsupportedOperationException.class) public void validateInstallBundleFromStreamNotImplemented() throws BundleException { // Act & Assert unitUnderTest.installBundle("irrelevant", null); } @Test(expected = UnsupportedOperationException.class) public void validateInstallBundleFromURLNotImplemented() throws BundleException { // Act & Assert unitUnderTest.installBundle("irrelevant"); } @Test(expected = UnsupportedOperationException.class) public void validateGenericGetServiceReferenceNotImplemented() throws InvalidSyntaxException { // Act & Assert unitUnderTest.getServiceReferences(Date.class, null); } @Test(expected = UnsupportedOperationException.class) public void validateAddingFrameworkListenerNotImplemented() throws BundleException { // Act & Assert unitUnderTest.addFrameworkListener(new FrameworkListener() { @Override public void frameworkEvent(FrameworkEvent event) { // Do nothing } }); } @Test(expected = UnsupportedOperationException.class) public void validateRemovingFrameworkListenerNotImplemented() throws BundleException { // Act & Assert unitUnderTest.removeFrameworkListener(new FrameworkListener() { @Override public void frameworkEvent(FrameworkEvent event) { // Do nothing } }); } // // Private helpers // private void fireBundleEvent(int bundleEventType) { final BundleEvent toFire = new BundleEvent(bundleEventType, bundle, bundle); unitUnderTest.fireBundleEvent(new EventConsumerCallback<BundleListenerAdapter>() { @Override public void onEvent(BundleListenerAdapter eventConsumer) { eventConsumer.bundleChanged(toFire); } }); } private void fireServiceEvent(int serviceEventType, final ServiceReference reference) { final ServiceEvent toFire = new ServiceEvent(serviceEventType, reference); unitUnderTest.fireServiceEvent(new EventConsumerCallback<ServiceListenerAdapter>() { @Override public void onEvent(ServiceListenerAdapter eventConsumer) { eventConsumer.serviceChanged(toFire); } }); } }