blob: dc7d060746489398aab9b9abb0ccc17bd4cf9d54 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2020 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.osgi.tests.bundles;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.osgi.launch.Equinox;
import org.eclipse.osgi.tests.OSGiTestsActivator;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.launch.Framework;
import org.osgi.framework.wiring.FrameworkWiring;
public class CascadeConfigTests extends AbstractBundleTests {
public static Test suite() {
return new TestSuite(CascadeConfigTests.class);
}
public void testCascadeConfigBundleInstall() throws Exception {
// First create a framework with the 'parent' configuration
File configParent = OSGiTestsActivator.getContext().getDataFile(getName() + "_parent");
Map<String, Object> parentMap = new HashMap<>();
parentMap.put(Constants.FRAMEWORK_STORAGE, configParent.getAbsolutePath());
Equinox equinox = new Equinox(parentMap);
equinox.init();
BundleContext systemContext = equinox.getBundleContext();
systemContext.installBundle(installer.getBundleLocation("test"));
stopQuietly(equinox);
// Now create a child framework and make sure test1 bundle is there
File configChild = OSGiTestsActivator.getContext().getDataFile(getName() + "_child");
Map<String, Object> childMap = new HashMap<>();
childMap.put(Constants.FRAMEWORK_STORAGE, configChild.getAbsolutePath());
childMap.put("osgi.sharedConfiguration.area", configParent.getCanonicalPath());
equinox = new Equinox(childMap);
equinox.init();
systemContext = equinox.getBundleContext();
Bundle test1 = systemContext.getBundle(installer.getBundleLocation("test"));
assertNotNull("Missing bundle.", test1);
systemContext.installBundle(installer.getBundleLocation("test2"));
stop(equinox);
// reuse the same configuration and make sure both bundles are there
equinox = new Equinox(childMap);
equinox.init();
systemContext = equinox.getBundleContext();
test1 = systemContext.getBundle(installer.getBundleLocation("test"));
assertNotNull("Missing bundle.", test1);
Bundle test2 = systemContext.getBundle(installer.getBundleLocation("test2"));
assertNotNull("Missing bundle.", test2);
stop(equinox);
// restart using the parent and make sure only the test1 bundle is there
equinox = new Equinox(parentMap);
equinox.init();
systemContext = equinox.getBundleContext();
test1 = systemContext.getBundle(installer.getBundleLocation("test"));
assertNotNull("Missing bundle.", test1);
test2 = systemContext.getBundle(installer.getBundleLocation("test2"));
assertNull("Unexpected bundle.", test2);
stop(equinox);
}
public void testCascadeConfigDataArea() throws Exception {
// First create a framework with the 'parent' configuration
File configParent = OSGiTestsActivator.getContext().getDataFile(getName() + "_parent");
Map<String, Object> parentMap = new HashMap<>();
parentMap.put(Constants.FRAMEWORK_STORAGE, configParent.getAbsolutePath());
Equinox equinox = new Equinox(parentMap);
equinox.init();
BundleContext systemContext = equinox.getBundleContext();
Bundle b = systemContext.installBundle(installer.getBundleLocation("substitutes.a"));
equinox.adapt(FrameworkWiring.class).resolveBundles(Collections.singletonList(b));
stop(equinox);
// Now create a child framework and make sure bundle is there
File configChild = OSGiTestsActivator.getContext().getDataFile(getName() + "_child");
Map<String, Object> childMap = new HashMap<>();
childMap.put(Constants.FRAMEWORK_STORAGE, configChild.getAbsolutePath());
childMap.put("osgi.sharedConfiguration.area", configParent.getCanonicalPath());
equinox = new Equinox(childMap);
equinox.init();
systemContext = equinox.getBundleContext();
b = systemContext.getBundle(installer.getBundleLocation("substitutes.a"));
assertNotNull("Missing bundle.", b);
equinox.start();
b.start();
BundleContext test1Context = b.getBundleContext();
// get the data file and make sure it is part of the child config area
File dataFile = test1Context.getDataFile("test1");
assertTrue(dataFile.getAbsolutePath().startsWith(configChild.getAbsolutePath()));
stop(equinox);
// get parent again
equinox = new Equinox(parentMap);
equinox.start();
systemContext = equinox.getBundleContext();
b = systemContext.getBundle(installer.getBundleLocation("substitutes.a"));
assertNotNull("Missing bundle.", b);
// Should not be active since we persistently started the bundle in child only.
assertEquals("Bundle is not resolved.", Bundle.RESOLVED, b.getState());
b.start();
test1Context = b.getBundleContext();
// get the data file and make sure it is part of the parent config area
dataFile = test1Context.getDataFile("test1");
assertTrue(dataFile.getAbsolutePath().startsWith(configParent.getAbsolutePath()));
stop(equinox);
}
public void testCascadeConfigIni() throws Exception {
// First create a framework with the 'parent' configuration
File configParent = OSGiTestsActivator.getContext().getDataFile(getName() + "_parent");
configParent.mkdirs();
File parentConfigIni = new File(configParent, "config.ini");
Properties parentProps = new Properties();
parentProps.put("parent.key", "parent");
parentProps.put("parent.child.key", "parent");
parentProps.store(new FileOutputStream(parentConfigIni), "Parent config.ini");
// Now create a child framework and make sure bundle is there
File configChild = OSGiTestsActivator.getContext().getDataFile(getName() + "_child");
configChild.mkdirs();
File childConfigIni = new File(configChild, "config.ini");
Properties childProps = new Properties();
childProps.put("parent.child.key", "child");
childProps.put("child.key", "child");
childProps.store(new FileOutputStream(childConfigIni), "Parent config.ini");
Map<String, Object> childMap = new HashMap<>();
childMap.put(Constants.FRAMEWORK_STORAGE, configChild.getAbsolutePath());
childMap.put("osgi.sharedConfiguration.area", configParent.getCanonicalPath());
Framework equinox = new Equinox(childMap);
equinox.init();
BundleContext systemContext = equinox.getBundleContext();
assertEquals("Wrong value for parent.key", "parent", systemContext.getProperty("parent.key"));
assertEquals("Wrong value for parent.child.key", "child", systemContext.getProperty("parent.child.key"));
assertEquals("Wrong value for child.key", "child", systemContext.getProperty("child.key"));
stop(equinox);
}
}