[rfc][icedtea-web] tests for hanging firefox

Adam Domurad adomurad at redhat.com
Tue Feb 5 09:32:59 PST 2013


On 01/31/2013 08:29 AM, Jiri Vanek wrote:
> Following tests are testing now fixed, hanging of firefox after the 
> LaunchExceeption.
> To achieve this I have missused AddShutDown test. It was one of the 
> most stable test... So I'm looking forward how my changes will 
> destabilize it :) (not expected!)
>
> 2013-01-31  Jiri Vanek  <jvanek at redhat.com>
>
>     Added test for hanging firefox by LaunchException and Improved 
> AddShutdownHookTest
>     * 
> tests/reproducers/simple/AddShutdownHook/resources/AddShutdownHook.html:
>     new file to launch applet with RuntimeException as result.
>     * 
> tests/reproducers/simple/AddShutdownHook/resources/AddShutdownHook_wrong.html:
>     new file to launch applet with LaunchException as result.
>     * 
> tests/reproducers/simple/AddShutdownHook/srcs/AddShutdownHook.java: is
>     now also applet.
>     * 
> tests/reproducers/simple/AddShutdownHook/testcases/AddShutdownHookTest.java:
>     Added test (AddShutdownHookApplet)for applet, removed duplicate 
> code by rules.
>     * 
> tests/reproducers/simple/AddShutdownHook/testcases/HangFirefoxTests.java:
>     New test set which is launching exception throwing applet, and 
> after exception
>     is thrown then it tries jsut stdou-ing applet. Second applet have 
> to be
>     launched.

Thanks very much for tackling the test! It seems to work well, when 
firefox does hang.

Some thoughts:
- Does the test fail for you before my fix ? I have to apply also my 
'pseudo-reproducer' to coax it to hang.
- If this test ever does come up as a failure it will probably be 
necessary to apply this patch to properly diagnose it, as it seems it 
can pass/fail randomly.

Patch:

> diff -r e631770d76ba 
> tests/reproducers/simple/AddShutdownHook/resources/AddShutdownHook.html
> --- /dev/null    Thu Jan 01 00:00:00 1970 +0000
> +++ 
> b/tests/reproducers/simple/AddShutdownHook/resources/AddShutdownHook.html 
>  Thu Jan 31 14:26:40 2013 +0100
> @@ -0,0 +1,42 @@
> +<!--
> +
> +This file is part of IcedTea.
> +
> +IcedTea is free software; you can redistribute it and/or modify
> +it under the terms of the GNU General Public License as published by
> +the Free Software Foundation; either version 2, or (at your option)
> +any later version.
> +
> +IcedTea is distributed in the hope that it will be useful, but
> +WITHOUT ANY WARRANTY; without even the implied warranty of
> +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +General Public License for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with IcedTea; see the file COPYING.  If not, write to the
> +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
> Boston, MA
> +02110-1301 USA.
> +
> +Linking this library statically or dynamically with other modules is
> +making a combined work based on this library.  Thus, the terms and
> +conditions of the GNU General Public License cover the whole
> +combination.
> +
> +As a special exception, the copyright holders of this library give you
> +permission to link this library with independent modules to produce an
> +executable, regardless of the license terms of these independent
> +modules, and to copy and distribute the resulting executable under
> +terms of your choice, provided that you also meet, for each linked
> +independent module, the terms and conditions of the license of that
> +module.  An independent module is a module which is not derived from
> +or based on this library.  If you modify this library, you may extend
> +this exception to your version of the library, but you are not
> +obligated to do so.  If you do not wish to do so, delete this
> +exception statement from your version.
> +
> + -->
> +<html><head></head><body bgcolor="blue">
> +<p><applet code="AddShutdownHook.class" archive="AddShutdownHook.jar" 
> codebase="." width="800" height="600">
> +</applet></p>
> +</body>
> +</html>
> \ No newline at end of file
> diff -r e631770d76ba 
> tests/reproducers/simple/AddShutdownHook/resources/AddShutdownHook_wrong.html
> --- /dev/null    Thu Jan 01 00:00:00 1970 +0000
> +++ 
> b/tests/reproducers/simple/AddShutdownHook/resources/AddShutdownHook_wrong.html 
>  Thu Jan 31 14:26:40 2013 +0100
> @@ -0,0 +1,42 @@
> +<!--
> +
> +This file is part of IcedTea.
> +
> +IcedTea is free software; you can redistribute it and/or modify
> +it under the terms of the GNU General Public License as published by
> +the Free Software Foundation; either version 2, or (at your option)
> +any later version.
> +
> +IcedTea is distributed in the hope that it will be useful, but
> +WITHOUT ANY WARRANTY; without even the implied warranty of
> +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +General Public License for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with IcedTea; see the file COPYING.  If not, write to the
> +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
> Boston, MA
> +02110-1301 USA.
> +
> +Linking this library statically or dynamically with other modules is
> +making a combined work based on this library.  Thus, the terms and
> +conditions of the GNU General Public License cover the whole
> +combination.
> +
> +As a special exception, the copyright holders of this library give you
> +permission to link this library with independent modules to produce an
> +executable, regardless of the license terms of these independent
> +modules, and to copy and distribute the resulting executable under
> +terms of your choice, provided that you also meet, for each linked
> +independent module, the terms and conditions of the license of that
> +module.  An independent module is a module which is not derived from
> +or based on this library.  If you modify this library, you may extend
> +this exception to your version of the library, but you are not
> +obligated to do so.  If you do not wish to do so, delete this
> +exception statement from your version.
> +
> + -->
> +<html><head></head><body bgcolor="blue">
> +<p><applet code="NotExistingMain.class" 
> archive="NotExisitngArchive.jar" codebase="." width="800" height="600">

