# HG changeset patch # User Jaroslav Tulach # Date 1407574354 -7200 # Node ID 0101d10bd2e0d7132c1a409b9e96508caab44af9 # Parent d02324a82d80b14c0fc56a0b68450ab745b4e980 Modifying the test to fail in bck2brwsr VM diff -r d02324a82d80 -r 0101d10bd2e0 rt/vm/src/test/java/org/apidesign/vm4brwsr/InvokeDynamicTest.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/InvokeDynamicTest.java Sat Aug 09 10:42:22 2014 +0200 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/InvokeDynamicTest.java Sat Aug 09 10:52:34 2014 +0200 @@ -17,11 +17,15 @@ */ package org.apidesign.vm4brwsr; +import java.io.ByteArrayInputStream; +import java.io.IOException; import java.io.InputStream; import java.lang.invoke.CallSite; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.lang.reflect.Method; +import java.net.URL; +import java.util.Enumeration; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; @@ -31,6 +35,7 @@ import static org.objectweb.asm.Opcodes.ASM4; import static org.objectweb.asm.Opcodes.INVOKESTATIC; import static org.testng.Assert.*; +import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -40,6 +45,8 @@ */ public class InvokeDynamicTest { private static Class invokeDynamicClass; + private static byte[] invokeDynamicBytes; + private static TestVM code; @Test public void simpleDynamicInJava() throws Exception { Method m = invokeDynamicClass.getMethod("dynamicSay"); @@ -47,27 +54,20 @@ assertEquals(ret, "Hello from Dynamic!"); } + @Test public void simpleDynamicInJS() throws Exception { + code.assertExec( + "Invoke dynamic can return a value", InvokeDynamic.class, + "dynamic__Ljava_lang_String_2", + "Hello from Dynamic!" + ); + } -/* - private static TestVM code; - - @BeforeClass - public void compileTheCode() throws Exception { - code = TestVM.compileClass(InvokeDynamic.class.getName()); - } @AfterClass public static void releaseTheCode() { code = null; } - private void assertExec( - String msg, Class clazz, String method, Object expRes, Object... args - ) throws Exception { - code.assertExec(msg, clazz, method, expRes, args); - } - */ - // // the following code is inspired by // https://code.google.com/p/indy-maven-plugin/ @@ -75,10 +75,10 @@ // @BeforeClass public static void prepareClass() throws Exception { - InputStream input = InvokeDynamic.class.getResourceAsStream("InvokeDynamic.class"); - assertNotNull(input, "Class found"); + InputStream is = InvokeDynamic.class.getResourceAsStream("InvokeDynamic.class"); + assertNotNull(is, "Class found"); - ClassReader reader = new ClassReader(input); + ClassReader reader = new ClassReader(is); ClassWriter writer = new ClassWriter(reader, 0); reader.accept( @@ -91,8 +91,8 @@ } }, 0); - input.close(); - final byte[] invokeDynamicBytes = writer.toByteArray(); + is.close(); + invokeDynamicBytes = writer.toByteArray(); ClassLoader l = new ClassLoader() { @Override public Class loadClass(String name) throws ClassNotFoundException { @@ -103,6 +103,11 @@ } }; invokeDynamicClass = l.loadClass(InvokeDynamic.class.getName()); + + code = TestVM.compileClass( + null, null, new EmulationResourcesWithException(), + InvokeDynamic.class.getName().replace('.', '/') + ); } @@ -133,5 +138,37 @@ } } + private static class EmulationResourcesWithException implements Bck2Brwsr.Resources { + @Override + public InputStream get(String name) throws IOException { + if ("org/apidesign/vm4brwsr/InvokeDynamic.class".equals(name)) { + return new ByteArrayInputStream(invokeDynamicBytes); + } + if ("java/net/URI.class".equals(name)) { + // skip + return null; + } + if ("java/net/URLConnection.class".equals(name)) { + // skip + return null; + } + if ("java/lang/System.class".equals(name)) { + // skip + return null; + } + Enumeration en = InvokeDynamicTest.class.getClassLoader().getResources(name); + URL u = null; + while (en.hasMoreElements()) { + u = en.nextElement(); + } + if (u == null) { + throw new IOException("Can't find " + name); + } + if (u.toExternalForm().contains("rt.jar!")) { + throw new IOException("No emulation for " + u); + } + return u.openStream(); + } + } } diff -r d02324a82d80 -r 0101d10bd2e0 rt/vm/src/test/java/org/apidesign/vm4brwsr/TestVM.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/TestVM.java Sat Aug 09 10:42:22 2014 +0200 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/TestVM.java Sat Aug 09 10:52:34 2014 +0200 @@ -123,10 +123,18 @@ } static TestVM compileClass(StringBuilder sb, ScriptEngine[] eng, String... names) throws ScriptException, IOException { + return compileClass(sb, eng, new EmulationResources(), names); + } + static TestVM compileClass( + StringBuilder sb, + ScriptEngine[] eng, + Bck2Brwsr.Resources resources, + String... names + ) throws ScriptException, IOException { if (sb == null) { sb = new StringBuilder(); } - Bck2Brwsr.generate(sb, new EmulationResources(), names); + Bck2Brwsr.generate(sb, resources, names); ScriptEngineManager sem = new ScriptEngineManager(); ScriptEngine js = sem.getEngineByExtension("js"); if (eng != null) {