blob: d1396fcf2936d5d5310642b2d57e0006e989c15b [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.ace.deployment.provider.repositorybased;
import java.io.File;
import java.io.StringWriter;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.jar.Attributes;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.ace.deployment.provider.ArtifactData;
import org.apache.ace.deployment.provider.ArtifactDataHelper;
import org.apache.ace.deployment.provider.impl.ArtifactDataImpl;
import org.apache.ace.deployment.util.test.BundleStreamGenerator;
import org.apache.ace.repository.Repository;
import org.apache.ace.test.utils.FileUtils;
import org.apache.ace.test.utils.TestUtils;
import org.osgi.framework.Constants;
import org.osgi.service.log.LogService;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
* This test class tests the Repositorybased Provider class. This class implements 2 backend interfaces, and both are
* tested here.
*/
public class RepositoryBasedProviderTest {
private static final String TAGS_TAG = "tags";
private static final String VERSION_TAG = "version";
private static final String TARGETID_TAG = "targetID";
private static final String ARTIFACTS_TAG = "artifacts";
private static final String ARTIFACT_TAG = "deploymentArtifact";
private static final String URL_TAG = "url";
private static final String SIZE_TAG = "size";
private static final String DIRECTIVES_TAG = "directives";
private static final String ATTRIBUTES_TAG = "attributes";
private static final String DEPLOYMENTVERSION_TAG = "deploymentversion";
public static final String KEY_SYMBOLICNAME = Constants.BUNDLE_SYMBOLICNAME;
public static final String KEY_NAME = Constants.BUNDLE_NAME;
public static final String KEY_VERSION = Constants.BUNDLE_VERSION;
public static final String KEY_VENDOR = Constants.BUNDLE_VENDOR;
public static final String KEY_RESOURCE_PROCESSOR_PID = "Deployment-ProvidesResourceProcessor";
/**
* Key, intended to be used for artifacts which are bundles and will publish a resource processor (see OSGi
* compendium section 114.10).
*/
public static final String DIRECTIVE_ISCUSTOMIZER = "DeploymentPackage-Customizer";
/**
* Key, intended to be used for resources which require a resource processor (see OSGi compendium section 114.10).
*/
public static final String DIRECTIVE_KEY_PROCESSORID = "Resource-Processor";
/**
* Key, intended to be used for artifacts which have a resourceID that's different from their generated name (based
* on URL).
*/
public static final String DIRECTIVE_KEY_RESOURCE_ID = "Resource-ID";
/**
* Key, intended to be used for matching processed (see ArtifactPreprocessor) to their 'original' one.
*/
public static final String DIRECTIVE_KEY_BASEURL = "Base-Url";
public static final String REPOSITORY_PATH = "ACE-RepositoryPath";
private RepositoryBasedProvider m_backend;
private File m_tempDirectory;
private final String VERSION1 = "1.0.0";
private final String VERSION2 = "2.0.0";
private final String VERSION3 = "3.0.0";
private final String VERSION4 = "4.0.0";
private final String INVALIDVERSION = "Invalid.version.directory";
private final String TARGET = "target";
private final String MULTIPLEVERSIONTARGET = "multi-version-target";
private final String INVALIDVERSIONTARGET = "illegal-version-target";
private final String EMPTYVERSIONTARGET = "empty-version-target";
private final String RESOURCETARGET = "resource-target";
private ArtifactData BUNDLE1;
private ArtifactData BUNDLE3;
private ArtifactData BUNDLE4;
private ArtifactData BUNDLE4_1;
private ArtifactData BUNDLE5;
private ArtifactData BUNDLE3_2;
private ArtifactData BUNDLE4_2;
private ArtifactData RESOURCEPROCESSOR1;
private ArtifactData ARTIFACT1;
private ArtifactData ARTIFACT2;
@BeforeMethod(alwaysRun = true)
protected void setUp() throws Exception {
// first create a file
m_tempDirectory = FileUtils.createTempFile(null);
// and make a directory with that name.
m_tempDirectory.mkdir();
// generate sample data
setupSampleData();
String deploymentRepositoryXml = generateValidTestXml();
String range = "1,2,3";
// setup mock repository
Repository mock = new MockDeploymentRepository(range, deploymentRepositoryXml, null);
m_backend = new RepositoryBasedProvider();
TestUtils.configureObject(m_backend, Repository.class, mock);
TestUtils.configureObject(m_backend, LogService.class);
TestUtils.configureObject(m_backend, ArtifactDataHelper.class, new NoOpArtifactDataHelper());
}
/**
* make a bundle with the given symbolic name and version in the given file.
*/
private ArtifactData generateBundle(File file, Map<String, String> directives, String symbolicName, String version,
Map<String, String> additionalHeaders) throws Exception {
// create a mock bundle, which is only used to generate the bundle on disk, and not used for anything else...
ArtifactData bundle = new ArtifactDataImpl(file.toURI().toURL(), directives, symbolicName, -1L, version, false);
if (additionalHeaders == null) {
BundleStreamGenerator.generateBundle(bundle);
}
else {
BundleStreamGenerator.generateBundle(bundle, additionalHeaders);
}
return bundle;
}
/**
* Create the testbundles in the tempdirectory
*/
private void setupSampleData() throws Exception {
BUNDLE1 = generateBundle(FileUtils.createTempFile(m_tempDirectory), null, "Bundle1", "1.0.0", null);
BUNDLE3 = generateBundle(FileUtils.createTempFile(m_tempDirectory), null, "Bundle3", "3.0.0", null);
BUNDLE4 = generateBundle(FileUtils.createTempFile(m_tempDirectory), null, "Bundle4", "4.0.0", null);
BUNDLE4_1 = generateBundle(FileUtils.createTempFile(m_tempDirectory), null, "Bundle4", "4.1.0", null);
BUNDLE5 = generateBundle(FileUtils.createTempFile(m_tempDirectory), null, "Bundle5;singleton:=true", "5.0.0", null);
BUNDLE3_2 = generateBundle(FileUtils.createTempFile(m_tempDirectory), null, "Bundle3", "3.0.0", null);
BUNDLE4_2 = generateBundle(FileUtils.createTempFile(m_tempDirectory), null, "Bundle4", "5.0.0", null);
Map<String, String> attr = new HashMap<>();
attr.put(DIRECTIVE_ISCUSTOMIZER, "true");
RESOURCEPROCESSOR1 = generateBundle(FileUtils.createTempFile(m_tempDirectory), attr, "Autoconf", "1.0.0", null);
attr = new HashMap<>();
attr.put(DIRECTIVE_KEY_PROCESSORID, "my.processor.pid");
ARTIFACT1 = new ArtifactDataImpl(FileUtils.createTempFile(m_tempDirectory).toURI().toURL(), attr, false);
attr = new HashMap<>();
attr.put(DIRECTIVE_KEY_PROCESSORID, "my.processor.pid");
attr.put(DIRECTIVE_KEY_RESOURCE_ID, "Artifact2");
ARTIFACT2 = new ArtifactDataImpl(FileUtils.createTempFile(m_tempDirectory).toURI().toURL(), attr, false);
}
private String generateValidTestXml() {
Document doc = null;
try {
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
doc = docBuilder.newDocument();
}
catch (ParserConfigurationException e) {
// Should not happen
e.printStackTrace();
}
// create the root element
Element root = doc.createElement("repository");
doc.appendChild(root);
// create the versions element
Element versions = doc.createElement("deploymentversions");
root.appendChild(versions);
// create deployment versions
versions.appendChild(generateDeploymentVersion(doc, TARGET, VERSION1, new String[] {
BUNDLE1.getUrl().toString(), KEY_SYMBOLICNAME, BUNDLE1.getSymbolicName(),
KEY_VERSION, BUNDLE1.getVersion() }));
versions
.appendChild(generateDeploymentVersion(doc, MULTIPLEVERSIONTARGET, VERSION1, new String[] {
BUNDLE3.getUrl().toString(), KEY_SYMBOLICNAME, BUNDLE3.getSymbolicName(),
KEY_VERSION, BUNDLE3.getVersion() },
new String[] { BUNDLE4.getUrl().toString(), KEY_SYMBOLICNAME, BUNDLE4.getSymbolicName(),
KEY_VERSION, BUNDLE4.getVersion() }));
versions
.appendChild(generateDeploymentVersion(doc, MULTIPLEVERSIONTARGET, VERSION2, new String[] {
BUNDLE4_1.getUrl().toString(), KEY_SYMBOLICNAME, BUNDLE4_1.getSymbolicName(),
KEY_VERSION, BUNDLE4_1.getVersion() },
new String[] { BUNDLE5.getUrl().toString(), KEY_SYMBOLICNAME, BUNDLE5.getSymbolicName(),
KEY_VERSION, BUNDLE5.getVersion() }));
versions.appendChild(generateDeploymentVersion(doc, MULTIPLEVERSIONTARGET, VERSION3, new String[] {
BUNDLE4.getUrl().toString(), KEY_SYMBOLICNAME, BUNDLE4.getSymbolicName(),
KEY_VERSION, BUNDLE4.getVersion() }));
versions.appendChild(generateDeploymentVersion(doc, MULTIPLEVERSIONTARGET, VERSION4, new String[] {
BUNDLE3_2.getUrl().toString(), KEY_SYMBOLICNAME, BUNDLE3_2.getSymbolicName(),
KEY_VERSION, BUNDLE3_2.getVersion() },
new String[] { BUNDLE4_2.getUrl().toString(), KEY_SYMBOLICNAME, BUNDLE4_2.getSymbolicName(),
KEY_VERSION, BUNDLE4_2.getVersion() }));
// Add versions with special characters like ' " < >
versions
.appendChild(generateDeploymentVersion(doc, "'", VERSION1,
new String[] { BUNDLE1.getUrl().toString(), KEY_SYMBOLICNAME, BUNDLE1.getSymbolicName(),
KEY_VERSION, BUNDLE1.getVersion() }));
versions
.appendChild(generateDeploymentVersion(doc, "\"", VERSION2,
new String[] { BUNDLE1.getUrl().toString(), KEY_SYMBOLICNAME, BUNDLE1.getSymbolicName(),
KEY_VERSION, BUNDLE1.getVersion() }));
versions.appendChild(generateDeploymentVersion(doc, "target'\"", VERSION3, new String[] {
BUNDLE1.getUrl().toString(), KEY_SYMBOLICNAME, BUNDLE1.getSymbolicName(),
KEY_VERSION, BUNDLE1.getVersion() }));
versions.appendChild(generateDeploymentVersion(doc, " '''' \"\"\"\" ", VERSION4, new String[] {
BUNDLE1.getUrl().toString(), KEY_SYMBOLICNAME, BUNDLE1.getSymbolicName(),
KEY_VERSION, BUNDLE1.getVersion() }));
versions.appendChild(generateDeploymentVersion(doc, "myTarget", "1'0'0", new String[] {
BUNDLE1.getUrl().toString(), KEY_SYMBOLICNAME, BUNDLE1.getSymbolicName(),
KEY_VERSION, BUNDLE1.getVersion() }));
// Add a valid deployment version (5.0.0) with no bundle urls (empty package)
versions.appendChild(generateDeploymentVersion(doc, EMPTYVERSIONTARGET, VERSION1, new String[] {
BUNDLE1.getUrl().toString(), KEY_SYMBOLICNAME, BUNDLE1.getSymbolicName(),
KEY_VERSION, BUNDLE1.getVersion() }));
versions.appendChild(generateDeploymentVersion(doc, EMPTYVERSIONTARGET, VERSION2));
versions.appendChild(generateDeploymentVersion(doc, RESOURCETARGET, VERSION1, new String[] {
BUNDLE1.getUrl().toString(), KEY_SYMBOLICNAME, BUNDLE1.getSymbolicName(),
KEY_VERSION, BUNDLE1.getVersion() },
new String[] { RESOURCEPROCESSOR1.getUrl().toString(), DIRECTIVE_ISCUSTOMIZER, "true",
KEY_SYMBOLICNAME, RESOURCEPROCESSOR1.getSymbolicName(), KEY_VERSION,
RESOURCEPROCESSOR1.getVersion() },
new String[] { ARTIFACT1.getUrl().toString(),
DIRECTIVE_KEY_PROCESSORID, "my.processor.pid" },
new String[] {
ARTIFACT2.getUrl().toString(), DIRECTIVE_KEY_RESOURCE_ID, "Artifact2",
DIRECTIVE_KEY_PROCESSORID, "my.processor.pid" }));
// transform the document to string
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = null;
StringWriter sw = null;
try {
transformer = tFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.setOutputProperty(OutputKeys.INDENT, "no");
DOMSource source = new DOMSource(doc);
sw = new StringWriter();
StreamResult result = new StreamResult(sw);
transformer.transform(source, result);
}
catch (TransformerConfigurationException e) {
// Should not happen
e.printStackTrace();
}
catch (TransformerException e) {
// Should not happen
e.printStackTrace();
}
return sw.toString();
}
/**
* Helper method to create the description of a deploymentpacakge with given data.
*
* @param doc
* The document to add the version to.
* @param targetText
* The targetId in the deploymentversion.
* @param versionText
* The version in the deploymentversion.
* @param data
* An array of data for the deployment artifact. [0] is the url, and each following item is first a
* directive key, and a directive value. For example,<br>
* <code>new String[] { "http://mybundle", "somedirective", "somevalue" }</code>
* @return
*/
private Node generateDeploymentVersion(Document doc, String targetText, String versionText, String[]... data) {
Element deploymentversion = doc.createElement(DEPLOYMENTVERSION_TAG);
Element attr = doc.createElement(ATTRIBUTES_TAG);
deploymentversion.appendChild(attr);
// Create and add targetId Tag
Element elem = null;
elem = doc.createElement(TARGETID_TAG);
elem.setTextContent(targetText);
attr.appendChild(elem);
// Create and add versionTag
elem = doc.createElement(VERSION_TAG);
elem.setTextContent(versionText);
attr.appendChild(elem);
// Create and add empty tagsTag to deploymentversion
elem = doc.createElement(TAGS_TAG);
deploymentversion.appendChild(elem);
// create and add bundlesTag
elem = doc.createElement(ARTIFACTS_TAG);
for (String[] s : data) {
Element artifact = doc.createElement(ARTIFACT_TAG);
Element url = doc.createElement(URL_TAG);
url.setTextContent(s[0]);
artifact.appendChild(url);
Element size = doc.createElement(SIZE_TAG);
size.setTextContent("100");
artifact.appendChild(size);
Element directives = doc.createElement(DIRECTIVES_TAG);
for (int i = 1; i < s.length; i += 2) {
Element directive = doc.createElement(s[i]);
directive.setTextContent(s[i + 1]);
directives.appendChild(directive);
}
artifact.appendChild(directives);
elem.appendChild(artifact);
}
deploymentversion.appendChild(elem);
return deploymentversion;
}
/**
* Without any checked in data, we should just get back no version, but the provider should not crash.
*
* @throws java.io.IOException
*/
@Test()
public void testEmptyRepository() throws Exception {
Repository mock = new MockDeploymentRepository("", null, null);
TestUtils.configureObject(m_backend, Repository.class, mock);
List<String> versions = m_backend.getVersions(TARGET);
assert versions.size() == 0 : "From an empty repository, we should get 0 versions, but we get "
+ versions.size();
}
/**
* See if the getVersions() methods normal output works
*/
@Test()
public void testGetVersion() throws Exception {
List<String> versions = m_backend.getVersions(TARGET);
assert versions.size() == 1 : "Expected one version to be found, but found " + versions.size();
assert versions.get(0).equals(VERSION1) : "Expected version " + VERSION1 + " but found " + versions.get(0);
}
/**
* Test the getVersions method with an illegal version (not in org.osgi.framework.Version format)
*/
@Test()
public void testIllegalVersion() throws Exception {
// an illegal version should be silently ignored
List<String> versions = m_backend.getVersions(INVALIDVERSIONTARGET);
assert versions.isEmpty() : "Expected no versions to be found, but found " + versions.size();
}
/**
* Test with multiple versions. It expects all versions in an ascending order.
*/
@Test()
public void testMultipleVersions() throws Exception {
List<String> versions = m_backend.getVersions(MULTIPLEVERSIONTARGET);
assert versions.size() == 4 : "Expected three version to be found, but found " + versions.size();
// all versions should be in ascending order
assert versions.get(0).equals(VERSION1) : "Expected version " + VERSION1 + " but found " + versions.get(0);
assert versions.get(1).equals(VERSION2) : "Expected version " + VERSION2 + " but found " + versions.get(1);
assert versions.get(2).equals(VERSION3) : "Expected version " + VERSION3 + " but found " + versions.get(2);
assert versions.get(3).equals(VERSION4) : "Expected version " + VERSION4 + " but found " + versions.get(3);
}
/**
* Test the getBundleData for a single version, returning a single bundle
*/
@Test()
public void testSingleBundleSingleVersionBundleData() throws Exception {
Collection<ArtifactData> bundleData = m_backend.getBundleData(TARGET, VERSION1);
assert bundleData.size() == 1 : "Expected one bundle to be found, but found " + bundleData.size();
assert bundleData.contains(BUNDLE1) : "Expected to find bundle " + BUNDLE1.getSymbolicName();
}
/**
* Test the getBundleData for a single version, returning a multiple bundles
*/
@Test()
public void testMultipleBundleSingleVersionBundleData() throws Exception {
Collection<ArtifactData> bundleData = m_backend.getBundleData(MULTIPLEVERSIONTARGET, VERSION1);
assert bundleData.size() == 2 : "Expected two bundle to be found, but found " + bundleData.size();
assert bundleData.contains(BUNDLE3) : "Expected to find bundle " + BUNDLE3.getSymbolicName();
assert bundleData.contains(BUNDLE4) : "Expected to find bundle " + BUNDLE4.getSymbolicName();
}
/**
* Test the getBundleData with an illegal version (i.e. a version that doesn't exist)
*/
@Test()
public void testInvalidVersionBundleData() throws Exception {
try {
m_backend.getBundleData(TARGET, INVALIDVERSION);
assert false : "Expected an error because version " + INVALIDVERSION + " doesn't exist for target: "
+ TARGET;
}
catch (IllegalArgumentException iae) {
// expected, because the version doesn't exist
}
}
/**
* Test the getBundleData with an illegal target (i.e. a target that doesn't exist)
*/
@Test()
public void testInvalidTargetBundleData() throws Exception {
try {
m_backend.getBundleData(INVALIDVERSIONTARGET, VERSION1);
assert false : "Expected an error because version " + VERSION1 + " doesn't exist for target: "
+ INVALIDVERSIONTARGET;
}
catch (IllegalArgumentException iae) {
// expected, because the version doesn't exist
}
}
/**
* Test the getBundleData for a two versions, returning a single bundle that hasn't changed
*/
@Test()
public void testSingleUnchangedBundleMultipleVersions() throws Exception {
Collection<ArtifactData> bundleData = m_backend.getBundleData(TARGET, VERSION1, VERSION1);
assert bundleData.size() == 1 : "Expect one bundle, got " + bundleData.size();
Iterator<ArtifactData> it = bundleData.iterator();
while (it.hasNext()) {
ArtifactData data = it.next();
assert data.getSize() == 100 : "Bundle has no sensible size?! " + data.getSize();
assert !data.hasChanged() : "The data should not have been changed.";
}
}
/**
* Test the getBundleData for a two versions, returning multiple bundles that haven't changed
*/
@Test()
public void testMultipleBundlesMultipleVersions() throws Exception {
Collection<ArtifactData> bundleData = m_backend.getBundleData(MULTIPLEVERSIONTARGET, VERSION1, VERSION1);
assert bundleData.size() == 2 : "Expected two bundle to be found, but found " + bundleData.size();
Iterator<ArtifactData> it = bundleData.iterator();
while (it.hasNext()) {
ArtifactData data = it.next();
assert !data.hasChanged() : "The data should not have been changed.";
}
}
/**
* Test the getBundleData for a two versions, where in the second version a bundle is removed
*/
@Test()
public void testRemovedBundleMultipleVersions() throws Exception {
Collection<ArtifactData> bundleData = m_backend.getBundleData(MULTIPLEVERSIONTARGET, VERSION1, VERSION3);
assert bundleData.size() == 1 : "Expected one bundle to be found, but found " + bundleData.size();
}
/**
* Test the getBundleData for a two versions, where in the second version a bundle is added
*/
@Test()
public void testAddedBundleMultipleVersions() throws Exception {
Collection<ArtifactData> bundleData = m_backend.getBundleData(MULTIPLEVERSIONTARGET, VERSION3, VERSION1);
assert bundleData.size() == 2 : "Expected two bundle to be found, but found " + bundleData.size();
Iterator<ArtifactData> it = bundleData.iterator();
while (it.hasNext()) {
ArtifactData data = it.next();
if (data.getSymbolicName().equals("Bundle4")) {
assert !data.hasChanged() : "The data (Bundle4) should not have been changed.";
}
else {
assert data.hasChanged() : "The data (Bundle3) should have been changed.";
}
}
}
/**
* Test the getBundleData for a two versions, where in the second version one bundle has changed and another hasn't
*/
@Test()
public void testSingleChangedBundleMultipleVersions() throws Exception {
Collection<ArtifactData> bundleData = m_backend.getBundleData(MULTIPLEVERSIONTARGET, VERSION1, VERSION4);
assert bundleData.size() == 2 : "Expected two bundles to be found, but found " + bundleData.size();
Iterator<ArtifactData> it = bundleData.iterator();
while (it.hasNext()) {
ArtifactData data = it.next();
if (data.equals(BUNDLE3_2)) {
assert !data.hasChanged() : "The data should not have been changed.";
}
else if (data.equals(BUNDLE4_2)) {
assert data.hasChanged() : "The data should have been changed.";
}
else {
assert false : "Unknown bundle found";
}
}
}
/**
* Test the getBundleData for a two versions, where two bundles have changed
*/
@Test()
public void testMultipleChangedBundlesMultipleVersions() throws Exception {
Collection<ArtifactData> bundleData = m_backend.getBundleData(MULTIPLEVERSIONTARGET, VERSION1, VERSION2);
assert bundleData.size() == 2 : "Expected two bundles to be found, but found " + bundleData.size();
Iterator<ArtifactData> it = bundleData.iterator();
while (it.hasNext()) {
ArtifactData data = it.next();
if (data.equals(BUNDLE4_1)) {
assert data.hasChanged() : "The data should have been changed.";
}
else if (data.equals(BUNDLE5)) {
assert data.hasChanged() : "The data should have been changed.";
}
else {
assert false : "Unknown bundle found";
}
}
}
/**
* See if the getVersions() methods normal output works with literals ' and "
*/
@Test()
public void testGetLiteralTargetVersion() throws Exception {
List<String> versions = m_backend.getVersions("'");
assert versions.size() == 1 : "Expected one version to be found, but found " + versions.size();
assert versions.get(0).equals(VERSION1) : "Expected version " + VERSION1 + " but found " + versions.get(0);
versions = m_backend.getVersions("\"");
assert versions.size() == 1 : "Expected one version to be found, but found " + versions.size();
assert versions.get(0).equals(VERSION2) : "Expected version " + VERSION2 + " but found " + versions.get(0);
versions = m_backend.getVersions("target'\"");
assert versions.size() == 1 : "Expected one version to be found, but found " + versions.size();
assert versions.get(0).equals(VERSION3) : "Expected version " + VERSION3 + " but found " + versions.get(0);
versions = m_backend.getVersions(" '''' \"\"\"\" ");
assert versions.size() == 1 : "Expected one version to be found, but found " + versions.size();
assert versions.get(0).equals(VERSION4) : "Expected version " + VERSION4 + " but found " + versions.get(0);
}
/**
* Test the getBundleData for an empty version (no bundle URLS are included)
*/
@Test()
public void testEmptyDeploymentVersion() throws Exception {
// get the version number
List<String> versions = m_backend.getVersions(EMPTYVERSIONTARGET);
assert versions.size() == 2 : "Expected two version to be found, but found " + versions.size();
// get the (empty bundle data version (2))
Collection<ArtifactData> bundleData = m_backend.getBundleData(EMPTYVERSIONTARGET, VERSION2);
assert bundleData.size() == 0 : "Expected no bundles to be found, but got: " + bundleData.size();
// check an update from and to an empty version
Collection<ArtifactData> bundleData2 = m_backend.getBundleData(EMPTYVERSIONTARGET, VERSION1, VERSION2);
assert bundleData2.size() == 0 : "Expected no bundles to be found, but got: " + bundleData2.size();
Collection<ArtifactData> bundleData3 = m_backend.getBundleData(EMPTYVERSIONTARGET, VERSION2, VERSION1);
assert bundleData3.size() == 1 : "Expected one bundle to be found, but got: " + bundleData3.size();
assert bundleData3.iterator().next().getVersion().equals("1.0.0");
}
/**
* See if a version with a literal is parsed correct and ignored.
*/
@Test()
public void testGetLiteralTargetIllegalVersion() throws Exception {
List<String> versions = m_backend.getVersions("myTarget");
assert versions.size() == 0 : "Expected no versions to be found, but found " + versions.size();
}
/**
* Test the getBundleData with some resources.
*/
@Test()
public void testBundleDataWithResources() throws Exception {
List<String> versions = m_backend.getVersions(RESOURCETARGET);
assert versions.size() == 1 : "Expected two version to be found, but found " + versions.size();
Collection<ArtifactData> bundleData = m_backend.getBundleData(RESOURCETARGET, versions.get(0));
assert bundleData.size() == 4 : "Expected four bundle to be found, but found " + bundleData.size();
Iterator<ArtifactData> it = bundleData.iterator();
while (it.hasNext()) {
ArtifactData data = it.next();
if (data.equals(BUNDLE1)) {
// fine
}
else if (data.equals(RESOURCEPROCESSOR1)) {
// fine
}
else if (data.equals(ARTIFACT1)) {
// fine
}
else if (data.equals(ARTIFACT2)) {
// check the filename
assert data.getFilename().equals("Artifact2");
assert data.getProcessorPid().equals("my.processor.pid");
}
else {
assert false : "Unknown bundle found";
}
}
}
@Test()
public void testArtifactDataManifestGeneration() {
Attributes B1NoFixpack = BUNDLE1.getManifestAttributes(false);
assert B1NoFixpack.size() == 2;
for (Map.Entry<Object, Object> entry : B1NoFixpack.entrySet()) {
if (entry.getKey().toString().equals(Constants.BUNDLE_SYMBOLICNAME)) {
assert entry.getValue().toString().equals(BUNDLE1.getSymbolicName());
}
else if (entry.getKey().toString().equals(Constants.BUNDLE_VERSION)) {
assert entry.getValue().toString().equals(BUNDLE1.getVersion());
}
else {
assert false : "Unknown header found: " + entry.getKey().toString();
}
}
Attributes B1Fixpack = BUNDLE1.getManifestAttributes(true);
assert B1Fixpack.size() == 3;
for (Map.Entry<Object, Object> entry : B1Fixpack.entrySet()) {
if (entry.getKey().toString().equals(Constants.BUNDLE_SYMBOLICNAME)) {
assert entry.getValue().toString().equals(BUNDLE1.getSymbolicName());
}
else if (entry.getKey().toString().equals(Constants.BUNDLE_VERSION)) {
assert entry.getValue().toString().equals(BUNDLE1.getVersion());
}
else if (entry.getKey().toString().equals("DeploymentPackage-Missing")) {
assert entry.getValue().toString().equals("true");
}
else {
assert false : "Unknown header found: " + entry.getKey().toString();
}
}
Attributes R1NoFixpack = RESOURCEPROCESSOR1.getManifestAttributes(false);
assert R1NoFixpack.size() == 3 : "We expect 3 headers, but find " + R1NoFixpack.size();
for (Map.Entry<Object, Object> entry : R1NoFixpack.entrySet()) {
if (entry.getKey().toString().equals(Constants.BUNDLE_SYMBOLICNAME)) {
assert entry.getValue().toString().equals(RESOURCEPROCESSOR1.getSymbolicName());
}
else if (entry.getKey().toString().equals(Constants.BUNDLE_VERSION)) {
assert entry.getValue().toString().equals(RESOURCEPROCESSOR1.getVersion());
}
else if (entry.getKey().toString().equals(DIRECTIVE_ISCUSTOMIZER)) {
assert entry.getValue().toString().equals("true");
}
else {
assert false : "Unknown header found: " + entry.getKey().toString();
}
}
Attributes A1NoFixpack = ARTIFACT1.getManifestAttributes(false);
assert A1NoFixpack.size() == 1 : "We expect 1 headers, but find " + A1NoFixpack.size();
for (Map.Entry<Object, Object> entry : A1NoFixpack.entrySet()) {
if (entry.getKey().toString().equals(DIRECTIVE_KEY_PROCESSORID)) {
assert entry.getValue().toString().equals("my.processor.pid");
}
else {
assert false : "Unknown header found: " + entry.getKey().toString();
}
}
}
@AfterTest(alwaysRun = true)
public void tearDown() throws Exception {
FileUtils.removeDirectoryWithContent(m_tempDirectory);
}
}