/* * JBoss, Home of Professional Open Source. * Copyright 2008, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.jmx.serialization; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import junit.framework.TestCase; /** * Tests serialization with the RI * * @todo Proper equality tests instead of toString() * * @author <a href="mailto:Adrian.Brock@HappeningTimes.com">Adrian Brock</a>. */ public class SerializeTestCase extends TestCase { // Attributes ---------------------------------------------------------------- // Constructor --------------------------------------------------------------- /** * Construct the test */ public SerializeTestCase(String s) { super(s); } public void testArrayType() throws Exception { if (SerializationSUITE.form < 11) return; Class clazz = loadClass("javax.management.openmbean.SimpleType"); Object elementType = clazz.getField("BIGDECIMAL").get(null); Object obj = instantiate( "javax.management.openmbean.ArrayType", new Class[] { Integer.TYPE, loadClass("javax.management.openmbean.OpenType") }, new Object[] { new Integer(3), elementType } ); Object result = runTest(obj); assertEquals(obj, result); } public void testAttribute() throws Exception { Object obj = instantiate( "javax.management.Attribute", new Class[] { String.class, Object.class }, new Object[] { "name", "value" } ); Object result = runTest(obj); assertEquals(obj, result); } public void testAttributeChangeNotification() throws Exception { Object obj = instantiate( "javax.management.AttributeChangeNotification", new Class[] { Object.class, Long.TYPE, Long.TYPE, String.class, String.class, String.class, Object.class, Object.class }, new Object[] { "source", new Long(1), new Long(2), "message", "name", "type", "old", "new" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testAttributeChangeNotificationFilter() throws Exception { Object obj = instantiate( "javax.management.AttributeChangeNotificationFilter", new Class[0], new Object[0] ); Method method = obj.getClass().getMethod("enableAttribute", new Class[] { String.class }); method.invoke(obj, new Object[] { "attribute" }); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testAttributeList() throws Exception { Object obj = instantiate( "javax.management.AttributeList", new Class[0], new Object[0] ); Object attr = instantiate( "javax.management.Attribute", new Class[] { String.class, Object.class }, new Object[] { "name", "value" } ); Method method = obj.getClass().getMethod("add", new Class[] { attr.getClass() }); method.invoke(obj, new Object[] { attr }); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testAttributeNotFoundException() throws Exception { Object obj = instantiate( "javax.management.AttributeNotFoundException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testAttributeValueExp() throws Exception { Object obj = instantiate( "javax.management.AttributeValueExp", new Class[] { String.class }, new Object[] { "attr" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testBadAttributeValueExpException() throws Exception { Object obj = instantiate( "javax.management.BadAttributeValueExpException", new Class[] { Object.class }, new Object[] { "value" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testBadBinaryOpValueExpException() throws Exception { Object exp = instantiate( "javax.management.AttributeValueExp", new Class[] { String.class }, new Object[] { "attr" } ); Object obj = instantiate( "javax.management.BadBinaryOpValueExpException", new Class[] { loadClass("javax.management.ValueExp") }, new Object[] { exp } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testBadStringOperationException() throws Exception { Object obj = instantiate( "javax.management.BadStringOperationException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testCompositeDataSupport() throws Exception { if (SerializationSUITE.form < 11) return; Class clazz = loadClass("javax.management.openmbean.SimpleType"); Object openType = clazz.getField("STRING").get(null); Class elementClass = loadClass("javax.management.openmbean.OpenType"); Object array = Array.newInstance(elementClass, 2); Array.set(array, 0, openType); Array.set(array, 1, openType); Object compositeType = instantiate( "javax.management.openmbean.CompositeType", new Class[] { String.class, String.class, String[].class, String[].class, array.getClass() }, new Object[] { "typeName", "description", new String[] { "name1", "name2" }, new String[] { "desc1", "desc2" }, array } ); Object obj = instantiate( "javax.management.openmbean.CompositeDataSupport", new Class[] { compositeType.getClass(), String[].class, Object[].class }, new Object[] { compositeType, new String[] { "name1", "name2" }, new Object[] { "itemValue1", "itemValue2" } } ); Object result = runTest(obj); assertEquals(obj, result); } public void testCompositeType() throws Exception { if (SerializationSUITE.form < 11) return; Class clazz = loadClass("javax.management.openmbean.SimpleType"); Object openType = clazz.getField("STRING").get(null); Class elementClass = loadClass("javax.management.openmbean.OpenType"); Object array = Array.newInstance(elementClass, 2); Array.set(array, 0, openType); Array.set(array, 1, openType); Object obj = instantiate( "javax.management.openmbean.CompositeType", new Class[] { String.class, String.class, String[].class, String[].class, array.getClass() }, new Object[] { "typeName", "description", new String[] { "name1", "name2" }, new String[] { "desc1", "desc2" }, array } ); Object result = runTest(obj); assertEquals(obj, result); } public void testDescriptorSupport() throws Exception { Object obj = instantiate( "javax.management.modelmbean.DescriptorSupport", new Class[] { new String[0].getClass(), new Object[0].getClass() }, new Object[] { new String[] { "name1", "name2"}, new Object[] { "value1", "value2" } } ); runTest(obj); } public void testInstanceAlreadyExistsException() throws Exception { Object obj = instantiate( "javax.management.InstanceAlreadyExistsException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testInstanceNotFoundException() throws Exception { Object obj = instantiate( "javax.management.InstanceNotFoundException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testIntrospectionException() throws Exception { Object obj = instantiate( "javax.management.IntrospectionException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testInvalidApplicationException() throws Exception { Object obj = instantiate( "javax.management.InvalidApplicationException", new Class[] { Object.class }, new Object[] { "value" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testInvalidAttributeValueException() throws Exception { Object obj = instantiate( "javax.management.InvalidAttributeValueException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testInvalidKeyException() throws Exception { if (SerializationSUITE.form < 11) return; Object obj = instantiate( "javax.management.openmbean.InvalidKeyException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testInvalidOpenTypeException() throws Exception { if (SerializationSUITE.form < 11) return; Object obj = instantiate( "javax.management.openmbean.InvalidOpenTypeException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testInvalidRelationIdException() throws Exception { Object obj = instantiate( "javax.management.relation.InvalidRelationIdException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testInvalidRelationServiceException() throws Exception { Object obj = instantiate( "javax.management.relation.InvalidRelationServiceException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testInvalidRelationTypeException() throws Exception { Object obj = instantiate( "javax.management.relation.InvalidRelationTypeException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testInvalidRoleInfoException() throws Exception { Object obj = instantiate( "javax.management.relation.InvalidRoleInfoException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testInvalidRoleValueException() throws Exception { Object obj = instantiate( "javax.management.relation.InvalidRoleValueException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testInvalidTargetObjectTypeException() throws Exception { Object obj = instantiate( "javax.management.modelmbean.InvalidTargetObjectTypeException", new Class[] { Exception.class, String.class }, new Object[] { new Exception("exception"), "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testKeyAlreadyExistsException() throws Exception { if (SerializationSUITE.form < 11) return; Object obj = instantiate( "javax.management.openmbean.KeyAlreadyExistsException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testJMException() throws Exception { Object obj = instantiate( "javax.management.JMException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testJMRuntimeException() throws Exception { Object obj = instantiate( "javax.management.JMRuntimeException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testListenerNotFoundException() throws Exception { Object obj = instantiate( "javax.management.ListenerNotFoundException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testMalformedObjectNameException() throws Exception { Object obj = instantiate( "javax.management.MalformedObjectNameException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testMBeanAttributeInfo() throws Exception { Object obj = instantiate( "javax.management.MBeanAttributeInfo", new Class[] { String.class, String.class, String.class, Boolean.TYPE, Boolean.TYPE, Boolean.TYPE }, new Object[] { "name", "type", "description", new Boolean(true), new Boolean(true), new Boolean(false)} ); try { Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } catch (java.io.InvalidClassException e) { fail("FAILS IN RI 1.1: Wrong serialization for form 1.0"); } } public void testMBeanConstructorInfo() throws Exception { Object parm = instantiate( "javax.management.MBeanParameterInfo", new Class[] { String.class, String.class, String.class }, new Object[] { "name", "type", "description" } ); Object array = Array.newInstance(parm.getClass(), 1); Array.set(array, 0, parm); Object obj = instantiate( "javax.management.MBeanConstructorInfo", new Class[] { String.class, String.class, array.getClass() }, new Object[] { "name", "description", array } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testMBeanException() throws Exception { Object obj = instantiate( "javax.management.MBeanException", new Class[] { Exception.class, String.class }, new Object[] { new Exception("Cause"), "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testMBeanFeatureInfo() throws Exception { Object obj = instantiate( "javax.management.MBeanFeatureInfo", new Class[] { String.class, String.class }, new Object[] { "name", "description" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testMBeanInfo() throws Exception { Object parm = instantiate( "javax.management.MBeanParameterInfo", new Class[] { String.class, String.class, String.class }, new Object[] { "name", "type", "description" } ); Object parms = Array.newInstance(parm.getClass(), 1); Array.set(parms, 0, parm); Object att = instantiate( "javax.management.MBeanAttributeInfo", new Class[] { String.class, String.class, String.class, Boolean.TYPE, Boolean.TYPE, Boolean.TYPE }, new Object[] { "name", "type", "description", new Boolean(true), new Boolean(true), new Boolean(false)} ); Object atts = Array.newInstance(att.getClass(), 1); Array.set(atts, 0, att); Object con = instantiate( "javax.management.MBeanConstructorInfo", new Class[] { String.class, String.class, parms.getClass() }, new Object[] { "name", "description", parms } ); Object cons = Array.newInstance(con.getClass(), 1); Array.set(cons, 0, con); Class clazz = loadClass("javax.management.MBeanOperationInfo"); Integer impact = new Integer(clazz.getField("ACTION").getInt(null)); Object op = instantiate( "javax.management.MBeanOperationInfo", new Class[] { String.class, String.class, parms.getClass(), String.class, Integer.TYPE }, new Object[] { "name", "description", parms, "type", impact } ); Object ops = Array.newInstance(op.getClass(), 1); Array.set(ops, 0, op); String[] types = { "type1", "type2" }; Object not = instantiate( "javax.management.MBeanNotificationInfo", new Class[] { types.getClass(), String.class, String.class }, new Object[] { types, "name", "description" } ); Object nots = Array.newInstance(not.getClass(), 1); Array.set(nots, 0, not); Object obj = instantiate( "javax.management.MBeanInfo", new Class[] { String.class, String.class, atts.getClass(), cons.getClass(), ops.getClass(), nots.getClass() }, new Object[] { "className", "description", atts, cons, ops, nots } ); try { Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } catch (java.io.InvalidClassException e) { fail("FAILS IN RI 1.1: Wrong serialization for form 1.0 " + "The real error is in MBeanAttributeInfo"); } } public void testMBeanNotificationInfo() throws Exception { String[] types = { "type1", "type2" }; Object obj = instantiate( "javax.management.MBeanNotificationInfo", new Class[] { types.getClass(), String.class, String.class }, new Object[] { types, "name", "description" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testMBeanOperationInfo() throws Exception { Object parm = instantiate( "javax.management.MBeanParameterInfo", new Class[] { String.class, String.class, String.class }, new Object[] { "name", "type", "description" } ); Object array = Array.newInstance(parm.getClass(), 1); Array.set(array, 0, parm); Class clazz = loadClass("javax.management.MBeanOperationInfo"); Integer impact = new Integer(clazz.getField("ACTION").getInt(null)); Object obj = instantiate( "javax.management.MBeanOperationInfo", new Class[] { String.class, String.class, array.getClass(), String.class, Integer.TYPE }, new Object[] { "name", "description", array, "type", impact } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testMBeanParameterInfo() throws Exception { Object obj = instantiate( "javax.management.MBeanParameterInfo", new Class[] { String.class, String.class, String.class }, new Object[] { "name", "type", "description" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testMBeanRegistrationException() throws Exception { Object obj = instantiate( "javax.management.MBeanRegistrationException", new Class[] { Exception.class, String.class }, new Object[] { new Exception("Cause"), "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testMBeanServerNotification() throws Exception { Object objectName = instantiate( "javax.management.ObjectName", new Class[] { String.class }, new Object[] { "domain:x=y" } ); Class clazz = loadClass("javax.management.MBeanServerNotification"); String type = (String) clazz.getField("REGISTRATION_NOTIFICATION").get(null); Object obj = instantiate( "javax.management.MBeanServerNotification", new Class[] { String.class, Object.class, Long.TYPE, objectName.getClass() }, new Object[] { type, "source", new Long(1), objectName } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testMBeanServerNotificationFilter() throws Exception { Object objectName = instantiate( "javax.management.ObjectName", new Class[] { String.class }, new Object[] { "domain:x=y" } ); Object obj = instantiate( "javax.management.relation.MBeanServerNotificationFilter", new Class[0], new Object[0] ); Method method = obj.getClass().getMethod("enableType", new Class[] { String.class }); method.invoke(obj, new Object[] { "prefix" }); method = obj.getClass().getMethod("enableObjectName", new Class[] { objectName.getClass() }); method.invoke(obj, new Object[] { objectName }); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testMBeanServerPermission() throws Exception { if (SerializationSUITE.form < 11) return; Object obj = instantiate( "javax.management.MBeanServerPermission", new Class[] { String.class }, new Object[] { "*" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testModelMBeanAttributeInfo() throws Exception { Object obj = instantiate( "javax.management.modelmbean.ModelMBeanAttributeInfo", new Class[] { String.class, String.class, String.class, Boolean.TYPE, Boolean.TYPE, Boolean.TYPE }, new Object[] { "name", "type", "description", new Boolean(true), new Boolean(true), new Boolean(false)} ); try { runTest(obj); } catch (java.io.InvalidClassException e) { fail("FAILS IN RI 1.1: Wrong serialization for form 1.0 "); } } /** * @todo equals test */ public void testModelMBeanConstructorInfo() throws Exception { Object parm = instantiate( "javax.management.MBeanParameterInfo", new Class[] { String.class, String.class, String.class }, new Object[] { "name", "type", "description" } ); Object array = Array.newInstance(parm.getClass(), 1); Array.set(array, 0, parm); Object obj = instantiate( "javax.management.modelmbean.ModelMBeanConstructorInfo", new Class[] { String.class, String.class, array.getClass() }, new Object[] { "name", "description", array } ); runTest(obj); } /** * @todo equals test */ public void testModelMBeanInfoSupport() throws Exception { Object parm = instantiate( "javax.management.MBeanParameterInfo", new Class[] { String.class, String.class, String.class }, new Object[] { "name", "type", "description" } ); Object parms = Array.newInstance(parm.getClass(), 1); Array.set(parms, 0, parm); Object att = instantiate( "javax.management.modelmbean.ModelMBeanAttributeInfo", new Class[] { String.class, String.class, String.class, Boolean.TYPE, Boolean.TYPE, Boolean.TYPE }, new Object[] { "name", "type", "description", new Boolean(true), new Boolean(true), new Boolean(false)} ); Object atts = Array.newInstance(att.getClass(), 1); Array.set(atts, 0, att); Object con = instantiate( "javax.management.modelmbean.ModelMBeanConstructorInfo", new Class[] { String.class, String.class, parms.getClass() }, new Object[] { "name", "description", parms } ); Object cons = Array.newInstance(con.getClass(), 1); Array.set(cons, 0, con); Class clazz = loadClass("javax.management.modelmbean.ModelMBeanOperationInfo"); Integer impact = new Integer(clazz.getField("ACTION").getInt(null)); Object op = instantiate( "javax.management.modelmbean.ModelMBeanOperationInfo", new Class[] { String.class, String.class, parms.getClass(), String.class, Integer.TYPE }, new Object[] { "name", "description", parms, "type", impact } ); Object ops = Array.newInstance(op.getClass(), 1); Array.set(ops, 0, op); String[] types = { "type1", "type2" }; Object not = instantiate( "javax.management.modelmbean.ModelMBeanNotificationInfo", new Class[] { types.getClass(), String.class, String.class }, new Object[] { types, "name", "description" } ); Object nots = Array.newInstance(not.getClass(), 1); Array.set(nots, 0, not); Object obj = instantiate( "javax.management.modelmbean.ModelMBeanInfoSupport", new Class[] { String.class, String.class, atts.getClass(), cons.getClass(), ops.getClass(), nots.getClass() }, new Object[] { "className", "description", atts, cons, ops, nots } ); try { runTest(obj); } catch (java.io.InvalidClassException e) { fail("FAILS IN RI 1.1: Wrong serialization for form 1.0 "); } } /** * @todo equals test */ public void testModelMBeanNotificationInfo() throws Exception { String[] types = { "type1", "type2" }; Object obj = instantiate( "javax.management.modelmbean.ModelMBeanNotificationInfo", new Class[] { types.getClass(), String.class, String.class }, new Object[] { types, "name", "description" } ); try { runTest(obj); } catch (java.io.StreamCorruptedException e) { fail("FAILS IN RI 1.1: Wrong serialization for form 1.0 "); } } /** * @todo equals test */ public void testModelMBeanOperationInfo() throws Exception { Object parm = instantiate( "javax.management.MBeanParameterInfo", new Class[] { String.class, String.class, String.class }, new Object[] { "name", "type", "description" } ); Object array = Array.newInstance(parm.getClass(), 1); Array.set(array, 0, parm); Class clazz = loadClass("javax.management.MBeanOperationInfo"); Integer impact = new Integer(clazz.getField("ACTION").getInt(null)); Object obj = instantiate( "javax.management.modelmbean.ModelMBeanOperationInfo", new Class[] { String.class, String.class, array.getClass(), String.class, Integer.TYPE }, new Object[] { "name", "description", array, "type", impact } ); try { runTest(obj); } catch (java.io.StreamCorruptedException e) { fail("FAILS IN RI 1.1: Wrong serialization for form 1.0 "); } } /** * @todo the constructor is package private * Actually tested by temporarily making the constructor public */ public void testMonitorNotification() throws Exception { /***** Object monitorName = instantiate( "javax.management.ObjectName", new Class[] { String.class }, new Object[] { "monitor:x=y" } ); Object objectName = instantiate( "javax.management.ObjectName", new Class[] { String.class }, new Object[] { "domain:x=y" } ); Object obj = instantiate( "javax.management.monitor.MonitorNotification", new Class[] { String.class, Object.class, Long.TYPE, Long.TYPE, String.class, Object.class, String.class, objectName.getClass(), Object.class }, new Object[] { "type", monitorName, new Long(1), new Long(2), "message", "derivedGauge", "attribute", objectName, "trigger"} ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); *****/ } public void testMonitorSettingException() throws Exception { Object obj = instantiate( "javax.management.monitor.MonitorSettingException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testNotCompliantMBeanException() throws Exception { Object obj = instantiate( "javax.management.NotCompliantMBeanException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testNotification() throws Exception { Object objectName = instantiate( "javax.management.ObjectName", new Class[] { String.class }, new Object[] { "domain:x=y" } ); Object obj = instantiate( "javax.management.Notification", new Class[] { String.class, Object.class, Long.TYPE, Long.TYPE, String.class }, new Object[] { "type", objectName, new Long(1), new Long(2), "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } /** * @todo equals tests */ public void testNotificationFilterSupport() throws Exception { Object obj = instantiate( "javax.management.NotificationFilterSupport", new Class[0], new Object[0] ); Method method = obj.getClass().getMethod("enableType", new Class[] { String.class }); method.invoke(obj, new Object[] { "prefix" }); runTest(obj); } public void testObjectInstance() throws Exception { Object objectName = instantiate( "javax.management.ObjectName", new Class[] { String.class }, new Object[] { "domain:x=y" } ); Object obj = instantiate( "javax.management.ObjectInstance", new Class[] { objectName.getClass(), String.class }, new Object[] { objectName, "DummyClass" } ); Object result = runTest(obj); assertEquals(obj, result); } public void testObjectName() throws Exception { Object obj = instantiate( "javax.management.ObjectName", new Class[] { String.class }, new Object[] { "domain:x=y" } ); Object result = runTest(obj); assertEquals(obj, result); } public void testObjectNamePattern() throws Exception { Object obj = instantiate( "javax.management.ObjectName", new Class[] { String.class }, new Object[] { "domain*:x=y" } ); Object result = runTest(obj); assertEquals(obj, result); } public void testObjectNamePropertyPattern() throws Exception { Object obj = instantiate( "javax.management.ObjectName", new Class[] { String.class }, new Object[] { "domain:x=y,*" } ); Object result = runTest(obj); assertEquals(obj, result); } public void testObjectNameRawPropertyPattern() throws Exception { Object obj = instantiate( "javax.management.ObjectName", new Class[] { String.class }, new Object[] { "domain:*" } ); Object result = runTest(obj); assertEquals(obj, result); } public void testOpenDataException() throws Exception { if (SerializationSUITE.form < 11) return; Object obj = instantiate( "javax.management.openmbean.OpenDataException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testOpenMBeanAttributeInfoSupportMinMax() throws Exception { if (SerializationSUITE.form < 11) return; Class clazz = loadClass("javax.management.openmbean.SimpleType"); Object elementType = clazz.getField("INTEGER").get(null); Object obj = instantiate( "javax.management.openmbean.OpenMBeanAttributeInfoSupport", new Class[] { String.class, String.class, loadClass("javax.management.openmbean.OpenType"), boolean.class, boolean.class, boolean.class, Object.class, Comparable.class, Comparable.class }, new Object[] { "name", "description", elementType, new Boolean(true), new Boolean(true), new Boolean(false), new Integer(12), new Integer(11), new Integer(13) } ); Object result = runTest(obj); assertEquals(obj, result); } public void testOpenMBeanAttributeInfoSupportLegal() throws Exception { if (SerializationSUITE.form < 11) return; Class clazz = loadClass("javax.management.openmbean.SimpleType"); Object elementType = clazz.getField("INTEGER").get(null); Object obj = instantiate( "javax.management.openmbean.OpenMBeanAttributeInfoSupport", new Class[] { String.class, String.class, loadClass("javax.management.openmbean.OpenType"), boolean.class, boolean.class, boolean.class, Object.class, Object[].class }, new Object[] { "name", "description", elementType, new Boolean(true), new Boolean(true), new Boolean(false), new Integer(12), new Integer[] { new Integer(12), new Integer(13) }} ); Object result = runTest(obj); assertEquals(obj, result); } public void testOpenMBeanConstructorInfoSupport() throws Exception { if (SerializationSUITE.form < 11) return; Class clazz = loadClass("javax.management.openmbean.SimpleType"); Object elementType = clazz.getField("INTEGER").get(null); Object parmInfo = instantiate( "javax.management.openmbean.OpenMBeanParameterInfoSupport", new Class[] { String.class, String.class, loadClass("javax.management.openmbean.OpenType"), Object.class, Object[].class }, new Object[] { "name", "description", elementType, new Integer(12), new Integer[] {new Integer(12), new Integer(13) }} ); Object array = Array.newInstance(parmInfo.getClass(), 1); Array.set(array, 0, parmInfo); Object obj = instantiate( "javax.management.openmbean.OpenMBeanConstructorInfoSupport", new Class[] { String.class, String.class, loadClass("[Ljavax.management.openmbean.OpenMBeanParameterInfo;")}, new Object[] { "name", "description", array } ); Object result = runTest(obj); assertEquals(obj, result); } public void testOpenMBeanInfoSupport() throws Exception { if (SerializationSUITE.form < 11) return; Class clazz = loadClass("javax.management.openmbean.SimpleType"); Object elementType = clazz.getField("INTEGER").get(null); Object parmInfo = instantiate( "javax.management.openmbean.OpenMBeanParameterInfoSupport", new Class[] { String.class, String.class, loadClass("javax.management.openmbean.OpenType"), Object.class, Object[].class }, new Object[] { "name", "description", elementType, new Integer(12), new Integer[] {new Integer(12), new Integer(13) }} ); Object parmArray = Array.newInstance(parmInfo.getClass(), 1); Array.set(parmArray, 0, parmInfo); Object attInfo = instantiate( "javax.management.openmbean.OpenMBeanAttributeInfoSupport", new Class[] { String.class, String.class, loadClass("javax.management.openmbean.OpenType"), boolean.class, boolean.class, boolean.class, Object.class, Object[].class }, new Object[] { "name", "description", elementType, new Boolean(true), new Boolean(true), new Boolean(false), new Integer(12), new Integer[] { new Integer(12), new Integer(13) }} ); Object conInfo = instantiate( "javax.management.openmbean.OpenMBeanConstructorInfoSupport", new Class[] { String.class, String.class, loadClass("[Ljavax.management.openmbean.OpenMBeanParameterInfo;")}, new Object[] { "name", "description", parmArray } ); clazz = loadClass("javax.management.MBeanOperationInfo"); Object impact = clazz.getField("INFO").get(null); Object opInfo = instantiate( "javax.management.openmbean.OpenMBeanOperationInfoSupport", new Class[] { String.class, String.class, loadClass("[Ljavax.management.openmbean.OpenMBeanParameterInfo;"), loadClass("javax.management.openmbean.OpenType"), int.class }, new Object[] { "name", "description", parmArray, elementType, impact } ); String[] types = { "type1", "type2" }; Object notInfo = instantiate( "javax.management.MBeanNotificationInfo", new Class[] { types.getClass(), String.class, String.class }, new Object[] { types, "name", "description" } ); Object attArray = Array.newInstance(attInfo.getClass(), 1); Array.set(attArray, 0, attInfo); Object conArray = Array.newInstance(conInfo.getClass(), 1); Array.set(conArray, 0, conInfo); Object opArray = Array.newInstance(opInfo.getClass(), 1); Array.set(opArray, 0, opInfo); Object notArray = Array.newInstance(notInfo.getClass(), 1); Array.set(notArray, 0, notInfo); Object obj = instantiate( "javax.management.openmbean.OpenMBeanInfoSupport", new Class[] { String.class, String.class, loadClass("[Ljavax.management.openmbean.OpenMBeanAttributeInfo;"), loadClass("[Ljavax.management.openmbean.OpenMBeanConstructorInfo;"), loadClass("[Ljavax.management.openmbean.OpenMBeanOperationInfo;"), loadClass("[Ljavax.management.MBeanNotificationInfo;") }, new Object[] { "classname", "description", attArray, conArray, opArray, notArray } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testOpenMBeanOperationInfoSupport() throws Exception { if (SerializationSUITE.form < 11) return; Class clazz = loadClass("javax.management.openmbean.SimpleType"); Object elementType = clazz.getField("INTEGER").get(null); Object parmInfo = instantiate( "javax.management.openmbean.OpenMBeanParameterInfoSupport", new Class[] { String.class, String.class, loadClass("javax.management.openmbean.OpenType"), Object.class, Object[].class }, new Object[] { "name", "description", elementType, new Integer(12), new Integer[] {new Integer(12), new Integer(13) }} ); Object array = Array.newInstance(parmInfo.getClass(), 1); Array.set(array, 0, parmInfo); clazz = loadClass("javax.management.MBeanOperationInfo"); Object impact = clazz.getField("INFO").get(null); Object obj = instantiate( "javax.management.openmbean.OpenMBeanOperationInfoSupport", new Class[] { String.class, String.class, loadClass("[Ljavax.management.openmbean.OpenMBeanParameterInfo;"), loadClass("javax.management.openmbean.OpenType"), int.class }, new Object[] { "name", "description", array, elementType, impact } ); Object result = runTest(obj); assertEquals(obj, result); } public void testOpenMBeanParameterInfoSupportMinMax() throws Exception { if (SerializationSUITE.form < 11) return; Class clazz = loadClass("javax.management.openmbean.SimpleType"); Object elementType = clazz.getField("INTEGER").get(null); Object obj = instantiate( "javax.management.openmbean.OpenMBeanParameterInfoSupport", new Class[] { String.class, String.class, loadClass("javax.management.openmbean.OpenType"), Object.class, Comparable.class, Comparable.class }, new Object[] { "name", "description", elementType, new Integer(12), new Integer(11), new Integer(13) } ); Object result = runTest(obj); assertEquals(obj, result); } public void testOpenMBeanParameterInfoSupportLegal() throws Exception { if (SerializationSUITE.form < 11) return; Class clazz = loadClass("javax.management.openmbean.SimpleType"); Object elementType = clazz.getField("INTEGER").get(null); Object obj = instantiate( "javax.management.openmbean.OpenMBeanParameterInfoSupport", new Class[] { String.class, String.class, loadClass("javax.management.openmbean.OpenType"), Object.class, Object[].class }, new Object[] { "name", "description", elementType, new Integer(12), new Integer[] {new Integer(12), new Integer(13) }} ); Object result = runTest(obj); assertEquals(obj, result); } public void testOperationsException() throws Exception { Object obj = instantiate( "javax.management.OperationsException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testReflectionException() throws Exception { Object obj = instantiate( "javax.management.ReflectionException", new Class[] { Exception.class, String.class }, new Object[] { new Exception("Cause"), "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testRelationException() throws Exception { Object obj = instantiate( "javax.management.relation.RelationException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testRelationNotFoundException() throws Exception { Object obj = instantiate( "javax.management.relation.RelationNotFoundException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testRelationNotification() throws Exception { Object objectName = instantiate( "javax.management.ObjectName", new Class[] { String.class }, new Object[] { "domain:x=y" } ); Class clazz = loadClass("javax.management.relation.RelationNotification"); String type = (String) clazz.getField("RELATION_BASIC_UPDATE").get(null); ArrayList newValue = new ArrayList(); newValue.add(objectName); ArrayList oldValue = new ArrayList(); oldValue.add(objectName); Object obj = instantiate( "javax.management.relation.RelationNotification", new Class[] { String.class, Object.class, Long.TYPE, Long.TYPE, String.class, String.class, String.class, objectName.getClass(), String.class, List.class, List.class }, new Object[] { type, objectName, new Long(1), new Long(2), "message", "relationId", "relationType", objectName, "roleName", newValue, oldValue} ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testRelationServiceNotRegisteredException() throws Exception { Object obj = instantiate( "javax.management.relation.RelationServiceNotRegisteredException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testRelationTypeNotFoundException() throws Exception { Object obj = instantiate( "javax.management.relation.RelationTypeNotFoundException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } /** * @todo equals test */ public void testRelationTypeSupport() throws Exception { Object roleInfo = instantiate( "javax.management.relation.RoleInfo", new Class[] { String.class, String.class, Boolean.TYPE, Boolean.TYPE, Integer.TYPE, Integer.TYPE, String.class }, new Object[] { "name", "test.serialization.support.Trivial", new Boolean(true), new Boolean(true), new Integer(10), new Integer(20), "descritpion" } ); Object array = Array.newInstance(roleInfo.getClass(), 1); Array.set(array, 0, roleInfo); Object obj = instantiate( "javax.management.relation.RelationTypeSupport", new Class[] { String.class, array.getClass() }, new Object[] { "name", array } ); runTest(obj); } public void testRole() throws Exception { Object objectName = instantiate( "javax.management.ObjectName", new Class[] { String.class }, new Object[] { "domain:x=y" } ); ArrayList list = new ArrayList(); list.add(objectName); Object obj = instantiate( "javax.management.relation.Role", new Class[] { String.class, List.class}, new Object[] { "name", list } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testRoleInfo() throws Exception { Object obj = instantiate( "javax.management.relation.RoleInfo", new Class[] { String.class, String.class, Boolean.TYPE, Boolean.TYPE, Integer.TYPE, Integer.TYPE, String.class }, new Object[] { "name", "test.serialization.support.Trivial", new Boolean(true), new Boolean(true), new Integer(10), new Integer(20), "descritpion" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testRoleInfoNotFoundException() throws Exception { Object obj = instantiate( "javax.management.relation.RoleInfoNotFoundException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testRoleList() throws Exception { Object objectName = instantiate( "javax.management.ObjectName", new Class[] { String.class }, new Object[] { "domain:x=y" } ); ArrayList list = new ArrayList(); list.add(objectName); Object role = instantiate( "javax.management.relation.Role", new Class[] { String.class, List.class}, new Object[] { "name", list } ); list = new ArrayList(); list.add(role); Object obj = instantiate( "javax.management.relation.RoleList", new Class[] { List.class}, new Object[] { list } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testRoleNotFoundException() throws Exception { Object obj = instantiate( "javax.management.relation.RoleNotFoundException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testRoleResult() throws Exception { Object objectName = instantiate( "javax.management.ObjectName", new Class[] { String.class }, new Object[] { "domain:x=y" } ); ArrayList list = new ArrayList(); list.add(objectName); Object resolved = instantiate( "javax.management.relation.Role", new Class[] { String.class, List.class}, new Object[] { "name", list } ); list = new ArrayList(); list.add(resolved); Object resolvedList = instantiate( "javax.management.relation.RoleList", new Class[] { List.class }, new Object[] { list } ); Class clazz = loadClass("javax.management.relation.RoleStatus"); Integer status = new Integer(clazz.getField("ROLE_NOT_READABLE").getInt(null)); Object unresolved = instantiate( "javax.management.relation.RoleUnresolved", new Class[] { String.class, List.class, Integer.TYPE}, new Object[] { "name", list, status } ); list = new ArrayList(); list.add(unresolved); Object unresolvedList = instantiate( "javax.management.relation.RoleUnresolvedList", new Class[] { List.class }, new Object[] { list } ); Object obj = instantiate( "javax.management.relation.RoleResult", new Class[] { resolvedList.getClass(), unresolvedList.getClass() }, new Object[] { resolvedList, unresolvedList } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testRoleUnresolved() throws Exception { Object objectName = instantiate( "javax.management.ObjectName", new Class[] { String.class }, new Object[] { "domain:x=y" } ); ArrayList list = new ArrayList(); list.add(objectName); Class clazz = loadClass("javax.management.relation.RoleStatus"); Integer status = new Integer(clazz.getField("ROLE_NOT_READABLE").getInt(null)); Object obj = instantiate( "javax.management.relation.RoleUnresolved", new Class[] { String.class, List.class, Integer.TYPE}, new Object[] { "name", list, status } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testRoleUnresolvedList() throws Exception { Object objectName = instantiate( "javax.management.ObjectName", new Class[] { String.class }, new Object[] { "domain:x=y" } ); ArrayList list = new ArrayList(); list.add(objectName); Class clazz = loadClass("javax.management.relation.RoleStatus"); Integer status = new Integer(clazz.getField("ROLE_NOT_READABLE").getInt(null)); Object unresolved = instantiate( "javax.management.relation.RoleUnresolved", new Class[] { String.class, List.class, Integer.TYPE}, new Object[] { "name", list, status } ); list = new ArrayList(); list.add(unresolved); Object obj = instantiate( "javax.management.relation.RoleUnresolvedList", new Class[] { List.class}, new Object[] { list } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testRuntimeErrorException() throws Exception { Object obj = instantiate( "javax.management.RuntimeErrorException", new Class[] { Error.class, String.class }, new Object[] { new Error("Cause"), "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testRuntimeMBeanException() throws Exception { Object obj = instantiate( "javax.management.RuntimeMBeanException", new Class[] { RuntimeException.class, String.class }, new Object[] { new RuntimeException("Cause"), "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testRuntimeOperationsException() throws Exception { Object obj = instantiate( "javax.management.RuntimeOperationsException", new Class[] { RuntimeException.class, String.class }, new Object[] { new RuntimeException("Cause"), "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testServiceNotFoundException() throws Exception { Object obj = instantiate( "javax.management.ServiceNotFoundException", new Class[] { String.class }, new Object[] { "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testSimpleType() throws Exception { if (SerializationSUITE.form < 11) return; Class clazz = loadClass("javax.management.openmbean.SimpleType"); Object obj = clazz.getField("BIGDECIMAL").get(null); Object result = runTest(obj); assertTrue("Simple types should resolve to the same object", obj == result); } public void testStringValueExp() throws Exception { Object obj = instantiate( "javax.management.StringValueExp", new Class[] { String.class }, new Object[] { "attr" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testTabularDataSupport() throws Exception { if (SerializationSUITE.form < 11) return; Class clazz = loadClass("javax.management.openmbean.SimpleType"); Object openType = clazz.getField("STRING").get(null); Class elementClass = loadClass("javax.management.openmbean.OpenType"); Object array = Array.newInstance(elementClass, 2); Array.set(array, 0, openType); Array.set(array, 1, openType); Object compositeType = instantiate( "javax.management.openmbean.CompositeType", new Class[] { String.class, String.class, String[].class, String[].class, array.getClass() }, new Object[] { "typeName", "description", new String[] { "name1", "name2" }, new String[] { "desc1", "desc2" }, array } ); Object tabularType = instantiate( "javax.management.openmbean.TabularType", new Class[] { String.class, String.class, compositeType.getClass(), String[].class }, new Object[] { "typeName", "description", compositeType, new String[] { "name1" }} ); Object obj = instantiate( "javax.management.openmbean.TabularDataSupport", new Class[] { tabularType.getClass() }, new Object[] { tabularType } ); Object result = runTest(obj); assertEquals(obj, result); } public void testTabularType() throws Exception { if (SerializationSUITE.form < 11) return; Class clazz = loadClass("javax.management.openmbean.SimpleType"); Object openType = clazz.getField("STRING").get(null); Class elementClass = loadClass("javax.management.openmbean.OpenType"); Object array = Array.newInstance(elementClass, 2); Array.set(array, 0, openType); Array.set(array, 1, openType); Object compositeType = instantiate( "javax.management.openmbean.CompositeType", new Class[] { String.class, String.class, String[].class, String[].class, array.getClass() }, new Object[] { "typeName", "description", new String[] { "name1", "name2" }, new String[] { "desc1", "desc2" }, array } ); Object obj = instantiate( "javax.management.openmbean.TabularType", new Class[] { String.class, String.class, compositeType.getClass(), String[].class }, new Object[] { "typeName", "description", compositeType, new String[] { "name1" }} ); Object result = runTest(obj); assertEquals(obj, result); } /** * @todo ? */ public void testTimerAlarmClockNotification() throws Exception { } public void testTimerNotification() throws Exception { Object timerName = instantiate( "javax.management.ObjectName", new Class[] { String.class }, new Object[] { "timer:x=y" } ); Object obj = instantiate( "javax.management.timer.TimerNotification", new Class[] { String.class, Object.class, Long.TYPE, Long.TYPE, String.class, Integer.class, Object.class }, new Object[] { "type", timerName, new Long(1), new Long(2), "message", new Integer(1), "user data" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } public void testXMLParseException() throws Exception { Object obj = instantiate( "javax.management.modelmbean.XMLParseException", new Class[] { Exception.class, String.class }, new Object[] { new Exception("exception"), "message" } ); Object result = runTest(obj); assertEquals(obj.toString(), result.toString()); } // Support ------------------------------------------------------- /** * Instantiate an object using JBossMX. */ private Object instantiate(String className, Class[] sig, Object[] parms) throws Exception { Constructor cons = loadClass(className).getDeclaredConstructor(sig); return cons.newInstance(parms); } /** * Load a class using JBossMX. */ private Class loadClass(String className) throws Exception { return SerializationSUITE.jbossmx.loadClass(className); } /** * Serialize from jbossmx to jmxri. * Serialize from jmxri to jbossmx. */ private Object runTest(Object obj) throws Exception { ByteArrayOutputStream os = serializeJBoss(obj); Object intermediate = deserializeRI(os); os = serializeRI(intermediate); return deserializeJBoss(os); } /** * Dummy method wrapper for debugging. */ private ByteArrayOutputStream serializeJBoss(Object obj) throws Exception { return serialize(obj); } /** * Dummy method wrapper for debugging. */ private ByteArrayOutputStream serializeRI(Object obj) throws Exception { return serialize(obj); } /** * Dummy method wrapper for debugging. */ private Object deserializeJBoss(ByteArrayOutputStream os) throws Exception { return deserialize(SerializationSUITE.jbossmx, os); } /** * Dummy method wrapper for debugging. */ private Object deserializeRI(ByteArrayOutputStream os) throws Exception { return deserialize(SerializationSUITE.jmxri, os); } /** * Serialize the object. */ private ByteArrayOutputStream serialize(Object obj) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(obj); return baos; } /** * Deserialize the object. */ private Object deserialize(ClassLoader cl, ByteArrayOutputStream baos) throws Exception { ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new MyObjectInputStream(cl, bais); return ois.readObject(); } /** * Custom inputstream to override classloading to the relevent * jmx implementation */ public class MyObjectInputStream extends ObjectInputStream { ClassLoader cl; public MyObjectInputStream(ClassLoader cl, ByteArrayInputStream is) throws IOException { super(is); this.cl = cl; } protected Class resolveClass(java.io.ObjectStreamClass osc) throws IOException, ClassNotFoundException { return cl.loadClass(osc.getName()); } } }