blob: d5ac6d4d88ab2cfc1ed572dae059047d4b7384ca [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.it.deployment.provider.filebased;
import java.io.File;
import java.util.Collection;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import org.apache.ace.deployment.provider.ArtifactData;
import org.apache.ace.deployment.provider.impl.ArtifactDataImpl;
import org.apache.ace.deployment.util.test.BundleStreamGenerator;
import org.apache.ace.test.utils.FileUtils;
import org.apache.ace.test.utils.TestUtils;
import org.osgi.service.log.LogService;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
/**
* This test class tests the FileBasedProvider class. This class implements 2 backend interfaces, and both are tested
* here.
*/
public class FileBasedProviderTest {
private FileBasedProvider 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 ArtifactData BUNDLE1;
private ArtifactData BUNDLE3;
private ArtifactData BUNDLE4;
private ArtifactData BUNDLE4_1;
private ArtifactData BUNDLE5;
private ArtifactData BUNDLE3_2;
private ArtifactData BUNDLE4_2;
@SuppressWarnings("serial")
@BeforeTest(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();
setupSampleData();
m_backend = new FileBasedProvider();
TestUtils.configureObject(m_backend, LogService.class);
m_backend.updated(new Hashtable<String, String>() {
{
put("BaseDirectoryName", m_tempDirectory.getAbsolutePath());
}
});
}
/**
* make a bundle with the given symbolic name and version in the given file.
*/
private ArtifactData generateBundle(File file, String symbolicName, String version) throws Exception {
ArtifactData bundle = new ArtifactDataImpl(file.getName(), symbolicName, file.length(), version, file.toURI().toURL(), false);
BundleStreamGenerator.generateBundle(bundle);
return bundle;
}
/**
* Create the test targets, versions and testbundles..
*/
private void setupSampleData() throws Exception {
File target = new File(m_tempDirectory, TARGET);
target.mkdirs();
File targetVersion1 = new File(target, VERSION1);
targetVersion1.mkdirs();
BUNDLE1 = generateBundle(FileUtils.createTempFile(targetVersion1), "Bundle1", "1.0.0");
File illegalVersionTarget = new File(m_tempDirectory, INVALIDVERSIONTARGET);
illegalVersionTarget.mkdirs();
File faultyVersion = new File(illegalVersionTarget, INVALIDVERSION);
faultyVersion.mkdirs();
// this bundle should never be accessed
generateBundle(FileUtils.createTempFile(faultyVersion), "Bundle2", "2.0.0");
File multipleVersionTarget = new File(m_tempDirectory, MULTIPLEVERSIONTARGET);
multipleVersionTarget.mkdir();
File multipleVersionTargetVersion1 = new File(multipleVersionTarget, VERSION1);
multipleVersionTargetVersion1.mkdir();
BUNDLE3 = generateBundle(FileUtils.createTempFile(multipleVersionTargetVersion1), "Bundle3", "3.0.0");
BUNDLE4 = generateBundle(FileUtils.createTempFile(multipleVersionTargetVersion1), "Bundle4", "4.0.0");
File multipleVersionTargetVersion2 = new File(multipleVersionTarget, VERSION2);
multipleVersionTargetVersion2.mkdir();
BUNDLE4_1 = generateBundle(FileUtils.createTempFile(multipleVersionTargetVersion2), "Bundle4", "4.1.0");
BUNDLE5 = generateBundle(FileUtils.createTempFile(multipleVersionTargetVersion2), "Bundle5", "5.0.0");
File multipleVersionTargetVersion3 = new File(multipleVersionTarget, VERSION3);
multipleVersionTargetVersion3.mkdir();
File multipleVersionTargetVersion4 = new File(multipleVersionTarget, VERSION4);
multipleVersionTargetVersion4.mkdir();
BUNDLE3_2 = generateBundle(FileUtils.createTempFile(multipleVersionTargetVersion4), "Bundle3", "3.0.0");
BUNDLE4_2 = generateBundle(FileUtils.createTempFile(multipleVersionTargetVersion4), "Bundle4", "5.0.0");
}
/**
* See if the getVersions() methods normal output works
*/
@Test()
public void testGetVersion() {
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() {
// 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() {
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() {
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() {
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() {
try {
m_backend.getBundleData(INVALIDVERSIONTARGET, INVALIDVERSION);
assert false : "Expected an error because version " + INVALIDVERSION + " 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() {
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() > 200 : "Bundle has no sensible size?!";
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() {
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() {
Collection<ArtifactData> bundleData = m_backend.getBundleData(MULTIPLEVERSIONTARGET, VERSION1, VERSION3);
assert bundleData.size() == 0 : "Expected zero 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() {
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();
assert data.hasChanged() : "The data 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() {
Collection<ArtifactData> bundleData = m_backend.getBundleData(MULTIPLEVERSIONTARGET, VERSION1, VERSION4);
assert bundleData.size() == 2 : "Expected one bundle 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() {
Collection<ArtifactData> bundleData = m_backend.getBundleData(MULTIPLEVERSIONTARGET, VERSION1, VERSION2);
assert bundleData.size() == 2 : "Expected one bundle 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";
}
}
}
@AfterTest(alwaysRun = true)
public void tearDown() throws Exception {
FileUtils.removeDirectoryWithContent(m_tempDirectory);
}
}