package org.apache.aries.subsystem.ctt.itests;
import static org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_SYMBOLICNAME;
import static org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_TYPE;
import static org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_TYPE_APPLICATION;
import static org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_TYPE_COMPOSITE;
import static org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_TYPE_FEATURE;
import java.io.File;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import org.osgi.framework.Constants;
import org.osgi.framework.namespace.IdentityNamespace;
import org.osgi.service.subsystem.Subsystem;
import org.osgi.service.subsystem.SubsystemConstants;
/*
* 2. A non-Root subsystem has acceptDependencies policy
a. - Register repository R2
- Using the Root subsystem, install a composite subsystem S1 with
- no content bundles
- acceptTransitive policy
- no sharing policy
- Using the subsystem S1, install an application S2 with
- content bundles C, D and E
- note sharing policy gets computed
- Verify that bundles A and B got installed into the S1 Subsystem
- Verify the wiring of C, D and E wire to A->x, A, B->y respectively
- Repeat test with S2 as a composite that imports package x, requires bundle A and required capability y
- Repeat test with S2 as a feature
b. - same as 4E2a except S2 is a content resource of S1
- There are 6 combinations to test
- app_app, app_comp, app_feat, comp_app, comp_comp, comp_feat
3. Invalid sharing policy prevents dependency installation
a. - Register repository R2
- Using the Root subsystem, install a composite subsystem S1 with
- no content bundles
- NO acceptDependency policy
- no sharing policy
- Using the subsystem S1, install an application S2 with
- content bundles C, D and E
- note the sharing policy gets computed
- Verify the installation of S2 fails because there is no valid place to install the
required transitive resources A and B that allow S2 constituents to have access.
- Verify resources A and B are not installed in the Root subsystem.
- Repeat test with S2 as a composite that imports package x, requires bundle A and requires capability y.
- Repeat test with S2 as a feature
c. - same as 4E3a except S1 is a composite that has S2 in its Subsystem-Content; S1 fails to install
*/
public class SubsystemDependency_4E2Test extends SubsystemDependencyTestBase
{
private static final String SUBSYSTEM_4E2_S1_COMP = "sdt_composite4e2_s1.esa";
private static final String SUBSYSTEM_4E2_S2_APP = "sdt_application4e2_s2.esa";
private static final String SUBSYSTEM_4E2_S2_COMP = "sdt_composite4e2_s2.esa";
private static final String SUBSYSTEM_4E2_S2_FEATURE = "sdt_feature4e2_s2.esa";
@Override
public void createApplications() throws Exception {
super.createApplications();
createComposite4E2_S1();
createApplication4E2_S2();
createComposite4E2_S2();
createFeature4E2_S2();
registerRepositoryR2();
}
/*
* - Using the Root subsystem, install a composite subsystem S1 with
- no content bundles
- acceptTransitive policy
- no sharing policy
- Using the subsystem S1, install an application S2 with
- content bundles C, D and E
- note sharing policy gets computed
- Verify that bundles A and B got installed into the S1 Subsystem
*/
@Test
public void test4E2A_where_S2isAnApplication() throws Exception
{
Subsystem s1 = installSubsystemFromFile (SUBSYSTEM_4E2_S1_COMP);
startSubsystem(s1);
Subsystem s2 = installSubsystemFromFile (s1, SUBSYSTEM_4E2_S2_APP);
startSubsystem(s2);
verifyBundlesInstalled (s1.getBundleContext(), "s1", BUNDLE_A, BUNDLE_B);
// - Verify the wiring of C, D and E wire to A->x, A, B->y respectively
checkBundlesCDandEWiredToAandB(s2);
stop(s1, s2);
}
/* Repeat test [4e2a.app] with S2 as a composite
* that imports package x, requires bundle A and required capability y
*/
@Test
public void test4E2A_where_S2isAComposite() throws Exception
{
Subsystem s1 = installSubsystemFromFile (SUBSYSTEM_4E2_S1_COMP);
startSubsystem(s1);
Subsystem s2 = installSubsystemFromFile (s1, SUBSYSTEM_4E2_S2_COMP);
startSubsystem(s2);
verifyBundlesInstalled (s1.getBundleContext(), "s1", BUNDLE_A, BUNDLE_B);
// - Verify the wiring of C, D and E wire to A->x, A, B->y respectively
checkBundlesCDandEWiredToAandB(s2);
stop(s1, s2);
}
/*
* - Repeat test [4e2a.app] with S2 as a feature
*/
@Test
public void test4E2A_where_S2isAFeature() throws Exception
{
Subsystem s1 = installSubsystemFromFile (SUBSYSTEM_4E2_S1_COMP);
startSubsystem(s1);
Subsystem s2 = installSubsystemFromFile (s1, SUBSYSTEM_4E2_S2_FEATURE);
startSubsystem(s2);
verifyBundlesInstalled (s1.getBundleContext(), "s1", BUNDLE_A, BUNDLE_B);
// - Verify the wiring of C, D and E wire to A->x, A, B->y respectively
checkBundlesCDandEWiredToAandB(s2);
stop(s1, s2);
}
/*
* 4e2b: - same as 4E2a except S2 is a content resource of S1
- There are 6 combinations to test
- app_app, app_comp, app_feat, comp_app, comp_comp, comp_feat
*/
@Test
public void FourE2b_App_App() throws Exception
{
combinationTest_4e2b ("4e2b_App_App.esa", SUBSYSTEM_TYPE_APPLICATION,
SUBSYSTEM_4E2_S2_APP, SUBSYSTEM_TYPE_APPLICATION);
}
@Test
public void FourE2b_App_Comp() throws Exception
{
combinationTest_4e2b ("4e2b_App_Comp.esa", SUBSYSTEM_TYPE_APPLICATION,
SUBSYSTEM_4E2_S2_COMP, SUBSYSTEM_TYPE_COMPOSITE);
}
@Test
public void FourE2b_App_Feature() throws Exception
{
combinationTest_4e2b ("4e2b_App_Feature.esa", SUBSYSTEM_TYPE_APPLICATION,
SUBSYSTEM_4E2_S2_FEATURE, SUBSYSTEM_TYPE_FEATURE);
}
@Test
public void FourE2b_Comp_App() throws Exception
{
combinationTest_4e2b ("4e2b_App_App.esa", SUBSYSTEM_TYPE_APPLICATION,
SUBSYSTEM_4E2_S2_APP, SUBSYSTEM_TYPE_APPLICATION);
}
@Test
public void FourE2b_Comp_Comp() throws Exception
{
combinationTest_4e2b ("4e2b_Comp_Comp.esa", SUBSYSTEM_TYPE_COMPOSITE,
SUBSYSTEM_4E2_S2_COMP, SUBSYSTEM_TYPE_COMPOSITE);
}
@Test
public void FourE2b_Comp_Feature() throws Exception
{
combinationTest_4e2b ("4e2b_Comp_Feature.esa", SUBSYSTEM_TYPE_COMPOSITE,
SUBSYSTEM_4E2_S2_FEATURE, SUBSYSTEM_TYPE_FEATURE);
}
/*
* Build a subsystem called combinedSubsystemName with a parent of parentType and a child of childType
* Start the subsystem
* - Verify that bundles A and B got installed into the S1 Subsystem
* - Verify the wiring of C, D and E wire to A->x, A, B->y respectively
* Stop and uninstall the combination
*/
private void combinationTest_4e2b (String combinedSubsystemName, String parentType, String childName, String childType) throws Exception
{
createCombinedSubsystem (combinedSubsystemName, parentType, childName, childType);
Subsystem s = installSubsystemFromFile(combinedSubsystemName);
startSubsystem(s);
verifyBundlesInstalled (s.getBundleContext(), "s1", BUNDLE_A, BUNDLE_B);
Collection<Subsystem> children = s.getChildren();
// we only expect one child
Subsystem child = children.iterator().next();
checkBundlesCDandEWiredToAandB (child);
stopSubsystem(s);
uninstallSubsystem(s);
}
private void createCombinedSubsystem (String symbolicName, String parentType, String childSubsystem, String childSubsystemType) throws Exception
{
File f = new File (symbolicName);
if (!f.exists()) {
Map<String, String> attributes = new HashMap<String, String>();
attributes.put(SUBSYSTEM_SYMBOLICNAME, symbolicName);
attributes.put(SubsystemConstants.SUBSYSTEM_VERSION, "1.0.0");
attributes.put(SUBSYSTEM_TYPE, parentType
+ ";" + SubsystemConstants.PROVISION_POLICY_DIRECTIVE
+ ":=" + SubsystemConstants.PROVISION_POLICY_ACCEPT_DEPENDENCIES);
StringBuffer subsystemContent = new StringBuffer();
subsystemContent.append (childSubsystem + ";" + Constants.VERSION_ATTRIBUTE
+ "=\"[1.0.0,1.0.0]\";");
// I'm not sure that this is the best "type" attribute to use, but it will do.
subsystemContent.append(IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE + "=");
subsystemContent.append(childSubsystemType);
attributes.put(SubsystemConstants.SUBSYSTEM_CONTENT, subsystemContent.toString());
// This seems to be necessary to get Comp_Comp and Comp_Feature to work
if (parentType == SubsystemConstants.SUBSYSTEM_TYPE_COMPOSITE) {
attributes.put(Constants.IMPORT_PACKAGE, "x");
attributes.put(Constants.REQUIRE_BUNDLE, BUNDLE_A);
attributes.put(Constants.REQUIRE_CAPABILITY, "y");
}
createManifest(symbolicName + ".mf", attributes);
createSubsystem(symbolicName, childSubsystem);
}
}
/*
* Stop s2, stop s1, uninstall s2, uninstall s1
*/
private void stop(Subsystem s1, Subsystem s2) throws Exception
{
stopSubsystem(s2);
stopSubsystem(s1);
uninstallSubsystem(s2);
uninstallSubsystem(s1);
}
/* a feature S2 with
* - content bundles C, D and E
*/
private static void createFeature4E2_S2() throws Exception
{
Map<String, String> attributes = new HashMap<String, String>();
attributes.put(SUBSYSTEM_SYMBOLICNAME, SUBSYSTEM_4E2_S2_FEATURE);
attributes.put(SubsystemConstants.SUBSYSTEM_VERSION, "1.0.0");
attributes.put(SUBSYSTEM_TYPE, SubsystemConstants.SUBSYSTEM_TYPE_FEATURE);
String appContent = BUNDLE_C + ", " + BUNDLE_D + ", " + BUNDLE_E;
attributes.put(SubsystemConstants.SUBSYSTEM_CONTENT, appContent);
createManifest(SUBSYSTEM_4E2_S2_FEATURE + ".mf", attributes);
createSubsystem(SUBSYSTEM_4E2_S2_FEATURE);
}
/* an application S2 with
* - content bundles C, D and E
*/
private static void createApplication4E2_S2() throws Exception
{
Map<String, String> attributes = new HashMap<String, String>();
attributes.put(SUBSYSTEM_SYMBOLICNAME, SUBSYSTEM_4E2_S2_APP);
attributes.put(SubsystemConstants.SUBSYSTEM_VERSION, "1.0.0");
attributes.put(SUBSYSTEM_TYPE, SUBSYSTEM_TYPE_APPLICATION);
String appContent = BUNDLE_C + ", " + BUNDLE_D + ", " + BUNDLE_E;
attributes.put(SubsystemConstants.SUBSYSTEM_CONTENT, appContent);
createManifest(SUBSYSTEM_4E2_S2_APP + ".mf", attributes);
createSubsystem(SUBSYSTEM_4E2_S2_APP);
}
/*
* a composite [S2]
* that imports package x, requires bundle A and required capability y
*/
private static void createComposite4E2_S2() throws Exception
{
Map<String, String> attributes = new HashMap<String, String>();
attributes.put(SUBSYSTEM_SYMBOLICNAME, SUBSYSTEM_4E2_S2_COMP);
attributes.put(SubsystemConstants.SUBSYSTEM_VERSION, "1.0.0");
attributes.put(SUBSYSTEM_TYPE, SUBSYSTEM_TYPE_COMPOSITE);
attributes.put(Constants.IMPORT_PACKAGE, "x");
attributes.put(Constants.REQUIRE_BUNDLE, BUNDLE_A);
attributes.put(Constants.REQUIRE_CAPABILITY, "y");
String appContent = BUNDLE_C + ";" + Constants.VERSION_ATTRIBUTE + "=\"[1.0.0,1.0.0]\""
+ ", " + BUNDLE_D + ";" + Constants.VERSION_ATTRIBUTE + "=\"[1.0.0,1.0.0]\""
+ ", " + BUNDLE_E + ";" + Constants.VERSION_ATTRIBUTE + "=\"[1.0.0,1.0.0]\"";
attributes.put(SubsystemConstants.SUBSYSTEM_CONTENT, appContent);
createManifest(SUBSYSTEM_4E2_S2_COMP + ".mf", attributes);
createSubsystem(SUBSYSTEM_4E2_S2_COMP);
}
/*
* a composite subsystem S1 with
* - no content bundles
* - acceptTransitive policy
* - no sharing policy
*/
private static void createComposite4E2_S1() throws Exception
{
Map<String, String> attributes = new HashMap<String, String>();
attributes.put(SUBSYSTEM_SYMBOLICNAME, SUBSYSTEM_4E2_S1_COMP);
attributes.put(SubsystemConstants.SUBSYSTEM_VERSION, "1.0.0");
attributes.put(SUBSYSTEM_TYPE, SubsystemConstants.SUBSYSTEM_TYPE_COMPOSITE
+ ";" + SubsystemConstants.PROVISION_POLICY_DIRECTIVE
+ ":=" + SubsystemConstants.PROVISION_POLICY_ACCEPT_DEPENDENCIES);
createManifest(SUBSYSTEM_4E2_S1_COMP + ".mf", attributes);
createSubsystem(SUBSYSTEM_4E2_S1_COMP);
}
}