1 /*
   2  * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 import javax.management.JMX;
  25 import javax.management.MBeanServer;
  26 import javax.management.MBeanServerFactory;
  27 import javax.management.NotCompliantMBeanException;
  28 import javax.management.ObjectName;
  29 
  30 /*
  31  * @test
  32  * @bug 8010285
  33  * @summary Tests that javax.management.JMX creates proxies only for the
  34  *          compliant MBeans/MXBeans
  35  * @author Jaroslav Bachorik
  36  * @run clean JMXProxyTest
  37  * @run build JMXProxyTest
  38  * @run main JMXProxyTest
  39  */
  40 public class JMXProxyTest {
  41     private static interface PrivateMBean {
  42         public int[] getInts();
  43     }
  44 
  45     private static interface PrivateMXBean {
  46         public int[] getInts();
  47     }
  48 
  49     public static class Private implements PrivateMXBean, PrivateMBean {
  50         public int[] getInts() {
  51             return new int[]{1,2,3};
  52         }
  53     }
  54 
  55     public static interface NonCompliantMBean {
  56         public boolean getInt();
  57         public boolean isInt();
  58         public void setInt(int a);
  59         public void setInt(long b);
  60     }
  61 
  62     public static interface NonCompliantMXBean {
  63         public boolean getInt();
  64         public boolean isInt();
  65         public void setInt(int a);
  66         public void setInt(long b);
  67     }
  68 
  69     public static class NonCompliant implements NonCompliantMXBean, NonCompliantMBean {
  70         public boolean getInt() {
  71             return false;
  72         }
  73 
  74         public boolean isInt() {
  75             return true;
  76         }
  77 
  78         public void setInt(int a) {
  79         }
  80 
  81         public void setInt(long b) {
  82         }
  83     }
  84 
  85     public static interface CompliantMBean {
  86         public boolean isFlag();
  87         public int getInt();
  88         public void setInt(int value);
  89     }
  90 
  91     public static interface CompliantMXBean {
  92         public boolean isFlag();
  93         public int getInt();
  94         public void setInt(int value);
  95     }
  96 
  97     public static class Compliant implements CompliantMXBean, CompliantMBean {
  98         public boolean isFlag() {
  99             return false;
 100         }
 101 
 102         public int getInt() {
 103             return 1;
 104         }
 105 
 106         public void setInt(int value) {
 107         }
 108     }
 109 
 110     private static int failures = 0;
 111 
 112     public static void main(String[] args) throws Exception {
 113         testCompliant(CompliantMBean.class, false);
 114         testCompliant(CompliantMXBean.class, true);
 115         testNonCompliant(PrivateMBean.class, false);
 116         testNonCompliant(PrivateMXBean.class, true);
 117         testNonCompliant(NonCompliantMBean.class, false);
 118         testNonCompliant(NonCompliantMXBean.class, true);
 119 
 120         if (failures == 0)
 121             System.out.println("Test passed");
 122         else
 123             throw new Exception("TEST FAILURES: " + failures);
 124     }
 125 
 126     private static void fail(String msg) {
 127         failures++;
 128         System.out.println("FAIL: " + msg);
 129     }
 130 
 131     private static void success(String msg) {
 132         System.out.println("OK: " + msg);
 133     }
 134 
 135     private static void testNonCompliant(Class<?> iface, boolean isMx) throws Exception {
 136         try {
 137             System.out.println("Creating a proxy for non-compliant " +
 138                                (isMx ? "MXBean" : "MBean") + " " +
 139                                iface.getName() + " ...");
 140 
 141             MBeanServer mbs = MBeanServerFactory.newMBeanServer();
 142             ObjectName on = new ObjectName("test:type=Proxy");
 143 
 144             if (isMx) {
 145                 JMX.newMXBeanProxy(mbs, on, iface);
 146             } else {
 147                 JMX.newMBeanProxy(mbs, on, iface);
 148             }
 149             fail("Created a proxy for non-compliant " +
 150                  (isMx ? "MXBean" : "MBean") + " - " + iface.getName());
 151         } catch (Exception e) {
 152             Throwable t = e;
 153             while (t != null && !(t instanceof NotCompliantMBeanException)) {
 154                 t = t.getCause();
 155             }
 156             if (t != null) {
 157                 success("Proxy not created");
 158             } else {
 159                 throw e;
 160             }
 161         }
 162     }
 163     private static void testCompliant(Class<?> iface, boolean isMx) throws Exception {
 164         try {
 165             System.out.println("Creating a proxy for compliant " +
 166                                (isMx ? "MXBean" : "MBean") + " " +
 167                                iface.getName() + " ...");
 168 
 169             MBeanServer mbs = MBeanServerFactory.newMBeanServer();
 170             ObjectName on = new ObjectName("test:type=Proxy");
 171 
 172             if (isMx) {
 173                 JMX.newMXBeanProxy(mbs, on, iface);
 174             } else {
 175                 JMX.newMBeanProxy(mbs, on, iface);
 176             }
 177             success("Created a proxy for compliant " +
 178                     (isMx ? "MXBean" : "MBean") + " - " + iface.getName());
 179         } catch (Exception e) {
 180             Throwable t = e;
 181             while (t != null && !(t instanceof NotCompliantMBeanException)) {
 182                 t = t.getCause();
 183             }
 184             if (t != null) {
 185                 fail("Proxy not created");
 186             } else {
 187                 throw e;
 188             }
 189         }
 190     }
 191 }