blob: 25260e0c15ed15391dd05f749a093fce47c29de9 [file] [log] [blame]
/*
* 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 5035217
* @summary Test that MBean's RuntimeException is wrapped in
* RuntimeMBeanException and (for Standard MBeans) that checked exceptions
* are wrapped in MBeanException
* @author Eamonn McManus
* @compile -source 1.4 MBeanExceptionTest.java
* @run main MBeanExceptionTest
*/
import javax.management.*;
public class MBeanExceptionTest {
public static void main(String[] args) throws Exception {
System.out.println("Test that if an MBean throws RuntimeException " +
"it is wrapped in RuntimeMBeanException,");
System.out.println("and if a Standard MBean throws Exception " +
"it is wrapped in MBeanException");
MBeanServer mbs = MBeanServerFactory.newMBeanServer();
Object standard = new Except();
ObjectName standardName = new ObjectName(":name=Standard MBean");
Object standardMBean =
new StandardMBean(new Except(), ExceptMBean.class);
ObjectName standardMBeanName =
new ObjectName(":name=Instance of StandardMBean");
Object dynamic = new DynamicExcept();
ObjectName dynamicName = new ObjectName(":name=Dynamic MBean");
mbs.registerMBean(standard, standardName);
mbs.registerMBean(standardMBean, standardMBeanName);
mbs.registerMBean(dynamic, dynamicName);
int failures = 0;
failures += test(mbs, standardName, true);
failures += test(mbs, standardMBeanName, true);
failures += test(mbs, dynamicName, false);
if (failures == 0)
System.out.println("Test passed");
else {
System.out.println("TEST FAILED: " + failures + " failure(s)");
System.exit(1);
}
}
private static int test(MBeanServer mbs, ObjectName name,
boolean testChecked)
throws Exception {
System.out.println("--------" + name + "--------");
int failures = 0;
final String[] ops = {"getAttribute", "setAttribute", "invoke"};
final int GET = 0, SET = 1, INVOKE = 2;
final String[] targets = {"UncheckedException", "CheckedException"};
final int UNCHECKED = 0, CHECKED = 1;
for (int i = 0; i < ops.length; i++) {
for (int j = 0; j < targets.length; j++) {
if (j == CHECKED && !testChecked)
continue;
String target = targets[j];
String what = ops[i] + "/" + target;
System.out.println(what);
try {
switch (i) {
case GET:
mbs.getAttribute(name, target);
break;
case SET:
mbs.setAttribute(name, new Attribute(target, "x"));
break;
case INVOKE:
mbs.invoke(name, target, null, null);
break;
default:
throw new AssertionError();
}
System.out.println("failure: " + what + " returned!");
failures++;
} catch (RuntimeMBeanException e) {
if (j == CHECKED) {
System.out.println("failure: RuntimeMBeanException " +
"when checked expected: " + e);
failures++;
} else {
Throwable cause = e.getCause();
if (cause == theUncheckedException)
System.out.println("ok: " + what);
else {
System.out.println("failure: " + what +
" wrapped " + cause);
failures++;
}
}
} catch (MBeanException e) {
if (j == UNCHECKED) {
System.out.println("failure: checked exception " +
"when unchecked expected: " + e);
failures++;
} else {
Throwable cause = e.getCause();
if (cause == theCheckedException)
System.out.println("ok: " + what);
else {
System.out.println("failure: " + what +
" wrapped " + cause);
failures++;
}
}
} catch (Throwable t) {
System.out.println("failure: " + what + " threw: " + t);
while ((t = t.getCause()) != null)
System.out.println(" ... " + t);
failures++;
}
}
}
return failures;
}
public static interface ExceptMBean {
public String getUncheckedException();
public void setUncheckedException(String x);
public void UncheckedException();
public String getCheckedException() throws Exception;
public void setCheckedException(String x) throws Exception;
public void CheckedException() throws Exception;
}
public static class Except implements ExceptMBean {
public String getUncheckedException() {
throw theUncheckedException;
}
public void setUncheckedException(String x) {
throw theUncheckedException;
}
public void UncheckedException() {
throw theUncheckedException;
}
public String getCheckedException() throws Exception {
throw theCheckedException;
}
public void setCheckedException(String x) throws Exception {
throw theCheckedException;
}
public void CheckedException() throws Exception {
throw theCheckedException;
}
}
public static class DynamicExcept implements DynamicMBean {
public Object getAttribute(String attrName)
throws MBeanException {
if (attrName.equals("UncheckedException"))
throw theUncheckedException;
else
throw new AssertionError();
}
public void setAttribute(Attribute attr)
throws MBeanException {
String attrName = attr.getName();
if (attrName.equals("UncheckedException"))
throw theUncheckedException;
else
throw new AssertionError();
}
public Object invoke(String opName, Object[] params, String[] sig)
throws MBeanException {
assert params == null && sig == null;
if (opName.equals("UncheckedException"))
throw theUncheckedException;
else
throw new AssertionError();
}
public AttributeList getAttributes(String[] names) {
assert false;
return null;
}
public AttributeList setAttributes(AttributeList attrs) {
assert false;
return null;
}
public MBeanInfo getMBeanInfo() {
try {
return new StandardMBean(new Except(), ExceptMBean.class)
.getMBeanInfo();
} catch (Exception e) {
assert false;
return null;
}
}
}
private static final Exception theCheckedException =
new Exception("The checked exception that should be seen");
private static final RuntimeException theUncheckedException =
new UnsupportedOperationException("The unchecked exception " +
"that should be seen");
}