# HG changeset patch # User Jiri Vanek # Date 1342016367 -7200 # Node ID 270a09e38dfb4f89a61332ba14f86df14cf0600d # Parent 13ca1c870b92f68fdb13a7bf6d5d296f2a2498e1 try to close browser before kill it diff -r 13ca1c870b92 -r 270a09e38dfb ChangeLog --- a/ChangeLog Mon Jul 09 15:45:42 2012 -0400 +++ b/ChangeLog Wed Jul 11 16:19:27 2012 +0200 @@ -1,3 +1,18 @@ +2012-07-11 Jiri Vanek + + try to close browser before kill it + * tests/reproducers/signed/AppletTestSigned/testcases/AppletTestSignedTests.java: + * tests/reproducers/simple/AppletTest/testcases/AppletTestTests.java: + * tests/reproducers/simple/CheckServices/testcases/CheckServicesTests.java + (evaluateSignedApplet) addapted to properly closed browser + * tests/reproducers/simple/CheckServices/srcs/CheckServices.java: + removed fixme section as it shuld work now + * tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java + (destroyProcess) new method, launching kill with SIGTERM before clasical + process.destroy() + * tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java: + removed Set terminated, should be removed long ago + 2012-07-09 Saad Mohammad * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java (initializeExtensions): diff -r 13ca1c870b92 -r 270a09e38dfb tests/reproducers/signed/AppletTestSigned/testcases/AppletTestSignedTests.java --- a/tests/reproducers/signed/AppletTestSigned/testcases/AppletTestSignedTests.java Mon Jul 09 15:45:42 2012 -0400 +++ b/tests/reproducers/signed/AppletTestSigned/testcases/AppletTestSignedTests.java Wed Jul 11 16:19:27 2012 +0200 @@ -38,8 +38,8 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; -import net.sourceforge.jnlp.ServerAccess.ProcessResult; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.annotations.TestInBrowsers; @@ -53,13 +53,13 @@ @Test public void AppletTestSignedTest() throws Exception { - ServerAccess.ProcessResult pr = server.executeJavawsHeadless(l, "/AppletTestSigned.jnlp"); - evaluateSignedApplet(pr); + ProcessResult pr = server.executeJavawsHeadless(l, "/AppletTestSigned.jnlp"); + evaluateSignedApplet(pr, true); Assert.assertFalse(pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } - private void evaluateSignedApplet(ProcessResult pr) { + private void evaluateSignedApplet(ProcessResult pr, boolean javawsApplet) { String s3 = "AppletTestSigned was initialised"; Assert.assertTrue("AppletTestSigned stdout should contain " + s3 + " but didn't", pr.stdout.contains(s3)); String s0 = "AppletTestSigned was started"; @@ -68,14 +68,18 @@ Assert.assertTrue("AppletTestSigned stdout should contain " + s1 + " but didn't", pr.stdout.contains(s1)); String s2 = "value2"; Assert.assertTrue("AppletTestSigned stdout should contain " + s2 + " but didn't", pr.stdout.contains(s2)); - String s4 = "AppletTestSigned was stopped"; - Assert.assertFalse("AppletTestSigned stdout shouldn't contain " + s4 + " but did", pr.stdout.contains(s4)); - String s5 = "AppletTestSigned will be destroyed"; - Assert.assertFalse("AppletTestSigned stdout shouldn't contain " + s5 + " but did", pr.stdout.contains(s5)); String ss = "xception"; Assert.assertFalse("AppletTestSigned stderr should not contain " + ss + " but did", pr.stderr.contains(ss)); String s7 = "AppletTestSigned killing himself after 2000 ms of life"; Assert.assertTrue("AppletTestSigned stdout should contain " + s7 + " but didn't", pr.stdout.contains(s7)); + if (!javawsApplet) { + /*this is working correctly in most browser, but not in all. temporarily disabling + String s4 = "AppletTestSigned was stopped"; + Assert.assertTrue("AppletTestSigned stdout shouldt contain " + s4 + " but did", pr.stdout.contains(s4)); + String s5 = "AppletTestSigned will be destroyed"; + Assert.assertTrue("AppletTestSigned stdout shouldt contain " + s5 + " but did", pr.stdout.contains(s5)); + */ + } } @Test @@ -83,8 +87,8 @@ public void AppletTestSignedFirefoxTest() throws Exception { ServerAccess.PROCESS_TIMEOUT = 30 * 1000; try { - ServerAccess.ProcessResult pr = server.executeBrowser("/AppletTestSigned.html"); - evaluateSignedApplet(pr); + ProcessResult pr = server.executeBrowser("/AppletTestSigned.html"); + evaluateSignedApplet(pr, false); Assert.assertTrue(pr.wasTerminated); //Assert.assertEquals((Integer) 0, pr.returnValue); due to destroy is null } finally { diff -r 13ca1c870b92 -r 270a09e38dfb tests/reproducers/simple/AppletTest/testcases/AppletTestTests.java --- a/tests/reproducers/simple/AppletTest/testcases/AppletTestTests.java Mon Jul 09 15:45:42 2012 -0400 +++ b/tests/reproducers/simple/AppletTest/testcases/AppletTestTests.java Wed Jul 11 16:19:27 2012 +0200 @@ -35,8 +35,8 @@ exception statement from your version. */ +import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.ServerAccess; -import net.sourceforge.jnlp.ServerAccess.ProcessResult; import net.sourceforge.jnlp.browsertesting.BrowserTest; import net.sourceforge.jnlp.browsertesting.Browsers; import net.sourceforge.jnlp.annotations.Bug; @@ -52,11 +52,11 @@ @TestInBrowsers(testIn = {Browsers.googleChrome}) @NeedsDisplay public void doubleChrome() throws Exception { - server.PROCESS_TIMEOUT = 30 * 1000; + ServerAccess.PROCESS_TIMEOUT = 30 * 1000; try { //System.out.println("connecting AppletInFirefoxTest request in " + getBrowser().toString()); //just verify loging is recording browser - ServerAccess.ProcessResult pr1 = server.executeBrowser("/appletAutoTests.html"); + ProcessResult pr1 = server.executeBrowser("/appletAutoTests.html"); if (pr1.process == null) { Assert.assertTrue("If proces was null here, then google-chrome had to not exist, and so " + ServerAccess.UNSET_BROWSER @@ -65,28 +65,28 @@ pr1.deadlyException.getMessage().contains(ServerAccess.UNSET_BROWSER)); return; } - evaluateApplet(pr1); + evaluateApplet(pr1,false); Assert.assertTrue(pr1.wasTerminated); //System.out.println("connecting AppletInFirefoxTest request in " + getBrowser().toString()); // just verify loging is recording browser ServerAccess.ProcessResult pr = server.executeBrowser("/appletAutoTests.html"); - evaluateApplet(pr); + evaluateApplet(pr,false); Assert.assertTrue(pr.wasTerminated); } finally { - server.PROCESS_TIMEOUT = 20 * 1000; //back to normal + ServerAccess.PROCESS_TIMEOUT = 20 * 1000; //back to normal } } @Test @NeedsDisplay public void AppletTest() throws Exception { - ServerAccess.ProcessResult pr = server.executeJavawsHeadless(null, "/AppletTest.jnlp"); - evaluateApplet(pr); + ProcessResult pr = server.executeJavawsHeadless(null, "/AppletTest.jnlp"); + evaluateApplet(pr,true); Assert.assertFalse(pr.wasTerminated); Assert.assertEquals((Integer) 0, pr.returnValue); } - private void evaluateApplet(ProcessResult pr) { + private void evaluateApplet(ProcessResult pr, boolean javawsApplet) { String s3 = "applet was initialised"; Assert.assertTrue("AppletTest stdout should contains " + s3 + " bud didn't", pr.stdout.contains(s3)); String s0 = "applet was started"; @@ -95,14 +95,18 @@ Assert.assertTrue("AppletTest stdout should contains " + s1 + " bud didn't", pr.stdout.contains(s1)); String s2 = "value2"; Assert.assertTrue("AppletTest stdout should contains " + s2 + " bud didn't", pr.stdout.contains(s2)); - String s4 = "applet was stopped"; - Assert.assertFalse("AppletTest stdout shouldn't contains " + s4 + " bud did", pr.stdout.contains(s4)); - String s5 = "applet will be destroyed"; - Assert.assertFalse("AppletTest stdout shouldn't contains " + s5 + " bud did", pr.stdout.contains(s5)); String ss = "xception"; Assert.assertFalse("AppletTest stderr should not contains " + ss + " but did", pr.stderr.contains(ss)); String s7 = "Aplet killing himself after 2000 ms of life"; Assert.assertTrue("AppletTest stdout should contains " + s7 + " bud didn't", pr.stdout.contains(s7)); + if (!javawsApplet) { + /*this is working correctly in most browser, but not in all. temporarily disabling + String s4 = "applet was stopped"; + Assert.assertTrue("AppletTest stdout should contains " + s4 + " bud did't", pr.stdout.contains(s4)); + String s5 = "applet will be destroyed"; + Assert.assertTrue("AppletTest stdout should contains " + s5 + " bud did't", pr.stdout.contains(s5)); + */ + } } @Test @@ -113,8 +117,8 @@ //just verify loging is recordingb rowser ServerAccess.PROCESS_TIMEOUT = 30 * 1000; try { - ServerAccess.ProcessResult pr = server.executeBrowser("/appletAutoTests2.html"); - evaluateApplet(pr); + ProcessResult pr = server.executeBrowser("/appletAutoTests2.html"); + evaluateApplet(pr,false); Assert.assertTrue(pr.wasTerminated); //Assert.assertEquals((Integer) 0, pr.returnValue); due to destroy is null } finally { @@ -129,9 +133,9 @@ //just verify loging is recording browser ServerAccess.PROCESS_TIMEOUT = 30 * 1000; try { - ServerAccess.ProcessResult pr = server.executeBrowser("/appletAutoTests.html"); + ProcessResult pr = server.executeBrowser("/appletAutoTests.html"); pr.process.destroy(); - evaluateApplet(pr); + evaluateApplet(pr,false); Assert.assertTrue(pr.wasTerminated); //Assert.assertEquals((Integer) 0, pr.returnValue); due to destroy is null } finally { diff -r 13ca1c870b92 -r 270a09e38dfb tests/reproducers/simple/CheckServices/srcs/CheckServices.java --- a/tests/reproducers/simple/CheckServices/srcs/CheckServices.java Mon Jul 09 15:45:42 2012 -0400 +++ b/tests/reproducers/simple/CheckServices/srcs/CheckServices.java Wed Jul 11 16:19:27 2012 +0200 @@ -93,7 +93,7 @@ killer.start(); } - /* FIXME: Check ServiceManagaer is setup once stop/destroy can be called. + @Override public void stop() { System.out.println("Applet is stopping."); @@ -105,5 +105,5 @@ System.out.println("Applet is destorying itself."); checkSetup("destroy()"); } - */ + } diff -r 13ca1c870b92 -r 270a09e38dfb tests/reproducers/simple/CheckServices/testcases/CheckServicesTests.java --- a/tests/reproducers/simple/CheckServices/testcases/CheckServicesTests.java Mon Jul 09 15:45:42 2012 -0400 +++ b/tests/reproducers/simple/CheckServices/testcases/CheckServicesTests.java Wed Jul 11 16:19:27 2012 +0200 @@ -35,7 +35,7 @@ exception statement from your version. */ -import net.sourceforge.jnlp.ServerAccess.ProcessResult; +import net.sourceforge.jnlp.ProcessResult; import net.sourceforge.jnlp.annotations.Bug; import net.sourceforge.jnlp.annotations.NeedsDisplay; import net.sourceforge.jnlp.annotations.TestInBrowsers; @@ -48,20 +48,21 @@ @Bug(id="http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2012-February/017153.html") public class CheckServicesTests extends BrowserTest{ - public void evaluateApplet(ProcessResult pr) { + public void evaluateApplet(ProcessResult pr, boolean applet) { String s0 = "Codebase for applet was found in constructor"; Assert.assertTrue("CheckServices stdout should contain `" + s0 + "' but didn't.", pr.stdout.contains(s0)); String s1 = "Codebase for applet was found in init()"; Assert.assertTrue("CheckServices stdout should contain `" + s1 + "' but didn't.", pr.stdout.contains(s1)); String s2 = "Codebase for applet was found in start()"; Assert.assertTrue("CheckServices stdout should contain `" + s2 + "' but didn't.", pr.stdout.contains(s2)); - /* FIXME: Once the awt robot can close the applet window (i.e. send - * a stop event), stdout should be checked for these asserts. + if (applet){ + /*this is working correctly in most browser, but not in all. temporarily disabling String s3 = "Codebase for applet was found in stop()"; Assert.assertTrue("CheckServices stdout should contain `" + s3 + "' but didn't.", pr.stdout.contains(s3)); String s4 = "Codebase for applet was found in destroy()"; Assert.assertTrue("CheckServices stdout should contain `" + s4 + "' but didn't.", pr.stdout.contains(s4)); - */ + */ + } String s5 = "Exception occurred with null codebase in"; Assert.assertFalse("CheckServices stderr should not contain `" + s5 + "' but did.", pr.stdout.contains(s5)); String s6 = "Applet killing itself after 2000 ms of life"; @@ -72,7 +73,7 @@ @NeedsDisplay public void CheckWebstartServices() throws Exception { ProcessResult pr = server.executeJavaws(null, "/CheckServices.jnlp"); - evaluateApplet(pr); + evaluateApplet(pr, false); Assert.assertFalse(pr.wasTerminated); Assert.assertEquals((Integer)0, pr.returnValue); } @@ -82,7 +83,7 @@ @TestInBrowsers(testIn={Browsers.one}) public void CheckPluginJNLPHServices() throws Exception { ProcessResult pr = server.executeBrowser(null, "/CheckPluginServices.html"); - evaluateApplet(pr); + evaluateApplet(pr,false); Assert.assertTrue(pr.wasTerminated); } } diff -r 13ca1c870b92 -r 270a09e38dfb tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java --- a/tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java Mon Jul 09 15:45:42 2012 -0400 +++ b/tests/test-extensions/net/sourceforge/jnlp/ProcessAssasin.java Wed Jul 11 16:19:27 2012 +0200 @@ -34,8 +34,11 @@ obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ +package net.sourceforge.jnlp; -package net.sourceforge.jnlp; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; /** * class which timeout any ThreadedProcess. This killing of 'thread with process' replaced not working process.destroy(). @@ -112,14 +115,10 @@ ServerAccess.logErrorReprint("Timed out " + p.toString() + " " + "null .. killing " + p.getCommandLine() + ": "); } wasTerminated = true; - p.interrupt(); - while (!ServerAccess.terminated.contains(p)) { - Thread.sleep(100); - } if (p.getP() != null) { try { if (!skipInstedOfDesroy) { - p.getP().destroy(); + destroyProcess(p); } } catch (Throwable ex) { if (p.deadlyException == null) { @@ -128,6 +127,10 @@ ex.printStackTrace(); } } + p.interrupt(); +// while (!ServerAccess.terminated.contains(p)) { +// Thread.sleep(100); +// } if (p.getP() != null) { ServerAccess.logErrorReprint("Timed out " + p.toString() + " " + p.getP().toString() + " .. killed " + p.getCommandLine()); } else { @@ -156,4 +159,25 @@ ServerAccess.logNoReprint("assassin for non existing job termination " + wasTerminated); } } + + public static void destroyProcess(ThreadedProcess pp) { + Process p = pp.getP(); + try { + Field f = p.getClass().getDeclaredField("pid"); + f.setAccessible(true); + String pid = (f.get(p)).toString(); + List ll=new ArrayList(4); + ll.add("kill"); + ll.add("-s"); + ll.add("SIGTERM"); + ll.add(pid); + ServerAccess.executeProcess(ll);//sync, but acctually release + //before affected application close + Thread.sleep(1000); + } catch (Exception ex) { + ServerAccess.logException(ex); + } finally { + p.destroy(); + } + } } diff -r 13ca1c870b92 -r 270a09e38dfb tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java --- a/tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java Mon Jul 09 15:45:42 2012 -0400 +++ b/tests/test-extensions/net/sourceforge/jnlp/ServerAccess.java Wed Jul 11 16:19:27 2012 +0200 @@ -111,10 +111,6 @@ */ public static long PROCESS_TIMEOUT = 20 * 1000;//ms /** - * all terminated processes are stored here. As wee need to 'wait' to termination to be finished. - */ - static Set terminated = new HashSet(); - /** * this flag is indicating whether output of executeProcess should be logged. By default true. */ public static boolean PROCESS_LOG = true; diff -r 13ca1c870b92 -r 270a09e38dfb tests/test-extensions/net/sourceforge/jnlp/ThreadedProcess.java --- a/tests/test-extensions/net/sourceforge/jnlp/ThreadedProcess.java Mon Jul 09 15:45:42 2012 -0400 +++ b/tests/test-extensions/net/sourceforge/jnlp/ThreadedProcess.java Wed Jul 11 16:19:27 2012 +0200 @@ -125,10 +125,10 @@ //add to the set of terminated threaded processes deadlyException = ex; ServerAccess.logException(deadlyException, false); - ServerAccess.terminated.add(this); + //ServerAccess.terminated.add(this); } else { //happens when non-existing process is launched, is causing p null! - ServerAccess.terminated.add(this); + //ServerAccess.terminated.add(this); deadlyException = ex; ServerAccess.logException(deadlyException, false); throw new RuntimeException(ex);