Nit:   s/Exisitng/Existing/

> +</applet></p>
> +</body>
> +</html>
> \ No newline at end of file
> diff -r e631770d76ba 
> tests/reproducers/simple/AddShutdownHook/srcs/AddShutdownHook.java
> --- 
> a/tests/reproducers/simple/AddShutdownHook/srcs/AddShutdownHook.java 
>  Thu Jan 31 11:12:35 2013 +0100
> +++ 
> b/tests/reproducers/simple/AddShutdownHook/srcs/AddShutdownHook.java 
>  Thu Jan 31 14:26:40 2013 +0100
> @@ -1,3 +1,6 @@
> +
> +import java.applet.Applet;
> +
>  /* AddShutdownHook.java
>  Copyright (C) 2011 Red Hat, Inc.
>
> @@ -35,7 +38,7 @@
>  exception statement from your version.
>   */
>
> -public class AddShutdownHook {
> +public class AddShutdownHook extends Applet {
>      public static void main(String[] args) {
>
>              Runtime.getRuntime().addShutdownHook(new Thread() {
> @@ -45,4 +48,11 @@
>              });
>
>      }
> +
> +    @Override
> +    public void start() {
> +        main(null);
> +    }
> +
> +
>  }
> diff -r e631770d76ba 
> tests/reproducers/simple/AddShutdownHook/testcases/AddShutdownHookTest.java
> --- 
> a/tests/reproducers/simple/AddShutdownHook/testcases/AddShutdownHookTest.java 
>  Thu Jan 31 11:12:35 2013 +0100
> +++ 
> b/tests/reproducers/simple/AddShutdownHook/testcases/AddShutdownHookTest.java 
>  Thu Jan 31 14:26:40 2013 +0100
> @@ -1,58 +1,74 @@
>  /* AddShutdownHookTest.java
> -Copyright (C) 2011 Red Hat, Inc.
> + Copyright (C) 2011 Red Hat, Inc.
>
> -This file is part of IcedTea.
> + This file is part of IcedTea.
>
> -IcedTea is free software; you can redistribute it and/or
> -modify it under the terms of the GNU General Public License as 
> published by
> -the Free Software Foundation, version 2.
> + IcedTea is free software; you can redistribute it and/or
> + modify it under the terms of the GNU General Public License as 
> published by
> + the Free Software Foundation, version 2.
>
> -IcedTea is distributed in the hope that it will be useful,
> -but WITHOUT ANY WARRANTY; without even the implied warranty of
> -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -General Public License for more details.
> + IcedTea is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + General Public License for more details.
>
> -You should have received a copy of the GNU General Public License
> -along with IcedTea; see the file COPYING.  If not, write to
> -the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
> Boston, MA
> -02110-1301 USA.
> + You should have received a copy of the GNU General Public License
> + along with IcedTea; see the file COPYING.  If not, write to
> + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
> Boston, MA
> + 02110-1301 USA.
>
> -Linking this library statically or dynamically with other modules is
> -making a combined work based on this library.  Thus, the terms and
> -conditions of the GNU General Public License cover the whole
> -combination.
> + Linking this library statically or dynamically with other modules is
> + making a combined work based on this library.  Thus, the terms and
> + conditions of the GNU General Public License cover the whole
> + combination.
>
> -As a special exception, the copyright holders of this library give you
> -permission to link this library with independent modules to produce an
> -executable, regardless of the license terms of these independent
> -modules, and to copy and distribute the resulting executable under
> -terms of your choice, provided that you also meet, for each linked
> -independent module, the terms and conditions of the license of that
> -module.  An independent module is a module which is not derived from
> -or based on this library.  If you modify this library, you may extend
> -this exception to your version of the library, but you are not
> -obligated to do so.  If you do not wish to do so, delete this
> -exception statement from your version.
> + As a special exception, the copyright holders of this library give you
> + permission to link this library with independent modules to produce an
> + executable, regardless of the license terms of these independent
> + modules, and to copy and distribute the resulting executable under
> + terms of your choice, provided that you also meet, for each linked
> + independent module, the terms and conditions of the license of that
> + module.  An independent module is a module which is not derived from
> + or based on this library.  If you modify this library, you may extend
> + this exception to your version of the library, but you are not
> + obligated to do so.  If you do not wish to do so, delete this
> + exception statement from your version.
>   */
>
> -import net.sourceforge.jnlp.ServerAccess;
> +import net.sourceforge.jnlp.ClosingListener;
> +import net.sourceforge.jnlp.ProcessResult;
> +import net.sourceforge.jnlp.annotations.TestInBrowsers;
> +import net.sourceforge.jnlp.browsertesting.BrowserTest;
> +import net.sourceforge.jnlp.browsertesting.Browsers;
> +import 
> net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener;
> +import net.sourceforge.jnlp.closinglisteners.StringMatchClosingListener;
>  import org.junit.Assert;
>
>  import org.junit.Test;
>
> -public class AddShutdownHookTest {
> +public class AddShutdownHookTest extends BrowserTest {
>
> -    private static ServerAccess server = new ServerAccess();
> +    public static final String s = 
> "(?s).*java.security.AccessControlException.{0,5}access 
> denied.{0,5}java.lang.RuntimePermission.{0,5}" + "shutdownHooks" + ".*";
> +    public static final String cnfString = "ClassNotFoundException";
> +    public static final RulesFolowingClosingListener.MatchesRule mr = 
> new RulesFolowingClosingListener.MatchesRule(s);
> +    public static final RulesFolowingClosingListener.ContainsRule cnf 
> = new RulesFolowingClosingListener.ContainsRule(cnfString);
> +    public static final RulesFolowingClosingListener rfc = new 
> RulesFolowingClosingListener(mr);
>
>      @Test
>      public void AddShutdownHookTestLunch1() throws Exception {
> -        ServerAccess.ProcessResult pr = 
> server.executeJavawsHeadless(null, "/AddShutdownHook.jnlp");
> -        String s = 
> "(?s).*java.security.AccessControlException.{0,5}access 
> denied.{0,5}java.lang.RuntimePermission.{0,5}" + "shutdownHooks" + ".*";
> -        Assert.assertTrue("stderr should match "+s+" but 
> didn't",pr.stderr.matches(s));
> -        String cc="ClassNotFoundException";
> -        Assert.assertFalse("stderr should NOT contains `"+cc+"`, but 
> did",pr.stderr.contains(cc));
> -        Assert.assertFalse("stdout length should be <=2, but was 
> "+pr.stdout.length(),pr.stdout.length()>2);
> -        Assert.assertFalse("AddShutdownHookTestLunch1 should not be 
> terminated, but was",pr.wasTerminated);
> +        ProcessResult pr = server.executeJavawsHeadless(null, 
> "/AddShutdownHook.jnlp");
> +        Assert.assertTrue("stderr " + mr.toPassingString(), 
> mr.evaluate(pr.stderr));
> +        Assert.assertFalse("stderr " + cnf.toFailingString(), 
> cnf.evaluate(pr.stderr));
> +        Assert.assertFalse("stdout length should be <=2, but was " + 
> pr.stdout.length(), pr.stdout.length() > 2);
> +        Assert.assertFalse("AddShutdownHookTestLunch1 should not be 
> terminated, but was", pr.wasTerminated);
>          Assert.assertEquals((Integer) 0, pr.returnValue);
>      }
> +
> +    @Test
> +    @TestInBrowsers(testIn = Browsers.one)
> +    public void AddShutdownHookApplet() throws Exception {
> +        ProcessResult pr = 
> server.executeBrowser("/AddShutdownHook.html", null, rfc);
> +        Assert.assertTrue("stderr " + mr.toPassingString(), 
> mr.evaluate(pr.stderr));
> +        Assert.assertFalse("stderr " + cnf.toFailingString(), 
> cnf.evaluate(pr.stderr));
> +    }
>  }
> diff -r e631770d76ba 
> tests/reproducers/simple/AddShutdownHook/testcases/HangFirefoxTests.java
> --- /dev/null    Thu Jan 01 00:00:00 1970 +0000
> +++ 
> b/tests/reproducers/simple/AddShutdownHook/testcases/HangFirefoxTests.java 
>  Thu Jan 31 14:26:40 2013 +0100
> @@ -0,0 +1,111 @@
> +/* AddShutdownHookTest.java
> + Copyright (C) 2011 Red Hat, Inc.
> +
> + This file is part of IcedTea.
> +
> + IcedTea is free software; you can redistribute it and/or
> + modify it under the terms of the GNU General Public License as 
> published by
> + the Free Software Foundation, version 2.
> +
> + IcedTea is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + General Public License for more details.
> +
> + You should have received a copy of the GNU General Public License
> + along with IcedTea; see the file COPYING.  If not, write to
> + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
> Boston, MA
> + 02110-1301 USA.
> +
> + Linking this library statically or dynamically with other modules is
> + making a combined work based on this library.  Thus, the terms and
> + conditions of the GNU General Public License cover the whole
> + combination.
> +
> + As a special exception, the copyright holders of this library give you
> + permission to link this library with independent modules to produce an
> + executable, regardless of the license terms of these independent
> + modules, and to copy and distribute the resulting executable under
> + terms of your choice, provided that you also meet, for each linked
> + independent module, the terms and conditions of the license of that
> + module.  An independent module is a module which is not derived from
> + or based on this library.  If you modify this library, you may extend
> + this exception to your version of the library, but you are not
> + obligated to do so.  If you do not wish to do so, delete this
> + exception statement from your version.
> + */
> +
> +import net.sourceforge.jnlp.ProcessResult;
> +import net.sourceforge.jnlp.annotations.TestInBrowsers;
> +import net.sourceforge.jnlp.browsertesting.BrowserTest;
> +import net.sourceforge.jnlp.browsertesting.Browsers;
> +import net.sourceforge.jnlp.closinglisteners.CountingClosingListener;
> +import 
> net.sourceforge.jnlp.closinglisteners.RulesFolowingClosingListener;
> +import org.junit.Assert;
> +
> +import org.junit.Test;
> +
> +public class HangFirefoxTests extends BrowserTest {
> +
> +    String leString = "LaunchException";
> +    ;
> +    String startedString = "applet was started";
> +    RulesFolowingClosingListener.ContainsRule leRule = new 
> RulesFolowingClosingListener.ContainsRule(leString);
> +    RulesFolowingClosingListener.ContainsRule appleStartedRule = new 
> RulesFolowingClosingListener.ContainsRule(startedString);
> +
> +    @Test
> +    @TestInBrowsers(testIn = Browsers.firefox)
> +    public void HangFirefoxWithRuntimeExceptionTests() throws Exception {
> +        ProcessResult pr = 
> server.executeBrowser("/AddShutdownHook.html", new 
> RulesFolowingClosingListener(appleStartedRule), new 
> CountingClosingListener() {
> +            private boolean launched = false;
> +
> +            @Override
> +            protected boolean isAlowedToFinish(String content) {

s/Alowed/Allowed/

> +                if (AddShutdownHookTest.mr.evaluate(content) && 
> !launched) {
> +                    launched = true;
> +                    try {
> + server.executeBrowser("/appletAutoTests2.html", null, 
> (CountingClosingListener) null);
> +                    } catch (Exception ex) {
> +                        throw new RuntimeException(ex);
> +                    }
> +                }
> +                return false;
> +            }
> +        });
> +        Assert.assertTrue("stderr " + 
> AddShutdownHookTest.mr.toPassingString(), 
> AddShutdownHookTest.mr.evaluate(pr.stderr));
> +        Assert.assertTrue("stdout " + 
> appleStartedRule.toPassingString(), appleStartedRule.evaluate(pr.stdout));
> +        Assert.assertFalse("stderr " + 
> AddShutdownHookTest.cnf.toFailingString(), 
> AddShutdownHookTest.cnf.evaluate(pr.stderr));
> +    }
> +
> +    @Test
> +    @TestInBrowsers(testIn = Browsers.firefox)
> +    public void HangFirefoxWithLaunchException() throws Exception {
> +        ProcessResult pr = 
> server.executeBrowser("/AddShutdownHook_wrong.html", new 
> RulesFolowingClosingListener(appleStartedRule), new 
> CountingClosingListener() {
> +            private boolean launched = false;
> +
> +            @Override
> +            protected boolean isAlowedToFinish(String content) {

s/Alowed/Allowed/

> +                if (leRule.evaluate(content) && !launched) {
> +                    launched = true;
> +                    try {
> + server.executeBrowser("/appletAutoTests2.html", null, 
> (CountingClosingListener) null);
> +                    } catch (Exception ex) {
> +                        throw new RuntimeException(ex);
> +                    }
> +                }
> +                return false;
> +            }
> +        });
> +        Assert.assertTrue("stderr " + leRule.toPassingString(), 
> leRule.evaluate(pr.stderr));
> +        Assert.assertTrue("stdout " + 
> appleStartedRule.toPassingString(), appleStartedRule.evaluate(pr.stdout));
> +        Assert.assertFalse("stderr " + 
> AddShutdownHookTest.cnf.toFailingString(), 
> AddShutdownHookTest.cnf.evaluate(pr.stderr));
> +    }
> +
> +    @Test
> +    @TestInBrowsers(testIn = Browsers.one)
> +    public void TestAddShutdownHookWrong() throws Exception {
> +        ProcessResult pr = 
> server.executeBrowser("/AddShutdownHook_wrong.html", null, new 
> RulesFolowingClosingListener(leRule));
> +        Assert.assertTrue("stderr " + leRule.toPassingString(), 
> leRule.evaluate(pr.stderr));
> +        Assert.assertFalse("stderr " + 
> AddShutdownHookTest.cnf.toFailingString(), 
> AddShutdownHookTest.cnf.evaluate(pr.stderr));
> +    }
> +}

Otherwise looks good for HEAD. Maybe add a comment somewhere in the 
reproducer that says eg

"If this test has failed, you may try the following to reproduce the 
problem more consistently:
-    private static final int MAX_WORKERS = MAX_PARALLEL_INITS * 4;
-    private static final int PRIORITY_WORKERS = MAX_PARALLEL_INITS * 2;
+    private static final int MAX_WORKERS = MAX_PARALLEL_INITS * 2;
+    private static final int PRIORITY_WORKERS = MAX_PARALLEL_INITS * 1;
in PluginMessageConsumer.java"

-Adam



More information about the distro-pkg-dev mailing list