1 /*
   2  * Copyright (c) 2003, 2015, 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 4883712 4869006 4894856 5016685
  27  * @summary Test that DescriptorSupport correctly validates fields
  28  * @author Eamonn McManus
  29  * @modules java.management
  30  * @run clean DescriptorSupportTest
  31  * @run build DescriptorSupportTest
  32  * @run main DescriptorSupportTest
  33  */
  34 
  35 import java.io.ByteArrayInputStream;
  36 import java.io.ByteArrayOutputStream;
  37 import java.io.ObjectInputStream;
  38 import java.io.ObjectOutputStream;
  39 import java.util.ArrayList;
  40 import java.util.Arrays;
  41 import java.util.List;
  42 import javax.management.Descriptor;
  43 import javax.management.RuntimeOperationsException;
  44 import javax.management.modelmbean.DescriptorSupport;
  45 import javax.management.modelmbean.ModelMBeanInfo;
  46 import javax.management.modelmbean.ModelMBeanInfoSupport;
  47 
  48 public class DescriptorSupportTest {
  49     private static final Object[] goodFields = {
  50         "value", "",
  51         "severity", "0",
  52         "severity", "6",
  53     };
  54 
  55     private static final Object[] badFields = {
  56         "name", null,
  57         "name", "",
  58         "descriptorType", null,
  59         "descriptorType", "",
  60         "setMethod", null,
  61         "getMethod", null,
  62         "role", null,
  63         "class", null,
  64         "visibility", null,
  65         "visibility", new Integer(0),
  66         "visibility", "0",
  67         "visibility", new Integer(5),
  68         "visibility", "5",
  69         "severity", null,
  70         "severity", new Integer(-1),
  71         "severity", "-1",
  72         "severity", new Integer(7),
  73         "severity", "7",
  74         "persistPolicy", null,
  75         "persistPolicy", "bogusPersistPolicy",
  76         "persistPeriod", null,
  77         "persistPeriod", "not a number",
  78         "currencyTimeLimit", null,
  79         "currencyTimeLimit", "not a number",
  80         "lastUpdatedTimeStamp", null,
  81         "lastUpdatedTimeStamp", "not a number",
  82         "lastReturnedTimeStamp", null,
  83         "lastReturnedTimeStamp", "not a number",
  84         "log", null,
  85         "log", "not T or F or true or false",
  86         "log", new Object[0],
  87     };
  88 
  89 
  90     public static void main(String[] args) throws Exception {
  91         boolean ok = true;
  92 
  93         System.out.println("Checking that name and descriptorType are " +
  94                            "mandatory");
  95         // Try omitting name and/or descriptorType
  96         for (int i = 0; i < 3; i++) {
  97             final boolean addName = ((i & 1) != 0);
  98             final boolean addDescriptorType = ((i & 2) != 0);
  99             final List fields = new ArrayList();
 100             if (addName)
 101                 fields.add("name=something");
 102             if (addDescriptorType)
 103                 fields.add("descriptorType=something-else");
 104             final String[] fs = (String[]) fields.toArray(new String[0]);
 105             final String what =
 106                     "DescriptorSupport with " +
 107                     (addName ? "" : "no ") + "name and " +
 108                     (addDescriptorType ? "" : "no ") + "descriptorType";
 109             DescriptorSupport ds = new DescriptorSupport(fs);
 110             if (ds.isValid()) {
 111                 System.out.println("INCORRECTLY ACCEPTED: " + what);
 112                 ok = false;
 113             } else
 114                 System.out.println("OK: rejected " + what);
 115         }
 116 
 117         for (int pass = 0; pass < 2; pass++) {
 118             boolean shouldAccept = (pass == 0);
 119             System.out.println("Trying out " +
 120                                (shouldAccept ? "correct" : "bogus") +
 121                                " DescriptorSupport fields");
 122             Object[] fields = shouldAccept ? goodFields : badFields;
 123             for (int i = 0; i < fields.length; i += 2) {
 124                 String[] names = {"name", "descriptorType"};
 125                 String[] values = {"some-name", "some-type"};
 126                 DescriptorSupport d = new DescriptorSupport(names, values);
 127                 final String name = (String) fields[i];
 128                 final Object value = fields[i + 1];
 129                 final String valueS =
 130                     (value instanceof String) ? ("\"" + value + "\"") :
 131                     (value == null) ? "null" : value.toString();
 132                 final String what =
 133                     "DescriptorSupport with " + name + " = " + valueS;
 134                 try {
 135                     d.setField(name, value);
 136                     if (shouldAccept)
 137                         System.out.println("OK: accepted " + what);
 138                     else {
 139                         System.out.println("INCORRECTLY ACCEPTED: " + what);
 140                         ok = false;
 141                     }
 142                 } catch (RuntimeOperationsException e) {
 143                     if (shouldAccept) {
 144                         System.out.println("INCORRECTLY REJECTED: " + what +
 145                                            ": " + e);
 146                         ok = false;
 147                     } else {
 148                         System.out.println("OK: rejected " + what);
 149                         // OK: this is what should happen
 150                     }
 151                 } catch (Exception e) {
 152                     System.out.println("WRONG EXCEPTION: " + what + ": " + e);
 153                     ok = false;
 154                 }
 155             }
 156         }
 157 
 158         // 4894856: ModelMBeanInfoSupport.setDescriptor(d, "mbean") fails
 159         System.out.println("Checking that setDescriptor(d, \"mbean\") works");
 160         ModelMBeanInfo mmbi =
 161             new ModelMBeanInfoSupport("x", "descr", null, null, null, null);
 162         Descriptor d = mmbi.getDescriptor("x", "mbean");
 163         try {
 164             mmbi.setDescriptor(d, "mbean");
 165         } catch (Exception e) {
 166             System.out.println("Unexpected exception:");
 167             e.printStackTrace(System.out);
 168             ok = false;
 169         }
 170 
 171         // 5016685: DescriptorSupport forces field names to lower case
 172         System.out.println("Checking that field name case is ignored " +
 173                            "but preserved");
 174         ok &= caseTest(new DescriptorSupport(new String[] {"NAME=blah"}),
 175                        "DescriptorSupport(String[])");
 176         ok &= caseTest(new DescriptorSupport(new String[] {"NAME"},
 177                                              new String[] {"blah"}),
 178                        "DescriptorSupport(String[], Object[])");
 179         DescriptorSupport d1 = new DescriptorSupport();
 180         d1.setField("NAME", "blah");
 181         ok &= caseTest(d1, "DescriptorSupport.setField");
 182         d1 = new DescriptorSupport(new String[] {"NAME=blah"});
 183         ok &= caseTest(new DescriptorSupport(d1),
 184                        "DescriptorSupport(Descriptor)");
 185         d1 = new DescriptorSupport(new String[] {"NAME=blah"});
 186         ok &= caseTest(new DescriptorSupport(d1.toXMLString()),
 187                        "DescriptorSupport(String)");
 188         d1 = new DescriptorSupport(new String[] {"NAME=blah"});
 189         ByteArrayOutputStream bos = new ByteArrayOutputStream();
 190         ObjectOutputStream oos = new ObjectOutputStream(bos);
 191         oos.writeObject(d1);
 192         oos.close();
 193         bos.close();
 194         ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
 195         ObjectInputStream ois = new ObjectInputStream(bis);
 196         d1 = (DescriptorSupport) ois.readObject();
 197         ok &= caseTest(d1, "serialized DescriptorSupport");
 198 
 199         if (ok)
 200             System.out.println("Test passed");
 201         else {
 202             System.out.println("TEST FAILED");
 203             System.exit(1);
 204         }
 205     }
 206 
 207     private static boolean caseTest(Descriptor d, String what) {
 208         boolean ok = true;
 209 
 210         System.out.println("..." + what);
 211 
 212         String[] names = d.getFieldNames();
 213         if (names.length != 1 || !names[0].equals("NAME")) {
 214             ok = false;
 215             System.out.println("...getFieldNames() fails: " +
 216                                Arrays.asList(names));
 217         }
 218 
 219         String[] fields = d.getFields();
 220         if (fields.length != 1 || !fields[0].equals("NAME=blah")) {
 221             ok = false;
 222             System.out.println("...getFields() fails: " +
 223                                Arrays.asList(fields));
 224         }
 225 
 226         Object value = d.getFieldValue("namE");
 227         if (!"blah".equals(value)) {
 228             ok = false;
 229             System.out.println("...getFieldValue(\"namE\") fails: " + value);
 230         }
 231 
 232         Object[] values = d.getFieldValues(new String[] {"namE"});
 233         if (values.length != 1 || !"blah".equals(values[0])) {
 234             ok = false;
 235             System.out.println("...getFieldValues({\"namE\"}) fails: " +
 236                                Arrays.asList(values));
 237         }
 238 
 239         d.setField("namE", "newblah");
 240         Object newblah = d.getFieldValue("Name");
 241         if (!"newblah".equals(newblah)) {
 242             ok = false;
 243             System.out.println("...setField value not returned: " + newblah);
 244         }
 245 
 246         d.setFields(new String[] {"NaMe"}, new Object[] {"newerblah"});
 247         Object newerblah = d.getFieldValue("naMe");
 248         if (!"newerblah".equals(newerblah)) {
 249             ok = false;
 250             System.out.println("...setFields value not returned: " +
 251                                newerblah);
 252         }
 253 
 254         Descriptor d1 = (Descriptor) d.clone();
 255         newerblah = d1.getFieldValue("NAMe");
 256         if (!"newerblah".equals(newerblah)) {
 257             ok = false;
 258             System.out.println("...clone incorrect: " + newerblah);
 259         }
 260 
 261         d.removeField("NAme");
 262         names = d.getFieldNames();
 263         if (names.length != 0) {
 264             ok = false;
 265             System.out.println("...removeField failed: " +
 266                                Arrays.asList(names));
 267         }
 268 
 269         if (ok)
 270             System.out.println("...succeeded");
 271 
 272         return ok;
 273     }
 274 }