blob: 546956a45d50d5722e69ac509e44a4aca027358d [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.felix.deploymentadmin.itest;
import static org.ops4j.pax.exam.CoreOptions.*;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.Security;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import javax.inject.Inject;
import junit.framework.TestCase;
import org.apache.felix.deploymentadmin.itest.util.DeploymentPackageBuilder;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.junit.After;
import org.junit.Before;
import org.ops4j.pax.exam.Configuration;
import org.ops4j.pax.exam.Option;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkEvent;
import org.osgi.framework.FrameworkListener;
import org.osgi.framework.Version;
import org.osgi.framework.wiring.FrameworkWiring;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.deploymentadmin.DeploymentAdmin;
import org.osgi.service.deploymentadmin.DeploymentException;
import org.osgi.service.deploymentadmin.DeploymentPackage;
import org.osgi.util.tracker.ServiceTracker;
/**
* Provides a common base class for all deployment admin related integration tests.
*/
public abstract class BaseIntegrationTest extends TestCase {
protected static final int DEFAULT_TIMEOUT = 10000;
protected static final String TEST_SERVICE_NAME = "org.apache.felix.deploymentadmin.test.bundle1.TestService";
protected static final String TEST_FAILING_BUNDLE_RP1 = "org.apache.felix.deploymentadmin.test.rp1";
@Inject
protected volatile BundleContext m_context;
@Inject
protected volatile DeploymentAdmin m_deploymentAdmin;
@Inject
protected volatile ConfigurationAdmin m_configAdmin;
protected volatile AtomicInteger m_gate = new AtomicInteger(0);
protected volatile String m_testBundleBasePath;
protected volatile Map<String, List<Version>> m_initialBundles;
private int cnt = 0;
@Configuration
public Option[] config() throws Exception {
return options(bootDelegationPackage("sun.*"), systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("ERROR"),
mavenBundle("org.apache.felix", "org.apache.felix.metatype").versionAsInProject(),
mavenBundle("org.apache.felix", "org.apache.felix.dependencymanager").versionAsInProject(),
mavenBundle("org.apache.felix", "org.apache.felix.deploymentadmin").versionAsInProject(),
mavenBundle("org.apache.felix", "org.apache.felix.eventadmin").versionAsInProject(),
mavenBundle("org.apache.felix", "org.apache.felix.configadmin").versionAsInProject(),
mavenBundle("commons-codec", "commons-codec").versionAsInProject(),
mavenBundle("org.bouncycastle", "bcprov-jdk15on").versionAsInProject(),
mavenBundle("org.bouncycastle", "bcpkix-jdk15on").versionAsInProject(),
junitBundles());
}
@Before
public void setUp() throws Exception {
assertNotNull("No bundle context?!", m_context);
File f = new File("../testbundles").getAbsoluteFile();
assertTrue("Failed to find test bundles directory?!", f.exists() && f.isDirectory());
m_testBundleBasePath = f.getAbsolutePath();
m_context.addFrameworkListener(new FrameworkListener() {
public void frameworkEvent(FrameworkEvent event) {
if (event.getType() == FrameworkEvent.PACKAGES_REFRESHED) {
m_gate.getAndIncrement();
}
}
});
m_initialBundles = new HashMap<String, List<Version>>();
for (Bundle bundle : m_context.getBundles()) {
List<Version> versions = m_initialBundles.get(bundle.getSymbolicName());
if (versions == null) {
versions = new ArrayList<Version>();
m_initialBundles.put(bundle.getSymbolicName(), versions);
}
versions.add(bundle.getVersion());
}
Security.addProvider(new BouncyCastleProvider());
}
@After
public void tearDown() throws Exception {
System.setProperty("rp1", "");
System.setProperty("bundle3", "");
Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
}
protected void assertBundleExists(String symbolicName, String version) {
boolean result = isBundleAdded(symbolicName, version);
if (!result) {
fail("Bundle " + symbolicName + ", v" + version + " does not exist?!\nCurrent additional bundles are: " + getCurrentBundles());
}
}
protected void assertBundleNotExists(String symbolicName, String version) {
boolean result = isBundleAdded(symbolicName, version);
if (result) {
fail("Bundle " + symbolicName + ", v" + version + " does (still) exist?!\nCurrent additional bundles are: " + getCurrentBundles());
}
}
protected void assertDeploymentException(int expectedCode, DeploymentException exception) {
assertEquals("Invalid exception code?!\nException = " + exception, expectedCode, exception.getCode());
}
protected void awaitRefreshPackagesEvent() throws Exception {
long start = System.currentTimeMillis();
while ((m_gate.get() == 0) && ((System.currentTimeMillis() - start) < DEFAULT_TIMEOUT)) {
TimeUnit.MILLISECONDS.sleep(100);
}
assertTrue("Failed to obtain refresh packages event?! " + m_gate.get(), m_gate.get() > 0);
m_gate.set(0);
}
protected <T> T awaitService(String serviceName) throws Exception {
ServiceTracker tracker = new ServiceTracker(m_context, serviceName, null);
tracker.open();
T result;
try {
result = (T) tracker.waitForService(DEFAULT_TIMEOUT);
}
finally {
tracker.close();
}
return result;
}
protected final DeploymentPackage installDeploymentPackage(DeploymentPackageBuilder dpBuilder) throws Exception {
return installDeploymentPackage(dpBuilder.generate());
}
protected final DeploymentPackage installDeploymentPackage(InputStream is) throws Exception {
try {
return m_deploymentAdmin.installDeploymentPackage(is);
}
finally {
try {
is.close();
}
catch (IOException e) {
// Nothing we can do about this, but log it...
e.printStackTrace();
}
}
}
protected final int countDeploymentPackages() {
return m_deploymentAdmin.listDeploymentPackages().length;
}
protected DeploymentPackageBuilder createNewDeploymentPackageBuilder(String version) {
return createDeploymentPackageBuilder(String.format("itest%d", ++cnt), version);
}
protected DeploymentPackageBuilder createDeploymentPackageBuilder(String symName, String version) {
return DeploymentPackageBuilder.create(symName, version);
}
protected Map<String, List<Version>> getCurrentBundles() {
Map<String, List<Version>> bundles = new HashMap<String, List<Version>>();
for (Bundle bundle : m_context.getBundles()) {
String symbolicName = bundle.getSymbolicName();
Version version = bundle.getVersion();
// Is is not part of any of the initially provisioned bundles?
List<Version> versions = m_initialBundles.get(symbolicName);
if ((versions == null) || !versions.contains(version)) {
List<Version> versions2 = bundles.get(symbolicName);
if (versions2 == null) {
versions2 = new ArrayList<Version>();
bundles.put(symbolicName, versions2);
}
versions2.add(version);
}
}
return bundles;
}
protected String getSymbolicName(String baseName) {
return "testbundles.".concat(baseName);
}
protected URL getTestResource(String resourceName) {
if (!resourceName.startsWith("/")) {
resourceName = "/".concat(resourceName);
}
URL resource = getClass().getResource(resourceName);
assertNotNull("No such resource: " + resourceName, resource);
return resource;
}
protected Bundle getBundle(String bsn) {
for (Bundle b : m_context.getBundles()) {
if (bsn.equals(b.getSymbolicName())) {
return b;
}
}
return null;
}
protected URL getTestBundleURL(String baseName) throws MalformedURLException {
return getTestBundleURL(baseName, "1.0.0");
}
protected URL getTestBundleURL(String baseName, String version) throws MalformedURLException {
return getTestBundleURL(baseName, baseName, version);
}
protected URL getTestBundleURL(String artifactName, String baseName, String version) throws MalformedURLException {
assertNotNull("Version cannot be null!", version);
File f = new File(m_testBundleBasePath, String.format("%1$s/target/org.apache.felix.deploymentadmin.test.%2$s-%3$s.jar", artifactName, baseName, version));
assertTrue("No such bundle: " + f, f.exists() && f.isFile());
return f.toURI().toURL();
}
protected boolean isBundleActive(Bundle bundle) {
return isBundleInState(bundle, Bundle.ACTIVE);
}
protected boolean isBundleAdded(String symbolicName, String version) {
return isBundleAdded(symbolicName, new Version(version));
}
protected boolean isBundleAdded(String symbolicName, Version version) {
Map<String, List<Version>> bundles = getCurrentBundles();
List<Version> availableVersions = bundles.get(symbolicName);
return (availableVersions != null) && availableVersions.contains(version);
}
protected boolean isBundleInstalled(Bundle bundle) {
return isBundleInState(bundle, Bundle.INSTALLED);
}
protected boolean isBundleInState(Bundle bundle, int state) {
return ((bundle.getState() & state) != 0);
}
protected boolean isBundleRemoved(String symbolicName, String version) {
return isBundleRemoved(symbolicName, new Version(version));
}
protected boolean isBundleRemoved(String symbolicName, Version version) {
Map<String, List<Version>> bundles = getCurrentBundles();
List<Version> availableVersions = bundles.get(symbolicName);
return (availableVersions == null) || !availableVersions.contains(version);
}
protected boolean isBundleResolved(Bundle bundle) {
return isBundleInState(bundle, Bundle.RESOLVED);
}
protected boolean resolveBundles(Bundle... bundles) throws Exception {
Bundle systemBundle = m_context.getBundle(0L);
FrameworkWiring frameworkWiring = systemBundle.adapt(FrameworkWiring.class);
frameworkWiring.resolveBundles(Arrays.asList(bundles));
for (Bundle bundle : bundles) {
if ((bundle.getState() & Bundle.RESOLVED) == 0) {
return false;
}
}
return true;
}
}