boot-agent-test/src/test/java/org/netbeans/html/bootagent/DynamicClassLoaderTest.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sat, 29 Nov 2014 22:25:40 +0100
changeset 884 af690d50d7d6
parent 838 boot-fx/src/test/java/org/netbeans/html/boot/fx/BootstrapTest.java@bdc3d696dd4a
permissions -rw-r--r--
Use optional dependency on asm-5.0.jar, so we don't have to bundle it when the classes are post processed.
     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.bootagent;
    44 
    45 import java.lang.reflect.Field;
    46 import java.lang.reflect.Method;
    47 import java.lang.reflect.Modifier;
    48 import java.util.ArrayList;
    49 import java.util.List;
    50 import java.util.concurrent.Executors;
    51 import net.java.html.BrwsrCtx;
    52 import net.java.html.boot.BrowserBuilder;
    53 import org.netbeans.html.boot.spi.Fn;
    54 import org.testng.Assert;
    55 import static org.testng.Assert.assertNotSame;
    56 import static org.testng.Assert.assertSame;
    57 import org.testng.annotations.Factory;
    58 
    59 /**
    60  *
    61  * @author Jaroslav Tulach
    62  */
    63 public class DynamicClassLoaderTest {
    64     private static Class<?> browserClass;
    65     private static Fn.Presenter browserPresenter;
    66     
    67     public DynamicClassLoaderTest() {
    68     }
    69 
    70     @Factory public static Object[] compatibilityTests() throws Exception {
    71         final BrowserBuilder bb = BrowserBuilder.newBrowser().loadClass(DynamicClassLoaderTest.class).
    72             loadPage("empty.html").
    73             invoke("initialized");
    74 
    75         Executors.newSingleThreadExecutor().submit(new Runnable() {
    76             @Override
    77             public void run() {
    78                 bb.showAndWait();
    79             }
    80         });
    81 
    82         List<Object> res = new ArrayList<Object>();
    83 
    84         Class[] arr = new Class[] { loadClass() };
    85         for (Class c : arr) {
    86             for (Method m : c.getDeclaredMethods()) {
    87                 if ((m.getModifiers() & Modifier.PUBLIC) != 0) {
    88                     res.add(new KOFx(browserPresenter, m));
    89                 }
    90             }
    91         }
    92         return res.toArray();
    93     }
    94 
    95     static synchronized Class<?> loadClass() throws InterruptedException {
    96         while (browserClass == null) {
    97             DynamicClassLoaderTest.class.wait();
    98         }
    99         return browserClass;
   100     }
   101     
   102     public static void ready(Class<?> browserCls) throws Exception {
   103         Class<?> origClazz = ClassLoader.getSystemClassLoader().loadClass(DynamicClassLoaderTest.class.getName());
   104         final Field f1 = origClazz.getDeclaredField("browserClass");
   105         f1.setAccessible(true);
   106         f1.set(null, browserCls);
   107         final Field f2 = origClazz.getDeclaredField("browserPresenter");
   108         f2.setAccessible(true);
   109         f2.set(null, Fn.activePresenter());
   110         synchronized (origClazz) {
   111             origClazz.notifyAll();
   112         }
   113     }
   114     
   115     public static void initialized() throws Exception {
   116         BrwsrCtx b1 = BrwsrCtx.findDefault(DynamicClassLoaderTest.class);
   117         assertNotSame(b1, BrwsrCtx.EMPTY, "Browser context is not empty");
   118         BrwsrCtx b2 = BrwsrCtx.findDefault(DynamicClassLoaderTest.class);
   119         assertSame(b1, b2, "Browser context remains stable");
   120         Assert.assertNotSame(DynamicClassLoaderTest.class.getClassLoader(),
   121             ClassLoader.getSystemClassLoader(),
   122             "Should use special classloader, not system one"
   123         );
   124         DynamicClassLoaderTest.ready(JavaScriptBodyTst.class);
   125     }
   126 }