0N/A/*
2362N/A * Copyright (c) 2001, 2004, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
0N/A * published by the Free Software Foundation.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/A/*
0N/A *
0N/A */
0N/A
0N/Aimport java.lang.reflect.Method;
0N/Aimport java.net.MalformedURLException;
0N/Aimport java.net.URL;
0N/Aimport java.net.URLClassLoader;
0N/Aimport java.util.ArrayList;
0N/Aimport java.util.Arrays;
0N/Aimport java.util.Collections;
0N/Aimport java.util.List;
0N/A
0N/Aimport java.rmi.server.RMIClassLoader;
0N/Aimport java.rmi.server.RMIClassLoaderSpi;
0N/A
0N/Apublic class TestProvider extends RMIClassLoaderSpi {
0N/A
0N/A public static final Method loadClassMethod;
0N/A public static final Method loadProxyClassMethod;
0N/A public static final Method getClassLoaderMethod;
0N/A public static final Method getClassAnnotationMethod;
0N/A static {
0N/A try {
0N/A loadClassMethod = RMIClassLoaderSpi.class.getMethod(
0N/A "loadClass", new Class[] {
0N/A String.class, String.class, ClassLoader.class
0N/A });
0N/A loadProxyClassMethod = RMIClassLoaderSpi.class.getMethod(
0N/A "loadProxyClass", new Class[] {
0N/A String.class, String[].class, ClassLoader.class
0N/A });
0N/A getClassLoaderMethod = RMIClassLoaderSpi.class.getMethod(
0N/A "getClassLoader", new Class[] { String.class });
0N/A getClassAnnotationMethod = RMIClassLoaderSpi.class.getMethod(
0N/A "getClassAnnotation", new Class[] { Class.class });
0N/A } catch (NoSuchMethodException e) {
0N/A Error error = new NoSuchMethodError();
0N/A error.initCause(e);
0N/A throw error;
0N/A }
0N/A }
0N/A
0N/A public static final Class loadClassReturn =
0N/A (new Object() { }).getClass();
0N/A public static final Class loadProxyClassReturn =
0N/A (new Object() { }).getClass();
0N/A public static final ClassLoader getClassLoaderReturn =
0N/A URLClassLoader.newInstance(new URL[0]);
0N/A public static final String getClassAnnotationReturn = new String();
0N/A
0N/A public static List invocations =
0N/A Collections.synchronizedList(new ArrayList(1));
0N/A
0N/A public TestProvider() {
0N/A System.err.println("TestProvider()");
0N/A }
0N/A
0N/A public Class loadClass(String codebase, String name,
0N/A ClassLoader defaultLoader)
0N/A throws MalformedURLException, ClassNotFoundException
0N/A {
0N/A invocations.add(new Invocation(loadClassMethod,
0N/A new Object[] { codebase, name, defaultLoader }));
0N/A
0N/A return loadClassReturn;
0N/A }
0N/A
0N/A public Class loadProxyClass(String codebase, String[] interfaces,
0N/A ClassLoader defaultLoader)
0N/A throws MalformedURLException, ClassNotFoundException
0N/A {
0N/A invocations.add(new Invocation(loadProxyClassMethod,
0N/A new Object[] { codebase, interfaces, defaultLoader }));
0N/A
0N/A return loadProxyClassReturn;
0N/A }
0N/A
0N/A public ClassLoader getClassLoader(String codebase)
0N/A throws MalformedURLException
0N/A {
0N/A invocations.add(new Invocation(
0N/A getClassLoaderMethod, new Object[] { codebase }));
0N/A
0N/A return getClassLoaderReturn;
0N/A }
0N/A
0N/A public String getClassAnnotation(Class<?> cl) {
0N/A invocations.add(new Invocation(
0N/A getClassAnnotationMethod, new Object[] { cl }));
0N/A
0N/A return getClassAnnotationReturn;
0N/A }
0N/A
0N/A public static class Invocation {
0N/A public Method method;
0N/A public Object[] args;
0N/A
0N/A public Invocation(Method method, Object[] args) {
0N/A this.method = method;
0N/A this.args = (Object[]) args.clone();
0N/A }
0N/A }
0N/A
0N/A public static void exerciseTestProvider(Object loadClassReturn,
0N/A Object loadProxyClassReturn,
0N/A Object getClassLoaderReturn,
0N/A Object getClassAnnotationReturn,
0N/A List invocationQueue)
0N/A throws MalformedURLException, ClassNotFoundException
0N/A {
0N/A URL codebaseURL = new URL("http://the-black-lodge/dale-cooper/");
0N/A String codebase = codebaseURL.toString();
0N/A String classname = "Foo";
0N/A ClassLoader defaultLoader = URLClassLoader.newInstance(new URL[0]);
0N/A String[] interfaces = new String[] { "Bar", "Baz" };
0N/A Class dummyClass = (new Object() { }).getClass();
0N/A
0N/A TestLibrary.suggestSecurityManager(null);
0N/A
0N/A String testcase;
0N/A Object ret;
0N/A
0N/A /*
0N/A *
0N/A */
0N/A testcase = "RMIClassLoader.loadClass(String)";
0N/A System.err.println("testing " + testcase);
0N/A
0N/A ret = RMIClassLoader.loadClass(classname);
0N/A if (ret != loadClassReturn) {
0N/A throw new RuntimeException("TEST FAILED: " +
0N/A testcase + " returned " + ret);
0N/A }
0N/A verifyOneInvocation(TestProvider.loadClassMethod,
0N/A new Object[] { null, classname, null }, invocationQueue);
0N/A
0N/A /*
0N/A *
0N/A */
0N/A testcase = "RMIClassLoader.loadClass(URL,String)";
0N/A System.err.println("testing " + testcase);
0N/A
0N/A ret = RMIClassLoader.loadClass(codebaseURL, classname);
0N/A if (ret != loadClassReturn) {
0N/A throw new RuntimeException("TEST FAILED: " +
0N/A testcase + " returned " + ret);
0N/A }
0N/A verifyOneInvocation(TestProvider.loadClassMethod,
0N/A new Object[] { codebase, classname, null }, invocationQueue);
0N/A
0N/A /*
0N/A *
0N/A */
0N/A testcase = "RMIClassLoader.loadClass(String,String)";
0N/A System.err.println("testing " + testcase);
0N/A
0N/A ret = RMIClassLoader.loadClass(codebase, classname);
0N/A if (ret != loadClassReturn) {
0N/A throw new RuntimeException("TEST FAILED: " +
0N/A testcase + " returned " + ret);
0N/A }
0N/A verifyOneInvocation(TestProvider.loadClassMethod,
0N/A new Object[] { codebase, classname, null }, invocationQueue);
0N/A
0N/A /*
0N/A *
0N/A */
0N/A testcase = "RMIClassLoader.loadClass(String,String,ClassLoader";
0N/A System.err.println("testing " + testcase);
0N/A
0N/A ret = RMIClassLoader.loadClass(codebase, classname, defaultLoader);
0N/A if (ret != loadClassReturn) {
0N/A throw new RuntimeException("TEST FAILED: " +
0N/A testcase + " returned " + ret);
0N/A }
0N/A verifyOneInvocation(TestProvider.loadClassMethod,
0N/A new Object[] { codebase, classname, defaultLoader },
0N/A invocationQueue);
0N/A
0N/A /*
0N/A *
0N/A */
0N/A testcase =
0N/A "RMIClassLoader.loadProxyClass(String,String[],ClassLoader)";
0N/A System.err.println("testing " + testcase);
0N/A
0N/A ret = RMIClassLoader.loadProxyClass(codebase, interfaces,
0N/A defaultLoader);
0N/A if (ret != loadProxyClassReturn) {
0N/A throw new RuntimeException("TEST FAILED: " +
0N/A testcase + " returned " + ret);
0N/A }
0N/A verifyOneInvocation(TestProvider.loadProxyClassMethod,
0N/A new Object[] { codebase, interfaces, defaultLoader },
0N/A invocationQueue);
0N/A
0N/A /*
0N/A *
0N/A */
0N/A testcase = "RMIClassLoader.getClassLoader(String)";
0N/A System.err.println("testing " + testcase);
0N/A
0N/A ret = RMIClassLoader.getClassLoader(codebase);
0N/A if (ret != getClassLoaderReturn) {
0N/A throw new RuntimeException("TEST FAILED: " +
0N/A testcase + " returned " + ret);
0N/A }
0N/A verifyOneInvocation(TestProvider.getClassLoaderMethod,
0N/A new Object[] { codebase }, invocationQueue);
0N/A
0N/A /*
0N/A *
0N/A */
0N/A testcase = "RMIClassLoader.getClassAnnotation(Class)";
0N/A System.err.println("testing " + testcase);
0N/A
0N/A ret = RMIClassLoader.getClassAnnotation(dummyClass);
0N/A if (ret != getClassAnnotationReturn) {
0N/A throw new RuntimeException("TEST FAILED: " +
0N/A testcase + " returned " + ret);
0N/A }
0N/A verifyOneInvocation(TestProvider.getClassAnnotationMethod,
0N/A new Object[] { dummyClass }, invocationQueue);
0N/A
0N/A System.err.println("TEST PASSED");
0N/A }
0N/A
0N/A private static void verifyOneInvocation(Method method, Object[] args,
0N/A List invocationQueue)
0N/A {
0N/A TestProvider.Invocation inv =
0N/A (TestProvider.Invocation) invocationQueue.remove(0);
0N/A
0N/A if (!method.equals(inv.method)) {
0N/A throw new RuntimeException(
0N/A "unexpected provider method invoked: expected " + method +
0N/A ", detected " + inv.method);
0N/A }
0N/A
0N/A List expectedArgs = Arrays.asList(args);
0N/A List detectedArgs = Arrays.asList(inv.args);
0N/A if (!expectedArgs.equals(detectedArgs)) {
0N/A throw new RuntimeException("TEST FAILED: " +
0N/A "unexpected provider method invocation arguments: " +
0N/A "expected " + expectedArgs + ", detected " + detectedArgs);
0N/A }
0N/A
0N/A if (!invocationQueue.isEmpty()) {
0N/A inv = (TestProvider.Invocation)
0N/A invocationQueue.remove(0);
0N/A throw new RuntimeException("TEST FAILED: " +
0N/A "unexpected provider invocation: " + inv.method + " " +
0N/A Arrays.asList(inv.args));
0N/A }
0N/A }
0N/A}