diff --git a/CHANGELOG.md b/CHANGELOG.md index eb4dcaabb..955c0ab04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). ## [Unreleased] - +- Ugrade to Vert.x 3.7.1 +- Avoid calling graaljs APIs from the EventBus codec +- Global log formatter used across graal and vert.x +- Fixed EventBus codec for Graal objects +- Removed Nashorn +- Update to Graal 19.0.0 - Verticle events are now triggered from the `process.on` event emitter. - Updated to Graal rc16 - Removed `es4x-cli` as it has been replaced with `es4x-pm` diff --git a/codegen/src/main/java/io/reactiverse/es4x/codegen/generator/IndexDTS.java b/codegen/src/main/java/io/reactiverse/es4x/codegen/generator/IndexDTS.java index 4f1a5c627..190866dbd 100644 --- a/codegen/src/main/java/io/reactiverse/es4x/codegen/generator/IndexDTS.java +++ b/codegen/src/main/java/io/reactiverse/es4x/codegen/generator/IndexDTS.java @@ -111,9 +111,9 @@ public String render(ClassModel model, int index, int size, Map final Set superTypes = new HashSet<>(); model.getAbstractSuperTypes().forEach(ti -> superTypes.add(genType(ti))); - if (model.getHandlerType() != null) { + if (model.isHandler()) { if (model.isConcrete()) { - superTypes.add("Handler<" + genType(model.getHandlerType()) + ">"); + superTypes.add("Handler<" + genType(model.getHandlerArg()) + ">"); } } @@ -127,8 +127,8 @@ public String render(ClassModel model, int index, int size, Map writer.printf(" implements %s", String.join(", ", superTypes)); } } else { - if (model.getHandlerType() != null) { - writer.printf(" extends Handler<%s>", genType(model.getHandlerType())); + if (model.isHandler()) { + writer.printf(" extends Handler<%s>", genType(model.getHandlerArg())); if (!superTypes.isEmpty()) { writer.printf(", %s", String.join(", ", superTypes)); } diff --git a/es4x/pom.xml b/es4x/pom.xml index 381a14e36..7d0e92f8c 100644 --- a/es4x/pom.xml +++ b/es4x/pom.xml @@ -28,65 +28,12 @@ - - java9 - - [1.9,) - - - - - org.codehaus.mojo - build-helper-maven-plugin - 3.0.0 - - - add-sources - generate-sources - - add-source - - - - src/main/java-9 - - - - - add-test-sources - generate-test-sources - - add-test-source - - - - src/test/java-9 - - - - - add-resources - generate-resources - - add-resource - - - - - src/main/resources-9 - - - - - - - - - graaljs - [1.11,) + + ${java.home}/../GRAALVM-README.md + @@ -129,7 +76,6 @@ graal-sdk ${graalvm.version} provided - true diff --git a/es4x/src/main/java-9/io/reactiverse/es4x/dynalink/DataObjectLinker.java b/es4x/src/main/java-9/io/reactiverse/es4x/dynalink/DataObjectLinker.java deleted file mode 100644 index c6ce2341b..000000000 --- a/es4x/src/main/java-9/io/reactiverse/es4x/dynalink/DataObjectLinker.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2018 Red Hat, Inc. - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * and Apache License v2.0 which accompanies this distribution. - * - * The Eclipse Public License is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * The Apache License v2.0 is available at - * http://www.opensource.org/licenses/apache2.0.php - * - * You may elect to redistribute this code under either of these licenses. - */ -package io.reactiverse.es4x.dynalink; - -import io.vertx.core.json.JsonObject; -import jdk.nashorn.api.scripting.ScriptUtils; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.util.Map; - -public class DataObjectLinker { - - private static final MethodHandles.Lookup lookup = MethodHandles.publicLookup(); - - private final Class type; - private final MethodHandle constructor; - private final MethodHandle handler; - - DataObjectLinker(Class target) throws NoSuchMethodException, IllegalAccessException { - this.type = target; - constructor = lookup.findConstructor(target, MethodType.methodType(void.class, JsonObject.class)); - - // create a method handler for this type - MethodHandle mh = lookup.findVirtual( - DataObjectLinker.class, - "convert", - MethodType.methodType(Object.class, Object.class)); - - // adapt as if it was a static method and force the correct signature - handler = mh.bindTo(this).asType(MethodType.methodType(target, Object.class)); - } - - public MethodHandle getHandler() { - return handler; - } - - public Object convert(Object obj) throws Throwable { - // nulls will be nulls - if (obj == null) { - return null; - } - - // the given object is already an instance of this type - if (type.isInstance(obj)) { - return obj; - } - - // if the object is not a json object, attempt to convert - if (!(obj instanceof JsonObject)) { - // rely on nashorn to do the intermediate representation for us - obj = new JsonObject((Map) ScriptUtils.convert(obj, Map.class)); - } - - // rely on the constructor above to do the adaptation - return constructor.invoke(obj); - } -} diff --git a/es4x/src/main/java-9/io/reactiverse/es4x/dynalink/ES4XJSONLinker.java b/es4x/src/main/java-9/io/reactiverse/es4x/dynalink/ES4XJSONLinker.java deleted file mode 100644 index 93576506d..000000000 --- a/es4x/src/main/java-9/io/reactiverse/es4x/dynalink/ES4XJSONLinker.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright 2018 Red Hat, Inc. - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * and Apache License v2.0 which accompanies this distribution. - * - * The Eclipse Public License is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * The Apache License v2.0 is available at - * http://www.opensource.org/licenses/apache2.0.php - * - * You may elect to redistribute this code under either of these licenses. - */ -package io.reactiverse.es4x.dynalink; - -import io.vertx.core.json.JsonArray; -import io.vertx.core.json.JsonObject; -import jdk.dynalink.linker.*; -import jdk.nashorn.api.scripting.ScriptObjectMirror; -import jdk.nashorn.api.scripting.ScriptUtils; - -import java.lang.invoke.*; -import java.time.Instant; -import java.util.*; -import java.util.function.Supplier; - -public class ES4XJSONLinker implements GuardingDynamicLinker, GuardingTypeConverterFactory { - - private static final MethodHandle TO_JSONOBJECT; - private static final MethodHandle TO_JSONARRAY; - - private static final MethodHandle TO_DATE; - private static final MethodHandle TO_INSTANT; - - private final Map linkers = new IdentityHashMap<>(); - - static { - final MethodHandles.Lookup lookup = MethodHandles.lookup(); - - try { - TO_JSONOBJECT = lookup.findStatic( - ES4XJSONLinker.class, - "toJsonObject", - MethodType.methodType(JsonObject.class, Object.class)); - - TO_JSONARRAY = lookup.findStatic( - ES4XJSONLinker.class, - "toJsonArray", - MethodType.methodType(JsonArray.class, Object.class)); - - TO_DATE = lookup.findStatic( - ES4XJSONLinker.class, - "toDate", - MethodType.methodType(Date.class, Object.class)); - - TO_INSTANT = lookup.findStatic( - ES4XJSONLinker.class, - "toInstant", - MethodType.methodType(Instant.class, Object.class)); - - } catch (NoSuchMethodException | IllegalAccessException e) { - throw new RuntimeException(e); - } - } - - @Override - public GuardedInvocation getGuardedInvocation(LinkRequest linkRequest, LinkerServices linkerServices) { - // this linker does not provide enhanced functionality to a type - // but instead provides a converter from nashorn JSON to Vert.x JSON types. - return null; - } - - @Override - public GuardedInvocation convertToType(Class sourceType, Class targetType, Supplier lookupSupplier) { - if (targetType.isAssignableFrom(JsonObject.class)) { - return new GuardedInvocation(TO_JSONOBJECT); - } - if (targetType.isAssignableFrom(JsonArray.class)) { - return new GuardedInvocation(TO_JSONARRAY); - } - if (targetType.isAssignableFrom(Date.class)) { - return new GuardedInvocation(TO_DATE); - } - if (targetType.isAssignableFrom(Instant.class)) { - return new GuardedInvocation(TO_INSTANT); - } - // will attempt to cache the linker if not available yet - DataObjectLinker linker; - - if (linkers.containsKey(targetType)) { - linker = linkers.get(targetType); - if (linker != null) { - return new GuardedInvocation(linker.getHandler()); - } - } else { - // first time check - try { - linker = new DataObjectLinker(targetType); - linkers.put(targetType, linker); - return new GuardedInvocation(linker.getHandler()); - } catch (NoSuchMethodException | IllegalAccessException e) { - linkers.put(targetType, null); - } - } - - // we can't convert - return null; - } - - @SuppressWarnings("unchecked") - private static JsonObject toJsonObject(final Object obj) { - // nulls will be nulls - if (obj == null) { - return null; - } - // if we're already working with the correct type return identity - if (obj instanceof JsonObject) { - return (JsonObject) obj; - } - // rely on nashorn to do the intermediate representation for us - return new JsonObject((Map) ScriptUtils.convert(obj, Map.class)); - } - - @SuppressWarnings("unchecked") - private static JsonArray toJsonArray(final Object obj) { - // nulls will be nulls - if (obj == null) { - return null; - } - // if we're already working with the correct type return identity - if (obj instanceof JsonArray) { - return (JsonArray) obj; - } - // rely on nashorn to do the intermediate representation for us - return new JsonArray((List) ScriptUtils.convert(obj, List.class)); - } - - @SuppressWarnings("unchecked") - private static Date toDate(final Object obj) { - // nulls will be nulls - if (obj == null) { - return null; - } - // if we're already working with the correct type return identity - if (obj instanceof Date) { - return (Date) obj; - } - // rely on nashorn to do the intermediate representation for us - final ScriptObjectMirror jsDate = ScriptUtils.wrap(obj); - - if (!"Date".equals(jsDate.getClassName())) { - throw new ClassCastException("Object is not a Date"); - } - - Number timestampLocalTime = (Number) jsDate.callMember("getTime"); - return new Date(timestampLocalTime.longValue()); - } - - @SuppressWarnings("unchecked") - private static Instant toInstant(final Object obj) { - // nulls will be nulls - if (obj == null) { - return null; - } - // if we're already working with the correct type return identity - if (obj instanceof Instant) { - return (Instant) obj; - } - // rely on nashorn to do the intermediate representation for us - final ScriptObjectMirror jsDate = ScriptUtils.wrap(obj); - - if (!"Date".equals(jsDate.getClassName())) { - throw new ClassCastException("Object is not a Date"); - } - - Number timestampLocalTime = (Number) jsDate.callMember("getTime"); - return Instant.ofEpochMilli(timestampLocalTime.longValue()); - } -} diff --git a/es4x/src/main/java-9/io/reactiverse/es4x/dynalink/ES4XJSONLinkerExporter.java b/es4x/src/main/java-9/io/reactiverse/es4x/dynalink/ES4XJSONLinkerExporter.java deleted file mode 100644 index d7212e287..000000000 --- a/es4x/src/main/java-9/io/reactiverse/es4x/dynalink/ES4XJSONLinkerExporter.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2018 Red Hat, Inc. - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * and Apache License v2.0 which accompanies this distribution. - * - * The Eclipse Public License is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * The Apache License v2.0 is available at - * http://www.opensource.org/licenses/apache2.0.php - * - * You may elect to redistribute this code under either of these licenses. - */ -package io.reactiverse.es4x.dynalink; - -import jdk.dynalink.linker.*; - -import java.util.ArrayList; -import java.util.List; - -public class ES4XJSONLinkerExporter extends GuardingDynamicLinkerExporter { - - @Override - public List get() { - final List linkers = new ArrayList<>(); - linkers.add(new ES4XJSONLinker()); - return linkers; - } -} diff --git a/es4x/src/main/java/io/reactiverse/es4x/ECMAEngine.java b/es4x/src/main/java/io/reactiverse/es4x/ECMAEngine.java index 775a917a0..361ab0d96 100644 --- a/es4x/src/main/java/io/reactiverse/es4x/ECMAEngine.java +++ b/es4x/src/main/java/io/reactiverse/es4x/ECMAEngine.java @@ -16,7 +16,6 @@ package io.reactiverse.es4x; import io.reactiverse.es4x.impl.graal.GraalEngine; -import io.reactiverse.es4x.impl.nashorn.NashornEngine; import io.vertx.core.Vertx; import java.util.regex.Pattern; @@ -24,31 +23,7 @@ public interface ECMAEngine { static ECMAEngine newEngine(Vertx vertx) { - String userSelectedEngine = System.getProperty("es4x.engine", "graaljs"); - - if ("graaljs".equals(userSelectedEngine)) { - try { - - System.setProperty("es4x.engine", "graaljs"); - return new GraalEngine(vertx); - } catch (NoClassDefFoundError | IllegalStateException e0) { - // in the case classes are missing, the graal bits are missing - // so fallback to Nashorn - - // we could also have an illegal state when the graal is missing - // the language bits, in that case also try to fallback to nashorn - - // force the engine to nashorn - userSelectedEngine = "nashorn"; - } - } - - if ("nashorn".equals(userSelectedEngine)) { - System.setProperty("es4x.engine", "nashorn"); - return new NashornEngine(vertx); - } - - throw new IllegalStateException("Unsupported runtime [" + userSelectedEngine + "]"); + return new GraalEngine(vertx); } default Pattern[] allowedHostClassFilters() { diff --git a/es4x/src/main/java/io/reactiverse/es4x/ESVerticleFactory.java b/es4x/src/main/java/io/reactiverse/es4x/ESVerticleFactory.java index 39916c4b2..bb2820aa4 100644 --- a/es4x/src/main/java/io/reactiverse/es4x/ESVerticleFactory.java +++ b/es4x/src/main/java/io/reactiverse/es4x/ESVerticleFactory.java @@ -39,12 +39,8 @@ public int order() { @Override public Verticle createVerticle(String verticleName, ClassLoader classLoader) { - final Runtime runtime; final String fsVerticleName = VerticleFactory.removePrefix(verticleName); - - synchronized (this) { - runtime = engine.newContext(); - } + final Runtime runtime = engine.newContext(); if (">".equals(fsVerticleName)) { return new REPLVerticle(runtime); diff --git a/es4x/src/main/java/io/reactiverse/es4x/JSVerticleFactory.java b/es4x/src/main/java/io/reactiverse/es4x/JSVerticleFactory.java index 0e8e19c1c..20c2f8bba 100644 --- a/es4x/src/main/java/io/reactiverse/es4x/JSVerticleFactory.java +++ b/es4x/src/main/java/io/reactiverse/es4x/JSVerticleFactory.java @@ -109,13 +109,12 @@ public void stop(Future stopFuture) { try { runtime.enter(); runtime.emit("undeploy"); - runtime.leave(); - runtime.close(); stopFuture.complete(); } catch (RuntimeException e) { + stopFuture.fail(e); + } finally { runtime.leave(); runtime.close(); - stopFuture.fail(e); } } }; diff --git a/es4x/src/main/java/io/reactiverse/es4x/impl/AbstractJSObjectMessageCodec.java b/es4x/src/main/java/io/reactiverse/es4x/impl/AbstractJSObjectMessageCodec.java index d976a7338..191e79606 100644 --- a/es4x/src/main/java/io/reactiverse/es4x/impl/AbstractJSObjectMessageCodec.java +++ b/es4x/src/main/java/io/reactiverse/es4x/impl/AbstractJSObjectMessageCodec.java @@ -20,7 +20,13 @@ import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; -public abstract class AbstractJSObjectMessageCodec implements MessageCodec { +public abstract class AbstractJSObjectMessageCodec implements MessageCodec { + + private final String codecName; + + public AbstractJSObjectMessageCodec(String codecName) { + this.codecName = codecName; + } @Override public Object decodeFromWire(int pos, Buffer buffer) { @@ -46,7 +52,7 @@ public Object decodeFromWire(int pos, Buffer buffer) { @Override public String name() { - return getClass().getSimpleName(); + return codecName; } @Override diff --git a/es4x/src/main/java/io/reactiverse/es4x/impl/ESModuleIO.java b/es4x/src/main/java/io/reactiverse/es4x/impl/ESModuleIO.java index 06517a486..676b738d8 100644 --- a/es4x/src/main/java/io/reactiverse/es4x/impl/ESModuleIO.java +++ b/es4x/src/main/java/io/reactiverse/es4x/impl/ESModuleIO.java @@ -18,6 +18,8 @@ import io.vertx.core.Vertx; import io.vertx.core.buffer.Buffer; import io.vertx.core.file.FileSystem; +import io.vertx.core.logging.Logger; +import io.vertx.core.logging.LoggerFactory; import java.io.IOException; import java.net.URI; @@ -28,7 +30,7 @@ public class ESModuleIO { - private static final boolean DEBUG = Boolean.getBoolean("es2cjs.debug"); + private static final Logger LOGGER = LoggerFactory.getLogger(ESModuleIO.class); private static final Pattern importDef = Pattern.compile("import (\\* as [a-zA-Z_$][0-9a-zA-Z_$]*|\\{.+?}) from ['\"]([0-9a-zA-Z_$@./\\- ]+)['\"];?", Pattern.DOTALL); private static final Pattern exportDef = Pattern.compile("\\{(.+?)}", Pattern.DOTALL); @@ -54,9 +56,7 @@ private static String replace(String source, Pattern pattern, Function { - if (DEBUG) { - System.out.println(importMatcher.group(0)); - } + LOGGER.debug(importMatcher.group(0)); final String exports = importMatcher.group(1); final String module = importMatcher.group(2); diff --git a/es4x/src/main/java/io/reactiverse/es4x/impl/REPLVerticle.java b/es4x/src/main/java/io/reactiverse/es4x/impl/REPLVerticle.java index de92b2d1f..04b52b633 100644 --- a/es4x/src/main/java/io/reactiverse/es4x/impl/REPLVerticle.java +++ b/es4x/src/main/java/io/reactiverse/es4x/impl/REPLVerticle.java @@ -18,7 +18,10 @@ import io.reactiverse.es4x.Runtime; import io.vertx.core.AbstractVerticle; import io.vertx.core.buffer.Buffer; +import io.vertx.core.logging.Logger; +import io.vertx.core.logging.LoggerFactory; import io.vertx.core.parsetools.RecordParser; +import org.graalvm.polyglot.PolyglotException; import java.io.*; import java.nio.charset.Charset; @@ -28,6 +31,8 @@ public class REPLVerticle extends AbstractVerticle { private static final AtomicBoolean ACTIVE = new AtomicBoolean(false); + private final Logger log = LoggerFactory.getLogger(REPLVerticle.class); + private final Runtime runtime; private final StringBuilder buffer = new StringBuilder(); @@ -69,7 +74,7 @@ public void start() { System.out.println("\u001B[1;90m" + runtime.eval(statement, true) + "\u001B[0m"); System.out.print("js:> "); System.out.flush(); - } catch (ScriptException t) { + } catch (PolyglotException t) { if (t.isIncompleteSource()) { updateBuffer(statement, false); return; @@ -91,30 +96,7 @@ public void start() { System.out.print("js:> "); System.out.flush(); } catch (Exception ex) { - String message = null; - String trace = null; - - // collect the trace back to a string - try (StringWriter sw = new StringWriter()) { - PrintWriter pw = new PrintWriter(sw); - ex.printStackTrace(pw); - String sStackTrace = sw.toString(); // stack trace as a string - int idx = sStackTrace.indexOf("\n\tat"); - if (idx != -1) { - message = sStackTrace.substring(0, idx); - trace = sStackTrace.substring(idx); - } else { - trace = sStackTrace; - } - } catch (IOException e) { - // ignore... - } - - if (message != null) { - System.out.print("\u001B[1m\u001B[31m" + message + "\u001B[0m"); - } - - System.out.println(trace); + log.error(ex.getMessage(), ex); System.out.print("js:> "); System.out.flush(); } diff --git a/es4x/src/main/java/io/reactiverse/es4x/impl/ScriptException.java b/es4x/src/main/java/io/reactiverse/es4x/impl/ScriptException.java deleted file mode 100644 index 185a3e2bc..000000000 --- a/es4x/src/main/java/io/reactiverse/es4x/impl/ScriptException.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2018 Red Hat, Inc. - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * and Apache License v2.0 which accompanies this distribution. - * - * The Eclipse Public License is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * The Apache License v2.0 is available at - * http://www.opensource.org/licenses/apache2.0.php - * - * You may elect to redistribute this code under either of these licenses. - */ -package io.reactiverse.es4x.impl; - -/** - * Exception wrapper to avoid depend on Graal exception types - * when dealing with VMs running on Nashorn only environments - */ -public class ScriptException extends RuntimeException { - - private final boolean isExit; - private final boolean isIncompleteSource; - - public ScriptException(Throwable other, boolean isIncompleteSource, boolean isExit) { - super(other.getMessage(), other.getCause()); - this.isIncompleteSource = isIncompleteSource; - this.isExit = isExit; - } - - public boolean isIncompleteSource() { - return isIncompleteSource; - } - - public boolean isExit() { - return isExit; - } -} diff --git a/es4x/src/main/java/io/reactiverse/es4x/impl/graal/GraalEngine.java b/es4x/src/main/java/io/reactiverse/es4x/impl/graal/GraalEngine.java index a1d5a28b6..6002d3f0c 100644 --- a/es4x/src/main/java/io/reactiverse/es4x/impl/graal/GraalEngine.java +++ b/es4x/src/main/java/io/reactiverse/es4x/impl/graal/GraalEngine.java @@ -21,6 +21,8 @@ import io.vertx.core.Vertx; import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; +import io.vertx.core.logging.Logger; +import io.vertx.core.logging.LoggerFactory; import org.graalvm.polyglot.*; import java.time.Instant; @@ -35,6 +37,8 @@ public class GraalEngine implements ECMAEngine { + private static final Logger LOG = LoggerFactory.getLogger(GraalEngine.class); + private final Vertx vertx; private final Engine engine; private final HostAccess hostAccess; @@ -60,7 +64,7 @@ public GraalEngine(Vertx vertx) { if (nag) { nag = false; if ("Interpreted".equalsIgnoreCase(engine.getImplementationName())) { - System.err.println("\u001B[1m\u001B[33mES4X is using graaljs in interpreted mode! Add the JVMCI compiler module in order to run in optimal mode!\u001B[0m"); + LOG.warn("ES4X is using graaljs in interpreted mode! Add the JVMCI compiler module in order to run in optimal mode!"); } } @@ -91,7 +95,7 @@ public GraalEngine(Vertx vertx) { .targetTypeMapping( Value.class, Instant.class, - Value::hasMembers, + v -> v.hasMembers() && v.hasMember("getTime"), v -> { if (v.isNull()) { return null; @@ -102,16 +106,24 @@ public GraalEngine(Vertx vertx) { .targetTypeMapping( Value.class, Date.class, - Value::hasMembers, + v -> v.hasMembers() && v.hasMember("getTime"), v -> { if (v.isNull()) { return null; } return new Date(v.invokeMember("getTime").asLong()); }) + // Ensure Arrays are exposed as List when the Java API is accepting Object + .targetTypeMapping(List.class, Object.class, null, v -> v) .build(); } + private void registerCodec(Class className) { + vertx.eventBus() + .unregisterDefaultCodec(className) + .registerDefaultCodec(className, new JSObjectMessageCodec(className.getName())); + } + @Override public String name() { return "graaljs"; @@ -157,13 +169,15 @@ public Runtime newContext() { // install the codec if needed if (codecInstalled.compareAndSet(false, true)) { // register a default codec to allow JSON messages directly from GraalJS to the JVM world - final Consumer callback = value -> vertx.eventBus() - .unregisterDefaultCodec(value.getClass()) - .registerDefaultCodec(value.getClass(), new JSObjectMessageCodec()); + final Consumer callback = value -> registerCodec(value.getClass()); context.eval( Source.newBuilder("js", "(function (fn) { fn({}); })", "").cached(false).internal(true).buildLiteral() ).execute(callback); + + context.eval( + Source.newBuilder("js", "(function (fn) { fn([]); })", "").cached(false).internal(true).buildLiteral() + ).execute(callback); } // setup complete diff --git a/es4x/src/main/java/io/reactiverse/es4x/impl/graal/GraalRuntime.java b/es4x/src/main/java/io/reactiverse/es4x/impl/graal/GraalRuntime.java index de428fec5..1463a53ca 100644 --- a/es4x/src/main/java/io/reactiverse/es4x/impl/graal/GraalRuntime.java +++ b/es4x/src/main/java/io/reactiverse/es4x/impl/graal/GraalRuntime.java @@ -17,7 +17,6 @@ import io.reactiverse.es4x.Runtime; import io.reactiverse.es4x.impl.EventEmitterImpl; -import io.reactiverse.es4x.impl.ScriptException; import io.vertx.core.Vertx; import io.vertx.core.json.JsonObject; import org.graalvm.polyglot.*; @@ -171,17 +170,7 @@ public Value eval(String script, String name, String contentType, boolean intera .mimeType(contentType) .buildLiteral(); - if (interactive) { - try { - return context.eval(source); - } catch (PolyglotException e) { - // in this special case we wrap and hide the polyglot type - // so we can keep a contract outside graal - throw new ScriptException(e, e.isIncompleteSource(), e.isExit()); - } - } else { - return context.eval(source); - } + return context.eval(source); } @Override diff --git a/es4x/src/main/java/io/reactiverse/es4x/impl/graal/JSObjectMessageCodec.java b/es4x/src/main/java/io/reactiverse/es4x/impl/graal/JSObjectMessageCodec.java index c4e2e3c12..2cdd68320 100644 --- a/es4x/src/main/java/io/reactiverse/es4x/impl/graal/JSObjectMessageCodec.java +++ b/es4x/src/main/java/io/reactiverse/es4x/impl/graal/JSObjectMessageCodec.java @@ -19,58 +19,54 @@ import io.vertx.core.buffer.Buffer; import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; -import org.graalvm.polyglot.Context; -import org.graalvm.polyglot.Source; -import org.graalvm.polyglot.Value; -final class JSObjectMessageCodec extends AbstractJSObjectMessageCodec { +import java.util.List; +import java.util.Map; - private static final Source stringify = Source.newBuilder("js", "JSON.stringify", "").internal(true).buildLiteral(); +final class JSObjectMessageCodec extends AbstractJSObjectMessageCodec { + + public JSObjectMessageCodec(String codecName) { + super(codecName); + } @Override - public void encodeToWire(Buffer buffer, T jsObject) { + public void encodeToWire(Buffer buffer, Object jsObject) { - final Value value = Value.asValue(jsObject); + if (jsObject == null) { + buffer.appendInt(0); + return; + } - if (value.isHostObject() || value.isString() || value.isNumber() || value.isBoolean() || value.isNativePointer() || value.isProxyObject()) { - throw new ClassCastException("type is not Object or Array"); + if (jsObject instanceof List) { + final Buffer encoded = new JsonArray((List) jsObject).toBuffer(); + buffer.appendInt(encoded.length()); + buffer.appendBuffer(buffer); + return; } - if (value.isNull()) { - buffer.appendInt(0); + if (jsObject instanceof Map) { + final Buffer encoded = new JsonObject((Map) jsObject).toBuffer(); + buffer.appendInt(encoded.length()); + buffer.appendBuffer(buffer); return; } - final Context ctx = Context.getCurrent(); - Buffer encoded = Buffer.buffer(ctx.eval(stringify).execute(value).asString()); - buffer.appendInt(encoded.length()); - buffer.appendBuffer(buffer); + throw new ClassCastException("type is not Object or Array"); } @Override - public Object transform(T jsObject) { - - final Value value = Value.asValue(jsObject); - - if (value.isHostObject() || value.isString() || value.isNumber() || value.isBoolean() || value.isNativePointer() || value.isProxyObject()) { - throw new ClassCastException("type is not Object or Array"); - } + public Object transform(Object jsObject) { - if (value.isNull()) { + if (jsObject == null) { return null; } - final Context ctx = Context.getCurrent(); - String encoded = ctx.eval(stringify).execute(value).asString(); - - char c = encoded.charAt(0); - - // encoded messages are expected not to be pretty printed - if (c == '{') { - return new JsonObject(encoded); + if (jsObject instanceof List) { + return new JsonArray((List) jsObject).copy(); } - if (c == '[') { - return new JsonArray(encoded); + + if (jsObject instanceof Map) { + return new JsonObject((Map) jsObject).copy(); } throw new ClassCastException("type is not Object or Array"); diff --git a/es4x/src/main/java/io/reactiverse/es4x/impl/nashorn/JSObjectMessageCodec.java b/es4x/src/main/java/io/reactiverse/es4x/impl/nashorn/JSObjectMessageCodec.java deleted file mode 100644 index f2b2c3e9f..000000000 --- a/es4x/src/main/java/io/reactiverse/es4x/impl/nashorn/JSObjectMessageCodec.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2018 Red Hat, Inc. - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * and Apache License v2.0 which accompanies this distribution. - * - * The Eclipse Public License is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * The Apache License v2.0 is available at - * http://www.opensource.org/licenses/apache2.0.php - * - * You may elect to redistribute this code under either of these licenses. - */ -package io.reactiverse.es4x.impl.nashorn; - -import io.reactiverse.es4x.impl.AbstractJSObjectMessageCodec; -import io.vertx.core.buffer.Buffer; -import io.vertx.core.json.JsonArray; -import io.vertx.core.json.JsonObject; -import jdk.nashorn.api.scripting.JSObject; -import jdk.nashorn.api.scripting.ScriptObjectMirror; - -final class JSObjectMessageCodec extends AbstractJSObjectMessageCodec { - - @Override - public void encodeToWire(Buffer buffer, ScriptObjectMirror jsObject) { - - if (jsObject == null) { - buffer.appendInt(0); - return; - } - - final JSObject JSON = (JSObject) jsObject.eval("JSON"); - final JSObject stringify = (JSObject) JSON.getMember("stringify"); - - Buffer encoded = Buffer.buffer((String) stringify.call(JSON, jsObject)); - buffer.appendInt(encoded.length()); - buffer.appendBuffer(buffer); - } - - @Override - public Object transform(ScriptObjectMirror jsObject) { - - if (jsObject == null) { - return null; - } - - final JSObject JSON = (JSObject) jsObject.eval("JSON"); - final JSObject stringify = (JSObject) JSON.getMember("stringify"); - final String encoded = (String) stringify.call(JSON, jsObject); - char c = encoded.charAt(0); - - // encoded messages are expected not to be pretty printed - if (c == '{') { - return new JsonObject(encoded); - } - if (c == '[') { - return new JsonArray(encoded); - } - - throw new ClassCastException("type is not Object or Array"); - } -} diff --git a/es4x/src/main/java/io/reactiverse/es4x/impl/nashorn/NashornEngine.java b/es4x/src/main/java/io/reactiverse/es4x/impl/nashorn/NashornEngine.java deleted file mode 100644 index 4113af3e6..000000000 --- a/es4x/src/main/java/io/reactiverse/es4x/impl/nashorn/NashornEngine.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2018 Red Hat, Inc. - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * and Apache License v2.0 which accompanies this distribution. - * - * The Eclipse Public License is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * The Apache License v2.0 is available at - * http://www.opensource.org/licenses/apache2.0.php - * - * You may elect to redistribute this code under either of these licenses. - */ -package io.reactiverse.es4x.impl.nashorn; - -import io.reactiverse.es4x.ECMAEngine; -import io.vertx.core.Vertx; -import jdk.nashorn.api.scripting.NashornScriptEngine; -import jdk.nashorn.api.scripting.NashornScriptEngineFactory; -import jdk.nashorn.api.scripting.ScriptObjectMirror; - -import javax.script.ScriptEngine; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.regex.Pattern; - -public class NashornEngine implements ECMAEngine { - - private final Vertx vertx; - private final NashornScriptEngineFactory factory; - private final AtomicBoolean codecInstalled = new AtomicBoolean(false); - - private static boolean nag = true; - - public NashornEngine(Vertx vertx) { - this.vertx = vertx; - // enable ES6 features - if (System.getProperty("nashorn.args") == null) { - System.setProperty("nashorn.args", "--language=es6"); - } - // create the factory - this.factory = new NashornScriptEngineFactory(); - - if (nag) { - nag = false; - System.err.println("\u001B[1m\u001B[33mES4X is using nashorn! Only ES5.1 features are available!\u001B[0m"); - } - } - - @Override - public String name() { - return "nashorn"; - } - - @Override - @SuppressWarnings("unchecked") - public NashornRuntime newContext() { - - final ScriptEngine engine; - - final Pattern[] allowedHostAccessClassFilters = allowedHostClassFilters(); - - if (allowedHostAccessClassFilters != null) { - engine = factory.getScriptEngine(fqcn -> { - for (Pattern filter : allowedHostAccessClassFilters) { - if (filter.matcher(fqcn).matches()) { - return true; - } - } - return false; - }); - } else { - engine = factory.getScriptEngine(); - } - - // install the codec if needed - if (codecInstalled.compareAndSet(false, true)) { - // register a default codec to allow JSON messages directly from Nashorn to the JVM world - vertx.eventBus() - .unregisterDefaultCodec(ScriptObjectMirror.class) - .registerDefaultCodec(ScriptObjectMirror.class, new JSObjectMessageCodec()); - } - - return new NashornRuntime(vertx, (NashornScriptEngine) engine); - } -} diff --git a/es4x/src/main/java/io/reactiverse/es4x/impl/nashorn/NashornRuntime.java b/es4x/src/main/java/io/reactiverse/es4x/impl/nashorn/NashornRuntime.java deleted file mode 100644 index 1a00468de..000000000 --- a/es4x/src/main/java/io/reactiverse/es4x/impl/nashorn/NashornRuntime.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright 2018 Red Hat, Inc. - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * and Apache License v2.0 which accompanies this distribution. - * - * The Eclipse Public License is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * The Apache License v2.0 is available at - * http://www.opensource.org/licenses/apache2.0.php - * - * You may elect to redistribute this code under either of these licenses. - */ -package io.reactiverse.es4x.impl.nashorn; - -import io.reactiverse.es4x.Runtime; -import io.reactiverse.es4x.impl.EventEmitterImpl; -import io.vertx.core.Vertx; -import io.vertx.core.json.JsonObject; -import jdk.nashorn.api.scripting.JSObject; -import jdk.nashorn.api.scripting.NashornScriptEngine; - -import javax.script.*; - -public class NashornRuntime extends EventEmitterImpl implements Runtime { - - private final NashornScriptEngine engine; - private final JSObject require; - private final Object module; - - public NashornRuntime(final Vertx vertx, NashornScriptEngine engine) { - this.engine = engine; - try { - final Bindings engineBindings = engine.getBindings(ScriptContext.ENGINE_SCOPE); - // remove the exit and quit functions - engineBindings.remove("exit"); - engineBindings.remove("quit"); - - final Bindings globalBindings = new SimpleBindings(); - // add vertx as a global - globalBindings.put("vertx", vertx); - // add the global reference to the bindings - globalBindings.put("global", engine.eval("this")); - - engine.setBindings(globalBindings, ScriptContext.GLOBAL_SCOPE); - - // add polyfills - engine.invokeFunction("load", "classpath:io/reactiverse/es4x/polyfill/object.js"); - engine.invokeFunction("load", "classpath:io/reactiverse/es4x/polyfill/json.js"); - put("verticle", this); - engine.invokeFunction("load", "classpath:io/reactiverse/es4x/polyfill/global.js"); - put("verticle", null); - engine.invokeFunction("load", "classpath:io/reactiverse/es4x/polyfill/date.js"); - engine.invokeFunction("load", "classpath:io/reactiverse/es4x/polyfill/console.js"); - engine.invokeFunction("load", "classpath:io/reactiverse/es4x/polyfill/promise.js"); - engine.invokeFunction("load", "classpath:io/reactiverse/es4x/polyfill/worker.js"); - // install the commonjs loader - module = engine.invokeFunction("load", "classpath:io/reactiverse/es4x/jvm-npm.js"); - // get a reference to the require function - require = (JSObject) engine.get("require"); - - } catch (ScriptException | NoSuchMethodException e) { - throw new RuntimeException(e); - } - } - - @Override - public void config(final JsonObject config) { - final Bindings engineBindings = engine.getBindings(ScriptContext.ENGINE_SCOPE); - // expose the config as a global - engineBindings.put("config", config != null ? config.getMap() : null); - } - - @Override - public Object require(String main) { - return require.call(null, main); - } - - @Override - public Object main(String main) { - if (main.equals(".") || main.equals("..")) { - // invoke the main script - return invokeMethod(module, "runMain", main + "/"); - } - // patch the main path to be a relative path - if (!main.startsWith("./") && !main.startsWith("/")) { - main = "./" + main; - } - // invoke the main script - return invokeMethod(module, "runMain", main); - } - - @Override - public Object worker(String main, String address) { - // invoke the main script - return invokeMethod(module, "runWorker", main, address); - } - - @Override - public Object eval(String script, String name, String contentType, boolean literal) throws ScriptException { - return engine.eval(script); - } - - @Override - public boolean hasMember(Object thiz, String key) { - if (thiz instanceof JSObject) { - return (((JSObject) thiz).hasMember(key)); - } - return false; - } - - @Override - public Object invokeMethod(Object thiz, String method, Object... args) { - if (thiz instanceof JSObject) { - if (((JSObject) thiz).hasMember(method)) { - Object fn = ((JSObject) thiz).getMember(method); - return ((JSObject) fn).call(thiz, args); - } - } - - return null; - } - - @Override - public Object invokeFunction(String function, Object... args) { - try { - return engine.invokeFunction(function, args); - } catch (ScriptException | NoSuchMethodException e) { - throw new RuntimeException(e); - } - } - - @Override - public void put(String name, Object value) { - engine.put(name, value); - } - - @Override - public void close() { - // NO-OP - } -} diff --git a/es4x/src/main/java/io/reactiverse/es4x/jul/ES4XFormatter.java b/es4x/src/main/java/io/reactiverse/es4x/jul/ES4XFormatter.java index 8157207b3..3f46981c8 100644 --- a/es4x/src/main/java/io/reactiverse/es4x/jul/ES4XFormatter.java +++ b/es4x/src/main/java/io/reactiverse/es4x/jul/ES4XFormatter.java @@ -15,170 +15,122 @@ */ package io.reactiverse.es4x.jul; -import jdk.nashorn.api.scripting.NashornException; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.logging.*; -import java.util.Collections; -import java.util.Date; -import java.util.IdentityHashMap; -import java.util.Set; -import java.util.logging.Formatter; -import java.util.logging.LogRecord; +import static java.util.logging.Level.*; public class ES4XFormatter extends Formatter { - private static final String format = "%5$s %6$s%n"; - - private final Date dat = new Date(); + private static final boolean ansi = System.console() != null; + @Override public synchronized String format(LogRecord record) { - dat.setTime(record.getMillis()); - String source; - if (record.getSourceClassName() != null) { - source = record.getSourceClassName(); - if (record.getSourceMethodName() != null) { - source += " " + record.getSourceMethodName(); - } - } else { - source = record.getLoggerName(); - } - String message = formatMessage(record); - CharSequence throwable = ""; - if (record.getThrown() != null) { - throwable = formatStackTrace(record.getThrown()); - } - - return String.format(format, - dat, - source, - record.getLoggerName(), - record.getLevel(), - message, - throwable); - } - - private static CharSequence formatStackTrace(Throwable self) { - final StringBuffer buffer = new StringBuffer(); - - Set dejaVu = Collections.newSetFromMap(new IdentityHashMap<>()); - dejaVu.add(self); - - StackTraceElement[] trace; - - if (self instanceof NashornException) { - buffer - .append(self.getLocalizedMessage()) - .append(System.lineSeparator()); - - buffer - .append("\tat (") - .append(((NashornException) self).getFileName()) - .append(":") - .append(((NashornException) self).getLineNumber()) - .append(":") - .append(((NashornException) self).getColumnNumber()) - .append(")") - .append(System.lineSeparator()); - trace = NashornException.getScriptFrames(self); - - for (StackTraceElement traceElement : trace) { - buffer - .append("\tat ") - .append(traceElement.getMethodName()) - .append(" (") - .append(traceElement.getFileName()) - .append(":") - .append(traceElement.getLineNumber()) - .append(")") - .append(System.lineSeparator()); - } - } else { - buffer - .append(self) - .append(System.lineSeparator()); - - trace = self.getStackTrace(); - for (StackTraceElement traceElement : trace) { - buffer - .append("\tat ") - .append(traceElement) - .append(System.lineSeparator()); + Throwable thrown = record.getThrown(); + String message = record.getMessage(); + + String thrownMessage = null; + String thrownTrace = null; + + if (thrown != null) { + // collect the trace back to a string + try (StringWriter sw = new StringWriter()) { + PrintWriter pw = new PrintWriter(sw); + // print the thrown to String + thrown.printStackTrace(pw); + String sStackTrace = sw.toString(); // stack trace as a string + int idx = sStackTrace.indexOf("\n\tat"); + if (idx != -1) { + thrownMessage = sStackTrace.substring(0, idx); + thrownTrace = sStackTrace.substring(idx); + } else { + thrownTrace = sStackTrace; + } + } catch (IOException e) { + // ignore... } } - Throwable[] suppressed = self.getSuppressed(); + StringBuilder sb = new StringBuilder(); - for (Throwable se : suppressed) { - printEnclosedStackTrace(se, buffer, trace, "Suppressed: ", "\t", dejaVu); + sb.append(prefix(record.getLevel())); + sb.append(message); + if (thrownMessage != null) { + sb.append(" caused by "); + sb.append(thrownMessage); } - - Throwable ourCause = self.getCause(); - if (ourCause != null) { - printEnclosedStackTrace(ourCause, buffer, trace, "Caused by: ", "", dejaVu); + sb.append(suffix(record.getLevel())); + if (thrownTrace != null) { + sb.append(thrownTrace); + } else { + sb.append(System.lineSeparator()); } - return buffer; + return sb.toString(); } - private static void printEnclosedStackTrace(Throwable self, StringBuffer buffer, StackTraceElement[] enclosingTrace, String caption, String prefix, Set dejaVu) { - if (dejaVu.contains(self)) { - buffer - .append("\t[CIRCULAR REFERENCE:") - .append(self) - .append("]") - .append(System.lineSeparator()); - } else { - - dejaVu.add(self); - - StackTraceElement[] trace; - - if (self instanceof NashornException) { - trace = NashornException.getScriptFrames(self); + private static String prefix(Level l) { + if (SEVERE.equals(l)) { + if (ansi) { + return "\u001B[1m\u001B[31m"; } else { - trace = self.getStackTrace(); + return "[SEVERE] "; } - - int m = trace.length - 1; - - for (int n = enclosingTrace.length - 1; m >= 0 && n >= 0 && trace[m].equals(enclosingTrace[n]); --n) { - --m; + } + if (WARNING.equals(l)) { + if (ansi) { + return "\u001B[1m\u001B[33m"; + } else { + return "[WARNING] "; } - - int framesInCommon = trace.length - 1 - m; - buffer - .append(prefix) - .append(caption) - .append(self) - .append(System.lineSeparator()); - - for (int i = 0; i <= m; ++i) { - buffer - .append(prefix) - .append("\tat ") - .append(trace[i]) - .append(System.lineSeparator()); + } + if (INFO.equals(l)) { + if (ansi) { + return "\u001B[1m\u001B[34m"; + } else { + return "[INFO] "; } - - if (framesInCommon != 0) { - buffer - .append(prefix) - .append("\t... ") - .append(framesInCommon) - .append(" more") - .append(System.lineSeparator()); + } + if (CONFIG.equals(l)) { + if (ansi) { + return "\u001B[1m\u001B[36m"; + } else { + return "[CONFIG] "; } - - Throwable[] suppressed = self.getSuppressed(); - - for (Throwable se : suppressed) { - printEnclosedStackTrace(se, buffer, trace, "Suppressed: ", prefix + "\t", dejaVu); + } + if (FINE.equals(l)) { + if (ansi) { + return "\u001B[1m\u001B[94m"; + } else { + return "[FINE] "; } - - Throwable ourCause = self.getCause(); - if (ourCause != null) { - printEnclosedStackTrace(ourCause, buffer, trace, "Caused by: ", prefix, dejaVu); + } + if (FINER.equals(l)) { + if (ansi) { + return "\u001B[94m"; + } else { + return "[FINER] "; + } + } + if (FINEST.equals(l)) { + if (ansi) { + return "\u001B[94m"; + } else { + return "[FINEST] "; } } + + return "[" + l.getName().toUpperCase() + "]"; + } + + private static String suffix(Level l) { + if (ansi) { + return "\u001B[0m"; + } else { + return ""; + } } } diff --git a/es4x/src/main/resources-9/META-INF/services/jdk.dynalink.linker.GuardingDynamicLinkerExporter b/es4x/src/main/resources-9/META-INF/services/jdk.dynalink.linker.GuardingDynamicLinkerExporter deleted file mode 100644 index 643fd40db..000000000 --- a/es4x/src/main/resources-9/META-INF/services/jdk.dynalink.linker.GuardingDynamicLinkerExporter +++ /dev/null @@ -1 +0,0 @@ -io.reactiverse.es4x.dynalink.ES4XJSONLinkerExporter diff --git a/es4x/src/main/resources/io/reactiverse/es4x/polyfill/global.js b/es4x/src/main/resources/io/reactiverse/es4x/polyfill/global.js index 5d20e3e30..735c82342 100644 --- a/es4x/src/main/resources/io/reactiverse/es4x/polyfill/global.js +++ b/es4x/src/main/resources/io/reactiverse/es4x/polyfill/global.js @@ -107,7 +107,7 @@ global.process = { env: System.getenv(), pid: pid, - engine: System.getProperty('es4x.engine'), + engine: 'graaljs', exit: function (exitCode) { vertx.close(function (res) { @@ -136,7 +136,17 @@ stderr: System.err, stdin: System.in, // non standard - properties: System.getProperties(), + properties: new Proxy({}, { + set: function (obj, prop, value) { + if (typeof prop !== 'string') { + throw new TypeError('Property name must be a String'); + } + return System.setProperty(prop, value); + }, + get: function (obj, prop) { + return System.getProperty(prop); + } + }), }; })(global || this, verticle); diff --git a/es4x/src/main/resources/node_modules/util.js b/es4x/src/main/resources/node_modules/util.js index 35902f069..eca5f5120 100644 --- a/es4x/src/main/resources/node_modules/util.js +++ b/es4x/src/main/resources/node_modules/util.js @@ -20,47 +20,27 @@ module.exports = { }); } } else if (typeof obj === 'object') { - switch (process.engine) { - case 'nashorn': - return { - __noSuchMethod__: function () { - var fn = arguments[0]; - var args = [obj].concat(Array.prototype.slice.call(arguments, 1)); + return new Proxy(obj, { + get: function (obj, prop) { + if (typeof obj[prop] !== 'function') { + return obj[prop]; + } - return new Promise(function (resolve, reject) { - args.push(function (res) { - if (res.failed()) { - reject(res.cause()); - } else { - resolve(res.result()); - } - }); - Function.call.apply(obj[fn], args); + return function () { + let args = [obj].concat(Array.prototype.slice.call(arguments)); + return new Promise(function (resolve, reject) { + args.push(function (res) { + if (res.failed()) { + reject(res.cause()); + } else { + resolve(res.result()); + } }); - } + Function.call.apply(obj[prop], args); + }); }; - case 'graaljs': - var o = {}; - for (let m in obj) { - // capture the method - let fn = obj[m]; - - o[m] = function () { - let args = [obj].concat(Array.prototype.slice.call(arguments)); - return new Promise(function (resolve, reject) { - args.push(function (res) { - if (res.failed()) { - reject(res.cause()); - } else { - resolve(res.result()); - } - }); - Function.call.apply(fn, args); - }); - } - } - return o; - } + } + }); } } }; diff --git a/es4x/src/test/java-9/io/reactiverse/es4x/dynalink/DinalynkTest.java b/es4x/src/test/java-9/io/reactiverse/es4x/dynalink/DinalynkTest.java deleted file mode 100644 index bf8a643a6..000000000 --- a/es4x/src/test/java-9/io/reactiverse/es4x/dynalink/DinalynkTest.java +++ /dev/null @@ -1,95 +0,0 @@ -package io.reactiverse.es4x.dynalink; - -import io.reactiverse.es4x.Runtime; -import io.reactiverse.es4x.impl.nashorn.NashornEngine; -import io.vertx.core.http.HttpServerOptions; -import io.vertx.core.json.JsonObject; -import io.vertx.ext.unit.Async; -import io.vertx.ext.unit.TestContext; -import io.vertx.ext.unit.junit.RunTestOnContext; -import io.vertx.ext.unit.junit.VertxUnitRunner; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.time.Instant; -import java.util.Date; - -import static org.junit.Assume.assumeTrue; - -@RunWith(VertxUnitRunner.class) -public class DinalynkTest { - - @Rule - public RunTestOnContext rule = new RunTestOnContext(); - - private Runtime runtime; - - @Before - public void before() { - System.setProperty("es4x.engine", "nashorn"); - runtime = new NashornEngine(rule.vertx()).newContext(); - } - - public static String testJSON(JsonObject o) { - return o.encodePrettily(); - } - - public static String testDataObject(HttpServerOptions o) { - return o.toJson().encodePrettily(); - } - - public static String testInstant(Instant instant) { - System.out.println(instant.toString()); - return "OK"; - } - - public static String testDate(Date instant) { - System.out.println(instant.toString()); - return "OK"; - } - @Test(timeout = 10000) - public void testCasting(TestContext should) throws Exception { - final Async test = should.async(); - - should.assertEquals("{\n \"foo\" : \"bar\"\n}", runtime.eval( - "var DynalinkTest = Java.type('io.reactiverse.es4x.dynalink.DinalynkTest');\n" + - "DynalinkTest.testJSON({foo: 'bar'});\n")); - - test.complete(); - } - - @Test(timeout = 10000) - public void testDataObject(TestContext should) throws Exception { - final Async test = should.async(); - - should.assertEquals(new HttpServerOptions().toJson().encodePrettily(), runtime.eval( - "var DynalinkTest = Java.type('io.reactiverse.es4x.dynalink.DinalynkTest');\n" + - "DynalinkTest.testDataObject({foo: 'bar'});\n")); - - test.complete(); - } - - @Test(timeout = 10000) - public void testInstant(TestContext should) throws Exception { - final Async test = should.async(); - - should.assertEquals("OK", runtime.eval( - "var DynalinkTest = Java.type('io.reactiverse.es4x.dynalink.DinalynkTest');\n" + - "DynalinkTest.testInstant(new Date());\n")); - - test.complete(); - } - - @Test(timeout = 10000) - public void testDate(TestContext should) throws Exception { - final Async test = should.async(); - - should.assertEquals("OK", runtime.eval( - "var DynalinkTest = Java.type('io.reactiverse.es4x.dynalink.DinalynkTest');\n" + - "DynalinkTest.testDate(new Date());\n")); - - test.complete(); - } -} diff --git a/es4x/src/test/java/io/reactiverse/es4x/ESModuleTest.java b/es4x/src/test/java/io/reactiverse/es4x/ESModuleTest.java index 9554504bc..6f280d2a1 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/ESModuleTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/ESModuleTest.java @@ -1,5 +1,6 @@ package io.reactiverse.es4x; +import io.reactiverse.es4x.impl.graal.GraalEngine; import io.vertx.ext.unit.TestContext; import io.vertx.ext.unit.junit.RunTestOnContext; import io.vertx.ext.unit.junit.VertxUnitRunner; @@ -9,7 +10,6 @@ import org.junit.Test; import org.junit.runner.RunWith; -import static io.reactiverse.es4x.test.Helper.getRuntime; import static org.junit.Assert.fail; @RunWith(VertxUnitRunner.class) @@ -22,7 +22,7 @@ public class ESModuleTest { @Before public void initialize() { - runtime = getRuntime(rule.vertx(), "GraalJS"); + runtime = new GraalEngine(rule.vertx()).newContext(); if (runtime == null) { fail("NULL runtime"); } diff --git a/es4x/src/test/java/io/reactiverse/es4x/FormatterTest.java b/es4x/src/test/java/io/reactiverse/es4x/FormatterTest.java new file mode 100644 index 000000000..d0df32dbb --- /dev/null +++ b/es4x/src/test/java/io/reactiverse/es4x/FormatterTest.java @@ -0,0 +1,20 @@ +package io.reactiverse.es4x; + +import io.vertx.core.logging.Logger; +import io.vertx.core.logging.LoggerFactory; +import org.junit.Test; + +public class FormatterTest { + + private final Logger log = LoggerFactory.getLogger(FormatterTest.class); + + @Test + public void testColors() { + log.fatal("Fatal message"); + log.error("Error message"); + log.warn("Warn message"); + log.info("Info message"); + log.debug("Debug message"); + log.trace("Trace message"); + } +} diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/AliasTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/AliasTest.java index 1a31dda87..c7573fdf4 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/AliasTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/AliasTest.java @@ -1,41 +1,25 @@ package io.reactiverse.es4x.test; import io.reactiverse.es4x.Runtime; +import io.reactiverse.es4x.impl.graal.GraalEngine; import io.vertx.ext.unit.junit.RunTestOnContext; -import io.vertx.ext.unit.junit.VertxUnitRunnerWithParametersFactory; +import io.vertx.ext.unit.junit.VertxUnitRunner; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.List; - -import static io.reactiverse.es4x.test.Helper.getRuntime; - -@RunWith(Parameterized.class) -@Parameterized.UseParametersRunnerFactory(VertxUnitRunnerWithParametersFactory.class) +@RunWith(VertxUnitRunner.class) public class AliasTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } - - private final String engineName; private Runtime runtime; - public AliasTest(String engine) { - engineName = engine; - } - @Rule public RunTestOnContext rule = new RunTestOnContext(); @Before public void initialize() { - runtime = getRuntime(rule.vertx(), engineName); + runtime = new GraalEngine(rule.vertx()).newContext(); } @Test(timeout = 10000) diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/CodecTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/CodecTest.java index 1b8a52ca3..3a835a3ea 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/CodecTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/CodecTest.java @@ -5,41 +5,30 @@ import io.vertx.ext.unit.Async; import io.vertx.ext.unit.TestContext; import io.vertx.ext.unit.junit.VertxUnitRunner; -import io.vertx.ext.unit.junit.VertxUnitRunnerWithParametersFactory; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.List; - -@RunWith(Parameterized.class) -@Parameterized.UseParametersRunnerFactory(VertxUnitRunnerWithParametersFactory.class) +@RunWith(VertxUnitRunner.class) public class CodecTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } - - public CodecTest(String engine) { - System.setProperty("es4x.engine", engine.toLowerCase()); - } - @Test(timeout = 10000) - public void testAlias(TestContext should) throws Exception { + public void testCodec(TestContext should) { final Async test = should.async(); Vertx.clusteredVertx(new VertxOptions(), clusteredVertx -> { should.assertTrue(clusteredVertx.succeeded()); final Vertx vertx = clusteredVertx.result(); + vertx.eventBus().consumer("test-complete", msg -> { + should.assertEquals("OK", msg.body()); + vertx.close(); + test.complete(); + }); + vertx.deployVerticle("js:cluster/receiver.js", deployReceiver -> { should.assertTrue(deployReceiver.succeeded()); vertx.deployVerticle("js:cluster/sender.js", deploySender -> { should.assertTrue(deploySender.succeeded()); - vertx.close(); - test.complete(); }); }); }); diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/CommonJSCyclicTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/CommonJSCyclicTest.java index 2c85aa9e6..d7f58070a 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/CommonJSCyclicTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/CommonJSCyclicTest.java @@ -1,42 +1,29 @@ package io.reactiverse.es4x.test; import io.reactiverse.es4x.Runtime; +import io.reactiverse.es4x.impl.graal.GraalEngine; import io.vertx.ext.unit.junit.RunTestOnContext; +import io.vertx.ext.unit.junit.VertxUnitRunner; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.List; - -import static io.reactiverse.es4x.test.Helper.getRuntime; +import static io.reactiverse.es4x.test.JS.getMember; +import static io.reactiverse.es4x.test.JS.isFunction; import static org.junit.Assert.assertTrue; -import static io.reactiverse.es4x.test.JS.*; - -@RunWith(Parameterized.class) +@RunWith(VertxUnitRunner.class) public class CommonJSCyclicTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } - - private final String engineName; private Runtime runtime; - public CommonJSCyclicTest(String engine) { - engineName = engine; - } - @Rule public RunTestOnContext rule = new RunTestOnContext(); @Before public void initialize() { - runtime = getRuntime(rule.vertx(), engineName); + runtime = new GraalEngine(rule.vertx()).newContext(); } @Test diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/CommonJSGlobalPollutionTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/CommonJSGlobalPollutionTest.java index a69396ddd..0266d33e9 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/CommonJSGlobalPollutionTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/CommonJSGlobalPollutionTest.java @@ -1,40 +1,28 @@ package io.reactiverse.es4x.test; import io.reactiverse.es4x.Runtime; +import io.reactiverse.es4x.impl.graal.GraalEngine; import io.vertx.ext.unit.junit.RunTestOnContext; +import io.vertx.ext.unit.junit.VertxUnitRunner; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.List; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; -import static io.reactiverse.es4x.test.Helper.getRuntime; -import static org.junit.Assert.*; - -@RunWith(Parameterized.class) +@RunWith(VertxUnitRunner.class) public class CommonJSGlobalPollutionTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } - - private final String engineName; private Runtime runtime; - public CommonJSGlobalPollutionTest(String engine) { - engineName = engine; - } - @Rule public RunTestOnContext rule = new RunTestOnContext(); @Before public void initialize() { - runtime = getRuntime(rule.vertx(), engineName); + runtime = new GraalEngine(rule.vertx()).newContext(); } @Test diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/CommonJsNODEPATHTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/CommonJsNODEPATHTest.java index cd4cb1634..12a57b736 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/CommonJsNODEPATHTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/CommonJsNODEPATHTest.java @@ -1,41 +1,28 @@ package io.reactiverse.es4x.test; import io.reactiverse.es4x.Runtime; +import io.reactiverse.es4x.impl.graal.GraalEngine; import io.vertx.ext.unit.junit.RunTestOnContext; +import io.vertx.ext.unit.junit.VertxUnitRunner; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.List; - -import static io.reactiverse.es4x.test.Helper.getRuntime; import static io.reactiverse.es4x.test.JS.getMember; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; -@RunWith(Parameterized.class) +@RunWith(VertxUnitRunner.class) public class CommonJsNODEPATHTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } - - private final String engineName; private Runtime runtime; - public CommonJsNODEPATHTest(String engine) { - engineName = engine; - } - @Rule public RunTestOnContext rule = new RunTestOnContext(); @Before public void initialize() { - runtime = getRuntime(rule.vertx(), engineName); + runtime = new GraalEngine(rule.vertx()).newContext(); } @Test diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/CommonJsNodeModulesTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/CommonJsNodeModulesTest.java index a62c08977..683a7ddb6 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/CommonJsNodeModulesTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/CommonJsNodeModulesTest.java @@ -1,43 +1,29 @@ package io.reactiverse.es4x.test; import io.reactiverse.es4x.Runtime; +import io.reactiverse.es4x.impl.graal.GraalEngine; import io.vertx.ext.unit.junit.RunTestOnContext; +import io.vertx.ext.unit.junit.VertxUnitRunner; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.List; - -import static io.reactiverse.es4x.test.Helper.getRuntime; +import static io.reactiverse.es4x.test.JS.getMember; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static io.reactiverse.es4x.test.JS.*; - -@RunWith(Parameterized.class) +@RunWith(VertxUnitRunner.class) public class CommonJsNodeModulesTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } - - private final String engineName; private Runtime runtime; - public CommonJsNodeModulesTest(String engine) { - engineName = engine; - } - @Rule public RunTestOnContext rule = new RunTestOnContext(); @Before public void initialize() { - runtime = getRuntime(rule.vertx(), engineName); + runtime = new GraalEngine(rule.vertx()).newContext(); } @Test diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/CommonJsTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/CommonJsTest.java index bb0fe65c3..00734e96b 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/CommonJsTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/CommonJsTest.java @@ -1,44 +1,29 @@ package io.reactiverse.es4x.test; import io.reactiverse.es4x.Runtime; +import io.reactiverse.es4x.impl.graal.GraalEngine; import io.vertx.ext.unit.junit.RunTestOnContext; +import io.vertx.ext.unit.junit.VertxUnitRunner; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.List; +import static io.reactiverse.es4x.test.JS.callAs; +import static io.reactiverse.es4x.test.JS.getMember; +import static org.junit.Assert.*; -import static io.reactiverse.es4x.test.Helper.getRuntime; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import static io.reactiverse.es4x.test.JS.*; - -@RunWith(Parameterized.class) +@RunWith(VertxUnitRunner.class) public class CommonJsTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } - - private final String engineName; private Runtime runtime; - public CommonJsTest(String engine) { - engineName = engine; - } - @Rule public RunTestOnContext rule = new RunTestOnContext(); @Before public void initialize() { - runtime = getRuntime(rule.vertx(), engineName); + runtime = new GraalEngine(rule.vertx()).newContext(); } @Test diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/CommonJsUserModulesTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/CommonJsUserModulesTest.java index 59b5ac97f..edd28c15b 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/CommonJsUserModulesTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/CommonJsUserModulesTest.java @@ -1,41 +1,28 @@ package io.reactiverse.es4x.test; import io.reactiverse.es4x.Runtime; +import io.reactiverse.es4x.impl.graal.GraalEngine; import io.vertx.ext.unit.junit.RunTestOnContext; +import io.vertx.ext.unit.junit.VertxUnitRunner; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.List; - -import static io.reactiverse.es4x.test.Helper.getRuntime; +import static io.reactiverse.es4x.test.JS.getMember; import static org.junit.Assert.assertEquals; -import static io.reactiverse.es4x.test.JS.*; -@RunWith(Parameterized.class) +@RunWith(VertxUnitRunner.class) public class CommonJsUserModulesTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } - - private final String engineName; private Runtime runtime; - public CommonJsUserModulesTest(String engine) { - engineName = engine; - } - @Rule public RunTestOnContext rule = new RunTestOnContext(); @Before public void initialize() { - runtime = getRuntime(rule.vertx(), engineName); + runtime = new GraalEngine(rule.vertx()).newContext(); } @Test diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/ConsoleTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/ConsoleTest.java index 24d4e7768..76d878c22 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/ConsoleTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/ConsoleTest.java @@ -1,37 +1,25 @@ package io.reactiverse.es4x.test; import io.reactiverse.es4x.Runtime; +import io.reactiverse.es4x.impl.graal.GraalEngine; import io.vertx.ext.unit.junit.RunTestOnContext; -import org.junit.*; +import io.vertx.ext.unit.junit.VertxUnitRunner; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.List; - -import static io.reactiverse.es4x.test.Helper.getRuntime; - -@RunWith(Parameterized.class) +@RunWith(VertxUnitRunner.class) public class ConsoleTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } - - private final String engineName; private Runtime runtime; - public ConsoleTest(String engine) { - engineName = engine; - } - @Rule public RunTestOnContext rule = new RunTestOnContext(); @Before public void initialize() { - runtime = getRuntime(rule.vertx(), engineName); + runtime = new GraalEngine(rule.vertx()).newContext(); } @Test diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/EventBusTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/EventBusTest.java index 66308d00c..797d7bf81 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/EventBusTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/EventBusTest.java @@ -1,45 +1,29 @@ package io.reactiverse.es4x.test; import io.reactiverse.es4x.Runtime; +import io.reactiverse.es4x.impl.graal.GraalEngine; import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; import io.vertx.ext.unit.Async; import io.vertx.ext.unit.TestContext; import io.vertx.ext.unit.junit.RunTestOnContext; -import io.vertx.ext.unit.junit.VertxUnitRunnerWithParametersFactory; +import io.vertx.ext.unit.junit.VertxUnitRunner; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.List; - -import static io.reactiverse.es4x.test.Helper.getRuntime; - -@RunWith(Parameterized.class) -@Parameterized.UseParametersRunnerFactory(VertxUnitRunnerWithParametersFactory.class) +@RunWith(VertxUnitRunner.class) public class EventBusTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } - - private final String engineName; private Runtime runtime; - public EventBusTest(String engine) { - engineName = engine; - } - @Rule public RunTestOnContext rule = new RunTestOnContext(); @Before public void initialize() { - runtime = getRuntime(rule.vertx(), engineName); + runtime = new GraalEngine(rule.vertx()).newContext(); runtime.put("eb", rule.vertx().eventBus()); } diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/FactoryMJSTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/FactoryMJSTest.java index 6548e5e7a..786c7acfd 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/FactoryMJSTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/FactoryMJSTest.java @@ -1,44 +1,17 @@ package io.reactiverse.es4x.test; -import io.reactiverse.es4x.Runtime; import io.vertx.core.DeploymentOptions; import io.vertx.ext.unit.Async; import io.vertx.ext.unit.TestContext; import io.vertx.ext.unit.junit.RunTestOnContext; -import io.vertx.ext.unit.junit.VertxUnitRunnerWithParametersFactory; -import org.junit.Before; +import io.vertx.ext.unit.junit.VertxUnitRunner; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.List; - -import static io.reactiverse.es4x.test.Helper.getRuntime; - -@RunWith(Parameterized.class) -@Parameterized.UseParametersRunnerFactory(VertxUnitRunnerWithParametersFactory.class) +@RunWith(VertxUnitRunner.class) public class FactoryMJSTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList(/*"Nashorn", */"GraalJS"); - } - - private final String engineName; - private Runtime runtime; - - public FactoryMJSTest(String engine) { - System.setProperty("es4x.engine", engine.toLowerCase()); - engineName = engine; - } - - @Before - public void initialize() { - runtime = getRuntime(rule.vertx(), engineName); - } - @Rule public RunTestOnContext rule = new RunTestOnContext(); diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/FactoryTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/FactoryTest.java index 25e2e4c60..22e3a16d9 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/FactoryTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/FactoryTest.java @@ -3,28 +3,14 @@ import io.vertx.ext.unit.Async; import io.vertx.ext.unit.TestContext; import io.vertx.ext.unit.junit.RunTestOnContext; -import io.vertx.ext.unit.junit.VertxUnitRunnerWithParametersFactory; +import io.vertx.ext.unit.junit.VertxUnitRunner; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.List; - -@RunWith(Parameterized.class) -@Parameterized.UseParametersRunnerFactory(VertxUnitRunnerWithParametersFactory.class) +@RunWith(VertxUnitRunner.class) public class FactoryTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } - - public FactoryTest(String engine) { - System.setProperty("es4x.engine", engine.toLowerCase()); - } - @Rule public RunTestOnContext rule = new RunTestOnContext(); diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/FilterHostClassTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/FilterHostClassTest.java index 7f0f63868..a0cf4b153 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/FilterHostClassTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/FilterHostClassTest.java @@ -1,34 +1,34 @@ package io.reactiverse.es4x.test; +import io.vertx.core.logging.Logger; +import io.vertx.core.logging.LoggerFactory; import io.vertx.ext.unit.Async; import io.vertx.ext.unit.TestContext; import io.vertx.ext.unit.junit.RunTestOnContext; -import io.vertx.ext.unit.junit.VertxUnitRunnerWithParametersFactory; +import io.vertx.ext.unit.junit.VertxUnitRunner; +import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import javax.swing.text.html.parser.Parser; -import java.util.Arrays; -import java.util.List; -import java.util.regex.Pattern; - -@RunWith(Parameterized.class) -@Parameterized.UseParametersRunnerFactory(VertxUnitRunnerWithParametersFactory.class) +@RunWith(VertxUnitRunner.class) public class FilterHostClassTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } + private static final Logger LOGGER = LoggerFactory.getLogger(FilterHostClassTest.class); + - public FilterHostClassTest(String engine) { - System.setProperty("es4x.engine", engine.toLowerCase()); + @BeforeClass + public static void before() { //System.setProperty("es4x.host.class.filter", "io.vertx.**,java.util.**,java.time.**,java.lang.**,java.net.**,io.reactiverse.es4x.**,!java.nio.file.FileAlreadyExistsException"); System.setProperty("es4x.host.class.filter", "!java.nio.file.FileAlreadyExistsException"); } + @AfterClass + public static void after() { + System.getProperties().remove("es4x.host.class.filter"); + } + @Rule public RunTestOnContext rule = new RunTestOnContext(); @@ -37,7 +37,7 @@ public void shouldDeployVerticle(TestContext ctx) { final Async async = ctx.async(); rule.vertx().deployVerticle("js:./verticle3.js", deploy -> { ctx.assertFalse(deploy.succeeded()); - System.out.println(deploy.cause()); + LOGGER.error("SHOULD FAIL", deploy.cause()); // fails because we excluded the class "java.nio.file.FileAlreadyExistsException" async.complete(); }); diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/GlobalsTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/GlobalsTest.java index 2965bc1d8..5cc751784 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/GlobalsTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/GlobalsTest.java @@ -1,44 +1,29 @@ package io.reactiverse.es4x.test; import io.reactiverse.es4x.Runtime; +import io.reactiverse.es4x.impl.graal.GraalEngine; import io.vertx.ext.unit.Async; import io.vertx.ext.unit.TestContext; import io.vertx.ext.unit.junit.RunTestOnContext; -import io.vertx.ext.unit.junit.VertxUnitRunnerWithParametersFactory; +import io.vertx.ext.unit.junit.VertxUnitRunner; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import java.time.Instant; -import java.util.Arrays; -import java.util.List; -import static io.reactiverse.es4x.test.Helper.getRuntime; - -@RunWith(Parameterized.class) -@Parameterized.UseParametersRunnerFactory(VertxUnitRunnerWithParametersFactory.class) +@RunWith(VertxUnitRunner.class) public class GlobalsTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } - - private final String engineName; private Runtime runtime; - public GlobalsTest(String engine) { - engineName = engine; - } - @Rule public RunTestOnContext rule = new RunTestOnContext(); @Before public void initialize() { - runtime = getRuntime(rule.vertx(), engineName); + runtime = new GraalEngine(rule.vertx()).newContext(); } @Test(timeout = 10000) diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/Helper.java b/es4x/src/test/java/io/reactiverse/es4x/test/Helper.java deleted file mode 100644 index d5995f404..000000000 --- a/es4x/src/test/java/io/reactiverse/es4x/test/Helper.java +++ /dev/null @@ -1,37 +0,0 @@ -package io.reactiverse.es4x.test; - -import io.reactiverse.es4x.Runtime; -import io.reactiverse.es4x.impl.graal.GraalEngine; -import io.reactiverse.es4x.impl.nashorn.NashornEngine; -import io.vertx.core.Vertx; - -import static org.junit.Assume.assumeTrue; - -public class Helper { - - public static Runtime getRuntime(Vertx vertx, String name) { - - switch (name) { - case "Nashorn": - try { - System.setProperty("es4x.engine", name.toLowerCase()); - return new NashornEngine(vertx).newContext(); - } catch (Throwable t) { - assumeTrue(name + " is not available", false); - } - break; - case "GraalJS": - try { - System.setProperty("es4x.engine", name.toLowerCase()); - return new GraalEngine(vertx).newContext(); - } catch (Throwable t) { - assumeTrue(name + " is not available", false); - } - break; - default: - throw new RuntimeException(name + " is not a valid runtime"); - } - - return null; - } -} diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/InteropTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/InteropTest.java index 855ce1cb2..6e96dbe89 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/InteropTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/InteropTest.java @@ -1,45 +1,25 @@ package io.reactiverse.es4x.test; import io.reactiverse.es4x.Runtime; -import io.vertx.core.json.JsonArray; -import io.vertx.core.json.JsonObject; +import io.reactiverse.es4x.impl.graal.GraalEngine; import io.vertx.ext.unit.junit.RunTestOnContext; -import org.graalvm.polyglot.Value; +import io.vertx.ext.unit.junit.VertxUnitRunner; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.List; - -import static io.reactiverse.es4x.test.Helper.getRuntime; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -@RunWith(Parameterized.class) +@RunWith(VertxUnitRunner.class) public class InteropTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList(/* "Nashorn", */"GraalJS"); - } - private Runtime runtime; - private final String engineName; - - public InteropTest(String engine) { - engineName = engine; - } - @Rule public RunTestOnContext rule = new RunTestOnContext(); @Before - public void initialize() throws Exception { - runtime = getRuntime(rule.vertx(), engineName); + public void initialize() { + runtime = new GraalEngine(rule.vertx()).newContext(); } @Test diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/JS.java b/es4x/src/test/java/io/reactiverse/es4x/test/JS.java index b2bb96bf5..e182cd9b3 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/JS.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/JS.java @@ -1,6 +1,5 @@ package io.reactiverse.es4x.test; -import jdk.nashorn.api.scripting.JSObject; import org.graalvm.polyglot.Value; public final class JS { @@ -10,9 +9,6 @@ private JS () { } static boolean isFunction(Object obj) { - if (obj instanceof JSObject) { - return ((JSObject) obj).isFunction(); - } if (obj instanceof Value) { return ((Value) obj).canExecute(); } @@ -20,9 +16,6 @@ static boolean isFunction(Object obj) { } static Object getMember(Object obj, String member) { - if (obj instanceof JSObject) { - return ((JSObject) obj).getMember(member); - } if (obj instanceof Value) { return ((Value) obj).getMember(member); } @@ -31,9 +24,6 @@ static Object getMember(Object obj, String member) { } static T getMember(Object obj, String member, Class asClass) { - if (obj instanceof JSObject) { - return (T) ((JSObject) obj).getMember(member); - } if (obj instanceof Value) { return ((Value) obj).getMember(member).as(asClass); } @@ -42,9 +32,6 @@ static T getMember(Object obj, String member, Class asClass) { } static Object call(Object thiz, Object fn, Object... args) { - if (fn instanceof JSObject) { - return ((JSObject) fn).call(thiz, args); - } if (fn instanceof Value) { return ((Value) fn).execute(args); } @@ -53,10 +40,6 @@ static Object call(Object thiz, Object fn, Object... args) { } static T callAs(Object thiz, Object fn, Class asType, Object... args) { - if (fn instanceof JSObject) { - return (T) ((JSObject) fn).call(thiz, args); - } - if (fn instanceof Value) { return ((Value) fn).execute(args).as(asType); } diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/JSConsoleTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/JSConsoleTest.java index af0dc9762..5f7e99fa2 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/JSConsoleTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/JSConsoleTest.java @@ -1,39 +1,25 @@ package io.reactiverse.es4x.test; import io.reactiverse.es4x.Runtime; +import io.reactiverse.es4x.impl.graal.GraalEngine; import io.vertx.ext.unit.junit.RunTestOnContext; +import io.vertx.ext.unit.junit.VertxUnitRunner; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.List; - -import static io.reactiverse.es4x.test.Helper.getRuntime; - -@RunWith(Parameterized.class) +@RunWith(VertxUnitRunner.class) public class JSConsoleTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } - - private final String engineName; private Runtime runtime; - public JSConsoleTest(String engine) { - engineName = engine; - } - @Rule public RunTestOnContext rule = new RunTestOnContext(); @Before public void initialize() { - runtime = getRuntime(rule.vertx(), engineName); + runtime = new GraalEngine(rule.vertx()).newContext(); } @Test diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/JSONTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/JSONTest.java index 778525dd3..7c1fc22d6 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/JSONTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/JSONTest.java @@ -1,39 +1,25 @@ package io.reactiverse.es4x.test; import io.reactiverse.es4x.Runtime; +import io.reactiverse.es4x.impl.graal.GraalEngine; import io.vertx.ext.unit.junit.RunTestOnContext; +import io.vertx.ext.unit.junit.VertxUnitRunner; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.List; - -import static io.reactiverse.es4x.test.Helper.getRuntime; - -@RunWith(Parameterized.class) +@RunWith(VertxUnitRunner.class) public class JSONTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } - - private final String engineName; private Runtime runtime; - public JSONTest(String engine) { - engineName = engine; - } - @Rule public RunTestOnContext rule = new RunTestOnContext(); @Before public void initialize() { - runtime = getRuntime(rule.vertx(), engineName); + runtime = new GraalEngine(rule.vertx()).newContext(); } @Test @@ -44,9 +30,5 @@ public void shouldStringify() throws Exception { runtime.eval("console.log(JSON.stringify([1,2,'', null]))"); runtime.eval("var JsonObject = Java.type('io.vertx.core.json.JsonObject'); console.log(JSON.stringify(new JsonObject()))"); runtime.eval("var JsonObject = Java.type('io.vertx.core.json.JsonObject'); console.log(JSON.stringify(new JsonObject().put('k', 1)))"); -// runtime.eval("console.log(JSON.stringify({}))"); -// runtime.eval("console.log(JSON.stringify({}))"); -// runtime.eval("console.log(JSON.stringify({}))"); -// runtime.eval("console.log(JSON.stringify({}))"); } } diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/LoggerTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/LoggerTest.java index d4560e0d4..f55480559 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/LoggerTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/LoggerTest.java @@ -1,43 +1,29 @@ package io.reactiverse.es4x.test; import io.reactiverse.es4x.Runtime; +import io.reactiverse.es4x.impl.graal.GraalEngine; import io.vertx.core.logging.Logger; import io.vertx.core.logging.LoggerFactory; import io.vertx.ext.unit.junit.RunTestOnContext; +import io.vertx.ext.unit.junit.VertxUnitRunner; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.List; - -import static io.reactiverse.es4x.test.Helper.getRuntime; - -@RunWith(Parameterized.class) +@RunWith(VertxUnitRunner.class) public class LoggerTest { private final Logger log = LoggerFactory.getLogger(LoggerTest.class); - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } - - private final String engineName; private Runtime runtime; - public LoggerTest(String engine) { - engineName = engine; - } - @Rule public RunTestOnContext rule = new RunTestOnContext(); @Before public void initialize() { - runtime = getRuntime(rule.vertx(), engineName); + runtime = new GraalEngine(rule.vertx()).newContext(); } @Test diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/MultithreadTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/MultithreadTest.java deleted file mode 100644 index 9d7d15d7c..000000000 --- a/es4x/src/test/java/io/reactiverse/es4x/test/MultithreadTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package io.reactiverse.es4x.test; - -import io.vertx.core.DeploymentOptions; -import io.vertx.core.Vertx; -import io.vertx.core.json.JsonObject; -import io.vertx.ext.unit.Async; -import io.vertx.ext.unit.TestContext; -import io.vertx.ext.unit.junit.RunTestOnContext; -import io.vertx.ext.unit.junit.VertxUnitRunnerWithParametersFactory; -import org.junit.*; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; - -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -@RunWith(Parameterized.class) -@Parameterized.UseParametersRunnerFactory(VertxUnitRunnerWithParametersFactory.class) -public class MultithreadTest { - - @Parameterized.Parameters - public static List engines() { - // Graal is disabled on purpose as it will not allow MT under JS - // the workaround is to use the Worker API which deploys everything in the worker pool - return Arrays.asList("Nashorn" /*, "GraalJS" */); - } - - public MultithreadTest(String engine) { - System.setProperty("es4x.engine", engine.toLowerCase()); - } - - @Rule - public RunTestOnContext rule = new RunTestOnContext(); - - @Test(timeout = 10000) - public void shouldNotPoluteMTState(TestContext ctx) { - final Vertx vertx = rule.vertx(); - final Async async = ctx.async(); - // install global exception handler - vertx.exceptionHandler(ctx::fail); - // deploy 8 instances - vertx.deployVerticle("js:./mt-verticle.js", new DeploymentOptions().setInstances(8), deploy -> { - if (deploy.failed()) { - // log the error (trying to find out why it fails on j9 travis) - deploy.cause().printStackTrace(); - } - ctx.assertTrue(deploy.succeeded()); - - // will wait 1 second to let things start... - vertx.setTimer(1000L, v -> { - final AtomicInteger cnt = new AtomicInteger(50); - - // run 50 runs - for(int i = 0; i < 50; i++) { - vertx.eventBus().send("es4x.mt.test", new JsonObject(), ar -> { - if (ar.failed()) { - ctx.fail(ar.cause()); - return; - } - - int result = ar.result().body().getInteger("result"); - if(result != 2) { - ctx.fail("Incorrect result from js, expected 1 + 1 = 2, but got: " + result); - return; - } - - if (cnt.decrementAndGet() == 0) { - async.complete(); - } - }); - } - }); - }); - } -} diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/NativeJSONTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/NativeJSONTest.java index 1054bb867..e30aa2c00 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/NativeJSONTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/NativeJSONTest.java @@ -1,46 +1,32 @@ package io.reactiverse.es4x.test; import io.reactiverse.es4x.Runtime; +import io.reactiverse.es4x.impl.graal.GraalEngine; import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; import io.vertx.ext.unit.junit.RunTestOnContext; +import io.vertx.ext.unit.junit.VertxUnitRunner; import org.graalvm.polyglot.Value; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.List; - -import static io.reactiverse.es4x.test.Helper.getRuntime; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -@RunWith(Parameterized.class) +@RunWith(VertxUnitRunner.class) public class NativeJSONTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } - private Runtime runtime; private Object JSON; - private final String engineName; - - public NativeJSONTest(String engine) { - engineName = engine; - } - @Rule public RunTestOnContext rule = new RunTestOnContext(); @Before public void initialize() throws Exception { - runtime = getRuntime(rule.vertx(), engineName); + runtime = new GraalEngine(rule.vertx()).newContext(); JSON = runtime.eval("JSON"); } diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/PathsTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/PathsTest.java index e990cb169..73d2a8e80 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/PathsTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/PathsTest.java @@ -1,44 +1,29 @@ package io.reactiverse.es4x.test; import io.reactiverse.es4x.Runtime; +import io.reactiverse.es4x.impl.graal.GraalEngine; import io.vertx.ext.unit.Async; import io.vertx.ext.unit.TestContext; import io.vertx.ext.unit.junit.RunTestOnContext; -import io.vertx.ext.unit.junit.VertxUnitRunnerWithParametersFactory; +import io.vertx.ext.unit.junit.VertxUnitRunner; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import java.io.File; -import java.util.Arrays; -import java.util.List; -import static io.reactiverse.es4x.test.Helper.getRuntime; - -@RunWith(Parameterized.class) -@Parameterized.UseParametersRunnerFactory(VertxUnitRunnerWithParametersFactory.class) +@RunWith(VertxUnitRunner.class) public class PathsTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } - - private final String engineName; private Runtime runtime; - public PathsTest(String engine) { - engineName = engine; - } - @Rule public RunTestOnContext rule = new RunTestOnContext(); @Before public void initialize() { - runtime = getRuntime(rule.vertx(), engineName); + runtime = new GraalEngine(rule.vertx()).newContext(); } @Test(timeout = 10000) diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/ProcessTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/ProcessTest.java index a7272e2bd..693b68224 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/ProcessTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/ProcessTest.java @@ -1,43 +1,31 @@ package io.reactiverse.es4x.test; import io.reactiverse.es4x.Runtime; +import io.reactiverse.es4x.impl.graal.GraalEngine; import io.vertx.ext.unit.junit.RunTestOnContext; +import io.vertx.ext.unit.junit.VertxUnitRunner; import org.graalvm.polyglot.Value; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.List; import java.util.Map; -import static io.reactiverse.es4x.test.Helper.getRuntime; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; -@RunWith(Parameterized.class) +@RunWith(VertxUnitRunner.class) public class ProcessTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } - - private final String engineName; private Runtime runtime; - public ProcessTest(String engine) { - engineName = engine; - } - @Rule public RunTestOnContext rule = new RunTestOnContext(); @Before public void initialize() { - runtime = getRuntime(rule.vertx(), engineName); + runtime = new GraalEngine(rule.vertx()).newContext(); } @Test(timeout = 10000) diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/ShellTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/ShellTest.java index 6db2fc308..ed4883677 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/ShellTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/ShellTest.java @@ -3,33 +3,19 @@ import io.vertx.ext.unit.Async; import io.vertx.ext.unit.TestContext; import io.vertx.ext.unit.junit.RunTestOnContext; -import io.vertx.ext.unit.junit.VertxUnitRunnerWithParametersFactory; +import io.vertx.ext.unit.junit.VertxUnitRunner; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.List; - -@RunWith(Parameterized.class) -@Parameterized.UseParametersRunnerFactory(VertxUnitRunnerWithParametersFactory.class) +@RunWith(VertxUnitRunner.class) public class ShellTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } - - public ShellTest(String engine) { - System.setProperty("es4x.engine", engine.toLowerCase()); - } - @Rule public RunTestOnContext rule = new RunTestOnContext(); @Test(timeout = 10000) - public void shouldRunAScript(TestContext should) throws Exception { + public void shouldRunAScript(TestContext should) { final Async test = should.async(); System.setProperty("script", "process.properties['result'] = 'OK';"); rule.vertx().deployVerticle("js:>", deploy -> { diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/StackTraceTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/StackTraceTest.java index d7d46efdc..279f88d40 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/StackTraceTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/StackTraceTest.java @@ -1,44 +1,29 @@ package io.reactiverse.es4x.test; import io.reactiverse.es4x.Runtime; +import io.reactiverse.es4x.impl.graal.GraalEngine; import io.vertx.ext.unit.Async; import io.vertx.ext.unit.TestContext; import io.vertx.ext.unit.junit.RunTestOnContext; -import io.vertx.ext.unit.junit.VertxUnitRunnerWithParametersFactory; +import io.vertx.ext.unit.junit.VertxUnitRunner; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.List; +import static io.reactiverse.es4x.AsyncError.asyncError; -import static io.reactiverse.es4x.AsyncError.*; -import static io.reactiverse.es4x.test.Helper.getRuntime; - -@RunWith(Parameterized.class) -@Parameterized.UseParametersRunnerFactory(VertxUnitRunnerWithParametersFactory.class) +@RunWith(VertxUnitRunner.class) public class StackTraceTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } - - private final String engineName; private Runtime runtime; @Rule public RunTestOnContext rule = new RunTestOnContext(); - public StackTraceTest(String engine) { - engineName = engine; - } - @Before public void initialize() { - runtime = getRuntime(rule.vertx(), engineName); + runtime = new GraalEngine(rule.vertx()).newContext(); } @Test(timeout = 10000) diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/UtilTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/UtilTest.java index 7e6dee0aa..77025ead2 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/UtilTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/UtilTest.java @@ -1,43 +1,27 @@ package io.reactiverse.es4x.test; import io.reactiverse.es4x.Runtime; +import io.reactiverse.es4x.impl.graal.GraalEngine; import io.vertx.ext.unit.Async; import io.vertx.ext.unit.TestContext; import io.vertx.ext.unit.junit.RunTestOnContext; -import io.vertx.ext.unit.junit.VertxUnitRunnerWithParametersFactory; +import io.vertx.ext.unit.junit.VertxUnitRunner; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.List; - -import static io.reactiverse.es4x.test.Helper.getRuntime; - -@RunWith(Parameterized.class) -@Parameterized.UseParametersRunnerFactory(VertxUnitRunnerWithParametersFactory.class) +@RunWith(VertxUnitRunner.class) public class UtilTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } - - private final String engineName; private Runtime runtime; - public UtilTest(String engine) { - engineName = engine; - } - @Rule public RunTestOnContext rule = new RunTestOnContext(); @Before public void initialize() { - runtime = getRuntime(rule.vertx(), engineName); + runtime = new GraalEngine(rule.vertx()).newContext(); } @Test(timeout = 10000) diff --git a/es4x/src/test/java/io/reactiverse/es4x/test/WorkerTest.java b/es4x/src/test/java/io/reactiverse/es4x/test/WorkerTest.java index 27c14bb7d..c9034c29e 100644 --- a/es4x/src/test/java/io/reactiverse/es4x/test/WorkerTest.java +++ b/es4x/src/test/java/io/reactiverse/es4x/test/WorkerTest.java @@ -1,44 +1,27 @@ package io.reactiverse.es4x.test; import io.reactiverse.es4x.Runtime; +import io.reactiverse.es4x.impl.graal.GraalEngine; import io.vertx.ext.unit.Async; import io.vertx.ext.unit.TestContext; import io.vertx.ext.unit.junit.RunTestOnContext; -import io.vertx.ext.unit.junit.VertxUnitRunnerWithParametersFactory; +import io.vertx.ext.unit.junit.VertxUnitRunner; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.List; - -import static io.reactiverse.es4x.test.Helper.getRuntime; - -@RunWith(Parameterized.class) -@Parameterized.UseParametersRunnerFactory(VertxUnitRunnerWithParametersFactory.class) +@RunWith(VertxUnitRunner.class) public class WorkerTest { - @Parameterized.Parameters - public static List engines() { - return Arrays.asList("Nashorn", "GraalJS"); - } - - private final String engineName; private Runtime runtime; - public WorkerTest(String engine) { - System.setProperty("es4x.engine", engine.toLowerCase()); - engineName = engine; - } - @Rule public RunTestOnContext rule = new RunTestOnContext(); @Before public void initialize() { - runtime = getRuntime(rule.vertx(), engineName); + runtime = new GraalEngine(rule.vertx()).newContext(); } @Test(timeout = 30000) diff --git a/es4x/src/test/resources/cluster/receiver.js b/es4x/src/test/resources/cluster/receiver.js index 738c32218..80c5c81c5 100644 --- a/es4x/src/test/resources/cluster/receiver.js +++ b/es4x/src/test/resources/cluster/receiver.js @@ -2,7 +2,7 @@ var eb = vertx.eventBus(); eb.consumer("ping-address", function (message) { - console.log("Received message: " + message.body()); + console.log("Receiver received: " + message.body()); // Now send back reply message.reply([1,2,3]); }); diff --git a/es4x/src/test/resources/cluster/sender.js b/es4x/src/test/resources/cluster/sender.js index 432d3bc5d..7332d90ba 100644 --- a/es4x/src/test/resources/cluster/sender.js +++ b/es4x/src/test/resources/cluster/sender.js @@ -1,7 +1,15 @@ var eb = vertx.eventBus(); -eb.send("ping-address", {"k": 1}, function (message) { - console.log("Received message: " + message.body()); +eb.send("ping-address", {"k": 1}, function (send) { + if (send.failed()) { + console.trace(send.cause()); + } + var result = send.result(); + console.log('Sender received: ' + result.body()); + + process.nextTick(function () { + eb.send("test-complete", 'OK'); + }); }); console.log("Sender ready!"); diff --git a/es4x/src/test/resources/vertx-default-jul-logging.properties b/es4x/src/test/resources/vertx-default-jul-logging.properties new file mode 100644 index 000000000..d31504f34 --- /dev/null +++ b/es4x/src/test/resources/vertx-default-jul-logging.properties @@ -0,0 +1,24 @@ +# +# Copyright 2018 Red Hat, Inc. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License v1.0 +# and Apache License v2.0 which accompanies this distribution. +# +# The Eclipse Public License is available at +# http://www.eclipse.org/legal/epl-v10.html +# +# The Apache License v2.0 is available at +# http://www.opensource.org/licenses/apache2.0.php +# +# You may elect to redistribute this code under either of these licenses. +# +handlers=java.util.logging.ConsoleHandler +java.util.logging.ConsoleHandler.formatter=io.reactiverse.es4x.jul.ES4XFormatter +java.util.logging.ConsoleHandler.level=FINEST + +.level=INFO +io.reactiverse.level=FINEST +io.vertx.level=INFO +com.hazelcast.level=INFO +io.netty.util.internal.PlatformDependent.level=SEVERE diff --git a/pm/src/main/java/io/reactiverse/es4x/commands/Helper.java b/pm/src/main/java/io/reactiverse/es4x/commands/Helper.java index 8d6b5e6b2..b19cb4130 100644 --- a/pm/src/main/java/io/reactiverse/es4x/commands/Helper.java +++ b/pm/src/main/java/io/reactiverse/es4x/commands/Helper.java @@ -73,15 +73,15 @@ static String exec(String... command) throws IOException, InterruptedException { } static void fatal(String message) { - System.err.println("\u001B[1m\u001B[33m" + message + "\u001B[0m"); + System.err.println("\u001B[1m\u001B[31m" + message + "\u001B[0m"); System.exit(1); } static void err(String message) { - System.err.println("\u001B[1m\u001B[33m" + message + "\u001B[0m"); + System.err.println("\u001B[1m\u001B[31m" + message + "\u001B[0m"); } static void warn(String message) { - System.err.println("\u001B[1m\u001B[31m" + message + "\u001B[0m"); + System.err.println("\u001B[1m\u001B[33m" + message + "\u001B[0m"); } } diff --git a/pm/src/main/java/io/reactiverse/es4x/commands/InstallCommand.java b/pm/src/main/java/io/reactiverse/es4x/commands/InstallCommand.java index 8938ba06d..81a8c4a1d 100644 --- a/pm/src/main/java/io/reactiverse/es4x/commands/InstallCommand.java +++ b/pm/src/main/java/io/reactiverse/es4x/commands/InstallCommand.java @@ -149,7 +149,7 @@ public void run() throws CLIException { err(e.getMessage()); } } else { - warn("Current JDK supports Nashorn [ES5.1] or GraalJS Interpreted!"); + warn("Current JDK only supports GraalJS in Interpreted mode!"); } } } diff --git a/pm/src/main/java/io/reactiverse/es4x/commands/JLinkCommand.java b/pm/src/main/java/io/reactiverse/es4x/commands/JLinkCommand.java index 67c52186b..635a830a2 100644 --- a/pm/src/main/java/io/reactiverse/es4x/commands/JLinkCommand.java +++ b/pm/src/main/java/io/reactiverse/es4x/commands/JLinkCommand.java @@ -62,24 +62,21 @@ public void run() throws CLIException { } // Collect the jmods used in the application - String mods = exec(javaHomePrefix() + "jdeps", "--module-path", "node_modules/.libs", "--print-module-deps", "node_modules/.bin/" + launcher + ".jar"); - - // remove nashorn is jvmci is supported + String mods = exec(javaHomePrefix() + "jdeps", "--module-path", "node_modules/.lib", "--print-module-deps", "node_modules/.bin/" + launcher + ".jar"); + // trim any new line + mods = mods.replaceAll("\r?\n", ""); + // enable jvmci if supported String modules = exec(javaHomePrefix() + "java", "--list-modules"); if (modules.contains("jdk.internal.vm.ci")) { if (!mods.contains("jdk.internal.vm.ci")) { // add the jvmci module mods = mods + ",jdk.internal.vm.ci"; } - // remove nashorn - mods = mods.replace("jdk.scripting.nashorn", ""); - mods = mods.replace("jdk.dynalink", ""); // clean up mods = mods.replaceAll(",,", ","); } - // jlink - exec(javaHomePrefix() + "jlink", "--no-header-files", "--no-man-pages", "--compress=2", "-strip-debug", "--add-modules", mods, "--output", "/jre"); + exec(javaHomePrefix() + "jlink", "--no-header-files", "--no-man-pages", "--compress=2", "-strip-debug", "--add-modules", mods, "--output", "jre"); } else { fatal("Your JDK version does not support jlink (< 11)"); } diff --git a/pom.xml b/pom.xml index 01e6bfa8e..e3e19f71f 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ 1.8 UTF-8 - 3.7.0 + 3.7.1 19.0.0