/* * Copyright 2011 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.inject.rebind; import com.google.gwt.core.ext.GeneratorContext; import com.google.gwt.core.ext.TreeLogger; import com.google.gwt.dev.javac.testing.GeneratorContextBuilder; import com.google.gwt.dev.javac.testing.JavaSource; import com.google.gwt.dev.util.log.PrintWriterTreeLogger; import junit.framework.TestCase; import java.io.PrintWriter; import java.util.Collections; import java.util.HashSet; public class GinBridgeClassLoaderTest extends TestCase { public void testExceptedPackages() throws ClassNotFoundException, NoSuchMethodException { GeneratorContext context = GeneratorContextBuilder.newEmptyBuilder().add(createSimple()).buildGeneratorContext(); GinBridgeClassLoader gwtLoader = new GinBridgeClassLoader(context, createLogger(), new HashSet<String>()); assertClassVersion(gwtLoader, "a", "b", "com.google.gwt.inject.rebind.types.Simple"); GinBridgeClassLoader javaLoader = new GinBridgeClassLoader(context, createLogger(), Collections.singleton("com.google.gwt.inject.rebind.types")); assertClassVersion(javaLoader, "b", "a", "com.google.gwt.inject.rebind.types.Simple"); } public void testExceptedPackagesWithDot() throws ClassNotFoundException, NoSuchMethodException { GeneratorContext context = GeneratorContextBuilder.newEmptyBuilder().add(createSimple()).buildGeneratorContext(); GinBridgeClassLoader loader = new GinBridgeClassLoader(context, createLogger(), Collections.singleton("com.google.gwt.inject.rebind.types.")); assertClassVersion(loader, "b", "a", "com.google.gwt.inject.rebind.types.Simple"); } public void testJavaCoreClass() throws ClassNotFoundException { GeneratorContext context = GeneratorContextBuilder.newEmptyBuilder().add(createFakeString()).buildGeneratorContext(); GinBridgeClassLoader loader = new GinBridgeClassLoader(context, createLogger(), new HashSet<String>()); assertTrue(loader.loadClass("java.lang.String").getMethods().length > 0); } private JavaSource createFakeString() { return new JavaSource("java.lang.String") { public String getSource() { return "package java.lang;" + "public class String {}"; } }; } private void assertClassVersion(GinBridgeClassLoader javaLoader, String missingMethod, String expectedMethod, String className) throws ClassNotFoundException, NoSuchMethodException { Class<?> javaSimple = javaLoader.loadClass(className); try { javaSimple.getDeclaredMethod(missingMethod); fail("Expected NoSuchMethodException."); } catch (NoSuchMethodException e) { // expected } assertNotNull(javaSimple.getDeclaredMethod(expectedMethod)); } private JavaSource createSimple() { return new JavaSource("com.google.gwt.inject.rebind.types.Simple") { public String getSource() { return "package com.google.gwt.inject.rebind.types;" + "public class Simple {" + " public void b() {}" + "}"; } }; } private static TreeLogger createLogger() { PrintWriterTreeLogger logger = new PrintWriterTreeLogger(new PrintWriter(System.err, true)); logger.setMaxDetail(TreeLogger.ERROR); return logger; } }