blob: d91ba9af96d24ac926f740075a2eaf7f9c6f27ca [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2021 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.appadmin;
import java.util.HashMap;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.tests.session.ConfigurationSessionTestSuite;
import org.eclipse.core.tests.session.SetupManager.SetupException;
import org.eclipse.osgi.tests.OSGiTest;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.service.application.ApplicationDescriptor;
import org.osgi.service.application.ApplicationHandle;
// This is for the most part a stripped down copy of ApplicationAdminTest.
public class ApplicationRelaunchTest extends OSGiTest {
public static final String testRunnerRelauncherApp = PI_OSGI_TESTS + ".relaunchApp"; //$NON-NLS-1$
public static final String testResults = "test.results"; //$NON-NLS-1$
public static final String SUCCESS = "success"; //$NON-NLS-1$
public static final String simpleResults = "test.simpleResults"; //$NON-NLS-1$
public static final String[] tests = new String[] { "testRelaunch" };
private static final String PI_OSGI_SERVICES = "org.eclipse.osgi.services"; //$NON-NLS-1$
private static final String PI_OSGI_UTIL = "org.eclipse.osgi.util";
public static Test suite() {
TestSuite suite = new TestSuite(ApplicationRelaunchTest.class.getName());
ConfigurationSessionTestSuite appAdminSessionTest = new ConfigurationSessionTestSuite(PI_OSGI_TESTS, ApplicationRelaunchTest.class.getName());
String[] ids = ConfigurationSessionTestSuite.MINIMAL_BUNDLE_SET;
for (String id : ids) {
appAdminSessionTest.addBundle(id);
}
appAdminSessionTest.addBundle(PI_OSGI_UTIL);
appAdminSessionTest.addBundle(PI_OSGI_SERVICES);
appAdminSessionTest.addBundle(PI_OSGI_TESTS);
appAdminSessionTest.setApplicationId(testRunnerRelauncherApp);
try {
appAdminSessionTest.getSetup().setSystemProperty("eclipse.application.registerDescriptors", "true"); //$NON-NLS-1$//$NON-NLS-2$
} catch (SetupException e) {
throw new RuntimeException(e);
}
// we add tests the hard way so we can control the order of the tests.
for (String test : tests) {
appAdminSessionTest.addTest(new ApplicationRelaunchTest(test));
}
suite.addTest(appAdminSessionTest);
return suite;
}
public ApplicationRelaunchTest(String name) {
super(name);
}
private ApplicationDescriptor getApplication(String appName) {
try {
BundleContext context = getContext();
assertNotNull("BundleContext is null!!", context); //$NON-NLS-1$
Class appDescClass = ApplicationDescriptor.class;
assertNotNull("ApplicationDescriptor.class is null!!", appDescClass); //$NON-NLS-1$
ServiceReference[] refs = context.getServiceReferences(appDescClass.getName(), "(" + ApplicationDescriptor.APPLICATION_PID + "=" + appName + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
if (refs == null || refs.length == 0) {
refs = getContext().getServiceReferences(ApplicationDescriptor.class.getName(), null);
String availableApps = ""; //$NON-NLS-1$
if (refs != null) {
for (int i = 0; i < refs.length; i++) {
availableApps += refs[i].getProperty(ApplicationDescriptor.APPLICATION_PID);
if (i < refs.length - 1)
availableApps += ","; //$NON-NLS-1$
}
}
fail("Could not find app pid: " + appName + " available apps are: " + availableApps); //$NON-NLS-1$ //$NON-NLS-2$
}
ApplicationDescriptor result = (ApplicationDescriptor) getContext().getService(refs[0]);
if (result != null)
getContext().ungetService(refs[0]);
else
fail("Could not get application descriptor service: " + appName); //$NON-NLS-1$
return result;
} catch (InvalidSyntaxException e) {
fail("Could not create app filter", e); //$NON-NLS-1$
}
return null;
}
private HashMap getArguments() {
HashMap args = new HashMap();
args.put(testResults, new HashMap());
return args;
}
public void testRelaunch() {
// this is the same as ApplicationAdminTest.testSimpleApp() (but launched
// through a different test runner app RelaunchApp which is the thing being
// tested)
ApplicationDescriptor app = getApplication(PI_OSGI_TESTS + ".simpleApp"); //$NON-NLS-1$
HashMap args = getArguments();
HashMap results = (HashMap) args.get(testResults);
try {
ApplicationHandle handle = app.launch(args);
handle.destroy();
} catch (Throwable e) {
fail("failed to launch simpleApp", e); //$NON-NLS-1$
}
String result = (String) results.get(simpleResults);
assertEquals("Check application result", SUCCESS, result); //$NON-NLS-1$
}
}