blob: b8fe6ff2724701f568515c6592c90388d12d758d [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.application.resolve.transform.cm.itest;
import static org.ops4j.pax.exam.CoreOptions.composite;
import static org.ops4j.pax.exam.CoreOptions.junitBundles;
import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
import static org.ops4j.pax.exam.CoreOptions.options;
import static org.ops4j.pax.exam.CoreOptions.systemProperty;
import static org.ops4j.pax.exam.CoreOptions.vmOption;
import static org.ops4j.pax.exam.CoreOptions.when;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import org.apache.aries.application.ApplicationMetadata;
import org.apache.aries.application.management.ResolverException;
import org.apache.aries.application.management.spi.resolve.PostResolveTransformer;
import org.apache.aries.application.modelling.DeployedBundles;
import org.apache.aries.application.modelling.ExportedBundle;
import org.apache.aries.application.modelling.ExportedPackage;
import org.apache.aries.application.modelling.ExportedService;
import org.apache.aries.application.modelling.ImportedBundle;
import org.apache.aries.application.modelling.ImportedPackage;
import org.apache.aries.application.modelling.ImportedService;
import org.apache.aries.application.modelling.ModelledResource;
import org.apache.aries.application.modelling.Provider;
import org.apache.aries.application.modelling.ResourceType;
import org.apache.aries.itest.AbstractIntegrationTest;
import org.apache.aries.itest.RichBundleContext;
import org.apache.aries.unittest.mocks.Skeleton;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.ops4j.pax.exam.Configuration;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.junit.PaxExam;
@RunWith(PaxExam.class)
public class ConfigurationPostResolverTest extends AbstractIntegrationTest {
/**
* This test validates that the transformer is correctly detecting the config admin package. Checks
* are performed to validate that an existing import package is still honored etc.
*
* @throws Exception
*/
@Test
public void validatePostResolveTransform() throws Exception {
RichBundleContext ctx = new RichBundleContext(bundleContext);
PostResolveTransformer transformer = ctx.getService(PostResolveTransformer.class);
Assert.assertNotNull("Unable to locate transformer", transformer);
/**
* Try processing deployed content that doesn't have any import for the
* org.osgi.service.cm package, the resultant imports should be unaffected.
*/
ApplicationMetadata mockApplicationMetadata = Skeleton.newMock(ApplicationMetadata.class);
MockDeployedBundles originalDeployedBundles = new MockDeployedBundles();
originalDeployedBundles.setDeployedContent(getNonConfigModelledResources());
DeployedBundles transformedDeployedBundles = transformer.postResolveProcess(mockApplicationMetadata, originalDeployedBundles);
Assert.assertNotNull("An instance should have been returned", transformedDeployedBundles);
Assert.assertEquals(originalDeployedBundles.getImportPackage(), transformedDeployedBundles.getImportPackage());
/**
* Now try processing a deployed bundles instances that has an import for the org.osgi.service.cm package in multiple
* modelled resources with an empty import package set in the mock deployed bundles instance.
*/
originalDeployedBundles = new MockDeployedBundles();
originalDeployedBundles.setDeployedContent(getConfigModelledResources());
transformedDeployedBundles = transformer.postResolveProcess(mockApplicationMetadata, originalDeployedBundles);
Assert.assertNotNull("An instance should have been returned", transformedDeployedBundles);
Assert.assertNotSame("Missing config package", originalDeployedBundles.getImportPackage(), transformedDeployedBundles.getImportPackage());
Assert.assertEquals("Missing config package", "org.osgi.service.cm;version=\"1.2.0\"", transformedDeployedBundles.getImportPackage());
/**
* Now try processing a deployed bundles instances that has an import for the org.osgi.service.cm package in multiple
* modelled resources with a populated import package set in the mock deployed bundles instance.
*/
originalDeployedBundles = new MockDeployedBundles();
originalDeployedBundles.setDeployedContent(getConfigModelledResources());
originalDeployedBundles.setImportPackage("org.foo.bar;version=\1.0.0\",org.bar.foo;version=\"1.0.0\"");
transformedDeployedBundles = transformer.postResolveProcess(mockApplicationMetadata, originalDeployedBundles);
Assert.assertNotNull("An instance should have been returned", transformedDeployedBundles);
Assert.assertNotSame("Missing config package", originalDeployedBundles.getImportPackage(), transformedDeployedBundles.getImportPackage());
Assert.assertEquals("Missing config package", "org.foo.bar;version=\1.0.0\",org.bar.foo;version=\"1.0.0\",org.osgi.service.cm;version=\"1.2.0\"", transformedDeployedBundles.getImportPackage());
}
private static Collection<ModelledResource> getNonConfigModelledResources() {
Collection<ModelledResource> modelledResources = new ArrayList<ModelledResource>();
MockModelledResource ms1 = new MockModelledResource();
ms1.setImportedPackages(Arrays.asList(new MockImportedPackage("org.foo.bar", "1.0.0"), new MockImportedPackage("org.bar.foo", "1.0.0")));
return modelledResources;
}
private static Collection<ModelledResource> getConfigModelledResources() {
Collection<ModelledResource> resources = getNonConfigModelledResources();
MockModelledResource mmr1 = new MockModelledResource();
mmr1.setImportedPackages(Arrays.asList(new MockImportedPackage("org.osgi.service.cm", "1.2.0")));
resources.add(mmr1);
MockModelledResource mmr2 = new MockModelledResource();
mmr2.setImportedPackages(Arrays.asList(new MockImportedPackage("org.osgi.service.cm", "1.2.0")));
resources.add(mmr2);
return resources;
}
public Option baseOptions() {
String localRepo = System.getProperty("maven.repo.local");
if (localRepo == null) {
localRepo = System.getProperty("org.ops4j.pax.url.mvn.localRepository");
}
return composite(
junitBundles(),
systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("INFO"),
when(localRepo != null).useOptions(vmOption("-Dorg.ops4j.pax.url.mvn.localRepository=" + localRepo)),
mavenBundle("org.ops4j.pax.logging", "pax-logging-api").versionAsInProject(),
mavenBundle("org.ops4j.pax.logging", "pax-logging-service").versionAsInProject()
);
}
/**
* Create the configuration for the PAX container
*
* @return the various required options
* @throws Exception
*/
@Configuration
public Option[] configuration() throws Exception {
return options(
baseOptions(),
mavenBundle("org.osgi", "org.osgi.compendium").versionAsInProject(),
mavenBundle("org.apache.aries.testsupport", "org.apache.aries.testsupport.unit").versionAsInProject(),
mavenBundle("org.apache.aries.blueprint", "org.apache.aries.blueprint").versionAsInProject(),
mavenBundle("org.ow2.asm", "asm-all").versionAsInProject(),
mavenBundle("org.apache.aries.proxy", "org.apache.aries.proxy").versionAsInProject(),
mavenBundle("org.apache.aries", "org.apache.aries.util").versionAsInProject(),
mavenBundle("org.osgi", "org.osgi.compendium").versionAsInProject(),
mavenBundle("org.apache.aries.application", "org.apache.aries.application.api").versionAsInProject(),
mavenBundle("org.apache.aries.application", "org.apache.aries.application.resolve.transform.cm").versionAsInProject()
);
}
private static class MockDeployedBundles implements DeployedBundles {
private Collection<ModelledResource> deployedContent;
private String importPackage;
public void addBundle(ModelledResource arg0) {
}
public String getContent() {
return null;
}
public Collection<ModelledResource> getDeployedContent() {
return deployedContent;
}
public void setDeployedContent(Collection<ModelledResource> deployedContent) {
this.deployedContent = deployedContent;
}
public String getDeployedImportService() {
return null;
}
public Collection<ModelledResource> getDeployedProvisionBundle() {
return null;
}
public Map<String, String> getExtraHeaders() {
return null;
}
public void setImportPackage(String importPackage) {
this.importPackage = importPackage;
}
/**
* Used to reflect external packages required
*/
public String getImportPackage() throws ResolverException {
return importPackage;
}
public String getProvisionBundle() {
return null;
}
public Collection<ModelledResource> getRequiredUseBundle() throws ResolverException {
return null;
}
public String getUseBundle() {
return null;
}
}
private static class MockModelledResource implements ModelledResource {
private Collection<? extends ImportedPackage> importedPackages;
public String toDeploymentString() {
return null;
}
public ExportedBundle getExportedBundle() {
return null;
}
public Collection<? extends ExportedPackage> getExportedPackages() {
return null;
}
public Collection<? extends ExportedService> getExportedServices() {
return null;
}
public ImportedBundle getFragmentHost() {
return null;
}
public Collection<? extends ImportedPackage> getImportedPackages() {
return importedPackages;
}
public void setImportedPackages(Collection<? extends ImportedPackage> importedPackages) {
this.importedPackages = importedPackages;
}
public Collection<? extends ImportedService> getImportedServices() {
return null;
}
public String getLocation() {
return null;
}
public Collection<? extends ImportedBundle> getRequiredBundles() {
return null;
}
public String getSymbolicName() {
return null;
}
public ResourceType getType() {
return null;
}
public String getVersion() {
return null;
}
public boolean isFragment() {
return false;
}
}
private static class MockImportedPackage implements ImportedPackage {
private String packageName;
private String versionRange;
public MockImportedPackage(String packageName, String versionRange) {
this.packageName = packageName;
this.versionRange = versionRange;
}
public String getAttributeFilter() {
return null;
}
public ResourceType getType() {
return null;
}
public boolean isMultiple() {
return false;
}
public boolean isOptional() {
return false;
}
public boolean isSatisfied(Provider provider) {
return false;
}
public String toDeploymentString() {
return packageName + ";version=\"" + versionRange + "\"";
}
public Map<String, String> getAttributes() {
return null;
}
public String getPackageName() {
return packageName;
}
public String getVersionRange() {
return versionRange;
}
}
}