jdk/test/javax/management/loading/ArrayClassTest.java
changeset 2 90ce3da70b43
child 5506 202f599c92aa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/management/loading/ArrayClassTest.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2004 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 4974913
+ * @summary Test that array classes can be found in signatures always
+ * and can be deserialized by the deprecated MBeanServer.deserialize method
+ * @author Eamonn McManus
+ * @run clean ArrayClassTest
+ * @run build ArrayClassTest
+ * @run main ArrayClassTest
+ */
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.net.*;
+import javax.management.*;
+import javax.management.loading.*;
+
+public class ArrayClassTest {
+    public static void main(String[] args) throws Exception {
+        MBeanServer mbs = MBeanServerFactory.createMBeanServer();
+
+        /* If this test isn't loaded by a URLClassLoader we will get
+           a ClassCastException here, which is good because it means
+           this test isn't valid.  */
+        URLClassLoader testLoader =
+            (URLClassLoader) ArrayClassTest.class.getClassLoader();
+
+        // Create an MLet that can load the same class names but
+        // will produce different results.
+        ClassLoader loader = new SpyLoader(testLoader.getURLs());
+        ObjectName loaderName = new ObjectName("test:type=SpyLoader");
+        mbs.registerMBean(loader, loaderName);
+
+        ObjectName testName = new ObjectName("test:type=Test");
+        mbs.createMBean(Test.class.getName(), testName, loaderName,
+                        new Object[1], new String[] {X[].class.getName()});
+        ClassLoader checkLoader = mbs.getClassLoaderFor(testName);
+        if (checkLoader != loader)
+            throw new AssertionError("Wrong loader: " + checkLoader);
+
+        mbs.invoke(testName, "ignore", new Object[1],
+                   new String[] {Y[].class.getName()});
+
+        ByteArrayOutputStream bout = new ByteArrayOutputStream();
+        ObjectOutputStream oout = new ObjectOutputStream(bout);
+        oout.writeObject(new Z[0]);
+        oout.close();
+        byte[] bytes = bout.toByteArray();
+        ObjectInputStream oin = mbs.deserialize(testName, bytes);
+        Object zarray = oin.readObject();
+        String failed = null;
+        if (zarray instanceof Z[])
+            failed = "read back a real Z[]";
+        else if (!zarray.getClass().getName().equals(Z[].class.getName())) {
+            failed = "returned object of wrong type: " +
+                zarray.getClass().getName();
+        } else if (Array.getLength(zarray) != 0)
+            failed = "returned array of wrong size: " + Array.getLength(zarray);
+        if (failed != null) {
+            System.out.println("TEST FAILED: " + failed);
+            System.exit(1);
+        }
+
+        System.out.println("Test passed");
+    }
+
+    public static interface TestMBean {
+        public void ignore(Y[] ignored);
+    }
+
+    public static class Test implements TestMBean {
+        public Test(X[] ignored) {}
+        public void ignore(Y[] ignored) {}
+    }
+
+    public static class X {}
+    public static class Y {}
+    public static class Z implements Serializable {}
+
+    public static interface SpyLoaderMBean {}
+
+    /* We originally had this extend MLet but for some reason that
+       stopped the bug from happening.  Some side-effect of registering
+       the MLet in the MBean server caused it not to fail when asked
+       to load Z[].  */
+    public static class SpyLoader extends URLClassLoader
+            implements SpyLoaderMBean, PrivateClassLoader {
+        public SpyLoader(URL[] urls) {
+            // important that the parent classloader be null!
+            // otherwise we can pick up classes from the classpath
+            super(urls, null);
+        }
+
+        /*
+        public Class loadClass(String name) throws ClassNotFoundException {
+            System.out.println("loadClass: " + name);
+            return super.loadClass(name);
+        }
+
+        public Class loadClass(String name, boolean resolve)
+                throws ClassNotFoundException {
+            System.out.println("loadClass: " + name + ", " + resolve);
+            return super.loadClass(name, resolve);
+        }
+        */
+
+        public Class findClass(String name) throws ClassNotFoundException {
+            System.out.println("findClass: " + name);
+            if (false)
+                new Throwable().printStackTrace(System.out);
+            Class c = super.findClass(name);
+            System.out.println(" -> " + name + " (" + c.getClassLoader() + ")");
+            return c;
+        }
+    }
+}