Mercurial > hg > release > icedtea6-1.8
changeset 1876:55c898e59858
Fix for Sun bug: 6829636: test case correction
test/java/util/logging/loggingdeadlock2.java
author | ptisnovs |
---|---|
date | Wed, 03 Feb 2010 13:30:49 +0100 |
parents | f8d8f6b0a1fd |
children | c399b5cbbbaf |
files | ChangeLog Makefile.am patches/icedtea-6829636-loggingdeadlock2.patch |
diffstat | 3 files changed, 258 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Tue Feb 02 16:21:26 2010 -0500 +++ b/ChangeLog Wed Feb 03 13:30:49 2010 +0100 @@ -1,3 +1,10 @@ +2010-02-03 Pavel Tisnovsky <ptisnovs@redhat.com> + + * Makefile.am: Add new patch. + * patches/icedtea-6829636-loggingdeadlock2.patch + Fix for Sun bug: 6829636: test case correction + test/java/util/logging/loggingdeadlock2.java + 2010-02-02 Deepak Bhole <dbhole@redhat.com> * plugin/tests/LiveConnect/PluginTest.java
--- a/Makefile.am Tue Feb 02 16:21:26 2010 -0500 +++ b/Makefile.am Wed Feb 03 13:30:49 2010 +0100 @@ -313,7 +313,8 @@ patches/icedtea-6920143-using-with-mouse.patch \ patches/icedtea-6920172-location-relative-to-test.patch \ patches/icedtea-6920172-turkish.patch \ - patches/icedtea-6912628-turkcert.patch + patches/icedtea-6912628-turkcert.patch \ + patches/icedtea-6829636-loggingdeadlock2.patch if WITH_RHINO ICEDTEA_PATCHES += \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/patches/icedtea-6829636-loggingdeadlock2.patch Wed Feb 03 13:30:49 2010 +0100 @@ -0,0 +1,249 @@ +6829636: test/java/util/logging/LoggingDeadlock2.java is flaky +Fixes created by mchung and martin + +--- openjdk.orig/jdk/test/java/util/logging/LoggingDeadlock2.java Fri Jan 30 16:27:33 2009 -0800 ++++ openjdk/jdk/test/java/util/logging/LoggingDeadlock2.java Fri Dec 04 23:11:11 2009 +0000 +@@ -23,10 +23,10 @@ + + /* + * @test +- * @bug 6467152 ++ * @bug 6467152 6716076 6829503 + * + * @summary deadlock occurs in LogManager initialization and JVM termination +- * @author Serguei Spitsyn / Hittachi ++ * @author Serguei Spitsyn / Hittachi / Martin Buchholz + * + * @build LoggingDeadlock2 + * @run main/timeout=15 LoggingDeadlock2 +@@ -47,43 +47,195 @@ + * This is a regression test for this bug. + */ + ++import java.util.Arrays; ++import java.util.List; ++import java.util.Random; ++import java.util.concurrent.CyclicBarrier; ++import java.util.concurrent.atomic.AtomicInteger; + import java.util.logging.LogManager; +- +-public class LoggingDeadlock2 implements Runnable { +- static final java.io.PrintStream out = System.out; +- static Object lock = new Object(); +- static int c = 0; +- public static void main(String arg[]) { +- out.println("\nThis test checks that there is no deadlock."); +- out.println("If not crashed or timed-out then it is passed."); ++import java.io.File; ++import java.io.InputStream; ++import java.io.InputStreamReader; ++import java.io.Reader; ++ ++public class LoggingDeadlock2 { ++ ++ public static void realMain(String arg[]) throws Throwable { + try { +- new Thread(new LoggingDeadlock2()).start(); +- synchronized(lock) { +- c++; +- if (c == 2) lock.notify(); +- else lock.wait(); ++ System.out.println(javaChildArgs); ++ ProcessBuilder pb = new ProcessBuilder(javaChildArgs); ++ ProcessResults r = run(pb.start()); ++ equal(r.exitValue(), 99); ++ equal(r.out(), ""); ++ equal(r.err(), ""); ++ } catch (Throwable t) { unexpected(t); } ++ } ++ ++ public static class JavaChild { ++ public static void main(String args[]) throws Throwable { ++ final CyclicBarrier startingGate = new CyclicBarrier(2); ++ final Throwable[] thrown = new Throwable[1]; ++ ++ // Some random variation, to help tickle races. ++ final Random rnd = new Random(); ++ final boolean dojoin = rnd.nextBoolean(); ++ final int JITTER = 1024; ++ final int iters1 = rnd.nextInt(JITTER); ++ final int iters2 = JITTER - iters1; ++ final AtomicInteger counter = new AtomicInteger(0); ++ ++ Thread exiter = new Thread() { ++ public void run() { ++ try { ++ startingGate.await(); ++ for (int i = 0; i < iters1; i++) ++ counter.getAndIncrement(); ++ System.exit(99); ++ } catch (Throwable t) { ++ t.printStackTrace(); ++ System.exit(86); ++ } ++ }}; ++ exiter.start(); ++ ++ startingGate.await(); ++ for (int i = 0; i < iters2; i++) ++ counter.getAndIncrement(); ++ // This may or may not result in a first call to ++ // Runtime.addShutdownHook after shutdown has already ++ // commenced. ++ LogManager log = LogManager.getLogManager(); ++ ++ if (dojoin) { ++ exiter.join(); ++ if (thrown[0] != null) ++ throw new Error(thrown[0]); ++ check(counter.get() == JITTER); + } +- LogManager log = LogManager.getLogManager(); +- out.println("Test passed"); +- } +- catch(Exception e) { +- e.printStackTrace(); +- out.println("Test FAILED"); // Not expected +- } +- } +- +- public void run() { ++ } ++ } ++ ++ //---------------------------------------------------------------- ++ // The rest of this test is copied from ProcessBuilder/Basic.java ++ //---------------------------------------------------------------- ++ private static final String javaExe = ++ System.getProperty("java.home") + ++ File.separator + "bin" + File.separator + "java"; ++ ++ private static final String classpath = ++ System.getProperty("java.class.path"); ++ ++ private static final List<String> javaChildArgs = ++ Arrays.asList(new String[] ++ { javaExe, "-classpath", classpath, ++ "LoggingDeadlock2$JavaChild"}); ++ ++ private static class ProcessResults { ++ private final String out; ++ private final String err; ++ private final int exitValue; ++ private final Throwable throwable; ++ ++ public ProcessResults(String out, ++ String err, ++ int exitValue, ++ Throwable throwable) { ++ this.out = out; ++ this.err = err; ++ this.exitValue = exitValue; ++ this.throwable = throwable; ++ } ++ ++ public String out() { return out; } ++ public String err() { return err; } ++ public int exitValue() { return exitValue; } ++ public Throwable throwable() { return throwable; } ++ ++ public String toString() { ++ StringBuilder sb = new StringBuilder(); ++ sb.append("<STDOUT>\n" + out() + "</STDOUT>\n") ++ .append("<STDERR>\n" + err() + "</STDERR>\n") ++ .append("exitValue = " + exitValue + "\n"); ++ if (throwable != null) ++ sb.append(throwable.getStackTrace()); ++ return sb.toString(); ++ } ++ } ++ ++ private static class StreamAccumulator extends Thread { ++ private final InputStream is; ++ private final StringBuilder sb = new StringBuilder(); ++ private Throwable throwable = null; ++ ++ public String result () throws Throwable { ++ if (throwable != null) ++ throw throwable; ++ return sb.toString(); ++ } ++ ++ StreamAccumulator (InputStream is) { ++ this.is = is; ++ } ++ ++ public void run() { ++ try { ++ Reader r = new InputStreamReader(is); ++ char[] buf = new char[4096]; ++ int n; ++ while ((n = r.read(buf)) > 0) { ++ sb.append(buf,0,n); ++ } ++ } catch (Throwable t) { ++ throwable = t; ++ } finally { ++ try { is.close(); } ++ catch (Throwable t) { throwable = t; } ++ } ++ } ++ } ++ ++ private static ProcessResults run(Process p) { ++ Throwable throwable = null; ++ int exitValue = -1; ++ String out = ""; ++ String err = ""; ++ ++ StreamAccumulator outAccumulator = ++ new StreamAccumulator(p.getInputStream()); ++ StreamAccumulator errAccumulator = ++ new StreamAccumulator(p.getErrorStream()); ++ + try { +- synchronized(lock) { +- c++; +- if (c == 2) lock.notify(); +- else lock.wait(); +- } +- System.exit(1); +- } +- catch(Exception e) { +- e.printStackTrace(); +- out.println("Test FAILED"); // Not expected +- } +- } ++ outAccumulator.start(); ++ errAccumulator.start(); ++ ++ exitValue = p.waitFor(); ++ ++ outAccumulator.join(); ++ errAccumulator.join(); ++ ++ out = outAccumulator.result(); ++ err = errAccumulator.result(); ++ } catch (Throwable t) { ++ throwable = t; ++ } ++ ++ return new ProcessResults(out, err, exitValue, throwable); ++ } ++ ++ //--------------------- Infrastructure --------------------------- ++ static volatile int passed = 0, failed = 0; ++ static void pass() {passed++;} ++ static void fail() {failed++; Thread.dumpStack();} ++ static void fail(String msg) {System.out.println(msg); fail();} ++ static void unexpected(Throwable t) {failed++; t.printStackTrace();} ++ static void check(boolean cond) {if (cond) pass(); else fail();} ++ static void check(boolean cond, String m) {if (cond) pass(); else fail(m);} ++ static void equal(Object x, Object y) { ++ if (x == null ? y == null : x.equals(y)) pass(); ++ else fail(x + " not equal to " + y);} ++ public static void main(String[] args) throws Throwable { ++ try {realMain(args);} catch (Throwable t) {unexpected(t);} ++ System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); ++ if (failed > 0) throw new AssertionError("Some tests failed");} + }