test/java/lang/Throwable/StackTraceSerialization.java

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 24,89 **** import java.io.*; import java.util.*; /* * @test ! * @bug 4202914 4363318 6991528 * @summary Basic test of serialization of stack trace information * @author Josh Bloch */ public class StackTraceSerialization { public static void main(String args[]) throws Exception { testWithSetStackTrace(); testWithFillInStackTrace(); } ! private static void testWithSetStackTrace() throws Exception { ! Throwable t = new Throwable(); ! t.setStackTrace(new StackTraceElement[] ! {new StackTraceElement("foo", "bar", "baz", -1)}); if (!equal(t, reconstitute(t))) ! throw new Exception("Unequal Throwables with set stacktrace"); } private static void assertEmptyStackTrace(Throwable t) { if (t.getStackTrace().length != 0) throw new AssertionError("Nonempty stacktrace."); } ! private static void testWithFillInStackTrace() throws Exception { Throwable original = null; try { a(); } catch(HighLevelException e) { original = e; } if (!equal(original, reconstitute(original))) ! throw new Exception("Unequal Throwables with filled-in stacktrace"); } - /** * Serialize the argument and return the deserialized result. */ ! private static Throwable reconstitute(Throwable t) throws Exception { Throwable result = null; - try(ByteArrayOutputStream bout = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(bout)) { out.writeObject(t); out.flush(); try(ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); ObjectInputStream in = new ObjectInputStream(bin)) { result = (Throwable) in.readObject(); } } - return result; } /** * Returns true if e1 and e2 have equal stack traces and their --- 24,126 ---- import java.io.*; import java.util.*; /* * @test ! * @bug 4202914 4363318 6991528 6998871 * @summary Basic test of serialization of stack trace information * @author Josh Bloch */ public class StackTraceSerialization { public static void main(String args[]) throws Exception { testWithSetStackTrace(); testWithFillInStackTrace(); } ! private static void testWithSetStackTrace() { ! StackTraceElement[] stackTrace = {new StackTraceElement("foo", "bar", "baz", -1)}; ! Throwable t = new TestThrowable(true, false); // Immutable and empty stack ! assertEmptyStackTrace(t); ! ! // Verify fillInStackTrace is now a no-op. ! t.fillInStackTrace(); ! assertEmptyStackTrace(t); ! ! // Verify setStackTrace is now a no-op. ! t.setStackTrace(stackTrace); ! assertEmptyStackTrace(t); ! ! // Verify null-handling ! try { ! t.setStackTrace(null); ! throw new RuntimeException("No NPE on a null stack trace."); ! } catch(NullPointerException npe) { ! assertEmptyStackTrace(t); ! } ! ! try { ! t.setStackTrace(new StackTraceElement[]{null}); ! throw new RuntimeException("No NPE on a null stack trace element."); ! } catch(NullPointerException npe) { ! assertEmptyStackTrace(t); ! } if (!equal(t, reconstitute(t))) ! throw new RuntimeException("Unequal Throwables with set stacktrace"); ! ! Throwable t2 = new Throwable(); ! t2.setStackTrace(stackTrace); ! if (!equal(t2, reconstitute(t2))) ! throw new RuntimeException("Unequal Throwables with set stacktrace"); ! ! } ! ! private static class TestThrowable extends Throwable { ! public TestThrowable(boolean enableSuppression, ! boolean writableStackTrace) { ! super("the medium", null, ! enableSuppression, ! writableStackTrace); ! } } private static void assertEmptyStackTrace(Throwable t) { if (t.getStackTrace().length != 0) throw new AssertionError("Nonempty stacktrace."); } ! private static void testWithFillInStackTrace() { Throwable original = null; try { a(); } catch(HighLevelException e) { original = e; } if (!equal(original, reconstitute(original))) ! throw new RuntimeException("Unequal Throwables with filled-in stacktrace"); } /** * Serialize the argument and return the deserialized result. */ ! private static Throwable reconstitute(Throwable t) { Throwable result = null; try(ByteArrayOutputStream bout = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(bout)) { out.writeObject(t); out.flush(); try(ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); ObjectInputStream in = new ObjectInputStream(bin)) { result = (Throwable) in.readObject(); } + } catch(IOException | ClassNotFoundException e) { + throw new RuntimeException(e); } return result; } /** * Returns true if e1 and e2 have equal stack traces and their