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

Jiri Vanek jvanek at redhat.com
Wed Feb 6 03:38:31 PST 2013


On 02/05/2013 06:32 PM, Adam Domurad wrote:
> 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.

Nope :(( On my old  f14 jdk6 it si hanging always, on my second 10.34.2.200 miraculous  machine it 
is always passing.

> - 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.

It it will START to fail then  we will at least know when this happened.   (well idea connected more 
to daily report then to anything else). Eg some of the freezing problems just occurred :/ And now 
after several month we have no idea when :(
I hope this test can track it.
>
> 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));
>> +    }
>> +}
>

Thanx for the nits, will be fixec.

> 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"

Great idea. Will do!

Still ok to push?
>
> -Adam




More information about the distro-pkg-dev mailing list