diff --git a/karate-core/src/main/java/com/intuit/karate/core/ScenarioEngine.java b/karate-core/src/main/java/com/intuit/karate/core/ScenarioEngine.java index 2726042cd..0311b1e5a 100644 --- a/karate-core/src/main/java/com/intuit/karate/core/ScenarioEngine.java +++ b/karate-core/src/main/java/com/intuit/karate/core/ScenarioEngine.java @@ -1256,7 +1256,7 @@ private JsValue executeJsValue(Value function, Object... args) { return JS.execute(function, args); } catch (Exception e) { String jsSource = function.getSourceLocation().getCharacters().toString(); - KarateException ke = JsEngine.fromJsEvalException(jsSource, e); + KarateException ke = JsEngine.fromJsEvalException(jsSource, e, null); setFailedReason(ke); throw ke; } @@ -1266,7 +1266,7 @@ public Variable evalJs(String js) { try { return new Variable(JS.eval(js)); } catch (Exception e) { - KarateException ke = JsEngine.fromJsEvalException(js, e); + KarateException ke = JsEngine.fromJsEvalException(js, e, null); setFailedReason(ke); throw ke; } diff --git a/karate-core/src/main/java/com/intuit/karate/core/ScenarioRuntime.java b/karate-core/src/main/java/com/intuit/karate/core/ScenarioRuntime.java index b5192ce2a..322215872 100644 --- a/karate-core/src/main/java/com/intuit/karate/core/ScenarioRuntime.java +++ b/karate-core/src/main/java/com/intuit/karate/core/ScenarioRuntime.java @@ -30,6 +30,7 @@ import com.intuit.karate.RuntimeHook; import com.intuit.karate.ScenarioActions; import com.intuit.karate.debug.DebugThread; +import com.intuit.karate.graal.JsEngine; import com.intuit.karate.http.ResourceType; import com.intuit.karate.shell.StringLogAppender; @@ -293,8 +294,8 @@ private void evalConfigJs(String js, String displayName) { Map map = engine.getOrEvalAsMap(fun); engine.setVariables(map); } catch (Exception e) { - String message = scenario.getDebugInfo() + "\n" + displayName + "\n" + e.getMessage(); - error = new KarateException(message, e); + String message = ">> " + scenario.getDebugInfo() + "\n>> " + displayName + " failed\n>> " + e.getMessage(); + error = JsEngine.fromJsEvalException(js, e, message); stopped = true; configFailed = true; } diff --git a/karate-core/src/main/java/com/intuit/karate/graal/JsEngine.java b/karate-core/src/main/java/com/intuit/karate/graal/JsEngine.java index adb23d5cc..78eb2097a 100644 --- a/karate-core/src/main/java/com/intuit/karate/graal/JsEngine.java +++ b/karate-core/src/main/java/com/intuit/karate/graal/JsEngine.java @@ -202,11 +202,14 @@ public Value evalWith(Set names, Function getVariable, S return function.execute(JsValue.fromJava(arg)); } - public static KarateException fromJsEvalException(String js, Exception e) { + public static KarateException fromJsEvalException(String js, Exception e, String message) { // do our best to make js error traces informative, else thrown exception seems to // get swallowed by the java reflection based method invoke flow StackTraceElement[] stack = e.getStackTrace(); StringBuilder sb = new StringBuilder(); + if (message != null) { + sb.append(message).append('\n'); + } sb.append(">>>> js failed:\n"); List lines = StringUtils.toStringLines(js); int index = 0; @@ -221,7 +224,7 @@ public static KarateException fromJsEvalException(String js, Exception e) { if (line.startsWith("") || i > 5) { break; } - } + } return new KarateException(sb.toString()); } diff --git a/karate-core/src/main/java/com/intuit/karate/template/KarateEngineContext.java b/karate-core/src/main/java/com/intuit/karate/template/KarateEngineContext.java index 401122104..d75f5890f 100644 --- a/karate-core/src/main/java/com/intuit/karate/template/KarateEngineContext.java +++ b/karate-core/src/main/java/com/intuit/karate/template/KarateEngineContext.java @@ -87,7 +87,7 @@ public JsValue evalGlobal(String src) { try { return jsEngine.eval(src); } catch (Exception e) { - throw JsEngine.fromJsEvalException(src, e); + throw JsEngine.fromJsEvalException(src, e, null); } } @@ -96,7 +96,7 @@ public JsValue evalLocal(String src, boolean returnValue) { Value value = jsEngine.evalWith(getVariableNames(), this::getVariable, src, returnValue); return new JsValue(value); } catch (Exception e) { - throw JsEngine.fromJsEvalException(src, e); + throw JsEngine.fromJsEvalException(src, e, null); } } diff --git a/karate-core/src/test/java/com/intuit/karate/core/parajava/ParallelJavaTest.java b/karate-core/src/test/java/com/intuit/karate/core/parajava/ParallelJavaTest.java new file mode 100644 index 000000000..591009230 --- /dev/null +++ b/karate-core/src/test/java/com/intuit/karate/core/parajava/ParallelJavaTest.java @@ -0,0 +1,19 @@ +package com.intuit.karate.core.parajava; + +import com.intuit.karate.Results; +import com.intuit.karate.Runner; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ParallelJavaTest { + + // @Test + public void testParallel() { + Results results = Runner.path("classpath:com/intuit/karate/core/parajava/parallel-java.feature") + .configDir("classpath:com/intuit/karate/core/parajava") + .parallel(5); + assertEquals(0, results.getFailCount(), results.getErrorMessages()); + } + +} diff --git a/karate-core/src/test/java/com/intuit/karate/core/parajava/karate-config.js b/karate-core/src/test/java/com/intuit/karate/core/parajava/karate-config.js new file mode 100644 index 000000000..0ccad3062 --- /dev/null +++ b/karate-core/src/test/java/com/intuit/karate/core/parajava/karate-config.js @@ -0,0 +1,3 @@ +function karateConfig() { + return karate.callSingle('setup.feature'); +} \ No newline at end of file diff --git a/karate-core/src/test/java/com/intuit/karate/core/parajava/parallel-java.feature b/karate-core/src/test/java/com/intuit/karate/core/parajava/parallel-java.feature new file mode 100644 index 000000000..b839487c8 --- /dev/null +++ b/karate-core/src/test/java/com/intuit/karate/core/parajava/parallel-java.feature @@ -0,0 +1,7 @@ +Feature: + +Scenario: test 1 +* match Hello.sayHello("foo") == "hello foo" + +Scenario: test 2 +* match Hello.sayHello("foo") == "hello foo" diff --git a/karate-core/src/test/java/com/intuit/karate/core/parajava/setup.feature b/karate-core/src/test/java/com/intuit/karate/core/parajava/setup.feature new file mode 100644 index 000000000..0b1ec58b9 --- /dev/null +++ b/karate-core/src/test/java/com/intuit/karate/core/parajava/setup.feature @@ -0,0 +1,5 @@ +@ignore +Feature: + +Scenario: +* def Hello = Java.type('com.intuit.karate.core.parallel.Hello')