/*
* 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.service.subsystem.Subsystem;
import org.osgi.service.subsystem.SubsystemConstants;
public class CompositeTest extends SubsystemTest {
private static final String BUNDLE_A = "bundle.a";
private static final String BUNDLE_B = "bundle.b";
private static final String BUNDLE_C = "bundle.c";
private static final String BUNDLE_D = "bundle.d";
private static final String BUNDLE_E = "bundle.e";
private static final String COMPOSITE_A = "composite.a";
private static final String COMPOSITE_B = "composite.b";
private static final String COMPOSITE_C = "composite.c";
private static final String COMPOSITE_D = "composite.d";
private static final String PACKAGE_X = "x";
@Override
public void createApplications() throws Exception {
createBundleA();
createBundleB();
createBundleC();
createBundleD();
createBundleE();
createCompositeA();
createCompositeB();
createCompositeC();
createCompositeD();
}
private void createBundleA() throws IOException {
createBundle(name(BUNDLE_A), version("1.0.0"), exportPackage(PACKAGE_X + ";version=1.0"));
}
private void createBundleB() throws IOException {
createBundle(name(BUNDLE_B), version("1.0.0"),
new Header(Constants.PROVIDE_CAPABILITY, "y; y=test; version:Version=1.0"));
}
private void createBundleC() throws IOException {
createBundle(name(BUNDLE_C), version("1.0.0"), importPackage(PACKAGE_X + ";version=\"[1.0,2.0)\""));
}
private void createBundleD() throws IOException {
createBundle(name(BUNDLE_D), requireBundle(BUNDLE_A));
}
private void createBundleE() throws IOException {
createBundle(name(BUNDLE_E), new Header(Constants.REQUIRE_CAPABILITY, "y; filter:=(y=test)"));
}
private static void createCompositeA() throws IOException {
createCompositeAManifest();
createSubsystem(COMPOSITE_A);
}
private static void createCompositeB() throws IOException {
createCompositeBManifest();
createSubsystem(COMPOSITE_B);
}
private static void createCompositeC() throws IOException {
createCompositeCManifest();
createSubsystem(COMPOSITE_C);
}
private static void createCompositeD() throws IOException {
createCompositeDManifest();
createSubsystem(COMPOSITE_D);
}
private static 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(Constants.EXPORT_PACKAGE, PACKAGE_X + "; version=1.0, does.not.exist; a=b");
createManifest(COMPOSITE_A + ".mf", attributes);
}
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(Constants.REQUIRE_BUNDLE, BUNDLE_A + "; bundle-version=\"[1.0, 2.0)\", does.not.exist; bundle-version=\"[1.0, 2.0)\"");
createManifest(COMPOSITE_B + ".mf", attributes);
}
private static void createCompositeCManifest() throws IOException {
Map<String, String> attributes = new HashMap<String, String>();
attributes.put(SubsystemConstants.SUBSYSTEM_SYMBOLICNAME, COMPOSITE_C);
attributes.put(SubsystemConstants.SUBSYSTEM_TYPE, SubsystemConstants.SUBSYSTEM_TYPE_COMPOSITE);
attributes.put(Constants.IMPORT_PACKAGE, PACKAGE_X + ", does.not.exist; a=b");
createManifest(COMPOSITE_C + ".mf", attributes);
}
private static void createCompositeDManifest() throws IOException {
Map<String, String> attributes = new HashMap<String, String>();
attributes.put(SubsystemConstants.SUBSYSTEM_SYMBOLICNAME, COMPOSITE_D);
attributes.put(SubsystemConstants.SUBSYSTEM_TYPE, SubsystemConstants.SUBSYSTEM_TYPE_COMPOSITE);
attributes.put(Constants.REQUIRE_CAPABILITY, "y; filter:=\"(y=test)\", does.not.exist; filter:=\"(a=b)\"");
createManifest(COMPOSITE_D + ".mf", attributes);
}
@Test
public void testExportPackage() throws Exception {
Subsystem composite = installSubsystemFromFile(COMPOSITE_A);
try {
startSubsystem(composite);
Bundle bundleA = installBundleFromFile(BUNDLE_A, composite);
try {
Bundle bundleC = installBundleFromFile(BUNDLE_C);
try {
startBundle(bundleC);
}
finally {
bundleC.uninstall();
}
}
finally {
bundleA.uninstall();
}
}
finally {
stopSubsystemSilently(composite);
uninstallSubsystemSilently(composite);
}
}
@Test
public void testImportPackage() throws Exception {
Bundle bundleA = installBundleFromFile(BUNDLE_A);
try {
Subsystem compositeC = installSubsystemFromFile(COMPOSITE_C);
try {
Bundle bundleC = installBundleFromFile(BUNDLE_C, compositeC);
try {
startBundle(bundleC, compositeC);
}
finally {
bundleC.uninstall();
}
}
finally {
uninstallSubsystemSilently(compositeC);
}
}
finally {
bundleA.uninstall();
}
}
@Test
public void testRequireBundle() throws Exception {
Bundle bundleA = installBundleFromFile(BUNDLE_A);
try {
Subsystem compositeB = installSubsystemFromFile(COMPOSITE_B);
try {
Bundle bundleD = installBundleFromFile(BUNDLE_D, compositeB);
try {
startBundle(bundleD, compositeB);
}
finally {
bundleD.uninstall();
}
}
finally {
uninstallSubsystemSilently(compositeB);
}
}
finally {
bundleA.uninstall();
}
}
@Test
public void testRequireCapability() throws Exception {
Bundle bundleB = installBundleFromFile(BUNDLE_B);
try {
Subsystem compositeD = installSubsystemFromFile(COMPOSITE_D);
try {
Bundle bundleE = installBundleFromFile(BUNDLE_E, compositeD);
try {
startBundle(bundleE, compositeD);
}
finally {
bundleE.uninstall();
}
}
finally {
uninstallSubsystemSilently(compositeD);
}
}
finally {
bundleB.uninstall();
}
}
}