/*
* Licensed 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.subsystem.itests;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import org.osgi.framework.Bundle;
import org.osgi.framework.Constants;
import org.osgi.framework.namespace.IdentityNamespace;
import org.osgi.service.subsystem.Subsystem;
import org.osgi.service.subsystem.SubsystemConstants;
public class AutostartTest extends SubsystemTest {
/*
* Subsystem-SymbolicName: application.a.esa
* Subsystem-Content: bundle.a.jar
*/
private static final String APPLICATION_A = "application.a.esa";
/*
* Subsystem-SymbolicName: application.b.esa
* Subsystem-Content: bundle.a.jar,application.a.esa;type=osgi.subsystem.application
*/
private static final String APPLICATION_B = "application.b.esa";
/*
* Bundle-SymbolicName: bundle.a.jar
* Export-Package: x
*/
private static final String BUNDLE_A = "bundle.a.jar";
/*
* Bundle-SymbolicName: bundle.b.jar
* Import-Package: x
*/
private static final String BUNDLE_B = "bundle.b.jar";
/*
* Subsystem-SymbolicName: composite.a.esa
* Subsystem-Type: osgi.subsystem.composite
* Subsystem-Content: bundle.a.jar;version="[0,0]"
* Export-Package: x
*/
private static final String COMPOSITE_A = "composite.a.esa";
/*
* Subsystem-SymbolicName: composite.b.esa
* Subsystem-Type: osgi.subsystem.composite
* Subsystem-Content: bundle.a.jar;version="[0,0]"
* Import-Package: x
* Preferred-Provider: composite.a.esa
*/
private static final String COMPOSITE_B = "composite.b.esa";
/*
* Subsystem-SymbolicName: feature.a.esa
* Subsystem-Type: osgi.subsystem.feature
* Subsystem-Content: bundle.a.jar
*/
private static final String FEATURE_A = "feature.a.esa";
/*
* Subsystem-SymbolicName: feature.b.esa
* Subsystem-Type: osgi.subsystem.feature
* Subsystem-Content: bundle.a.jar,feature.a.esa;type=osgi.subsystem.feature
*/
private static final String FEATURE_B = "feature.b.esa";
/*
* Subsystem-SymbolicName: feature.c.esa
* Subsystem-Type: osgi.subsystem.feature
* Subsystem-Content: bundle.a.jar,feature.a.esa;type=osgi.subsystem.feature
*/
private static final String FEATURE_C = "feature.c.esa";
private static void createApplicationA() throws IOException {
createApplicationAManifest();
createSubsystem(APPLICATION_A, BUNDLE_A);
}
private static void createApplicationAManifest() throws IOException {
Map<String, String> attributes = new HashMap<String, String>();
attributes.put(SubsystemConstants.SUBSYSTEM_SYMBOLICNAME, APPLICATION_A);
createManifest(APPLICATION_A + ".mf", attributes);
}
private void createApplicationB() throws IOException {
createApplicationBManifest();
createSubsystem(APPLICATION_B, BUNDLE_A, APPLICATION_A);
}
private void createApplicationBManifest() throws IOException {
Map<String, String> attributes = new HashMap<String, String>();
attributes.put(SubsystemConstants.SUBSYSTEM_SYMBOLICNAME, APPLICATION_B);
attributes.put(SubsystemConstants.SUBSYSTEM_CONTENT, BUNDLE_A + ',' + APPLICATION_A + ';' + IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE + '=' + SubsystemConstants.SUBSYSTEM_TYPE_APPLICATION);
createManifest(APPLICATION_B + ".mf", attributes);
}
private void createBundleA() throws IOException {
createBundle(name(BUNDLE_A), exportPackage("x"));
}
private void createBundleB() throws IOException {
createBundle(name(BUNDLE_B), importPackage("x"));
}
private void createCompositeA() throws IOException {
createCompositeAManifest();
createSubsystem(COMPOSITE_A, BUNDLE_A);
}
private void createCompositeAManifest() throws IOException {
Map<String, String> attributes = new HashMap<String, String>();
attributes.put(SubsystemConstants.SUBSYSTEM_SYMBOLICNAME, COMPOSITE_A);
attributes.put(SubsystemConstants.SUBSYSTEM_TYPE, SubsystemConstants.SUBSYSTEM_TYPE_COMPOSITE);
attributes.put(SubsystemConstants.SUBSYSTEM_CONTENT, BUNDLE_A + ';' + IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE + "=\"[0,0]\"");
attributes.put(Constants.EXPORT_PACKAGE, "x");
createManifest(COMPOSITE_A + ".mf", attributes);
}
private static void createCompositeB() throws IOException {
createCompositeBManifest();
createSubsystem(COMPOSITE_B, BUNDLE_B);
}
private static void createCompositeBManifest() throws IOException {
Map<String, String> attributes = new HashMap<String, String>();
attributes.put(SubsystemConstants.SUBSYSTEM_SYMBOLICNAME, COMPOSITE_B);
attributes.put(SubsystemConstants.SUBSYSTEM_TYPE, SubsystemConstants.SUBSYSTEM_TYPE_COMPOSITE);
attributes.put(SubsystemConstants.SUBSYSTEM_CONTENT, BUNDLE_B + ';' + IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE + "=\"[0,0]\"");
attributes.put(Constants.IMPORT_PACKAGE, "x");
attributes.put(SubsystemConstants.PREFERRED_PROVIDER, COMPOSITE_A);
createManifest(COMPOSITE_B + ".mf", attributes);
}
private static void createFeatureA() throws IOException {
createFeatureAManifest();
createSubsystem(FEATURE_A, BUNDLE_A);
}
private static void createFeatureAManifest() throws IOException {
Map<String, String> attributes = new HashMap<String, String>();
attributes.put(SubsystemConstants.SUBSYSTEM_SYMBOLICNAME, FEATURE_A);
attributes.put(SubsystemConstants.SUBSYSTEM_TYPE, SubsystemConstants.SUBSYSTEM_TYPE_FEATURE);
attributes.put(SubsystemConstants.SUBSYSTEM_CONTENT, BUNDLE_A);
createManifest(FEATURE_A + ".mf", attributes);
}
private static void createFeatureB() throws IOException {
createFeatureBManifest();
createSubsystem(FEATURE_B, BUNDLE_A);
}
private static void createFeatureBManifest() throws IOException {
Map<String, String> attributes = new HashMap<String, String>();
attributes.put(SubsystemConstants.SUBSYSTEM_SYMBOLICNAME, FEATURE_B);
attributes.put(SubsystemConstants.SUBSYSTEM_TYPE, SubsystemConstants.SUBSYSTEM_TYPE_FEATURE);
attributes.put(SubsystemConstants.SUBSYSTEM_CONTENT, BUNDLE_A);
createManifest(FEATURE_B + ".mf", attributes);
}
private static void createFeatureC() throws IOException {
createFeatureCManifest();
createSubsystem(FEATURE_C, BUNDLE_A, FEATURE_A);
}
private static void createFeatureCManifest() throws IOException {
Map<String, String> attributes = new HashMap<String, String>();
attributes.put(SubsystemConstants.SUBSYSTEM_SYMBOLICNAME, FEATURE_C);
attributes.put(SubsystemConstants.SUBSYSTEM_TYPE, SubsystemConstants.SUBSYSTEM_TYPE_FEATURE);
attributes.put(SubsystemConstants.SUBSYSTEM_CONTENT, BUNDLE_A + ',' + FEATURE_A + ';' + IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE + '=' + SubsystemConstants.SUBSYSTEM_TYPE_FEATURE);
createManifest(FEATURE_C + ".mf", attributes);
}
@Override
public void createApplications() throws Exception {
createBundleA();
createBundleB();
createApplicationA();
createApplicationB();
createCompositeA();
createCompositeB();
createFeatureA();
createFeatureB();
createFeatureC();
}
@Test
public void testAutostartScoped() throws Exception {
Subsystem subsystem = null;
try {
subsystem = installSubsystemFromFile(APPLICATION_A);
restartSubsystemsImplBundle();
subsystem = findSubsystemService(subsystem.getSubsystemId());
assertState(Subsystem.State.INSTALLED, subsystem);
assertBundleState(Bundle.INSTALLED | Bundle.RESOLVED, BUNDLE_A, subsystem);
startSubsystem(subsystem);
restartSubsystemsImplBundle();
subsystem = findSubsystemService(subsystem.getSubsystemId());
assertState(Subsystem.State.ACTIVE, subsystem);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, subsystem);
stopSubsystem(subsystem);
restartSubsystemsImplBundle();
subsystem = findSubsystemService(subsystem.getSubsystemId());
assertState(Subsystem.State.RESOLVED, subsystem);
assertBundleState(Bundle.RESOLVED, BUNDLE_A, subsystem);
}
finally {
stopAndUninstallSubsystemSilently(subsystem);
}
}
@Test
public void testAutostartUnscoped() throws Exception {
Subsystem subsystem = null;
try {
subsystem = installSubsystemFromFile(FEATURE_A);
restartSubsystemsImplBundle();
subsystem = findSubsystemService(subsystem.getSubsystemId());
assertState(Subsystem.State.INSTALLED, subsystem);
assertBundleState(Bundle.INSTALLED | Bundle.RESOLVED, BUNDLE_A, subsystem);
startSubsystem(subsystem);
restartSubsystemsImplBundle();
subsystem = findSubsystemService(subsystem.getSubsystemId());
assertState(Subsystem.State.ACTIVE, subsystem);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, subsystem);
stopSubsystem(subsystem);
restartSubsystemsImplBundle();
subsystem = findSubsystemService(subsystem.getSubsystemId());
assertState(Subsystem.State.RESOLVED, subsystem);
assertBundleState(Bundle.RESOLVED, BUNDLE_A, subsystem);
}
finally {
stopAndUninstallSubsystemSilently(subsystem);
}
}
@Test
public void testAutostartChildScoped() throws Exception {
Subsystem compositeA = null;
try {
compositeA = installSubsystemFromFile(COMPOSITE_A);
Subsystem applicationA = installSubsystemFromFile(compositeA, APPLICATION_A);
restartSubsystemsImplBundle();
compositeA = findSubsystemService(compositeA.getSubsystemId());
applicationA = findSubsystemService(applicationA.getSubsystemId());
assertState(Subsystem.State.INSTALLED, compositeA);
assertBundleState(Bundle.INSTALLED | Bundle.RESOLVED, BUNDLE_A, compositeA);
assertState(Subsystem.State.INSTALLED, applicationA);
assertBundleState(Bundle.INSTALLED | Bundle.RESOLVED, BUNDLE_A, applicationA);
startSubsystem(compositeA);
restartSubsystemsImplBundle();
compositeA = findSubsystemService(compositeA.getSubsystemId());
applicationA = findSubsystemService(applicationA.getSubsystemId());;
assertState(Subsystem.State.ACTIVE, compositeA);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, compositeA);
assertState(Subsystem.State.RESOLVED, applicationA);
assertBundleState(Bundle.INSTALLED | Bundle.RESOLVED, BUNDLE_A, applicationA);
startSubsystemFromResolved(applicationA);
restartSubsystemsImplBundle();
compositeA = findSubsystemService(compositeA.getSubsystemId());
applicationA = findSubsystemService(applicationA.getSubsystemId());;
assertState(Subsystem.State.ACTIVE, compositeA);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, compositeA);
assertState(Subsystem.State.ACTIVE, applicationA);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, applicationA);
stopSubsystem(applicationA);
restartSubsystemsImplBundle();
compositeA = findSubsystemService(compositeA.getSubsystemId());
applicationA = findSubsystemService(applicationA.getSubsystemId());;
assertState(Subsystem.State.ACTIVE, compositeA);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, compositeA);
assertState(Subsystem.State.RESOLVED, applicationA);
assertBundleState(Bundle.RESOLVED, BUNDLE_A, applicationA);
startSubsystemFromResolved(applicationA);
stopSubsystem(compositeA);
restartSubsystemsImplBundle();
compositeA = findSubsystemService(compositeA.getSubsystemId());
applicationA = findSubsystemService(applicationA.getSubsystemId());;
assertState(Subsystem.State.RESOLVED, compositeA);
assertBundleState(Bundle.RESOLVED, BUNDLE_A, compositeA);
assertState(Subsystem.State.RESOLVED, applicationA);
assertBundleState(Bundle.RESOLVED, BUNDLE_A, compositeA);
}
finally {
stopAndUninstallSubsystemSilently(compositeA);
}
}
@Test
public void testAutostartChildUnscoped() throws Exception {
Subsystem featureA = null;
try {
featureA = installSubsystemFromFile(FEATURE_A);
Subsystem featureB = installSubsystemFromFile(featureA, FEATURE_B);
restartSubsystemsImplBundle();
featureA = findSubsystemService(featureA.getSubsystemId());
featureB = findSubsystemService(featureB.getSubsystemId());
assertState(Subsystem.State.INSTALLED, featureA);
assertBundleState(Bundle.INSTALLED | Bundle.RESOLVED, BUNDLE_A, featureA);
assertState(Subsystem.State.INSTALLED, featureB);
assertBundleState(Bundle.INSTALLED | Bundle.RESOLVED, BUNDLE_A, featureB);
startSubsystem(featureA);
restartSubsystemsImplBundle();
featureA = findSubsystemService(featureA.getSubsystemId());
featureB = findSubsystemService(featureB.getSubsystemId());;
assertState(Subsystem.State.ACTIVE, featureA);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, featureA);
assertState(Subsystem.State.RESOLVED, featureB);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, featureB);
startSubsystemFromResolved(featureB);
restartSubsystemsImplBundle();
featureA = findSubsystemService(featureA.getSubsystemId());
featureB = findSubsystemService(featureB.getSubsystemId());;
assertState(Subsystem.State.ACTIVE, featureA);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, featureA);
assertState(Subsystem.State.ACTIVE, featureB);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, featureB);
stopSubsystem(featureB);
restartSubsystemsImplBundle();
featureA = findSubsystemService(featureA.getSubsystemId());
featureB = findSubsystemService(featureB.getSubsystemId());;
assertState(Subsystem.State.ACTIVE, featureA);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, featureA);
assertState(Subsystem.State.RESOLVED, featureB);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, featureB);
startSubsystemFromResolved(featureB);
stopSubsystem(featureA);
restartSubsystemsImplBundle();
featureA = findSubsystemService(featureA.getSubsystemId());
featureB = findSubsystemService(featureB.getSubsystemId());;
assertState(Subsystem.State.RESOLVED, featureA);
assertBundleState(Bundle.RESOLVED, BUNDLE_A, featureA);
assertState(Subsystem.State.RESOLVED, featureB);
assertBundleState(Bundle.RESOLVED, BUNDLE_A, featureA);
}
finally {
stopAndUninstallSubsystemSilently(featureA);
}
}
@Test
public void testAutostartChildAsContentScoped() throws Exception {
Subsystem applicationB = null;
try {
applicationB = installSubsystemFromFile(APPLICATION_B);
Subsystem applicationA = applicationB.getChildren().iterator().next();
restartSubsystemsImplBundle();
applicationB = findSubsystemService(applicationB.getSubsystemId());
applicationA = findSubsystemService(applicationA.getSubsystemId());
assertState(Subsystem.State.INSTALLED, applicationB);
assertBundleState(Bundle.INSTALLED | Bundle.RESOLVED, BUNDLE_A, applicationB);
assertState(Subsystem.State.INSTALLED, applicationA);
assertBundleState(Bundle.INSTALLED | Bundle.RESOLVED, BUNDLE_A, applicationA);
startSubsystem(applicationB);
restartSubsystemsImplBundle();
applicationB = findSubsystemService(applicationB.getSubsystemId());
applicationA = findSubsystemService(applicationA.getSubsystemId());;
assertState(Subsystem.State.ACTIVE, applicationB);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, applicationB);
assertState(Subsystem.State.ACTIVE, applicationA);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, applicationA);
stopSubsystem(applicationA);
restartSubsystemsImplBundle();
applicationB = findSubsystemService(applicationB.getSubsystemId());
applicationA = findSubsystemService(applicationA.getSubsystemId());;
assertState(Subsystem.State.ACTIVE, applicationB);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, applicationB);
assertState(Subsystem.State.ACTIVE, applicationA);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, applicationA);
stopSubsystem(applicationB);
restartSubsystemsImplBundle();
applicationB = findSubsystemService(applicationB.getSubsystemId());
applicationA = findSubsystemService(applicationA.getSubsystemId());;
assertState(Subsystem.State.RESOLVED, applicationB);
assertBundleState(Bundle.RESOLVED, BUNDLE_A, applicationB);
assertState(Subsystem.State.RESOLVED, applicationA);
assertBundleState(Bundle.RESOLVED, BUNDLE_A, applicationA);
}
finally {
stopAndUninstallSubsystemSilently(applicationB);
}
}
@Test
public void testAutostartChildAsContentUnscoped() throws Exception {
Subsystem featureC = null;
try {
featureC = installSubsystemFromFile(FEATURE_C);
Subsystem featureA = featureC.getChildren().iterator().next();
restartSubsystemsImplBundle();
featureC = findSubsystemService(featureC.getSubsystemId());
featureA = findSubsystemService(featureA.getSubsystemId());
assertState(Subsystem.State.INSTALLED, featureC);
assertBundleState(Bundle.INSTALLED | Bundle.RESOLVED, BUNDLE_A, featureC);
assertState(Subsystem.State.INSTALLED, featureA);
assertBundleState(Bundle.INSTALLED | Bundle.RESOLVED, BUNDLE_A, featureA);
startSubsystem(featureC);
restartSubsystemsImplBundle();
featureC = findSubsystemService(featureC.getSubsystemId());
featureA = findSubsystemService(featureA.getSubsystemId());;
assertState(Subsystem.State.ACTIVE, featureC);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, featureC);
assertState(Subsystem.State.ACTIVE, featureA);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, featureA);
stopSubsystem(featureA);
restartSubsystemsImplBundle();
featureC = findSubsystemService(featureC.getSubsystemId());
featureA = findSubsystemService(featureA.getSubsystemId());;
assertState(Subsystem.State.ACTIVE, featureC);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, featureC);
assertState(Subsystem.State.ACTIVE, featureA);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, featureA);
stopSubsystem(featureC);
restartSubsystemsImplBundle();
featureC = findSubsystemService(featureC.getSubsystemId());
featureA = findSubsystemService(featureA.getSubsystemId());;
assertState(Subsystem.State.RESOLVED, featureC);
assertBundleState(Bundle.RESOLVED, BUNDLE_A, featureC);
assertState(Subsystem.State.RESOLVED, featureA);
assertBundleState(Bundle.RESOLVED, BUNDLE_A, featureA);
}
finally {
stopAndUninstallSubsystemSilently(featureC);
}
}
@Test
public void testAutostartDependency() throws Exception {
Subsystem compositeA = installSubsystemFromFile(COMPOSITE_A);
try {
Subsystem compositeB = installSubsystemFromFile(COMPOSITE_B);
try {
restartSubsystemsImplBundle();
compositeB = findSubsystemService(compositeB.getSubsystemId());
compositeA = findSubsystemService(compositeA.getSubsystemId());
assertState(Subsystem.State.INSTALLED, compositeB);
assertBundleState(Bundle.INSTALLED | Bundle.RESOLVED, BUNDLE_B, compositeB);
assertState(Subsystem.State.INSTALLED, compositeA);
assertBundleState(Bundle.INSTALLED | Bundle.RESOLVED, BUNDLE_A, compositeA);
startSubsystem(compositeA);
restartSubsystemsImplBundle();
compositeB = findSubsystemService(compositeB.getSubsystemId());
compositeA = findSubsystemService(compositeA.getSubsystemId());
assertState(Subsystem.State.INSTALLED, compositeB);
assertBundleState(Bundle.INSTALLED | Bundle.RESOLVED, BUNDLE_B, compositeB);
assertState(Subsystem.State.ACTIVE, compositeA);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, compositeA);
stopSubsystem(compositeA);
startSubsystem(compositeB);
restartSubsystemsImplBundle();
compositeB = findSubsystemService(compositeB.getSubsystemId());
compositeA = findSubsystemService(compositeA.getSubsystemId());
assertState(Subsystem.State.ACTIVE, compositeB);
assertBundleState(Bundle.ACTIVE, BUNDLE_B, compositeB);
assertState(Subsystem.State.ACTIVE, compositeA);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, compositeA);
stopSubsystem(compositeB);
restartSubsystemsImplBundle();
compositeB = findSubsystemService(compositeB.getSubsystemId());
compositeA = findSubsystemService(compositeA.getSubsystemId());
assertState(Subsystem.State.RESOLVED, compositeB);
assertBundleState(Bundle.RESOLVED, BUNDLE_B, compositeB);
assertState(Subsystem.State.RESOLVED, compositeA);
assertBundleState(Bundle.RESOLVED, BUNDLE_A, compositeA);
uninstallSubsystem(compositeB);
restartSubsystemsImplBundle();
compositeA = findSubsystemService(compositeA.getSubsystemId());
assertState(Subsystem.State.RESOLVED, compositeA);
assertBundleState(Bundle.RESOLVED, BUNDLE_A, compositeA);
startSubsystemFromResolved(compositeA);
restartSubsystemsImplBundle();
compositeA = findSubsystemService(compositeA.getSubsystemId());
assertState(Subsystem.State.ACTIVE, compositeA);
assertBundleState(Bundle.ACTIVE, BUNDLE_A, compositeA);
}
finally {
stopAndUninstallSubsystemSilently(compositeB);
}
}
finally {
stopAndUninstallSubsystemSilently(compositeA);
}
}
@Test
/* Start a composite with a dependency on an installed, but unresolved subsystem.
* The unresolved dependency should be auto-resolved and started (test fix to
* bug ARIES-1348).
*
* composite b imports package exported by a bundle in composite.a.
* - install composite a
* - install composite b
* - start composite b
*/
public void testStartCompositeWithUnresolvedDependency() throws Exception {
Subsystem compositeA = installSubsystemFromFile(COMPOSITE_A);
Subsystem compositeB = installSubsystemFromFile(COMPOSITE_B);
try {
startSubsystem(compositeB);
// A should be automatically resolved and started.
assertState(Subsystem.State.ACTIVE, compositeA);
}
finally {
stopSubsystemSilently(compositeB);
stopSubsystemSilently(compositeA);
uninstallSubsystemSilently(compositeB);
uninstallSubsystemSilently(compositeA);
}
}
}