/* * 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.felix.bundlerepository.impl; import java.io.InputStream; import java.net.URL; import java.util.Collections; import java.util.Hashtable; import junit.framework.TestCase; import org.apache.felix.bundlerepository.*; import org.apache.felix.utils.filter.FilterImpl; import org.apache.felix.utils.log.Logger; import org.easymock.Capture; import org.easymock.EasyMock; import org.easymock.IAnswer; import org.easymock.internal.matchers.Captures; import org.osgi.framework.*; import org.osgi.framework.wiring.BundleRevision; import org.osgi.resource.Capability; public class ResolverImplTest extends TestCase { public void testReferral1() throws Exception { URL url = getClass().getResource("/repo_for_resolvertest.xml"); RepositoryAdminImpl repoAdmin = createRepositoryAdmin(); RepositoryImpl repo = (RepositoryImpl) repoAdmin.addRepository(url); Resolver resolver = repoAdmin.resolver(); Resource[] discoverResources = repoAdmin.discoverResources("(symbolicname=org.apache.felix.test*)"); assertNotNull(discoverResources); assertEquals(1, discoverResources.length); resolver.add(discoverResources[0]); assertTrue(resolver.resolve()); } public void testSpec() throws Exception { URL url = getClass().getResource("/spec_repository.xml"); RepositoryAdminImpl repoAdmin = createRepositoryAdmin(); repoAdmin.addRepository(url); Resolver resolver = repoAdmin.resolver(); RequirementImpl requirement = new RequirementImpl("foo"); requirement.setFilter("(bar=toast)"); Requirement[] requirements = { requirement }; Resource[] discoverResources = repoAdmin.discoverResources(requirements); assertNotNull(discoverResources); assertEquals(1, discoverResources.length); resolver.add(discoverResources[0]); assertTrue("Resolver could not resolve", resolver.resolve()); } public void testSpec2() throws Exception { URL url = getClass().getResource("/spec_repository.xml"); RepositoryAdminImpl repoAdmin = createRepositoryAdmin(); repoAdmin.addRepository(url); Resolver resolver = repoAdmin.resolver(); // Create a Local Resource with an extender capability CapabilityImpl capability = new CapabilityImpl("osgi.extender"); capability.addProperty("osgi.extender", "osgi.component"); capability.addProperty("version", "Version", "1.3"); org.apache.felix.bundlerepository.Capability[] capabilities = { capability }; Resource resource = EasyMock.createMock(Resource.class); EasyMock.expect(resource.getSymbolicName()).andReturn("com.test.bundleA").anyTimes(); EasyMock.expect(resource.getRequirements()).andReturn(null).anyTimes(); EasyMock.expect(resource.getCapabilities()).andReturn(capabilities).anyTimes(); EasyMock.expect(resource.getURI()).andReturn("http://test.com").anyTimes(); EasyMock.expect(resource.isLocal()).andReturn(true).anyTimes(); // Create a Local Resource with a service capability CapabilityImpl capability2 = new CapabilityImpl("service"); capability2.addProperty("objectClass", "org.some.other.interface"); capability2.addProperty("effective", "active"); org.apache.felix.bundlerepository.Capability[] capabilities2 = { capability2 }; Resource resource2 = EasyMock.createMock(Resource.class); EasyMock.expect(resource2.getSymbolicName()).andReturn("com.test.bundleB").anyTimes(); EasyMock.expect(resource2.getRequirements()).andReturn(null).anyTimes(); EasyMock.expect(resource2.getCapabilities()).andReturn(capabilities2).anyTimes(); EasyMock.expect(resource2.getURI()).andReturn("http://test2.com").anyTimes(); EasyMock.expect(resource2.isLocal()).andReturn(true).anyTimes(); EasyMock.replay(resource, resource2); resolver.add(resource); resolver.add(resource2); // Set the requirements to get the bundle RequirementImpl requirement = new RequirementImpl("foo"); requirement.setFilter("(bar=bread)"); Requirement[] requirements = { requirement }; Resource[] discoverResources = repoAdmin.discoverResources(requirements); assertNotNull(discoverResources); assertEquals(1, discoverResources.length); resolver.add(discoverResources[0]); assertTrue("Resolver could not resolve", resolver.resolve()); } public void testSpecBundleNamespace() throws Exception { URL url = getClass().getResource("/spec_repository.xml"); RepositoryAdminImpl repoAdmin = createRepositoryAdmin(); RepositoryImpl repo = (RepositoryImpl) repoAdmin.addRepository(url); Resolver resolver = repoAdmin.resolver(); Resource[] discoverResources = repoAdmin.discoverResources("(symbolicname=org.apache.felix.bundlerepository.test_file_6*)"); assertNotNull(discoverResources); assertEquals(1, discoverResources.length); resolver.add(discoverResources[0]); assertTrue(resolver.resolve()); } public void testMatchingReq() throws Exception { RepositoryAdminImpl repoAdmin = createRepositoryAdmin(); repoAdmin.addRepository(getClass().getResource("/repo_for_resolvertest.xml")); Resource[] res = repoAdmin.discoverResources( new Requirement[] { repoAdmin.getHelper().requirement( "package", "(package=org.apache.felix.test.osgi)") }); assertNotNull(res); assertEquals(1, res.length); } public void testResolveReq() throws Exception { RepositoryAdminImpl repoAdmin = createRepositoryAdmin(); repoAdmin.addRepository(getClass().getResource("/repo_for_resolvertest.xml")); Resolver resolver = repoAdmin.resolver(); resolver.add(repoAdmin.getHelper().requirement("package", "(package=org.apache.felix.test.osgi)")); assertTrue(resolver.resolve()); } public void testResolveInterrupt() throws Exception { RepositoryAdminImpl repoAdmin = createRepositoryAdmin(); repoAdmin.addRepository(getClass().getResource("/repo_for_resolvertest.xml")); Resolver resolver = repoAdmin.resolver(); resolver.add(repoAdmin.getHelper().requirement("package", "(package=org.apache.felix.test.osgi)")); Thread.currentThread().interrupt(); try { resolver.resolve(); fail("An excepiton should have been thrown"); } catch (org.apache.felix.bundlerepository.InterruptedResolutionException e) { // ok } } public void testOptionalResolution() throws Exception { RepositoryAdminImpl repoAdmin = createRepositoryAdmin(); repoAdmin.addRepository(getClass().getResource("/repo_for_optional_resources.xml")); Resolver resolver = repoAdmin.resolver(); resolver.add(repoAdmin.getHelper().requirement("bundle", "(symbolicname=res1)")); assertTrue(resolver.resolve()); assertEquals(1, resolver.getRequiredResources().length); assertEquals(2, resolver.getOptionalResources().length); } public void testMandatoryPackages() throws Exception { RepositoryAdminImpl repoAdmin = createRepositoryAdmin(); repoAdmin.addRepository(getClass().getResource("/repo_for_mandatory.xml")); Resolver resolver = repoAdmin.resolver(); resolver.add(repoAdmin.getHelper().requirement("bundle", "(symbolicname=res2)")); assertFalse(resolver.resolve()); resolver = repoAdmin.resolver(); resolver.add(repoAdmin.getHelper().requirement("bundle", "(symbolicname=res3)")); assertTrue(resolver.resolve()); resolver = repoAdmin.resolver(); resolver.add(repoAdmin.getHelper().requirement("bundle", "(symbolicname=res4)")); assertFalse(resolver.resolve()); } public void testFindUpdatableLocalResource() throws Exception { LocalResource resource = EasyMock.createMock(LocalResource.class); EasyMock.expect(resource.getSymbolicName()).andReturn("com.test.bundleA").anyTimes(); EasyMock.expect(resource.getRequirements()).andReturn(null).anyTimes(); EasyMock.expect(resource.getCapabilities()).andReturn(null).anyTimes(); EasyMock.expect(resource.getURI()).andReturn("http://test.com").anyTimes(); EasyMock.expect(resource.isLocal()).andReturn(true).anyTimes(); Repository localRepo = EasyMock.createMock(Repository.class); Repository[] localRepos = { localRepo }; final LocalResource[] localResources = { resource }; EasyMock.expect(localRepo.getResources()).andReturn(localResources).anyTimes(); EasyMock.expect(localRepo.getURI()).andReturn(Repository.LOCAL).anyTimes(); EasyMock.expect(localRepo.getLastModified()).andReturn(System.currentTimeMillis()).anyTimes(); BundleContext bundleContext = EasyMock.createMock(BundleContext.class); EasyMock.replay(resource, localRepo); ResolverImpl resolver = new ResolverImpl(bundleContext, localRepos, new Logger(bundleContext)) { @Override public LocalResource[] getLocalResources() { return localResources; } }; resolver.add(resource); boolean exceptionThrown = false; try { resolver.resolve(); resolver.deploy(Resolver.START); } catch (Exception e) { e.printStackTrace(); exceptionThrown = true; } assertFalse(exceptionThrown); } public static void main(String[] args) throws Exception { new ResolverImplTest().testReferral1(); } private RepositoryAdminImpl createRepositoryAdmin() throws Exception { BundleContext bundleContext = EasyMock.createMock(BundleContext.class); Bundle systemBundle = EasyMock.createMock(Bundle.class); BundleRevision systemBundleRevision = EasyMock.createMock(BundleRevision.class); Activator.setContext(bundleContext); EasyMock.expect(bundleContext.getProperty(RepositoryAdminImpl.REPOSITORY_URL_PROP)) .andReturn(getClass().getResource("/referred.xml").toExternalForm()); EasyMock.expect(bundleContext.getProperty((String) EasyMock.anyObject())).andReturn(null).anyTimes(); EasyMock.expect(bundleContext.getBundle(0)).andReturn(systemBundle); EasyMock.expect(bundleContext.installBundle((String) EasyMock.anyObject(), (InputStream) EasyMock.anyObject())).andReturn(systemBundle); EasyMock.expect(systemBundle.getHeaders()).andReturn(new Hashtable()).anyTimes(); systemBundle.start(); EasyMock.expectLastCall().anyTimes(); EasyMock.expect(systemBundle.getRegisteredServices()).andReturn(null); EasyMock.expect(new Long(systemBundle.getBundleId())).andReturn(new Long(0)).anyTimes(); EasyMock.expect(systemBundle.getBundleContext()).andReturn(bundleContext); EasyMock.expect(systemBundleRevision.getCapabilities(null)).andReturn(Collections.<Capability>emptyList()); EasyMock.expect(systemBundle.adapt(BundleRevision.class)).andReturn(systemBundleRevision); bundleContext.addBundleListener((BundleListener) EasyMock.anyObject()); bundleContext.addServiceListener((ServiceListener) EasyMock.anyObject()); EasyMock.expect(bundleContext.getBundles()).andReturn(new Bundle[] { systemBundle }); final Capture c = new Capture(); EasyMock.expect(bundleContext.createFilter((String) capture(c))).andAnswer(new IAnswer() { public Object answer() throws Throwable { return FilterImpl.newInstance((String) c.getValue()); } }).anyTimes(); EasyMock.replay(new Object[] { bundleContext, systemBundle, systemBundleRevision }); RepositoryAdminImpl repoAdmin = new RepositoryAdminImpl(bundleContext, new Logger(bundleContext)); // force initialization && remove all initial repositories Repository[] repos = repoAdmin.listRepositories(); for (int i = 0; repos != null && i < repos.length; i++) { repoAdmin.removeRepository(repos[i].getURI()); } return repoAdmin; } static Object capture(Capture capture) { EasyMock.reportMatcher(new Captures(capture)); return null; } }