1 /*
   2  * Copyright (c) 2005, 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 /*
  25  * @test
  26  * @bug 6324523
  27  * @summary Check that setting the wrong type of an attribute in a Standard
  28  * MBean or MXBean causes InvalidAttributeValueException
  29  * @author Eamonn McManus
  30  * @run clean SetWrongTypeAttributeTest
  31  * @run build SetWrongTypeAttributeTest
  32  * @run main SetWrongTypeAttributeTest
  33  */
  34 
  35 import java.util.*;
  36 import javax.management.*;
  37 
  38 public class SetWrongTypeAttributeTest {
  39     // In this 2D array, the first element of each subarray is an attribute
  40     // to do setAttribute on, and the remaining elements are values that
  41     // should provoke InvalidAttributeValueException.
  42     private static final Object[][] TEST_VALUES = {
  43         {"Foo", null, 5, "false", Collections.<String,String>emptyMap()},
  44         {"Name", 5, false, Collections.<String,String>emptyMap()},
  45         {"Properties", 5, false, Collections.singleton("foo")},
  46     };
  47 
  48     public static interface BlahMBean {
  49         public boolean isFoo();
  50         public void setFoo(boolean foo);
  51 
  52         public String getName();
  53         public void setName(String name);
  54 
  55         public Map<String,String> getProperties();
  56         public void setProperties(Map<String,String> map);
  57     }
  58 
  59     public static interface BlahMXBean {
  60         public boolean isFoo();
  61         public void setFoo(boolean foo);
  62 
  63         public String getName();
  64         public void setName(String name);
  65 
  66         public Map<String,String> getProperties();
  67         public void setProperties(Map<String,String> map);
  68     }
  69 
  70     public static class BlahBase {
  71         public boolean isFoo() {
  72             return foo;
  73         }
  74         public void setFoo(boolean foo) {
  75             this.foo = foo;
  76         }
  77 
  78         public String getName() {
  79             return name;
  80         }
  81         public void setName(String name) {
  82             this.name = name;
  83         }
  84 
  85         public Map<String,String> getProperties() {
  86             return properties;
  87         }
  88         public void setProperties(Map<String,String> map) {
  89             this.properties = map;
  90         }
  91 
  92         private boolean foo;
  93         private String name;
  94         private Map<String,String> properties;
  95     }
  96 
  97     public static class Blah extends BlahBase implements BlahMBean {}
  98 
  99     public static class MXBlah extends BlahBase implements BlahMXBean {}
 100 
 101     public static class StdBlah extends StandardMBean implements BlahMBean {
 102         public StdBlah() throws NotCompliantMBeanException {
 103             super(BlahMBean.class);
 104         }
 105 
 106         public boolean isFoo() {
 107             return foo;
 108         }
 109         public void setFoo(boolean foo) {
 110             this.foo = foo;
 111         }
 112 
 113         public String getName() {
 114             return name;
 115         }
 116         public void setName(String name) {
 117             this.name = name;
 118         }
 119 
 120         public Map<String,String> getProperties() {
 121             return properties;
 122         }
 123         public void setProperties(Map<String,String> map) {
 124             this.properties = map;
 125         }
 126 
 127         private boolean foo;
 128         private String name;
 129         private Map<String,String> properties;
 130     }
 131 
 132     public static class StdMXBlah extends StandardMBean implements BlahMXBean {
 133         public StdMXBlah() throws NotCompliantMBeanException {
 134             super(BlahMXBean.class, true);
 135         }
 136 
 137         public boolean isFoo() {
 138             return foo;
 139         }
 140         public void setFoo(boolean foo) {
 141             this.foo = foo;
 142         }
 143 
 144         public String getName() {
 145             return name;
 146         }
 147         public void setName(String name) {
 148             this.name = name;
 149         }
 150 
 151         public Map<String,String> getProperties() {
 152             return properties;
 153         }
 154         public void setProperties(Map<String,String> map) {
 155             this.properties = map;
 156         }
 157 
 158         private boolean foo;
 159         private String name;
 160         private Map<String,String> properties;
 161     }
 162 
 163     public static void main(String[] args) throws Exception {
 164         test("Standard Blah", new Blah());
 165         test("StandardMBean implementing Blah", new StdBlah());
 166         test("StandardMBean wrapping Blah",
 167              new StandardMBean(new Blah(), BlahMBean.class));
 168         test("MXBean Blah", new MXBlah());
 169         test("StandardMBean implementing MXBean Blah", new StdMXBlah());
 170         test("StandardMBean wrapping MXBean Blah",
 171              new StandardMBean(new MXBlah(), BlahMXBean.class, true));
 172 
 173         if (failure == null)
 174             System.out.println("TEST PASSED");
 175         else
 176             throw new Exception("TEST FAILED: " + failure);
 177     }
 178 
 179     private static void test(String what, Object obj) throws Exception {
 180         System.out.println(what + "...");
 181         MBeanServer mbs = MBeanServerFactory.newMBeanServer();
 182         ObjectName on = new ObjectName("a:b=c");
 183         mbs.registerMBean(obj, on);
 184         for (Object[] testValue : TEST_VALUES) {
 185             String attrName = (String) testValue[0];
 186             for (int i = 1; i < testValue.length; i++) {
 187                 Object value = testValue[i];
 188                 final String doing =
 189                     "setAttribute(" + attrName + ", " + value + ")";
 190                 try {
 191                     mbs.setAttribute(on, new Attribute("Foo", 5));
 192                     fail(what, doing + " succeeded but should fail!");
 193                 } catch (InvalidAttributeValueException e) {
 194                     final String msg =
 195                         doing + ": OK, got expected " +
 196                         "InvalidAttributeValueException";
 197                     System.out.println(msg);
 198                 } catch (Throwable e) {
 199                     fail(what, doing + " got wrong exception: " + e);
 200                     e.printStackTrace(System.out);
 201                 }
 202             }
 203         }
 204     }
 205 
 206     private static void fail(String what, String msg) {
 207         failure = what + ": " + msg;
 208         System.out.println("FAILED: " + failure);
 209     }
 210 
 211     private static String failure;
 212 }