boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderBase.java
author Jaroslav Tulach <jtulach@netbeans.org>
Fri, 15 Jan 2016 13:05:42 +0100
changeset 1043 b189d001b9bd
parent 1041 36165f49f598
child 1048 acc9ba4af659
permissions -rw-r--r--
#257579: Erase the parameter types before computing the signature
     1 /**
     2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     3  *
     4  * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved.
     5  *
     6  * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
     7  * Other names may be trademarks of their respective owners.
     8  *
     9  * The contents of this file are subject to the terms of either the GNU
    10  * General Public License Version 2 only ("GPL") or the Common
    11  * Development and Distribution License("CDDL") (collectively, the
    12  * "License"). You may not use this file except in compliance with the
    13  * License. You can obtain a copy of the License at
    14  * http://www.netbeans.org/cddl-gplv2.html
    15  * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
    16  * specific language governing permissions and limitations under the
    17  * License.  When distributing the software, include this License Header
    18  * Notice in each file and include the License file at
    19  * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
    20  * particular file as subject to the "Classpath" exception as provided
    21  * by Oracle in the GPL Version 2 section of the License file that
    22  * accompanied this code. If applicable, add the following below the
    23  * License Header, with the fields enclosed by brackets [] replaced by
    24  * your own identifying information:
    25  * "Portions Copyrighted [year] [name of copyright owner]"
    26  *
    27  * Contributor(s):
    28  *
    29  * The Original Software is NetBeans. The Initial Developer of the Original
    30  * Software is Oracle. Portions Copyright 2013-2014 Oracle. All Rights Reserved.
    31  *
    32  * If you wish your version of this file to be governed by only the CDDL
    33  * or only the GPL Version 2, indicate your decision by adding
    34  * "[Contributor] elects to include this software in this distribution
    35  * under the [CDDL or GPL Version 2] license." If you do not indicate a
    36  * single choice of license, a recipient has the option to distribute
    37  * your version of this file under either the CDDL, the GPL Version 2 or
    38  * to extend the choice of license to its licensees as provided above.
    39  * However, if you add GPL Version 2 code and therefore, elected the GPL
    40  * Version 2 license, then the option applies only if the new code is
    41  * made subject to such option by the copyright holder.
    42  */
    43 package org.netbeans.html.boot.impl;
    44 
    45 import java.io.Closeable;
    46 import java.lang.reflect.InvocationTargetException;
    47 import java.lang.reflect.Method;
    48 import java.lang.reflect.Modifier;
    49 import java.util.HashMap;
    50 import java.util.Map;
    51 import org.netbeans.html.boot.spi.Fn;
    52 import org.testng.Assert;
    53 import static org.testng.Assert.*;
    54 import org.testng.annotations.BeforeMethod;
    55 import org.testng.annotations.Test;
    56 
    57 /**
    58  *
    59  * @author Jaroslav Tulach
    60  */
    61 public class JsClassLoaderBase {
    62     protected static Class<?> methodClass;
    63     
    64     public JsClassLoaderBase() {
    65     }
    66     
    67     @BeforeMethod
    68     public void assertClassDefined() {
    69         assertNotNull(methodClass, "BeforeClass set up code should provide methodClass");
    70     }
    71 
    72     @Test public void noParamMethod() throws Throwable {
    73         Method plus = methodClass.getMethod("fortyTwo");
    74         try {
    75             final java.lang.Object val = plus.invoke(null);
    76             assertTrue(val instanceof Number, "A number returned " + val);
    77             assertEquals(((Number)val).intValue(), 42);
    78         } catch (InvocationTargetException ex) {
    79             throw ex.getTargetException();
    80         }
    81     }
    82     
    83     @Test public void testExecuteScript() throws Throwable {
    84         Method plus = methodClass.getMethod("plus", int.class, int.class);
    85         try {
    86             assertEquals(plus.invoke(null, 10, 20), 30);
    87         } catch (InvocationTargetException ex) {
    88             throw ex.getTargetException();
    89         }
    90     }
    91 
    92     @Test public void overloadedMethod() throws Throwable {
    93         Method plus = methodClass.getMethod("plus", int.class);
    94         try {
    95             assertEquals(plus.invoke(null, 10), 10);
    96         } catch (InvocationTargetException ex) {
    97             throw ex.getTargetException();
    98         }
    99     }
   100     
   101     @Test public void instanceMethod() throws Throwable {
   102         Method plus = methodClass.getMethod("plusInst", int.class);
   103         java.lang.Object inst = methodClass.newInstance();
   104         try {
   105             assertEquals(plus.invoke(inst, 10), 10);
   106         } catch (InvocationTargetException ex) {
   107             throw ex.getTargetException();
   108         }
   109     }
   110     
   111     @Test public void staticThis() throws Throwable {
   112         Method st = methodClass.getMethod("staticThis");
   113         try {
   114             assertNull(st.invoke(null));
   115         } catch (InvocationTargetException ex) {
   116             throw ex.getTargetException();
   117         }
   118     }
   119 
   120     @Test public void getThis() throws Throwable {
   121         java.lang.Object th = methodClass.newInstance();
   122         Method st = methodClass.getMethod("getThis");
   123         try {
   124             assertEquals(st.invoke(th), th);
   125         } catch (InvocationTargetException ex) {
   126             throw ex.getTargetException();
   127         }
   128     }
   129     
   130     @Test public void truth() throws Throwable {
   131         Method st = methodClass.getMethod("truth");
   132         assertTrue((st.getModifiers() & Modifier.STATIC) != 0, "Is static");
   133         assertEquals(st.invoke(null), Boolean.TRUE, "Can return boolean");
   134     }
   135     
   136     @Test public void callback() throws Throwable {
   137         class R implements Runnable {
   138             int cnt;
   139             
   140             @Override
   141             public void run() {
   142                 cnt++;
   143             }
   144         }
   145         R r = new R();
   146         
   147         Method inc = methodClass.getMethod("callback", Runnable.class);
   148         inc.invoke(null, r);
   149         
   150         assertEquals(r.cnt, 1, "Callback happened");
   151     }
   152     
   153     @Test public void sumArray() throws Throwable {
   154         Method st = methodClass.getMethod("sumArr", int[].class);
   155         assertEquals(st.invoke(null, new int[] { 1, 2, 3 }), 6, "1+2+3 is six");
   156     }
   157     
   158     @Test public void javaScriptResource() throws Throwable {
   159         try {
   160             Method st = methodClass.getMethod("useExternalMul", int.class, int.class);
   161             assertEquals(st.invoke(null, 6, 7), 42, "Meaning of JavaScript?");
   162         } catch (InvocationTargetException ex) {
   163             throw ex.getTargetException();
   164         }
   165     }
   166     
   167     @Test public void callJavaScriptMethodOnOwnClass() throws Throwable {
   168         try {
   169             java.lang.Object thiz = methodClass.newInstance();
   170             Method st = methodClass.getMethod("returnYourSelf", methodClass);
   171             assertEquals(st.invoke(null, thiz), thiz, "Returns this");
   172         } catch (InvocationTargetException ex) {
   173             throw ex.getTargetException();
   174         }
   175     }
   176     
   177     @Test public void callStaticJavaMethod() throws Throwable {
   178         Method st = methodClass.getMethod("staticCallback", int.class, int.class);
   179         assertEquals(st.invoke(null, 6, 7), 42, "Meaning of JavaScript?");
   180     }
   181 
   182     @Test public void callStaticStringParamMethod() throws Throwable {
   183         Method st = methodClass.getMethod("parseInt", String.class);
   184         assertEquals(st.invoke(null, "42"), 42, "Meaning of JavaScript?");
   185     }
   186 
   187     @Test public void passEnum() throws Throwable {
   188         Class<?> enmClazz = methodClass.getDeclaredClasses()[0];
   189         assertTrue(Enum.class.isAssignableFrom(enmClazz), "It is an enum: " + enmClazz);
   190         Class<? extends Enum> enmClazz2 = enmClazz.asSubclass(Enum.class);
   191         Method st = methodClass.getMethod("fromEnum", enmClazz);
   192         
   193         java.lang.Object valueB = Enum.valueOf(enmClazz2, "B");
   194         assertEquals(st.invoke(null, valueB), "B", "Converts to string");
   195     }
   196     
   197     @Test public void firstLong() throws Throwable {
   198         Method st = methodClass.getMethod("chooseLong", boolean.class, boolean.class, long.class, long.class);
   199         assertEquals(st.invoke(null, true, false, 10, 20), 10L, "Take first value");
   200     }
   201 
   202     @Test public void secondLong() throws Throwable {
   203         Method st = methodClass.getMethod("chooseLong", boolean.class, boolean.class, long.class, long.class);
   204         assertEquals(st.invoke(null, false, true, 10, 20), 20L, "Take 2nd value");
   205     }
   206 
   207     @Test public void bothLong() throws Throwable {
   208         Method st = methodClass.getMethod("chooseLong", boolean.class, boolean.class, long.class, long.class);
   209         assertEquals(st.invoke(null, true, true, 10, 20), 30L, "Take both values");
   210     }
   211     
   212     @Test public void recordError() throws Throwable {
   213         Method st = methodClass.getMethod("recordError", java.lang.Object.class);
   214         assertEquals(st.invoke(methodClass.newInstance(), "Hello"), "Hello", "The same parameter returned");
   215     }
   216     
   217     @Test public void plusOrMul() throws Throwable {
   218         Method st = methodClass.getMethod("plusOrMul", int.class, int.class);
   219         assertNotNull(Fn.activePresenter(), "Is there a presenter?");
   220         Closeable c = Fn.activate(null);
   221         try {
   222             assertNull(Fn.activePresenter(), "No presenter now");
   223             assertEquals(st.invoke(null, 6, 7), 42, "Mul in Java");
   224         } finally {
   225             c.close();
   226         }
   227         assertNotNull(Fn.activePresenter(), "Is there a presenter again");
   228         assertEquals(st.invoke(null, 6, 7), 13, "Plus in JavaScript");
   229         c = Fn.activate(null);
   230         try {
   231             assertNull(Fn.activePresenter(), "No presenter again");
   232             assertEquals(st.invoke(null, 6, 7), 42, "Mul in Java");
   233         } finally {
   234             c.close();
   235         }
   236         assertNotNull(Fn.activePresenter(), "Is there a presenter again");
   237         assertEquals(st.invoke(null, 6, 7), 13, "Plus in JavaScript again");
   238     }
   239     
   240     @Test public void arrayInOut() throws Throwable {
   241         String[] arr = { "Ahoj" };
   242         Method st = methodClass.getMethod("arr", java.lang.Object[].class);
   243         java.lang.Object ret = st.invoke(null, (java.lang.Object) arr);
   244         assertTrue(ret instanceof java.lang.Object[], "Expecting array: " + ret);
   245         java.lang.Object[] res = (java.lang.Object[]) ret;
   246         assertEquals(res.length, 1, "One element");
   247         assertEquals(res[0], "Ahoj", "The right string");
   248     }
   249 
   250     @Test public void parametricCallback() throws Throwable {
   251         Map<String,Integer> map = new HashMap<String, Integer>();
   252         Method st = methodClass.getMethod("callParamTypes", Map.class, int.class);
   253         st.invoke(null, map, 42);
   254         assertEquals(map.get("key"), Integer.valueOf(42), "The right value");
   255     }
   256     
   257    @Test public void checkTheTypeOfThrownException() throws Throwable {
   258         FnContext.currentPresenter(null);
   259         assertNull(Fn.activePresenter(), "No presenter is activer right now");
   260         java.lang.Object res = null;
   261         try {
   262             Method st = methodClass.getMethod("plus", int.class, int.class);
   263             try {
   264                 res = st.invoke(null, 40, 2);
   265                 Assert.fail("Native method should throw IllegalStateException. Was: " + res);
   266             } catch (InvocationTargetException ex) {
   267                 throw ex.getTargetException();
   268             }
   269         } catch (IllegalStateException ex) {
   270             assertEquals(ex.getMessage(), "No presenter active. Use BrwsrCtx.execute!");
   271         }
   272     }    
   273 }