/* * Licensed 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.subsystem.core.internal; import static org.junit.Assert.assertEquals; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; import org.apache.aries.subsystem.core.internal.sub.Creator; import org.easymock.EasyMock; import org.junit.Test; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.osgi.resource.Capability; import org.osgi.resource.Requirement; import org.osgi.resource.Resource; import org.osgi.service.repository.Repository; public class RepositoryServiceRepositoryTest { @Test public void testFindProviders() throws Exception { BundleContext bc = EasyMock.createNiceMock(BundleContext.class); RepositoryServiceRepository rsr = new RepositoryServiceRepository(bc); @SuppressWarnings("unchecked") ServiceReference<Object> sr = EasyMock.createMock(ServiceReference.class); @SuppressWarnings("unchecked") ServiceReference<Object> sr2 = EasyMock.createMock(ServiceReference.class); @SuppressWarnings("unchecked") ServiceReference<Object> sr3 = EasyMock.createMock(ServiceReference.class); EasyMock.expect(bc.getAllServiceReferences("org.osgi.service.repository.Repository", null)). andReturn(new ServiceReference[] {sr, sr2, sr3}).anyTimes(); TestRepository tr = new TestRepository(); EasyMock.expect(bc.getService(sr)).andReturn(tr).anyTimes(); ToastRepository tr2 = new ToastRepository(); EasyMock.expect(bc.getService(sr2)).andReturn(tr2).anyTimes(); Repository tr3 = Creator.create(); EasyMock.expect(bc.getService(sr3)).andReturn(tr3).anyTimes(); EasyMock.replay(bc); Map<String, String> dirs = Collections.singletonMap("filter", "(org.foo=bar)"); Requirement req = new TestRequirement("org.foo", dirs); Collection<Capability> res = rsr.findProviders(req); assertEquals(1, res.size()); Capability cap = res.iterator().next(); assertEquals("org.foo", cap.getNamespace()); assertEquals(1, cap.getAttributes().size()); assertEquals("bar", cap.getAttributes().get("org.foo")); Map<String, String> dirs2 = Collections.singletonMap("filter", "(org.foo=b)"); Requirement req2 = new TestRequirement("poing", dirs2); Collection<Capability> res2 = rsr.findProviders(req2); assertEquals(1, res2.size()); Capability cap2 = res2.iterator().next(); assertEquals("poing", cap2.getNamespace()); assertEquals(1, cap2.getAttributes().size()); assertEquals("b", cap2.getAttributes().get("org.foo")); Map<String, String> dirs3 = Collections.singletonMap("filter", "(x=y)"); Requirement req3 = new TestRequirement("ns1", dirs3); Collection<Capability> res3 = rsr.findProviders(req3); assertEquals(1, res3.size()); Capability cap3 = res3.iterator().next(); assertEquals("ns1", cap3.getNamespace()); assertEquals(1, cap3.getAttributes().size()); assertEquals("y", cap3.getAttributes().get("x")); } private static class TestRequirement implements Requirement { private final String namespace; private final Map<String, String> directives; private TestRequirement(String ns, Map<String, String> dirs) { namespace = ns; directives = dirs; } @Override public String getNamespace() { return namespace; } @Override public Map<String, Object> getAttributes() { return Collections.emptyMap(); } @Override public Map<String, String> getDirectives() { return directives; } @Override public Resource getResource() { return null; } } private static class TestRepository implements Repository { @Override public Map<Requirement, Collection<Capability>> findProviders(Collection<? extends Requirement> requirements) { Map<Requirement, Collection<Capability>> res = new HashMap<Requirement, Collection<Capability>>(); for (Requirement req : requirements) { if (req.getNamespace().equals("org.foo") && req.getDirectives().equals(Collections.singletonMap("filter", "(org.foo=bar)"))) { TestCapability cap = new TestCapability("org.foo", Collections.<String, Object>singletonMap("org.foo", "bar")); Collection<Capability> caps = Collections.<Capability>singleton(cap); res.put(req, caps); } } return res; } } private static class ToastRepository extends TestRepository { @Override public Map<Requirement, Collection<Capability>> findProviders(Collection<? extends Requirement> requirements) { for (Requirement req : requirements) { if (req.getNamespace().equals("poing") && req.getDirectives().equals(Collections.singletonMap("filter", "(org.foo=b)"))) { TestCapability cap = new TestCapability("poing", Collections.<String, Object>singletonMap("org.foo", "b")); Collection<Capability> caps = Collections.<Capability>singleton(cap); return Collections.singletonMap(req, caps); } } return Collections.emptyMap(); } } }