diff --git a/src/jdk.jshell/share/classes/jdk/jshell/execution/FailOverExecutionControlProvider.java b/src/jdk.jshell/share/classes/jdk/jshell/execution/FailOverExecutionControlProvider.java index 890306c2fcc..6d3e5cc03f0 100644 --- a/src/jdk.jshell/share/classes/jdk/jshell/execution/FailOverExecutionControlProvider.java +++ b/src/jdk.jshell/share/classes/jdk/jshell/execution/FailOverExecutionControlProvider.java @@ -96,6 +96,8 @@ public Map defaultParameters() { public ExecutionControl generate(ExecutionEnv env, Map parameters) throws Throwable { Throwable thrown = null; + StringWriter dumpsw = new StringWriter(); + PrintWriter dump = new PrintWriter(dumpsw); for (int i = 0; i <= 9; ++i) { String param = parameters.get("" + i); if (param != null && !param.isEmpty()) { @@ -115,10 +117,17 @@ public ExecutionControl generate(ExecutionEnv env, Map parameter ex.printStackTrace(log); log.flush(); logger().fine(writer.toString()); - // only care about the first, and only if they all fail - if (thrown == null) { - thrown = ex; + // if they all fail, use the last as cause and include info about prior in message + dump.printf("FailOverExecutionControlProvider: FAILED: %d:%s --%n", i, param); + dump.printf(" Exception: %s%n", ex); + var st = ex.getStackTrace(); + for (int k = 0; k < 5 && k < st.length; ++k) { + dump.printf(" %s%n", st[k]); } + if (ex.getCause() != null) { + dump.printf(" cause: %s%n", ex.getCause()); + } + thrown = ex; } } @@ -127,7 +136,7 @@ public ExecutionControl generate(ExecutionEnv env, Map parameter if (thrown == null) { throw new IllegalArgumentException("All least one parameter must be set to a provider."); } - throw thrown; + throw new RuntimeException(dumpsw.toString(), thrown); } private Logger logger() { diff --git a/test/langtools/jdk/jshell/ExecutionControlTestBase.java b/test/langtools/jdk/jshell/ExecutionControlTestBase.java index 6bf5a55fb72..201150797f5 100644 --- a/test/langtools/jdk/jshell/ExecutionControlTestBase.java +++ b/test/langtools/jdk/jshell/ExecutionControlTestBase.java @@ -25,12 +25,30 @@ import org.testng.annotations.Test; import jdk.jshell.VarSnippet; +import java.net.InetAddress; import static jdk.jshell.Snippet.Status.VALID; import static jdk.jshell.Snippet.SubKind.*; public class ExecutionControlTestBase extends KullaTesting { + String standardListenSpec() { + String loopback = InetAddress.getLoopbackAddress().getHostAddress(); + return "jdi:hostname(" + loopback + ")"; + } + + String standardLaunchSpec() { + return "jdi:launch(true)"; + } + + String standardJdiSpec() { + return "jdi"; + } + + String standardSpecs() { + return "5(" + standardListenSpec() + "), 6(" + standardLaunchSpec() + "), 7(" + standardJdiSpec() + ")"; + } + @Test public void classesDeclaration() { assertEval("interface A { }"); diff --git a/test/langtools/jdk/jshell/FailOverDirectExecutionControlTest.java b/test/langtools/jdk/jshell/FailOverDirectExecutionControlTest.java index 4f6700927a3..da838798f8e 100644 --- a/test/langtools/jdk/jshell/FailOverDirectExecutionControlTest.java +++ b/test/langtools/jdk/jshell/FailOverDirectExecutionControlTest.java @@ -129,7 +129,9 @@ public void setUp() { Map pm = provider.defaultParameters(); pm.put("0", "alwaysFailing"); pm.put("1", "alwaysFailing"); - pm.put("2", "jdi"); + pm.put("2", standardListenSpec()); + pm.put("3", standardLaunchSpec()); + pm.put("4", standardJdiSpec()); setUp(builder -> builder.executionEngine(provider, pm)); } @@ -156,6 +158,10 @@ public void variables() { assertTrue(log.contains("Failure failover -- 1 = alwaysFailing"), log); assertTrue(log.contains("This operation intentionally broken"), log); log = logged.get(Level.FINEST).get(0); - assertTrue(log.contains("Success failover -- 2 = jdi"), log); + assertTrue( + log.contains("Success failover -- 2 = " + standardListenSpec()) + || log.contains("Success failover -- 3 = " + standardLaunchSpec()) + || log.contains("Success failover -- 4 = " + standardJdiSpec()), + log); } } diff --git a/test/langtools/jdk/jshell/FailOverExecutionControlDyingLaunchTest.java b/test/langtools/jdk/jshell/FailOverExecutionControlDyingLaunchTest.java index 0cc828a01d3..f3218fab7c7 100644 --- a/test/langtools/jdk/jshell/FailOverExecutionControlDyingLaunchTest.java +++ b/test/langtools/jdk/jshell/FailOverExecutionControlDyingLaunchTest.java @@ -42,6 +42,7 @@ public class FailOverExecutionControlDyingLaunchTest extends ExecutionControlTes @Override public void setUp() { setUp(builder -> builder.executionEngine( - "failover:0(jdi:remoteAgent(DyingRemoteAgent),launch(true)), 4(jdi:launch(true))")); + "failover:0(jdi:remoteAgent(DyingRemoteAgent),launch(true)), " + + standardSpecs())); } } diff --git a/test/langtools/jdk/jshell/FailOverExecutionControlHangingLaunchTest.java b/test/langtools/jdk/jshell/FailOverExecutionControlHangingLaunchTest.java index 852f891f8c1..778d004915c 100644 --- a/test/langtools/jdk/jshell/FailOverExecutionControlHangingLaunchTest.java +++ b/test/langtools/jdk/jshell/FailOverExecutionControlHangingLaunchTest.java @@ -41,6 +41,7 @@ public class FailOverExecutionControlHangingLaunchTest extends ExecutionControlT @Override public void setUp() { setUp(builder -> builder.executionEngine( - "failover:0(jdi:remoteAgent(HangingRemoteAgent),launch(true)), 1(jdi:launch(true))")); + "failover:0(jdi:remoteAgent(HangingRemoteAgent),launch(true)), " + + standardSpecs())); } } diff --git a/test/langtools/jdk/jshell/FailOverExecutionControlHangingListenTest.java b/test/langtools/jdk/jshell/FailOverExecutionControlHangingListenTest.java index 8c0131df288..f22dd821f40 100644 --- a/test/langtools/jdk/jshell/FailOverExecutionControlHangingListenTest.java +++ b/test/langtools/jdk/jshell/FailOverExecutionControlHangingListenTest.java @@ -45,6 +45,6 @@ public void setUp() { String loopback = InetAddress.getLoopbackAddress().getHostAddress(); setUp(builder -> builder.executionEngine( "failover:0(jdi:remoteAgent(HangingRemoteAgent),hostname(" + loopback + "))," - + "1(jdi:hostname(" + loopback + "))")); + + standardSpecs())); } } diff --git a/test/langtools/jdk/jshell/FailOverExecutionControlTest.java b/test/langtools/jdk/jshell/FailOverExecutionControlTest.java index b3f140adc9d..0843351815f 100644 --- a/test/langtools/jdk/jshell/FailOverExecutionControlTest.java +++ b/test/langtools/jdk/jshell/FailOverExecutionControlTest.java @@ -40,7 +40,8 @@ public class FailOverExecutionControlTest extends ExecutionControlTestBase { @BeforeMethod @Override public void setUp() { - setUp(builder -> builder.executionEngine("failover:0(nonExistent), 1(nonExistent), 2(jdi:launch(true))")); + setUp(builder -> builder.executionEngine("failover:0(expectedFailureNonExistent1), 1(expectedFailureNonExistent2), " + + standardSpecs())); } }