From 233190b05a83fd42cd61f5b561458a3a966f8152 Mon Sep 17 00:00:00 2001 From: Peter Thomas Date: Thu, 6 Jun 2024 17:28:45 +0530 Subject: [PATCH] simplify async extension hooks --- .../main/java/com/intuit/karate/Actions.java | 23 +---- .../com/intuit/karate/ScenarioActions.java | 44 +--------- .../java/com/intuit/karate/core/Channel.java | 15 ++-- .../intuit/karate/core/ChannelSession.java | 32 ------- .../intuit/karate/core/ScenarioBridge.java | 57 ++++--------- .../intuit/karate/core/ScenarioEngine.java | 85 +++++-------------- .../karate/http/HttpRequestBuilder.java | 27 ------ 7 files changed, 50 insertions(+), 233 deletions(-) delete mode 100644 karate-core/src/main/java/com/intuit/karate/core/ChannelSession.java diff --git a/karate-core/src/main/java/com/intuit/karate/Actions.java b/karate-core/src/main/java/com/intuit/karate/Actions.java index 2379ec072..e731a5dbd 100644 --- a/karate-core/src/main/java/com/intuit/karate/Actions.java +++ b/karate-core/src/main/java/com/intuit/karate/Actions.java @@ -27,7 +27,6 @@ import java.util.Map; /** - * * @author pthomas3 */ public interface Actions { @@ -45,7 +44,7 @@ public interface Actions { void callonce(String line); void csv(String name, String exp); - + void csvDocString(String name, String exp); void json(String name, String exp); @@ -79,7 +78,7 @@ public interface Actions { void eval(String name, String dotOrParen, String exp); void evalIf(String exp); - + void evalDelete(String exp); void formField(String name, String exp); @@ -114,7 +113,7 @@ public interface Actions { void path(String exp); - void print(String exp); + void print(String exp); void remove(String name, String path); @@ -143,7 +142,7 @@ public interface Actions { void url(String exp); void yaml(String name, String exp); - + void yamlDocString(String name, String exp); void doc(String exp); @@ -155,19 +154,5 @@ public interface Actions { void driver(String exp); void robot(String exp); - - void produce(String type); - - void register(String exp); - - void schema(String exp); - - void topic(String exp); - - void key(String exp); - - void value(String exp); - - void valueDocString(String exp); } diff --git a/karate-core/src/main/java/com/intuit/karate/ScenarioActions.java b/karate-core/src/main/java/com/intuit/karate/ScenarioActions.java index 91ad3e733..b136e4319 100644 --- a/karate-core/src/main/java/com/intuit/karate/ScenarioActions.java +++ b/karate-core/src/main/java/com/intuit/karate/ScenarioActions.java @@ -26,11 +26,11 @@ import com.intuit.karate.core.AssignType; import com.intuit.karate.core.ScenarioEngine; import com.intuit.karate.core.When; + import java.util.List; import java.util.Map; /** - * * @author pthomas3 */ public class ScenarioActions implements Actions { @@ -415,46 +415,4 @@ public void robot(String exp) { engine.robot(exp); } - @Override - @When("^produce (.+)") - public void produce(String type) { - engine.produce(type); - } - - @Override - @When("^register (.+)") - public void register(String exp) { - engine.register(exp); - } - - @Override - @When("^schema (.+)") - public void schema(String exp) { - engine.schema(exp); - } - - @Override - @When("^topic (.+)") - public void topic(String exp) { - engine.topic(exp); - } - - @Override - @When("^key (.+)") - public void key(String exp) { - engine.key(exp); - } - - @Override - @When("^value (.+)") - public void value(String exp) { - engine.value(exp); - } - - @Override - @When("^value$") - public void valueDocString(String exp) { - engine.value(exp); - } - } diff --git a/karate-core/src/main/java/com/intuit/karate/core/Channel.java b/karate-core/src/main/java/com/intuit/karate/core/Channel.java index 2abee7c54..0bf7deff7 100644 --- a/karate-core/src/main/java/com/intuit/karate/core/Channel.java +++ b/karate-core/src/main/java/com/intuit/karate/core/Channel.java @@ -23,18 +23,13 @@ */ package com.intuit.karate.core; -import java.util.Map; - /** - * * @author peter */ public interface Channel { - - void produce(ScenarioRuntime runtime); - - ChannelSession consume(ScenarioRuntime runtime); - - void register(ScenarioRuntime runtime, Map data); - + + Object init(ScenarioRuntime runtime); + + void afterScenario(); + } diff --git a/karate-core/src/main/java/com/intuit/karate/core/ChannelSession.java b/karate-core/src/main/java/com/intuit/karate/core/ChannelSession.java deleted file mode 100644 index 650583cfa..000000000 --- a/karate-core/src/main/java/com/intuit/karate/core/ChannelSession.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * The MIT License - * - * Copyright 2023 Karate Labs Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.intuit.karate.core; - -/** - * - * @author peter - */ -public interface ChannelSession { - -} diff --git a/karate-core/src/main/java/com/intuit/karate/core/ScenarioBridge.java b/karate-core/src/main/java/com/intuit/karate/core/ScenarioBridge.java index 039adda20..19d3a4dd6 100644 --- a/karate-core/src/main/java/com/intuit/karate/core/ScenarioBridge.java +++ b/karate-core/src/main/java/com/intuit/karate/core/ScenarioBridge.java @@ -23,50 +23,22 @@ */ package com.intuit.karate.core; -import com.intuit.karate.FileUtils; -import com.intuit.karate.Json; -import com.intuit.karate.JsonUtils; -import com.intuit.karate.KarateException; -import com.intuit.karate.Logger; -import com.intuit.karate.Match; -import com.intuit.karate.MatchStep; -import com.intuit.karate.PerfContext; -import com.intuit.karate.StringUtils; -import com.intuit.karate.XmlUtils; -import com.intuit.karate.graal.JsEngine; -import com.intuit.karate.graal.JsFunction; -import com.intuit.karate.graal.JsLambda; -import com.intuit.karate.graal.JsList; -import com.intuit.karate.graal.JsMap; -import com.intuit.karate.graal.JsValue; -import com.intuit.karate.http.HttpClient; -import com.intuit.karate.http.HttpRequest; -import com.intuit.karate.http.HttpRequestBuilder; -import com.intuit.karate.http.ResourceType; -import com.intuit.karate.http.WebSocketClient; -import com.intuit.karate.http.WebSocketOptions; +import com.intuit.karate.*; +import com.intuit.karate.graal.*; +import com.intuit.karate.http.*; import com.intuit.karate.shell.Command; +import org.graalvm.polyglot.Value; + import java.io.File; import java.io.InputStream; import java.net.URLDecoder; import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; +import java.util.*; import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.graalvm.polyglot.Value; -import org.graalvm.polyglot.proxy.ProxyExecutable; /** - * * @author pthomas3 */ public class ScenarioBridge implements PerfContext { @@ -276,6 +248,10 @@ public void capturePerfEvent(String name, long startTime, long endTime) { getEngine().capturePerfEvent(event); } + public Object channel(String type) { + return getEngine().channelSession(type); + } + public Object compareImage(Object baseline, Object latest, Value... optionsVal) { if (optionsVal.length > 0 && !optionsVal[0].hasMembers()) { throw new RuntimeException("invalid image comparison options: expected map"); @@ -299,9 +275,10 @@ public Object compareImage(Object baseline, Object latest, Value... optionsVal) public void configure(String key, Value value) { getEngine().configure(key, new Variable(value)); } - + public Object consume(String type) { - return getEngine().consume(type); + getEngine().logger.warn("karate.consume() is deprecated, use karate.channel() instead"); + return channel(type); } public Object distinct(Value o) { @@ -1012,15 +989,15 @@ public String toCsv(Object o) { public Object toJava(Value value) { return new JsValue(value).getValue(); - } + } public File toJavaFile(String path) { return getEngine().fileReader.toResource(path).getFile(); } - + public Object toJs(Object value) { return JsValue.fromJava(value); - } + } public Object toJson(Value value) { return toJson(value, false); @@ -1134,7 +1111,7 @@ public WebSocketClient webSocketBinary(String url, Value listener, Value value) options.setBinaryHandler(handler); return engine.webSocket(options); } - + public Object wrapFunction(Value value) { if (value.isProxyObject()) { Object o = value.asProxyObject(); 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 019df8b3e..24c18be84 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 @@ -23,22 +23,13 @@ */ package com.intuit.karate.core; -import com.intuit.karate.ImageComparison; -import com.intuit.karate.FileUtils; -import com.intuit.karate.Json; -import com.intuit.karate.JsonUtils; -import com.intuit.karate.KarateException; -import com.intuit.karate.Logger; -import com.intuit.karate.Match; -import com.intuit.karate.RuntimeHook; -import com.intuit.karate.StringUtils; -import com.intuit.karate.XmlUtils; +import com.intuit.karate.*; import com.intuit.karate.driver.Driver; import com.intuit.karate.driver.DriverOptions; import com.intuit.karate.driver.Key; import com.intuit.karate.graal.JsEngine; -import com.intuit.karate.graal.JsLambda; import com.intuit.karate.graal.JsFunction; +import com.intuit.karate.graal.JsLambda; import com.intuit.karate.graal.JsValue; import com.intuit.karate.http.*; import com.intuit.karate.resource.Resource; @@ -49,11 +40,9 @@ import com.intuit.karate.template.TemplateUtils; import com.jayway.jsonpath.PathNotFoundException; import org.graalvm.polyglot.Value; -import org.w3c.dom.Attr; -import org.w3c.dom.Document; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; +import org.graalvm.polyglot.proxy.ProxyExecutable; +import org.slf4j.LoggerFactory; +import org.w3c.dom.*; import java.io.File; import java.io.InputStream; @@ -68,11 +57,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.graalvm.polyglot.proxy.ProxyExecutable; -import org.slf4j.LoggerFactory; - /** - * * @author pthomas3 */ public class ScenarioEngine { @@ -491,7 +476,7 @@ private void multiPartInternal(String name, Object value) { if (name != null) { map.put("name", name); } - if(value instanceof Number) { + if (value instanceof Number) { value = value.toString(); } if (value instanceof Map) { @@ -740,6 +725,8 @@ public KeyStore getKeyStore(String trustStoreFile, String password, String type) // non-http ================================================================ // + List channels; + private static String getFactory(String channelType) { switch (channelType) { case Config.KAFKA: @@ -754,14 +741,19 @@ private static String getFactory(String channelType) { throw new RuntimeException("unknown channel type: " + channelType); } } - - private Channel channel(String type) { + + protected Object channelSession(String type) { String factoryClass = getFactory(type); try { - Class clazz = Class.forName(factoryClass); + Class clazz = Class.forName(factoryClass); ChannelFactory factory = (ChannelFactory) clazz.getDeclaredConstructor().newInstance(); Map options = config.getCustomOptions().get(type); - return factory.create(runtime, options); + Channel channel = factory.create(runtime, options); + if (channels == null) { + channels = new ArrayList<>(); + } + channels.add(channel); + return channel.init(this.runtime); } catch (KarateException ke) { throw ke; } catch (Exception e) { @@ -773,44 +765,8 @@ private Channel channel(String type) { } logger.error(message); throw new RuntimeException(message, e); - } - } - - public void produce(String type) { - Channel channel = channel(type); - channel.produce(runtime); - } - - public ChannelSession consume(String type) { - Channel channel = channel(type); - return channel.consume(runtime); - } - - public void register(String expression) { - Variable v = evalKarateExpression(expression); - Channel channel = channel("kafka"); - Map map = v.getValue(); - channel.register(runtime, map); - } - - public void schema(String exp) { - Variable v = evalKarateExpression(exp); - requestBuilder.setSchema(v.getAsString()); - } - - public void topic(String exp) { - Variable v = evalKarateExpression(exp); - requestBuilder.setTopic(v.getAsString()); + } } - - public void key(String exp) { - Variable v = evalKarateExpression(exp); - requestBuilder.setKey(v.getAsString()); - } - - public void value(String exp) { - request(exp); - } // http mock =============================================================== // @@ -1068,6 +1024,11 @@ public void stop(StepResult lastStepResult) { if (robot != null) { robot.afterScenario(); } + if (channels != null) { + for (Channel channel : channels) { + channel.afterScenario(); + } + } } } diff --git a/karate-core/src/main/java/com/intuit/karate/http/HttpRequestBuilder.java b/karate-core/src/main/java/com/intuit/karate/http/HttpRequestBuilder.java index bd10278a7..d8322c384 100644 --- a/karate-core/src/main/java/com/intuit/karate/http/HttpRequestBuilder.java +++ b/karate-core/src/main/java/com/intuit/karate/http/HttpRequestBuilder.java @@ -94,9 +94,6 @@ public class HttpRequestBuilder implements ProxyObject { private String url; private String method; - private String topic; - private String key; - private String schema; private List paths; private Map> params; private Map> headers; @@ -282,30 +279,6 @@ public List getPaths() { return paths; } - public void setSchema(String schema) { - this.schema = schema; - } - - public String getSchema() { - return schema; - } - - public String getTopic() { - return topic; - } - - public void setTopic(String topic) { - this.topic = topic; - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - public Object getBody() { return body; }