Skip to content

Commit

Permalink
Switch the JavaScript engine used for testing from Nashorn to GraalJS
Browse files Browse the repository at this point in the history
  • Loading branch information
yasuyuki-baba committed Apr 19, 2022
1 parent 9e3db7d commit 6a0d1cc
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 35 deletions.
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ repositories {

dependencies {
testImplementation group: 'junit', name: 'junit', version: '4.13.2'
testImplementation group: 'org.graalvm.js', name: 'js', version: '22.0.0.2'
testImplementation group: 'org.graalvm.js', name: 'js-scriptengine', version: '22.0.0.2'
jmh group: 'org.openjdk.jmh', name: 'jmh-core', version: '1.34'
jmh group: 'org.openjdk.jmh', name: 'jmh-generator-annprocess', version: '1.34'
jmh group: 'org.ow2.asm', name: 'asm', version: '9.3'
Expand Down
46 changes: 16 additions & 30 deletions src/test/java/com/nulabinc/zxcvbn/ApproachComparisonTest.java
Original file line number Diff line number Diff line change
@@ -1,22 +1,24 @@
package com.nulabinc.zxcvbn;

import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.*;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.*;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.*;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import static java.nio.CharBuffer.wrap;
import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.assertNotNull;
import static junit.framework.TestCase.fail;

/**
* These tests compare the output from different approaches for calculating password strength.
Expand All @@ -34,7 +36,7 @@ public class ApproachComparisonTest {

private static ScriptEngine engine;

private CharSequence password;
private final CharSequence password;

private Strength charSequenceStrength;
private Strength stringStrength;
Expand All @@ -54,7 +56,7 @@ private void calculateAndRecordStrengthUsingAllMethods(CharSequence password, Zx

stringStrength = zxcvbn.measure(password.toString());

stringInputsStrength = zxcvbn.measure(password, Collections.EMPTY_LIST);
stringInputsStrength = zxcvbn.measure(password, Collections.<String>emptyList());

jsStrength = invokeJsVersion(password);
}
Expand Down Expand Up @@ -172,7 +174,7 @@ public void assertStringListsAreEqual(List<String> expectedStrings, List<String>
}
}

class JavaScriptStrength {
static class JavaScriptStrength {
private final Map<String, Object> values;

public JavaScriptStrength(Map<String, Object> values) {
Expand All @@ -198,31 +200,15 @@ public String getPassword() {
public JavaScriptStrength invokeJsVersion(CharSequence password) {
engine.put("pwd",password.toString());
try {
return new JavaScriptStrength(( Map<String, Object>) engine.eval("zxcvbn(pwd);"));
return new JavaScriptStrength((Map<String, Object>) engine.eval("zxcvbn(pwd);"));
} catch (ScriptException e) {
System.err.println("Error invoking JavaScript version for password "+password);
fail("Error invoking JavaScript version for password " + password);
return null;
}
}

@BeforeClass
public static void beforeClass() {
engine = initScriptEngine();
}

public static ScriptEngine initScriptEngine() {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");

try {
//using the 4.4.1 release
URL script = JavaPortTest.class.getClassLoader().getResource("zxcvbn.js");
engine.eval(new FileReader(new File(script.toURI())));
} catch (URISyntaxException | FileNotFoundException | ScriptException e) {
throw new RuntimeException("Cannot instantiate Javascript Engine", e);
}

return engine;
engine = new JSScriptEngineBuilder().build();
}

}
36 changes: 36 additions & 0 deletions src/test/java/com/nulabinc/zxcvbn/JSScriptEngineBuilder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.nulabinc.zxcvbn;

import com.oracle.truffle.js.scriptengine.GraalJSScriptEngine;
import org.graalvm.polyglot.Context;
import org.graalvm.polyglot.Engine;

import javax.script.ScriptEngine;
import javax.script.ScriptException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.net.URISyntaxException;
import java.net.URL;

public class JSScriptEngineBuilder {

public ScriptEngine build() {
final GraalJSScriptEngine engine = GraalJSScriptEngine.create(
Engine.newBuilder()
.option("engine.WarnInterpreterOnly", "false")
.build(),
Context.newBuilder("js"));
loadZxcvbnJs(engine);
return engine;
}

private void loadZxcvbnJs(ScriptEngine engine) {
try {
//using the 4.4.1 release
URL script = JSScriptEngineBuilder.class.getClassLoader().getResource("zxcvbn.js");
engine.eval(new FileReader(new File(script.toURI())));
} catch (URISyntaxException | FileNotFoundException | ScriptException e) {
throw new RuntimeException("Cannot instantiate Javascript Engine", e);
}
}
}
8 changes: 3 additions & 5 deletions src/test/java/com/nulabinc/zxcvbn/JavaPortTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,22 +10,20 @@
import java.util.Arrays;
import java.util.Map;

import static com.nulabinc.zxcvbn.ApproachComparisonTest.initScriptEngine;

@RunWith(Parameterized.class)
public class JavaPortTest {
private static ScriptEngine engine;
private String password;
private final String password;
private final Zxcvbn zxcvbn;

public JavaPortTest(String password) {
this.password = password;
zxcvbn = new Zxcvbn();
this.zxcvbn = new Zxcvbn();
}

@BeforeClass
public static void initEngine() {
engine = initScriptEngine();
engine = new JSScriptEngineBuilder().build();
}

@Test
Expand Down

0 comments on commit 6a0d1cc

Please sign in to comment.