blob: 97402600ac518ae52ab3aad1fe2049c1e36ad188 [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.aries.spifly;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Dictionary;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import org.apache.aries.mytest.MySPI;
import org.apache.aries.mytest.MySPI2;
import org.apache.aries.spifly.impl4.MySPIImpl4a;
import org.apache.aries.spifly.impl4.MySPIImpl4b;
import org.apache.aries.spifly.impl4.MySPIImpl4c;
import org.easymock.EasyMock;
import org.easymock.IAnswer;
import org.junit.Test;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceFactory;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
import org.osgi.framework.wiring.BundleRequirement;
import org.osgi.framework.wiring.BundleRevision;
import org.osgi.framework.wiring.BundleWire;
import org.osgi.framework.wiring.BundleWiring;
import aQute.bnd.header.Parameters;
public class ProviderBundleTrackerCustomizerGenericCapabilityTest {
@Test
public void testAddingRemovedBundle() throws Exception {
Bundle mediatorBundle = EasyMock.createMock(Bundle.class);
EasyMock.expect(mediatorBundle.getBundleId()).andReturn(42l).anyTimes();
EasyMock.replay(mediatorBundle);
BaseActivator activator = new BaseActivator() {
@Override
public void start(BundleContext context) throws Exception {}
};
ProviderBundleTrackerCustomizer customizer = new ProviderBundleTrackerCustomizer(activator, mediatorBundle);
@SuppressWarnings("rawtypes")
ServiceRegistration sreg = EasyMock.createMock(ServiceRegistration.class);
sreg.unregister();
EasyMock.expectLastCall();
EasyMock.replay(sreg);
BundleContext implBC = mockSPIBundleContext(sreg);
Dictionary<String, String> headers = new Hashtable<String, String>();
headers.put(SpiFlyConstants.REQUIRE_CAPABILITY, SpiFlyConstants.PROVIDER_REQUIREMENT);
headers.put(SpiFlyConstants.PROVIDE_CAPABILITY, SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE + "; " +
SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE + "=org.apache.aries.mytest.MySPI");
Bundle implBundle = mockSPIBundle(implBC, headers);
assertEquals("Precondition", 0, activator.findProviderBundles("org.apache.aries.mytest.MySPI").size());
// Call addingBundle();
@SuppressWarnings("rawtypes")
List<ServiceRegistration> registrations = customizer.addingBundle(implBundle, null);
Collection<Bundle> bundles = activator.findProviderBundles("org.apache.aries.mytest.MySPI");
assertEquals(1, bundles.size());
assertSame(implBundle, bundles.iterator().next());
// The bc.registerService() call should now have been made
EasyMock.verify(implBC);
// Call removedBundle();
customizer.removedBundle(implBundle, null, registrations);
Collection<Bundle> bundles2 = activator.findProviderBundles("org.apache.aries.mytest.MySPI");
assertEquals(0, bundles2.size());
// sreg.unregister() should have been called.
EasyMock.verify(sreg);
}
@Test
public void testCapReqHeadersInFragment() throws Exception {
Bundle mediatorBundle = EasyMock.createMock(Bundle.class);
EasyMock.expect(mediatorBundle.getBundleId()).andReturn(42l).anyTimes();
EasyMock.replay(mediatorBundle);
BaseActivator activator = new BaseActivator() {
@Override
public void start(BundleContext context) throws Exception {}
};
ProviderBundleTrackerCustomizer customizer = new ProviderBundleTrackerCustomizer(activator, mediatorBundle);
ServiceRegistration<?> sreg = EasyMock.createNiceMock(ServiceRegistration.class);
EasyMock.replay(sreg);
BundleContext implBC = mockSPIBundleContext(sreg);
Dictionary<String, String> headers = new Hashtable<String, String>();
// A typical requirement that is not for us...
headers.put(SpiFlyConstants.REQUIRE_CAPABILITY, "osgi.ee;filter:=\"(&(osgi.ee=JavaSE)(version=1.6))\"");
List<BundleWire> wires = new ArrayList<BundleWire>();
BundleWire wire = EasyMock.createMock(BundleWire.class);
Bundle fragment = EasyMock.createMock(Bundle.class);
BundleRevision frev = EasyMock.createMock(BundleRevision.class);
EasyMock.expect(frev.getBundle()).andReturn(fragment).anyTimes();
EasyMock.replay(frev);
BundleRequirement req = EasyMock.createMock(BundleRequirement.class);
EasyMock.expect(req.getRevision()).andReturn(frev).anyTimes();
EasyMock.replay(req);
EasyMock.expect(wire.getRequirement()).andReturn(req).anyTimes();
EasyMock.replay(wire);
wires.add(wire);
BundleWiring bw = EasyMock.createMock(BundleWiring.class);
EasyMock.expect(bw.getProvidedWires("osgi.wiring.host")).andReturn(wires).anyTimes();
EasyMock.replay(bw);
BundleRevision rev = EasyMock.createMock(BundleRevision.class);
EasyMock.expect(rev.getWiring()).andReturn(bw).anyTimes();
EasyMock.replay(rev);
Bundle implBundle = mockSPIBundle(implBC, headers, rev);
Dictionary<String, String> fheaders = new Hashtable<String, String>();
fheaders.put(SpiFlyConstants.REQUIRE_CAPABILITY, SpiFlyConstants.PROVIDER_REQUIREMENT);
fheaders.put(SpiFlyConstants.PROVIDE_CAPABILITY, SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE + "; " +
SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE + "=org.apache.aries.mytest.MySPI");
EasyMock.expect(fragment.getHeaders()).andReturn(fheaders).anyTimes();
EasyMock.replay(fragment);
assertEquals("Precondition", 0, activator.findProviderBundles("org.apache.aries.mytest.MySPI").size());
customizer.addingBundle(implBundle, null);
Collection<Bundle> bundles = activator.findProviderBundles("org.apache.aries.mytest.MySPI");
assertEquals(1, bundles.size());
assertSame(implBundle, bundles.iterator().next());
}
@Test
public void testCustomAttributesBundle() throws Exception {
Bundle mediatorBundle = EasyMock.createMock(Bundle.class);
EasyMock.expect(mediatorBundle.getBundleId()).andReturn(42l).anyTimes();
EasyMock.replay(mediatorBundle);
BaseActivator activator = new BaseActivator() {
@Override
public void start(BundleContext context) throws Exception {}
};
ProviderBundleTrackerCustomizer customizer = new ProviderBundleTrackerCustomizer(activator, mediatorBundle);
@SuppressWarnings("rawtypes")
ServiceRegistration sreg = EasyMock.createMock(ServiceRegistration.class);
EasyMock.replay(sreg);
BundleContext implBC = mockSPIBundleContext(sreg);
Dictionary<String, String> headers = new Hashtable<String, String>();
headers.put(SpiFlyConstants.REQUIRE_CAPABILITY, SpiFlyConstants.PROVIDER_REQUIREMENT);
headers.put(SpiFlyConstants.PROVIDE_CAPABILITY, SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE + "; " +
SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE + "=org.apache.aries.mytest.MySPI; approval=yeah; ");
Bundle implBundle = mockSPIBundle(implBC, headers);
@SuppressWarnings("rawtypes")
List<ServiceRegistration> registrations = customizer.addingBundle(implBundle, null);
assertEquals(1, registrations.size());
Collection<Bundle> bundles = activator.findProviderBundles("org.apache.aries.mytest.MySPI");
assertEquals(1, bundles.size());
assertSame(implBundle, bundles.iterator().next());
Map<String, Object> attrs = activator.getCustomBundleAttributes("org.apache.aries.mytest.MySPI", implBundle);
assertEquals(4, attrs.size());
assertEquals("yeah", attrs.get("approval"));
}
@Test
public void testAutoProviderSystemProperty() throws Exception {
Bundle mediatorBundle = EasyMock.createMock(Bundle.class);
EasyMock.expect(mediatorBundle.getBundleId()).andReturn(42l).anyTimes();
EasyMock.replay(mediatorBundle);
BaseActivator activator = new BaseActivator() {
@Override
public void start(BundleContext context) throws Exception {}
};
activator.setAutoProviderInstructions(Optional.of(new Parameters("*")));
ProviderBundleTrackerCustomizer customizer = new ProviderBundleTrackerCustomizer(activator, mediatorBundle);
@SuppressWarnings("rawtypes")
ServiceRegistration sreg = EasyMock.createMock(ServiceRegistration.class);
EasyMock.replay(sreg);
BundleContext implBC = mockSPIBundleContext(sreg);
Dictionary<String, String> headers = new Hashtable<String, String>();
Bundle implBundle = mockSPIBundle(implBC, headers);
@SuppressWarnings("rawtypes")
List<ServiceRegistration> registrations = customizer.addingBundle(implBundle, null);
assertEquals(1, registrations.size());
Collection<Bundle> bundles = activator.findProviderBundles("org.apache.aries.mytest.MySPI");
assertEquals(1, bundles.size());
assertSame(implBundle, bundles.iterator().next());
Map<String, Object> attrs = activator.getCustomBundleAttributes("org.apache.aries.mytest.MySPI", implBundle);
assertEquals(3, attrs.size());
assertNull(attrs.get("approval"));
}
@Test
public void testAutoProviderSystemPropertyPlusProperty() throws Exception {
Bundle mediatorBundle = EasyMock.createMock(Bundle.class);
EasyMock.expect(mediatorBundle.getBundleId()).andReturn(42l).anyTimes();
EasyMock.replay(mediatorBundle);
BaseActivator activator = new BaseActivator() {
@Override
public void start(BundleContext context) throws Exception {}
};
activator.setAutoProviderInstructions(Optional.of(new Parameters("*;approval=yeah")));
ProviderBundleTrackerCustomizer customizer = new ProviderBundleTrackerCustomizer(activator, mediatorBundle);
@SuppressWarnings("rawtypes")
ServiceRegistration sreg = EasyMock.createMock(ServiceRegistration.class);
EasyMock.replay(sreg);
BundleContext implBC = mockSPIBundleContext(sreg);
Dictionary<String, String> headers = new Hashtable<String, String>();
Bundle implBundle = mockSPIBundle(implBC, headers);
@SuppressWarnings("rawtypes")
List<ServiceRegistration> registrations = customizer.addingBundle(implBundle, null);
assertEquals(1, registrations.size());
Collection<Bundle> bundles = activator.findProviderBundles("org.apache.aries.mytest.MySPI");
assertEquals(1, bundles.size());
assertSame(implBundle, bundles.iterator().next());
Map<String, Object> attrs = activator.getCustomBundleAttributes("org.apache.aries.mytest.MySPI", implBundle);
assertEquals(4, attrs.size());
assertEquals("yeah", attrs.get("approval"));
}
@Test
public void testAutoProviderSystemPropertyTargetBundle() throws Exception {
Bundle mediatorBundle = EasyMock.createMock(Bundle.class);
EasyMock.expect(mediatorBundle.getBundleId()).andReturn(42l).anyTimes();
EasyMock.replay(mediatorBundle);
BaseActivator activator = new BaseActivator() {
@Override
public void start(BundleContext context) throws Exception {}
};
activator.setAutoProviderInstructions(Optional.of(new Parameters("bsn")));
ProviderBundleTrackerCustomizer customizer = new ProviderBundleTrackerCustomizer(activator, mediatorBundle);
@SuppressWarnings("rawtypes")
ServiceRegistration sreg = EasyMock.createMock(ServiceRegistration.class);
EasyMock.replay(sreg);
BundleContext implBC = mockSPIBundleContext(sreg);
Dictionary<String, String> headers = new Hashtable<String, String>();
Bundle implBundle = mockSPIBundle(implBC, headers);
@SuppressWarnings("rawtypes")
List<ServiceRegistration> registrations = customizer.addingBundle(implBundle, null);
assertEquals(1, registrations.size());
Collection<Bundle> bundles = activator.findProviderBundles("org.apache.aries.mytest.MySPI");
assertEquals(1, bundles.size());
assertSame(implBundle, bundles.iterator().next());
Map<String, Object> attrs = activator.getCustomBundleAttributes("org.apache.aries.mytest.MySPI", implBundle);
assertEquals(3, attrs.size());
}
@Test
public void testNonServiceRegistryBundle() throws Exception {
Bundle mediatorBundle = EasyMock.createMock(Bundle.class);
EasyMock.expect(mediatorBundle.getBundleId()).andReturn(42l).anyTimes();
EasyMock.replay(mediatorBundle);
BaseActivator activator = new BaseActivator() {
@Override
public void start(BundleContext context) throws Exception {}
};
ProviderBundleTrackerCustomizer customizer = new ProviderBundleTrackerCustomizer(activator, mediatorBundle);
@SuppressWarnings("rawtypes")
ServiceRegistration sreg = EasyMock.createMock(ServiceRegistration.class);
EasyMock.replay(sreg);
BundleContext implBC = mockSPIBundleContext(sreg);
Dictionary<String, String> headers = new Hashtable<String, String>();
headers.put(SpiFlyConstants.REQUIRE_CAPABILITY, SpiFlyConstants.PROVIDER_REQUIREMENT);
headers.put(SpiFlyConstants.PROVIDE_CAPABILITY, SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE + "; " +
SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE + "=org.apache.aries.mytest.MySPI; approval=yeah;" +
SpiFlyConstants.REGISTER_DIRECTIVE + "=\"\"");
Bundle implBundle = mockSPIBundle(implBC, headers);
@SuppressWarnings("rawtypes")
List<ServiceRegistration> registrations = customizer.addingBundle(implBundle, null);
assertEquals(0, registrations.size());
Collection<Bundle> bundles = activator.findProviderBundles("org.apache.aries.mytest.MySPI");
assertEquals(1, bundles.size());
assertSame(implBundle, bundles.iterator().next());
Map<String, Object> attrs = activator.getCustomBundleAttributes("org.apache.aries.mytest.MySPI", implBundle);
assertEquals(attrs.toString(), 1, attrs.size());
assertEquals("yeah", attrs.get("approval"));
}
@Test
public void testRegisterAltAttributeDatatype() throws Exception {
// TODO
}
@Test
public void testServiceSubsetSelectionAndRegistrationProperties() throws Exception {
Bundle mediatorBundle = EasyMock.createMock(Bundle.class);
EasyMock.expect(mediatorBundle.getBundleId()).andReturn(42l).anyTimes();
EasyMock.replay(mediatorBundle);
BaseActivator activator = new BaseActivator() {
@Override
public void start(BundleContext context) throws Exception {}
};
ProviderBundleTrackerCustomizer customizer = new ProviderBundleTrackerCustomizer(activator, mediatorBundle);
BundleContext implBC = mockSPIBundleContext4();
Dictionary<String, String> headers = new Hashtable<String, String>();
headers.put(SpiFlyConstants.REQUIRE_CAPABILITY, SpiFlyConstants.PROVIDER_REQUIREMENT);
headers.put(SpiFlyConstants.PROVIDE_CAPABILITY, SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE + "; " +
SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE + "=org.apache.aries.mytest.MySPI2; approval=yeah; " +
SpiFlyConstants.REGISTER_DIRECTIVE + "=\"org.apache.aries.spifly.impl4.MySPIImpl4b\"");
Bundle implBundle = mockSPIBundle4(implBC, headers);
@SuppressWarnings("rawtypes")
List<ServiceRegistration> registrations = customizer.addingBundle(implBundle, null);
assertEquals(1, registrations.size());
String[] objectClassProp = (String [])registrations.iterator().next().getReference().getProperty(Constants.OBJECTCLASS);
assertEquals(1, objectClassProp.length);
assertEquals("org.apache.aries.mytest.MySPI2", objectClassProp[0]);
assertNotNull(registrations.iterator().next().getReference().getProperty(SpiFlyConstants.SERVICELOADER_MEDIATOR_PROPERTY));
assertEquals("yeah", registrations.iterator().next().getReference().getProperty("approval"));
}
@Test
public void testProvidedSPIDirective() throws Exception {
Bundle mediatorBundle = EasyMock.createMock(Bundle.class);
EasyMock.expect(mediatorBundle.getBundleId()).andReturn(42l).anyTimes();
EasyMock.replay(mediatorBundle);
BaseActivator activator = new BaseActivator() {
@Override
public void start(BundleContext context) throws Exception {}
};
ProviderBundleTrackerCustomizer customizer = new ProviderBundleTrackerCustomizer(activator, mediatorBundle);
BundleContext implBC = mockSPIBundleContext4();
Dictionary<String, String> headers = new Hashtable<String, String>();
headers.put(SpiFlyConstants.REQUIRE_CAPABILITY, SpiFlyConstants.PROVIDER_REQUIREMENT);
headers.put(SpiFlyConstants.PROVIDE_CAPABILITY,
SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE + "; " +
SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE + "=org.apache.aries.mytest.MySPI; approval=yeah, " +
SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE + "; " +
SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE + "=org.apache.aries.mytest.MySPI2");
Bundle implBundle = mockSPIBundle4(implBC, headers);
@SuppressWarnings("rawtypes")
List<ServiceRegistration> registrations = customizer.addingBundle(implBundle, null);
assertEquals("Expected 3 registrations, one for MySPI and 2 for MySPI2", 3, registrations.size());
Set<String> expectedObjectClasses = new HashSet<String>(Arrays.asList("org.apache.aries.mytest.MySPI", "org.apache.aries.mytest.MySPI2"));
Set<String> actualObjectClasses = new HashSet<String>();
boolean foundMySPI = false;
boolean foundMySPI2 = false;
for (@SuppressWarnings("rawtypes") ServiceRegistration sr : registrations) {
List<String> objectClasses = Arrays.asList((String[]) sr.getReference().getProperty(Constants.OBJECTCLASS));
actualObjectClasses.addAll(objectClasses);
assertNotNull(sr.getReference().getProperty(SpiFlyConstants.SERVICELOADER_MEDIATOR_PROPERTY));
if (objectClasses.contains("org.apache.aries.mytest.MySPI")) {
assertEquals("yeah", sr.getReference().getProperty("approval"));
foundMySPI = true;
} else if (objectClasses.contains("org.apache.aries.mytest.MySPI2")) {
assertNull(sr.getReference().getProperty("approval"));
foundMySPI2 = true;
}
}
assertTrue(foundMySPI);
assertTrue(foundMySPI2);
assertEquals(expectedObjectClasses, actualObjectClasses);
}
@Test
public void testMultipleServiceInstancesAndTypes() throws Exception {
Bundle mediatorBundle = EasyMock.createMock(Bundle.class);
EasyMock.expect(mediatorBundle.getBundleId()).andReturn(42l).anyTimes();
EasyMock.replay(mediatorBundle);
BaseActivator activator = new BaseActivator() {
@Override
public void start(BundleContext context) throws Exception {}
};
ProviderBundleTrackerCustomizer customizer = new ProviderBundleTrackerCustomizer(activator, mediatorBundle);
BundleContext implBC = mockSPIBundleContext4();
Dictionary<String, String> headers = new Hashtable<String, String>();
headers.put(SpiFlyConstants.REQUIRE_CAPABILITY, SpiFlyConstants.PROVIDER_REQUIREMENT);
headers.put(SpiFlyConstants.PROVIDE_CAPABILITY,
SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE + "; " +
SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE + "=org.apache.aries.mytest.MySPI," +
SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE + "; " +
SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE + "=org.apache.aries.mytest.MySPI2");
Bundle implBundle = mockSPIBundle4(implBC, headers);
@SuppressWarnings("rawtypes")
List<ServiceRegistration> registrations = customizer.addingBundle(implBundle, null);
assertEquals(3, registrations.size());
boolean foundA = false, foundB = false, foundC = false;
for (@SuppressWarnings("rawtypes") ServiceRegistration sreg : registrations) {
@SuppressWarnings("rawtypes")
ServiceReference sref = sreg.getReference();
String objectClassName = ((String [])sref.getProperty(Constants.OBJECTCLASS))[0];
String serviceImplClassName = (String) sref.getProperty(SpiFlyConstants.PROVIDER_IMPLCLASS_PROPERTY);
if (MySPIImpl4a.class.getName().equals(serviceImplClassName)) {
assertEquals("org.apache.aries.mytest.MySPI", objectClassName);
@SuppressWarnings("unchecked")
MySPI svc = (MySPI) implBC.getService(sreg.getReference());
assertEquals("impl4a", svc.someMethod(""));
foundA = true;
} else if (MySPIImpl4b.class.getName().equals(serviceImplClassName)) {
assertEquals("org.apache.aries.mytest.MySPI2", objectClassName);
@SuppressWarnings("unchecked")
MySPI2 svc = (MySPI2) implBC.getService(sreg.getReference());
assertEquals("impl4b", svc.someMethod(""));
foundB = true;
} else if (MySPIImpl4c.class.getName().equals(serviceImplClassName)) {
assertEquals("org.apache.aries.mytest.MySPI2", objectClassName);
@SuppressWarnings("unchecked")
MySPI2 svc = (MySPI2) implBC.getService(sreg.getReference());
assertEquals("impl4c", svc.someMethod(""));
foundC = true;
}
}
assertTrue(foundA);
assertTrue(foundB);
assertTrue(foundC);
}
@Test
public void testNoServiceRegistration() throws Exception {
Bundle mediatorBundle = EasyMock.createMock(Bundle.class);
EasyMock.expect(mediatorBundle.getBundleId()).andReturn(42l).anyTimes();
EasyMock.replay(mediatorBundle);
BaseActivator activator = new BaseActivator() {
@Override
public void start(BundleContext context) throws Exception {}
};
ProviderBundleTrackerCustomizer customizer = new ProviderBundleTrackerCustomizer(activator, mediatorBundle);
@SuppressWarnings("rawtypes")
ServiceRegistration sreg = EasyMock.createMock(ServiceRegistration.class);
EasyMock.replay(sreg);
BundleContext implBC = mockSPIBundleContext(sreg);
Bundle implBundle = mockSPIBundle(implBC, SpiFlyConstants.PROVIDER_REQUIREMENT);
@SuppressWarnings("rawtypes")
List<ServiceRegistration> registrations = customizer.addingBundle(implBundle, null);
assertEquals(0, registrations.size());
Collection<Bundle> bundles = activator.findProviderBundles("org.apache.aries.mytest.MySPI");
assertEquals(1, bundles.size());
assertSame(implBundle, bundles.iterator().next());
}
@SuppressWarnings({ "resource", "unchecked" })
@Test
public void testAddingBundleWithBundleClassPath() throws Exception {
Bundle mediatorBundle = EasyMock.createMock(Bundle.class);
EasyMock.expect(mediatorBundle.getBundleId()).andReturn(42l).anyTimes();
EasyMock.replay(mediatorBundle);
BaseActivator activator = new BaseActivator() {
@Override
public void start(BundleContext context) throws Exception {}
};
ProviderBundleTrackerCustomizer customizer = new ProviderBundleTrackerCustomizer(activator, mediatorBundle);
BundleContext implBC = EasyMock.createMock(BundleContext.class);
EasyMock.<Object>expect(implBC.registerService(
EasyMock.eq("org.apache.aries.mytest.MySPI"),
EasyMock.isA(ServiceFactory.class),
(Dictionary<String,?>) EasyMock.anyObject())).andReturn(EasyMock.createNiceMock(ServiceRegistration.class)).times(3);
EasyMock.replay(implBC);
Bundle implBundle = EasyMock.createNiceMock(Bundle.class);
EasyMock.expect(implBundle.getBundleContext()).andReturn(implBC).anyTimes();
Dictionary<String, String> headers = new Hashtable<String, String>();
headers.put(SpiFlyConstants.REQUIRE_CAPABILITY, SpiFlyConstants.PROVIDER_REQUIREMENT);
headers.put(SpiFlyConstants.PROVIDE_CAPABILITY,
SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE + "; " +
SpiFlyConstants.SERVICELOADER_CAPABILITY_NAMESPACE + "=org.apache.aries.mytest.MySPI");
headers.put(Constants.BUNDLE_CLASSPATH, ".,non-jar.jar,embedded.jar,embedded2.jar");
EasyMock.expect(implBundle.getHeaders()).andReturn(headers).anyTimes();
URL embeddedJar = getClass().getResource("/embedded.jar");
assertNotNull("precondition", embeddedJar);
EasyMock.expect(implBundle.getResource("embedded.jar")).andReturn(embeddedJar).anyTimes();
URL embedded2Jar = getClass().getResource("/embedded2.jar");
assertNotNull("precondition", embedded2Jar);
EasyMock.expect(implBundle.getResource("embedded2.jar")).andReturn(embedded2Jar).anyTimes();
URL dir = new URL("jar:" + embeddedJar + "!/META-INF/services");
assertNotNull("precondition", dir);
EasyMock.expect(implBundle.getResource("/META-INF/services")).andReturn(dir).anyTimes();
EasyMock.expect(implBundle.findEntries((String) EasyMock.anyObject(), (String) EasyMock.anyObject(), EasyMock.anyBoolean())).
andReturn(null).anyTimes();
ClassLoader cl = new URLClassLoader(new URL [] {embeddedJar}, getClass().getClassLoader());
Class<?> clsA = cl.loadClass("org.apache.aries.spifly.impl2.MySPIImpl2a");
EasyMock.<Object>expect(implBundle.loadClass("org.apache.aries.spifly.impl2.MySPIImpl2a")).andReturn(clsA).anyTimes();
Class<?> clsB = cl.loadClass("org.apache.aries.spifly.impl2.MySPIImpl2b");
EasyMock.<Object>expect(implBundle.loadClass("org.apache.aries.spifly.impl2.MySPIImpl2b")).andReturn(clsB).anyTimes();
ClassLoader cl2 = new URLClassLoader(new URL [] {embedded2Jar}, getClass().getClassLoader());
Class<?> clsC = cl2.loadClass("org.apache.aries.spifly.impl3.MySPIImpl3");
EasyMock.<Object>expect(implBundle.loadClass("org.apache.aries.spifly.impl3.MySPIImpl3")).andReturn(clsC).anyTimes();
EasyMock.replay(implBundle);
assertEquals("Precondition", 0, activator.findProviderBundles("org.apache.aries.mytest.MySPI").size());
// Call addingBundle();
customizer.addingBundle(implBundle, null);
Collection<Bundle> bundles = activator.findProviderBundles("org.apache.aries.mytest.MySPI");
assertEquals(1, bundles.size());
assertSame(implBundle, bundles.iterator().next());
// The bc.registerService() call should now have been made
EasyMock.verify(implBC);
}
@SuppressWarnings("unchecked")
private BundleContext mockSPIBundleContext(@SuppressWarnings("rawtypes") ServiceRegistration sreg) {
BundleContext implBC = EasyMock.createMock(BundleContext.class);
EasyMock.<Object>expect(implBC.registerService(
EasyMock.eq("org.apache.aries.mytest.MySPI"),
EasyMock.isA(ServiceFactory.class),
(Dictionary<String,?>) EasyMock.anyObject())).andReturn(sreg);
EasyMock.replay(implBC);
return implBC;
}
private Bundle mockSPIBundle(BundleContext implBC, String spiProviderHeader) throws ClassNotFoundException {
Dictionary<String, String> headers = new Hashtable<String, String>();
headers.put(SpiFlyConstants.REQUIRE_CAPABILITY, spiProviderHeader);
return mockSPIBundle(implBC, headers);
}
private Bundle mockSPIBundle(BundleContext implBC, Dictionary<String, String> headers) throws ClassNotFoundException {
return mockSPIBundle(implBC, headers, null);
}
private Bundle mockSPIBundle(BundleContext implBC, Dictionary<String, String> headers, BundleRevision rev) throws ClassNotFoundException {
if (headers == null)
headers = new Hashtable<String, String>();
Bundle implBundle = EasyMock.createNiceMock(Bundle.class);
EasyMock.expect(implBundle.getBundleContext()).andReturn(implBC).anyTimes();
EasyMock.expect(implBundle.getHeaders()).andReturn(headers).anyTimes();
EasyMock.expect(implBundle.getSymbolicName()).andReturn("bsn").anyTimes();
// List the resources found at META-INF/services in the test bundle
URL dir = getClass().getResource("impl1/META-INF/services");
assertNotNull("precondition", dir);
EasyMock.expect(implBundle.getResource("/META-INF/services")).andReturn(dir).anyTimes();
URL res = getClass().getResource("impl1/META-INF/services/org.apache.aries.mytest.MySPI");
assertNotNull("precondition", res);
EasyMock.expect(implBundle.findEntries("META-INF/services", "*", false)).andReturn(
Collections.enumeration(Collections.singleton(res))).anyTimes();
Class<?> cls = getClass().getClassLoader().loadClass("org.apache.aries.spifly.impl1.MySPIImpl1");
EasyMock.<Object>expect(implBundle.loadClass("org.apache.aries.spifly.impl1.MySPIImpl1")).andReturn(cls).anyTimes();
if (rev != null)
EasyMock.expect(implBundle.adapt(BundleRevision.class)).andReturn(rev).anyTimes();
EasyMock.replay(implBundle);
return implBundle;
}
@SuppressWarnings("unchecked")
private BundleContext mockSPIBundleContext4() {
BundleContext implBC = EasyMock.createNiceMock(BundleContext.class);
implBC.registerService(EasyMock.anyString(),
EasyMock.anyObject(),
(Dictionary<String,?>)EasyMock.anyObject());
EasyMock.expectLastCall().andAnswer(new IAnswer<ServiceRegistration<Object>>() {
@Override
public ServiceRegistration<Object> answer() throws Throwable {
final String className = (String) EasyMock.getCurrentArguments()[0];
final Object serviceObject = EasyMock.getCurrentArguments()[1];
final Dictionary<String, Object> registrationProps =
(Dictionary<String, Object>) EasyMock.getCurrentArguments()[2];
return new ServiceRegistrationImpl(className, serviceObject, registrationProps);
}
}).anyTimes();
implBC.getService(EasyMock.anyObject(ServiceReference.class));
EasyMock.expectLastCall().
andAnswer(new IAnswer<Object>() {
@SuppressWarnings("rawtypes")
@Override
public Object answer() throws Throwable {
ServiceRegistrationImpl reg = (ServiceRegistrationImpl) EasyMock.getCurrentArguments()[0];
Object svc = reg.getServiceObject();
if (svc instanceof ServiceFactory) {
return ((ServiceFactory) svc).getService(null, reg);
} else {
return svc;
}
}
}).anyTimes();
EasyMock.replay(implBC);
return implBC;
}
private Bundle mockSPIBundle4(BundleContext implBC, Dictionary<String, String> headers) throws ClassNotFoundException {
Bundle implBundle = EasyMock.createNiceMock(Bundle.class);
EasyMock.expect(implBundle.getBundleContext()).andReturn(implBC).anyTimes();
EasyMock.expect(implBundle.getHeaders()).andReturn(headers).anyTimes();
// List the resources found at META-INF/services in the test bundle
URL dir = getClass().getResource("impl4/META-INF/services");
assertNotNull("precondition", dir);
EasyMock.expect(implBundle.getResource("/META-INF/services")).andReturn(dir).anyTimes();
URL res = getClass().getResource("impl4/META-INF/services/org.apache.aries.mytest.MySPI");
assertNotNull("precondition", res);
URL res2 = getClass().getResource("impl4/META-INF/services/org.apache.aries.mytest.MySPI2");
assertNotNull("precondition", res2);
EasyMock.expect(implBundle.findEntries("META-INF/services", "*", false)).andReturn(
Collections.enumeration(Arrays.asList(res, res2))).anyTimes();
Class<?> clsa = getClass().getClassLoader().loadClass("org.apache.aries.spifly.impl4.MySPIImpl4a");
EasyMock.<Object>expect(implBundle.loadClass("org.apache.aries.spifly.impl4.MySPIImpl4a")).andReturn(clsa).anyTimes();
Class<?> clsb = getClass().getClassLoader().loadClass("org.apache.aries.spifly.impl4.MySPIImpl4b");
EasyMock.<Object>expect(implBundle.loadClass("org.apache.aries.spifly.impl4.MySPIImpl4b")).andReturn(clsb).anyTimes();
Class<?> clsc = getClass().getClassLoader().loadClass("org.apache.aries.spifly.impl4.MySPIImpl4c");
EasyMock.<Object>expect(implBundle.loadClass("org.apache.aries.spifly.impl4.MySPIImpl4c")).andReturn(clsc).anyTimes();
EasyMock.replay(implBundle);
return implBundle;
}
@SuppressWarnings("rawtypes")
private static class ServiceRegistrationImpl implements ServiceRegistration<Object>, ServiceReference {
private final Object serviceObject;
private final Dictionary<String, Object> properties;
public ServiceRegistrationImpl(String className, Object serviceObject, Dictionary<String, Object> properties) {
this.serviceObject = serviceObject;
this.properties = properties;
this.properties.put(Constants.OBJECTCLASS, new String[] {className});
}
Object getServiceObject() {
return serviceObject;
}
@SuppressWarnings("unchecked")
@Override
public ServiceReference<Object> getReference() {
return this;
}
@Override
public void setProperties(Dictionary<String, ?> properties) {
throw new UnsupportedOperationException();
}
@Override
public void unregister() {
}
@Override
public Object getProperty(String key) {
return properties.get(key);
}
@Override
public String[] getPropertyKeys() {
return Collections.list(properties.keys()).toArray(new String [] {});
}
@Override
public Bundle getBundle() {
throw new UnsupportedOperationException();
}
@Override
public Bundle[] getUsingBundles() {
throw new UnsupportedOperationException();
}
@Override
public boolean isAssignableTo(Bundle bundle, String className) {
throw new UnsupportedOperationException();
}
@Override
public int compareTo(Object reference) {
throw new UnsupportedOperationException();
}
}
}