blob: 93e5b95645111337ab602cdb828534477225db58 [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.ivy.osgi.obr;
import java.io.File;
import java.io.FileInputStream;
import java.text.ParseException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.jar.JarInputStream;
import java.util.jar.Manifest;
import org.apache.ivy.Ivy;
import org.apache.ivy.core.cache.RepositoryCacheManager;
import org.apache.ivy.core.module.descriptor.Artifact;
import org.apache.ivy.core.module.descriptor.DefaultDependencyDescriptor;
import org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor;
import org.apache.ivy.core.module.id.ModuleRevisionId;
import org.apache.ivy.core.report.ArtifactDownloadReport;
import org.apache.ivy.core.report.DownloadReport;
import org.apache.ivy.core.report.DownloadStatus;
import org.apache.ivy.core.report.ResolveReport;
import org.apache.ivy.core.resolve.DownloadOptions;
import org.apache.ivy.core.resolve.ResolveData;
import org.apache.ivy.core.resolve.ResolveOptions;
import org.apache.ivy.core.resolve.ResolvedModuleRevision;
import org.apache.ivy.core.settings.IvySettings;
import org.apache.ivy.osgi.core.BundleArtifact;
import org.apache.ivy.osgi.core.BundleInfo;
import org.apache.ivy.osgi.core.BundleInfoAdapter;
import org.apache.ivy.osgi.core.ExecutionEnvironmentProfileProvider;
import org.apache.ivy.osgi.core.ManifestParser;
import org.apache.ivy.osgi.core.OSGiManifestParser;
import org.apache.ivy.osgi.repo.AbstractOSGiResolver.RequirementStrategy;
import org.apache.ivy.plugins.resolver.DependencyResolver;
import org.apache.ivy.plugins.resolver.DualResolver;
import org.apache.ivy.plugins.resolver.FileSystemResolver;
import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
public class OBRResolverTest extends TestCase {
private static final ModuleRevisionId MRID_TEST_BUNDLE = ModuleRevisionId.newInstance(
BundleInfo.BUNDLE_TYPE, "org.apache.ivy.osgi.testbundle", "1.2.3");
private static final ModuleRevisionId MRID_TEST_BUNDLE_IMPORTING = ModuleRevisionId
.newInstance(BundleInfo.BUNDLE_TYPE, "org.apache.ivy.osgi.testbundle.importing",
"3.2.1");
private static final ModuleRevisionId MRID_TEST_BUNDLE_IMPORTING_VERSION = ModuleRevisionId
.newInstance(BundleInfo.BUNDLE_TYPE,
"org.apache.ivy.osgi.testbundle.importing.version", "3.2.1");
private static final ModuleRevisionId MRID_TEST_BUNDLE_IMPORTING_OPTIONAL = ModuleRevisionId
.newInstance(BundleInfo.BUNDLE_TYPE,
"org.apache.ivy.osgi.testbundle.importing.optional", "3.2.1");
private static final ModuleRevisionId MRID_TEST_BUNDLE_USE = ModuleRevisionId.newInstance(
BundleInfo.BUNDLE_TYPE, "org.apache.ivy.osgi.testbundle.use", "2.2.2");
private static final ModuleRevisionId MRID_TEST_BUNDLE_EXPORTING_AMBIGUITY = ModuleRevisionId
.newInstance(BundleInfo.BUNDLE_TYPE,
"org.apache.ivy.osgi.testbundle.exporting.ambiguity", "3.3.3");
private static final ModuleRevisionId MRID_TEST_BUNDLE_IMPORTING_JREPACKAGE = ModuleRevisionId
.newInstance(BundleInfo.BUNDLE_TYPE,
"org.apache.ivy.osgi.testbundle.importing.jrepackage", "1.2.3");
private IvySettings settings;
private File cache;
private ResolveData data;
private Ivy ivy;
private OBRResolver bundleResolver;
private OBRResolver bundleUrlResolver;
private DualResolver dualResolver;
private ExecutionEnvironmentProfileProvider profileProvider = ExecutionEnvironmentProfileProvider
.getInstance();
public void setUp() throws Exception {
settings = new IvySettings();
bundleResolver = new OBRResolver();
bundleResolver.setRepoXmlFile(new File("test/test-repo/bundlerepo/repo.xml")
.getAbsolutePath());
bundleResolver.setName("bundle");
bundleResolver.setSettings(settings);
settings.addResolver(bundleResolver);
bundleUrlResolver = new OBRResolver();
bundleUrlResolver.setRepoXmlURL(new File("test/test-repo/bundlerepo/repo.xml").toURI()
.toURL().toExternalForm());
bundleUrlResolver.setName("bundleurl");
bundleUrlResolver.setSettings(settings);
settings.addResolver(bundleUrlResolver);
dualResolver = new DualResolver();
OBRResolver resolver = new OBRResolver();
resolver.setRepoXmlFile(new File("test/test-repo/ivyrepo/repo.xml").getAbsolutePath());
resolver.setName("dual-bundle");
resolver.setSettings(settings);
dualResolver.add(resolver);
dualResolver.setName("dual");
File ivyrepo = new File("test/test-repo/ivyrepo");
FileSystemResolver fileSystemResolver = new FileSystemResolver();
fileSystemResolver.addIvyPattern(ivyrepo.getAbsolutePath()
+ "/[organisation]/[module]/[revision]/ivy.xml");
fileSystemResolver.addArtifactPattern(ivyrepo.getAbsolutePath()
+ "/[organisation]/[module]/[revision]/[type]s/[artifact]-[revision].[ext]");
fileSystemResolver.setName("dual-file");
fileSystemResolver.setSettings(settings);
dualResolver.add(fileSystemResolver);
settings.addResolver(dualResolver);
settings.setDefaultResolver("bundle");
cache = new File("build/cache");
cache.mkdirs();
settings.setDefaultCache(cache);
ivy = new Ivy();
ivy.setSettings(settings);
ivy.bind();
ivy.getResolutionCacheManager().clean();
RepositoryCacheManager[] caches = settings.getRepositoryCacheManagers();
for (int i = 0; i < caches.length; i++) {
caches[i].clean();
}
data = new ResolveData(ivy.getResolveEngine(), new ResolveOptions());
}
public void testSimpleResolve() throws Exception {
ModuleRevisionId mrid = ModuleRevisionId.newInstance(BundleInfo.BUNDLE_TYPE,
"org.apache.ivy.osgi.testbundle", "1.2.3");
genericTestResolveDownload(bundleResolver, mrid);
}
public void testSimpleUrlResolve() throws Exception {
ModuleRevisionId mrid = ModuleRevisionId.newInstance(BundleInfo.BUNDLE_TYPE,
"org.apache.ivy.osgi.testbundle", "1.2.3");
genericTestResolveDownload(bundleUrlResolver, mrid);
}
public void testResolveDual() throws Exception {
ModuleRevisionId mrid = ModuleRevisionId.newInstance(BundleInfo.BUNDLE_TYPE,
"org.apache.ivy.osgi.testbundle", "1.2.3");
genericTestResolveDownload(dualResolver, mrid);
}
private void genericTestResolveDownload(DependencyResolver resolver, ModuleRevisionId mrid)
throws ParseException {
ResolvedModuleRevision rmr = resolver.getDependency(new DefaultDependencyDescriptor(mrid,
false), data);
assertNotNull(rmr);
assertEquals(mrid, rmr.getId());
Artifact artifact = rmr.getDescriptor().getAllArtifacts()[0];
DownloadReport report = resolver.download(new Artifact[] {artifact}, new DownloadOptions());
assertNotNull(report);
assertEquals(1, report.getArtifactsReports().length);
ArtifactDownloadReport ar = report.getArtifactReport(artifact);
assertNotNull(ar);
assertEquals(artifact, ar.getArtifact());
assertEquals(DownloadStatus.SUCCESSFUL, ar.getDownloadStatus());
// test to ask to download again, should use cache
report = resolver.download(new Artifact[] {artifact}, new DownloadOptions());
assertNotNull(report);
assertEquals(1, report.getArtifactsReports().length);
ar = report.getArtifactReport(artifact);
assertNotNull(ar);
assertEquals(artifact, ar.getArtifact());
assertEquals(DownloadStatus.NO, ar.getDownloadStatus());
}
public void testResolveImporting() throws Exception {
String jarName = "org.apache.ivy.osgi.testbundle.importing_3.2.1.jar";
genericTestResolve(jarName, "default", new ModuleRevisionId[] {MRID_TEST_BUNDLE});
}
public void testResolveImportingOptional() throws Exception {
String jarName = "org.apache.ivy.osgi.testbundle.importing.optional_3.2.1.jar";
genericTestResolve(jarName, "default", new ModuleRevisionId[] {});
genericTestResolve(jarName, "optional", new ModuleRevisionId[] {MRID_TEST_BUNDLE});
genericTestResolve(jarName, "transitive-optional",
new ModuleRevisionId[] {MRID_TEST_BUNDLE});
}
public void testResolveImportingTransitiveOptional() throws Exception {
String jarName = "org.apache.ivy.osgi.testbundle.importing.transitiveoptional_3.2.1.jar";
genericTestResolve(jarName, "default", new ModuleRevisionId[] {});
genericTestResolve(jarName, "optional",
new ModuleRevisionId[] {MRID_TEST_BUNDLE_IMPORTING_OPTIONAL});
genericTestResolve(jarName, "transitive-optional", new ModuleRevisionId[] {
MRID_TEST_BUNDLE, MRID_TEST_BUNDLE_IMPORTING_OPTIONAL});
}
public void testResolveImportingVersion() throws Exception {
String jarName = "org.apache.ivy.osgi.testbundle.importing.version_3.2.1.jar";
genericTestResolve(jarName, "default", new ModuleRevisionId[] {MRID_TEST_BUNDLE});
}
public void testResolveImportingRangeVersion() throws Exception {
String jarName = "org.apache.ivy.osgi.testbundle.importing.rangeversion_3.2.1.jar";
genericTestResolve(jarName, "default", new ModuleRevisionId[] {MRID_TEST_BUNDLE});
}
public void testResolveUse() throws Exception {
String jarName = "org.apache.ivy.osgi.testbundle.use_2.2.2.jar";
genericTestResolve(jarName, "default", new ModuleRevisionId[] {});
}
public void testResolveImportingUse() throws Exception {
String jarName = "org.apache.ivy.osgi.testbundle.importing.use_3.2.1.jar";
genericTestResolve(jarName, "default", new ModuleRevisionId[] {MRID_TEST_BUNDLE_USE,
MRID_TEST_BUNDLE_IMPORTING, MRID_TEST_BUNDLE});
}
public void testResolveRequire() throws Exception {
String jarName = "org.apache.ivy.osgi.testbundle.require_1.1.1.jar";
genericTestResolve(jarName, "default", new ModuleRevisionId[] {MRID_TEST_BUNDLE,
MRID_TEST_BUNDLE_IMPORTING_VERSION});
}
public void testResolveOptionalConf() throws Exception {
String jarName = "org.apache.ivy.osgi.testbundle.require_1.1.1.jar";
genericTestResolve(jarName, "optional", new ModuleRevisionId[] {MRID_TEST_BUNDLE,
MRID_TEST_BUNDLE_IMPORTING_VERSION});
}
public void testResolveImportAmbiguity() throws Exception {
String jarName = "org.apache.ivy.osgi.testbundle.importing.ambiguity_3.2.1.jar";
bundleResolver.setRequirementStrategy(RequirementStrategy.first);
genericTestResolve(jarName, "default",
new ModuleRevisionId[] {MRID_TEST_BUNDLE_EXPORTING_AMBIGUITY}, new ModuleRevisionId[] {
MRID_TEST_BUNDLE, MRID_TEST_BUNDLE_IMPORTING_VERSION});
}
public void testResolveImportNoAmbiguity() throws Exception {
String jarName = "org.apache.ivy.osgi.testbundle.importing.ambiguity_3.2.1.jar";
bundleResolver.setRequirementStrategy(RequirementStrategy.noambiguity);
genericTestFailingResolve(jarName, "default");
}
public void testResolveRequireAmbiguity() throws Exception {
String jarName = "org.apache.ivy.osgi.testbundle.require.ambiguity_1.1.1.jar";
bundleResolver.setRequirementStrategy(RequirementStrategy.noambiguity);
genericTestResolve(jarName, "default", new ModuleRevisionId[] {MRID_TEST_BUNDLE,
MRID_TEST_BUNDLE_IMPORTING_VERSION});
}
public void testResolveRequireJre() throws Exception {
String jarName = "org.apache.ivy.osgi.testbundle.requirejre_2.2.2.jar";
bundleResolver.setRequirementStrategy(RequirementStrategy.noambiguity);
genericTestResolve(jarName, "default",
new ModuleRevisionId[] {MRID_TEST_BUNDLE_IMPORTING_JREPACKAGE});
}
private void genericTestResolve(String jarName, String conf, ModuleRevisionId[] expectedMrids)
throws Exception {
genericTestResolve(jarName, conf, expectedMrids, null);
}
private void genericTestResolve(String jarName, String conf, ModuleRevisionId[] expectedMrids,
ModuleRevisionId[] expected2Mrids) throws Exception {
Manifest manifest = new JarInputStream(new FileInputStream("test/test-repo/bundlerepo/"
+ jarName)).getManifest();
BundleInfo bundleInfo = ManifestParser.parseManifest(manifest);
bundleInfo.addArtifact(new BundleArtifact(false, new File("test/test-repo/bundlerepo/"
+ jarName).toURI(), null));
DefaultModuleDescriptor md = BundleInfoAdapter.toModuleDescriptor(
OSGiManifestParser.getInstance(), null, bundleInfo, profileProvider);
ResolveReport resolveReport = ivy.resolve(md,
new ResolveOptions().setConfs(new String[] {conf}).setOutputReport(false));
assertFalse("resolve failed " + resolveReport.getAllProblemMessages(),
resolveReport.hasError());
Set<ModuleRevisionId> actual = new HashSet<ModuleRevisionId>();
List<Artifact> artifacts = resolveReport.getArtifacts();
for (Artifact artfact : artifacts) {
actual.add(artfact.getModuleRevisionId());
}
Set<ModuleRevisionId> expected = new HashSet<ModuleRevisionId>(Arrays.asList(expectedMrids));
if (expected2Mrids != null) {
// in this use case, we have two choices, let's try the second one
try {
Set<ModuleRevisionId> expected2 = new HashSet<ModuleRevisionId>(
Arrays.asList(expected2Mrids));
assertEquals(expected2, actual);
return; // test passed
} catch (AssertionFailedError e) {
// too bad, let's continue
}
}
assertEquals(expected, actual);
}
private void genericTestFailingResolve(String jarName, String conf) throws Exception {
Manifest manifest = new JarInputStream(new FileInputStream("test/test-repo/bundlerepo/"
+ jarName)).getManifest();
BundleInfo bundleInfo = ManifestParser.parseManifest(manifest);
bundleInfo.addArtifact(new BundleArtifact(false, new File("test/test-repo/bundlerepo/"
+ jarName).toURI(), null));
DefaultModuleDescriptor md = BundleInfoAdapter.toModuleDescriptor(
OSGiManifestParser.getInstance(), null, bundleInfo, manifest, profileProvider);
ResolveReport resolveReport = ivy.resolve(md,
new ResolveOptions().setConfs(new String[] {conf}).setOutputReport(false));
assertTrue(resolveReport.hasError());
}
}