Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Watson2008-08-26 20:54:10 +0000
committerThomas Watson2008-08-26 20:54:10 +0000
commit7fd80bd01f581e44c1be29de8e2a0b380d1af9b9 (patch)
tree347debdf547a6e5927354988d80762ba2ee5e176
parent3f163bd0a44fecc4c58e43f4aa77484392cfa3eb (diff)
downloadrt.equinox.framework-7fd80bd01f581e44c1be29de8e2a0b380d1af9b9.tar.gz
rt.equinox.framework-7fd80bd01f581e44c1be29de8e2a0b380d1af9b9.tar.xz
rt.equinox.framework-7fd80bd01f581e44c1be29de8e2a0b380d1af9b9.zip
Bug 245303 [app] implement new ApplicationHandle.getExitValue
-rw-r--r--bundles/org.eclipse.osgi.tests/plugin.xml12
-rw-r--r--bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/appadmin/ApplicationAdminTest.java210
-rw-r--r--bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/appadmin/ExitValueApp.java47
3 files changed, 264 insertions, 5 deletions
diff --git a/bundles/org.eclipse.osgi.tests/plugin.xml b/bundles/org.eclipse.osgi.tests/plugin.xml
index fc38a79b0..69e6db358 100644
--- a/bundles/org.eclipse.osgi.tests/plugin.xml
+++ b/bundles/org.eclipse.osgi.tests/plugin.xml
@@ -83,4 +83,16 @@
</run>
</application>
</extension>
+ <extension
+ id="exitValueApp"
+ point="org.eclipse.core.runtime.applications">
+ <application
+ cardinality="1"
+ thread="any"
+ visible="true">
+ <run
+ class="org.eclipse.osgi.tests.appadmin.ExitValueApp">
+ </run>
+ </application>
+ </extension>
</plugin>
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/appadmin/ApplicationAdminTest.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/appadmin/ApplicationAdminTest.java
index c952eb470..a03093ae9 100644
--- a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/appadmin/ApplicationAdminTest.java
+++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/appadmin/ApplicationAdminTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
+ * Copyright (c) 2007, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -16,7 +16,6 @@ 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.equinox.internal.app.EclipseAppHandle;
import org.eclipse.osgi.tests.OSGiTest;
import org.eclipse.osgi.tests.OSGiTestsActivator;
import org.eclipse.osgi.tests.bundles.BundleInstaller;
@@ -33,7 +32,7 @@ public class ApplicationAdminTest extends OSGiTest {
public static final String MODIFIED = "modified"; //$NON-NLS-1$
public static final String REMOVED = "removed"; //$NON-NLS-1$
public static final String simpleResults = "test.simpleResults"; //$NON-NLS-1$
- public static final String[] tests = new String[] {"testSimpleApp", "testGlobalSingleton", "testCardinality01", "testCardinality02", "testMainThreaded01", "testMainThreaded02", "testHandleEvents01", "testDescriptorEvents01", "testPersistentLock01", "testPersistentLock02", "testPersistentLock03", "testPersistentSchedule01", "testPersistentSchedule02", "testPersistentSchedule03", "testPersistentSchedule04", "testPersistentSchedule05", "testPersistentSchedule06", "testPersistentSchedule07", "testPersistentSchedule08", "testFailedApplication01", "testDestroyBeforeStart01", "testDestroyBeforeStart02"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$ //$NON-NLS-11$ //$NON-NLS-12$ //$NON-NLS-13$ //$NON-NLS-14$ //$NON-NLS-15$ //$NON-NLS-16$ //$NON-NLS-17$ //$NON-NLS-18$ //$NON-NLS-19$ //$NON-NLS-20$ //$NON-NLS-21$ //$NON-NLS-22$
+ public static final String[] tests = new String[] {"testSimpleApp", "testExitValue01", "testExitValue02", "testExitValue03", "testExitValue04", "testExitValue05", "testExitValue06", "testGlobalSingleton", "testCardinality01", "testCardinality02", "testMainThreaded01", "testMainThreaded02", "testHandleEvents01", "testDescriptorEvents01", "testPersistentLock01", "testPersistentLock02", "testPersistentLock03", "testPersistentSchedule01", "testPersistentSchedule02", "testPersistentSchedule03", "testPersistentSchedule04", "testPersistentSchedule05", "testPersistentSchedule06", "testPersistentSchedule07", "testPersistentSchedule08", "testFailedApplication01", "testDestroyBeforeStart01", "testDestroyBeforeStart02"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$ //$NON-NLS-11$ //$NON-NLS-12$ //$NON-NLS-13$ //$NON-NLS-14$ //$NON-NLS-15$ //$NON-NLS-16$ //$NON-NLS-17$ //$NON-NLS-18$ //$NON-NLS-19$ //$NON-NLS-20$ //$NON-NLS-21$ //$NON-NLS-22$ //$NON-NLS-23$ //$NON-NLS-24$ //$NON-NLS-25$ //$NON-NLS-26$ //$NON-NLS-27$ //$NON-NLS-28$
private static final String PI_OSGI_SERVICES = "org.eclipse.osgi.services"; //$NON-NLS-1$
public static Test suite() {
@@ -113,6 +112,193 @@ public class ApplicationAdminTest extends OSGiTest {
assertEquals("Check application result", SUCCESS, result); //$NON-NLS-1$
}
+ public void testExitValue01() {
+ // simple getExitValue test
+ ApplicationDescriptor app = getApplication(PI_OSGI_TESTS + ".exitValueApp"); //$NON-NLS-1$
+ ApplicationHandle handle = null;
+ try {
+ handle = app.launch(null);
+ } catch (ApplicationException e) {
+ fail("failed to launch simpleApp", e); //$NON-NLS-1$
+ }
+ assertNotNull("app handle is null", handle); //$NON-NLS-1$
+ String value = null;
+ try {
+ value = (String) handle.getExitValue(10000);
+ } catch (Exception e) {
+ fail("unexpected exception waiting for exit value", e); //$NON-NLS-1$
+ }
+ assertNotNull("value is null", value); //$NON-NLS-1$
+ assertEquals("exit value is incorrect", ExitValueApp.exitValue, value); //$NON-NLS-1$
+ }
+
+ public void testExitValue02() {
+ // getExitValue test when called from a service listener during service unregistration
+ ApplicationDescriptor app = getApplication(PI_OSGI_TESTS + ".exitValueApp"); //$NON-NLS-1$
+ final Object[] result = new Object[1];
+ ServiceTrackerCustomizer trackerCustomizer = new ServiceTrackerCustomizer() {
+ public Object addingService(ServiceReference reference) {
+ return getContext().getService(reference);
+ }
+
+ public void modifiedService(ServiceReference reference, Object service) {
+ // nothing
+ }
+
+ public void removedService(ServiceReference reference, Object service) {
+ try {
+ result[0] = ((ApplicationHandle) service).getExitValue(10000);
+ } catch (Exception e) {
+ result[0] = e;
+ }
+ }
+ };
+ ServiceTracker tracker = null;
+ try {
+ tracker = new ServiceTracker(getContext(), FrameworkUtil.createFilter("(&(objectClass=" + ApplicationHandle.class.getName() + ")(" + ApplicationHandle.APPLICATION_DESCRIPTOR + "=" + app.getApplicationId() + "))"), trackerCustomizer); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ } catch (InvalidSyntaxException e) {
+ fail("unexpected syntax exception for tracker", e); //$NON-NLS-1$
+ }
+ tracker.open();
+ ApplicationHandle handle = null;
+ try {
+ handle = app.launch(null);
+ } catch (ApplicationException e) {
+ fail("failed to launch simpleApp", e); //$NON-NLS-1$
+ }
+ assertNotNull("app handle is null", handle); //$NON-NLS-1$
+ String value = null;
+ try {
+ value = (String) handle.getExitValue(10000);
+ } catch (Exception e) {
+ fail("unexpected exception waiting for exit value", e); //$NON-NLS-1$
+ }
+ assertNotNull("value is null", value); //$NON-NLS-1$
+ assertEquals("exit value is incorrect", ExitValueApp.exitValue, value); //$NON-NLS-1$
+ assertEquals("value from service unregister is different", value, result[0]); //$NON-NLS-1$
+ }
+
+ public void testExitValue03() {
+ // getExitValue test when called from a service listener during service property modified (STOPPING)
+ ApplicationDescriptor app = getApplication(PI_OSGI_TESTS + ".exitValueApp"); //$NON-NLS-1$
+ final Object[] result = new Object[1];
+ ServiceTrackerCustomizer trackerCustomizer = new ServiceTrackerCustomizer() {
+ public Object addingService(ServiceReference reference) {
+ return getContext().getService(reference);
+ }
+
+ public void modifiedService(ServiceReference reference, Object service) {
+ if (!"org.eclipse.equinox.app.stopped".equals(reference.getProperty(ApplicationHandle.APPLICATION_STATE))) //$NON-NLS-1$
+ return;
+ try {
+ result[0] = ((ApplicationHandle) service).getExitValue(10000);
+ } catch (Exception e) {
+ result[0] = e;
+ }
+ }
+
+ public void removedService(ServiceReference reference, Object service) {
+ // nothing
+ }
+ };
+ ServiceTracker tracker = null;
+ try {
+ tracker = new ServiceTracker(getContext(), FrameworkUtil.createFilter("(&(objectClass=" + ApplicationHandle.class.getName() + ")(" + ApplicationHandle.APPLICATION_DESCRIPTOR + "=" + app.getApplicationId() + "))"), trackerCustomizer); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ } catch (InvalidSyntaxException e) {
+ fail("unexpected syntax exception for tracker", e); //$NON-NLS-1$
+ }
+ tracker.open();
+ ApplicationHandle handle = null;
+ try {
+ handle = app.launch(null);
+ } catch (ApplicationException e) {
+ fail("failed to launch simpleApp", e); //$NON-NLS-1$
+ }
+ assertNotNull("app handle is null", handle); //$NON-NLS-1$
+ String value = null;
+ try {
+ value = (String) handle.getExitValue(10000);
+ } catch (Exception e) {
+ fail("unexpected exception waiting for exit value", e); //$NON-NLS-1$
+ }
+ assertNotNull("value is null", value); //$NON-NLS-1$
+ assertEquals("exit value is incorrect", ExitValueApp.exitValue, value); //$NON-NLS-1$
+ assertEquals("value from service unregister is different", value, result[0]); //$NON-NLS-1$
+ }
+
+ public void testExitValue04() {
+ // getExitValue test with destroy called while waiting for an exit value
+ ApplicationDescriptor app = getApplication(PI_OSGI_TESTS + ".exitValueApp"); //$NON-NLS-1$
+ ApplicationHandle handle = null;
+ try {
+ handle = app.launch(null);
+ } catch (ApplicationException e) {
+ fail("failed to launch simpleApp", e); //$NON-NLS-1$
+ }
+ assertNotNull("app handle is null", handle); //$NON-NLS-1$
+ final ApplicationHandle destroyHandle = handle;
+ new Thread(new Runnable() {
+ public void run() {
+ try {
+ Thread.sleep(1000);
+ destroyHandle.destroy();
+ } catch (InterruptedException e) {
+ // nothing
+ }
+
+ }
+ }).start();
+ String value = null;
+ try {
+ value = (String) handle.getExitValue(10000);
+ } catch (Exception e) {
+ fail("unexpected exception waiting for exit value", e); //$NON-NLS-1$
+ }
+ assertNotNull("value is null", value); //$NON-NLS-1$
+ assertEquals("exit value is incorrect", ExitValueApp.exitValue, value); //$NON-NLS-1$
+ }
+
+ public void testExitValue05() {
+ // getExitValue test with destroy called before getting an exit value
+ ApplicationDescriptor app = getApplication(PI_OSGI_TESTS + ".exitValueApp"); //$NON-NLS-1$
+ ApplicationHandle handle = null;
+ try {
+ handle = app.launch(null);
+ } catch (ApplicationException e) {
+ fail("failed to launch simpleApp", e); //$NON-NLS-1$
+ }
+ assertNotNull("app handle is null", handle); //$NON-NLS-1$
+ handle.destroy();
+ String value = null;
+ try {
+ value = (String) handle.getExitValue(10000);
+ } catch (Exception e) {
+ fail("unexpected exception waiting for exit value", e); //$NON-NLS-1$
+ }
+ assertNotNull("value is null", value); //$NON-NLS-1$
+ assertEquals("exit value is incorrect", ExitValueApp.exitValue, value); //$NON-NLS-1$
+ }
+
+ public void testExitValue06() {
+ // getExitValue test; expecting an ApplicationException because the exit value is not available
+ ApplicationDescriptor app = getApplication(PI_OSGI_TESTS + ".exitValueApp"); //$NON-NLS-1$
+ ApplicationHandle handle = null;
+ try {
+ handle = app.launch(null);
+ } catch (ApplicationException e) {
+ fail("failed to launch simpleApp", e); //$NON-NLS-1$
+ }
+ assertNotNull("app handle is null", handle); //$NON-NLS-1$
+ try {
+ handle.getExitValue(100);
+ fail("Expected an ApplicationException for exit value not available"); //$NON-NLS-1$
+ } catch (ApplicationException e) {
+ assertEquals("Unexpected error type", ApplicationException.APPLICATION_EXITVALUE_NOT_AVAILABLE, e.getErrorCode()); //$NON-NLS-1$
+ } catch (InterruptedException e) {
+ fail("Unexpected interrupted exception waiting for exit value", e); //$NON-NLS-1$
+ }
+ }
+
public void testGlobalSingleton() {
ApplicationDescriptor app = getApplication(PI_OSGI_TESTS + ".globalSingletonApp"); //$NON-NLS-1$
HashMap args = getArguments();
@@ -300,7 +486,12 @@ public class ApplicationAdminTest extends OSGiTest {
handleTracker.waitForEvent(handle.getInstanceId(), ApplicationHandle.RUNNING);
handle.destroy();
handleTracker.waitForEvent(handle.getInstanceId(), REMOVED);
- HashMap results = (HashMap) ((EclipseAppHandle) handle).waitForResult(1000);
+ HashMap results = null;
+ try {
+ results = (HashMap) handle.getExitValue(1000);
+ } catch (ApplicationException e) {
+ fail("Unexpected application exception waiting for an exit value", e); //$NON-NLS-1$
+ }
assertNotNull("Null results", results); //$NON-NLS-1$
HashMap args = new HashMap();
args.put("test.arg1", Boolean.TRUE); //$NON-NLS-1$
@@ -360,7 +551,12 @@ public class ApplicationAdminTest extends OSGiTest {
handleTracker.waitForEvent(handle.getInstanceId(), ApplicationHandle.RUNNING);
handle.destroy();
handleTracker.waitForEvent(handle.getInstanceId(), REMOVED);
- HashMap results = (HashMap) ((EclipseAppHandle) handle).waitForResult(1000);
+ HashMap results = null;
+ try {
+ results = (HashMap) handle.getExitValue(1000);
+ } catch (ApplicationException e) {
+ fail("Unexpected application exception waiting for an exit value", e); //$NON-NLS-1$
+ }
assertNotNull("Null results", results); //$NON-NLS-1$
HashMap args = new HashMap();
args.put("test.arg1", Boolean.TRUE); //$NON-NLS-1$
@@ -477,6 +673,8 @@ public class ApplicationAdminTest extends OSGiTest {
handle.destroy();
} catch (Throwable e) {
fail("failed to launch simpleApp", e); //$NON-NLS-1$
+ } finally {
+ tracker.close();
}
String result = (String) results.get(simpleResults);
assertNull("Check application result", result); //$NON-NLS-1$
@@ -508,6 +706,8 @@ public class ApplicationAdminTest extends OSGiTest {
handle.destroy();
} catch (Throwable e) {
fail("failed to launch simpleApp", e); //$NON-NLS-1$
+ } finally {
+ tracker.close();
}
String result = (String) results.get(simpleResults);
assertNull("Check application result", result); //$NON-NLS-1$
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/appadmin/ExitValueApp.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/appadmin/ExitValueApp.java
new file mode 100644
index 000000000..215ce2f5d
--- /dev/null
+++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/appadmin/ExitValueApp.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osgi.tests.appadmin;
+
+import org.eclipse.equinox.app.IApplication;
+import org.eclipse.equinox.app.IApplicationContext;
+
+public class ExitValueApp implements IApplication {
+
+ public static final String exitValue = "Exit Value"; //$NON-NLS-1$
+ private boolean active = true;
+ private boolean stopped = false;
+
+ public synchronized Object start(IApplicationContext context) {
+ context.applicationRunning();
+ if (active) {
+ try {
+ wait(5000); // only run for 5 seconds at most
+ } catch (InterruptedException e) {
+ // do nothing
+ }
+ }
+ stopped = true;
+ notifyAll();
+ return exitValue;
+ }
+
+ public synchronized void stop() {
+ active = false;
+ notifyAll();
+ while (!stopped)
+ try {
+ wait(100);
+ } catch (InterruptedException e) {
+ // do nothing
+ }
+ }
+
+}

Back to the top