1 /*
   2  * Copyright (c) 2005, 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 6273541
  27  * @summary Test that the counter/gauge/string monitors emit a
  28  *          jmx.monitor.error.type notification when the attribute
  29  *          being monitored returns a non comparable value.
  30  * @author Luis-Miguel Alventosa
  31  * @modules java.management
  32  * @run clean NonComparableAttributeValueTest
  33  * @run build NonComparableAttributeValueTest
  34  * @run main NonComparableAttributeValueTest
  35  */
  36 
  37 import javax.management.*;
  38 import javax.management.monitor.*;
  39 
  40 public class NonComparableAttributeValueTest implements NotificationListener {
  41 
  42     // Flag to notify that a message has been received
  43     private volatile boolean messageReceived = false;
  44 
  45     // MBean class
  46     public class ObservedObject implements ObservedObjectMBean {
  47         public Object getIntegerAttribute() {
  48             return new Object();
  49         }
  50         public Object getStringAttribute() {
  51             return new Object();
  52         }
  53     }
  54 
  55     // MBean interface
  56     public interface ObservedObjectMBean {
  57         public Object getIntegerAttribute();
  58         public Object getStringAttribute();
  59     }
  60 
  61     // Notification handler
  62     public void handleNotification(Notification notification,
  63                                    Object handback) {
  64         MonitorNotification n = (MonitorNotification) notification;
  65         echo("\tInside handleNotification...");
  66         String type = n.getType();
  67         try {
  68             if (type.equals(
  69                     MonitorNotification.OBSERVED_ATTRIBUTE_TYPE_ERROR)) {
  70                 echo("\t\t" + n.getObservedAttribute() + " is null");
  71                 echo("\t\tDerived Gauge = " + n.getDerivedGauge());
  72                 echo("\t\tTrigger = " + n.getTrigger());
  73 
  74                 synchronized (this) {
  75                     messageReceived = true;
  76                     notifyAll();
  77                 }
  78             } else {
  79                 echo("\t\tSkipping notification of type: " + type);
  80             }
  81         } catch (Exception e) {
  82             echo("\tError in handleNotification!");
  83             e.printStackTrace(System.out);
  84         }
  85     }
  86 
  87     /**
  88      * Update the counter and check for notifications
  89      */
  90     public int counterMonitorNotification() throws Exception {
  91 
  92         CounterMonitor counterMonitor = null;
  93         try {
  94             MBeanServer server = MBeanServerFactory.newMBeanServer();
  95 
  96             String domain = server.getDefaultDomain();
  97 
  98             // Create a new CounterMonitor MBean and add it to the MBeanServer.
  99             //
 100             echo(">>> CREATE a new CounterMonitor MBean");
 101             ObjectName counterMonitorName = new ObjectName(
 102                             domain + ":type=" + CounterMonitor.class.getName());
 103             counterMonitor = new CounterMonitor();
 104             server.registerMBean(counterMonitor, counterMonitorName);
 105 
 106             echo(">>> ADD a listener to the CounterMonitor");
 107             counterMonitor.addNotificationListener(this, null, null);
 108 
 109             //
 110             // MANAGEMENT OF A STANDARD MBEAN
 111             //
 112 
 113             echo(">>> CREATE a new ObservedObject MBean");
 114 
 115             ObjectName obsObjName =
 116                 ObjectName.getInstance(domain + ":type=ObservedObject");
 117             ObservedObject obsObj = new ObservedObject();
 118             server.registerMBean(obsObj, obsObjName);
 119 
 120             echo(">>> SET the attributes of the CounterMonitor:");
 121 
 122             counterMonitor.addObservedObject(obsObjName);
 123             echo("\tATTRIBUTE \"ObservedObject\"    = " + obsObjName);
 124 
 125             counterMonitor.setObservedAttribute("IntegerAttribute");
 126             echo("\tATTRIBUTE \"ObservedAttribute\" = IntegerAttribute");
 127 
 128             counterMonitor.setNotify(true);
 129             echo("\tATTRIBUTE \"NotifyFlag\"        = true");
 130 
 131             Integer threshold = 2;
 132             counterMonitor.setInitThreshold(threshold);
 133             echo("\tATTRIBUTE \"Threshold\"         = " + threshold);
 134 
 135             int granularityperiod = 500;
 136             counterMonitor.setGranularityPeriod(granularityperiod);
 137             echo("\tATTRIBUTE \"GranularityPeriod\" = " + granularityperiod);
 138 
 139             echo(">>> START the CounterMonitor");
 140             counterMonitor.start();
 141 
 142             // Check if notification was received
 143             //
 144             doWait();
 145             if (messageReceived) {
 146                 echo("\tOK: CounterMonitor notification received");
 147             } else {
 148                 echo("\tKO: CounterMonitor notification missed or not emitted");
 149                 return 1;
 150             }
 151         } finally {
 152             if (counterMonitor != null)
 153                 counterMonitor.stop();
 154         }
 155 
 156         return 0;
 157     }
 158 
 159     /**
 160      * Update the gauge and check for notifications
 161      */
 162     public int gaugeMonitorNotification() throws Exception {
 163 
 164         GaugeMonitor gaugeMonitor = null;
 165         try {
 166             MBeanServer server = MBeanServerFactory.newMBeanServer();
 167 
 168             String domain = server.getDefaultDomain();
 169 
 170             // Create a new GaugeMonitor MBean and add it to the MBeanServer.
 171             //
 172             echo(">>> CREATE a new GaugeMonitor MBean");
 173             ObjectName gaugeMonitorName = new ObjectName(
 174                             domain + ":type=" + GaugeMonitor.class.getName());
 175             gaugeMonitor = new GaugeMonitor();
 176             server.registerMBean(gaugeMonitor, gaugeMonitorName);
 177 
 178             echo(">>> ADD a listener to the GaugeMonitor");
 179             gaugeMonitor.addNotificationListener(this, null, null);
 180 
 181             //
 182             // MANAGEMENT OF A STANDARD MBEAN
 183             //
 184 
 185             echo(">>> CREATE a new ObservedObject MBean");
 186 
 187             ObjectName obsObjName =
 188                 ObjectName.getInstance(domain + ":type=ObservedObject");
 189             ObservedObject obsObj = new ObservedObject();
 190             server.registerMBean(obsObj, obsObjName);
 191 
 192             echo(">>> SET the attributes of the GaugeMonitor:");
 193 
 194             gaugeMonitor.addObservedObject(obsObjName);
 195             echo("\tATTRIBUTE \"ObservedObject\"    = " + obsObjName);
 196 
 197             gaugeMonitor.setObservedAttribute("IntegerAttribute");
 198             echo("\tATTRIBUTE \"ObservedAttribute\" = IntegerAttribute");
 199 
 200             gaugeMonitor.setNotifyLow(false);
 201             gaugeMonitor.setNotifyHigh(true);
 202             echo("\tATTRIBUTE \"Notify Low  Flag\"  = false");
 203             echo("\tATTRIBUTE \"Notify High Flag\"  = true");
 204 
 205             Double highThreshold = 3.0, lowThreshold = 2.5;
 206             gaugeMonitor.setThresholds(highThreshold, lowThreshold);
 207             echo("\tATTRIBUTE \"Low  Threshold\"    = " + lowThreshold);
 208             echo("\tATTRIBUTE \"High Threshold\"    = " + highThreshold);
 209 
 210             int granularityperiod = 500;
 211             gaugeMonitor.setGranularityPeriod(granularityperiod);
 212             echo("\tATTRIBUTE \"GranularityPeriod\" = " + granularityperiod);
 213 
 214             echo(">>> START the GaugeMonitor");
 215             gaugeMonitor.start();
 216 
 217             // Check if notification was received
 218             //
 219             doWait();
 220             if (messageReceived) {
 221                 echo("\tOK: GaugeMonitor notification received");
 222             } else {
 223                 echo("\tKO: GaugeMonitor notification missed or not emitted");
 224                 return 1;
 225             }
 226         } finally {
 227             if (gaugeMonitor != null)
 228                 gaugeMonitor.stop();
 229         }
 230 
 231         return 0;
 232     }
 233 
 234     /**
 235      * Update the string and check for notifications
 236      */
 237     public int stringMonitorNotification() throws Exception {
 238 
 239         StringMonitor stringMonitor = null;
 240         try {
 241             MBeanServer server = MBeanServerFactory.newMBeanServer();
 242 
 243             String domain = server.getDefaultDomain();
 244 
 245             // Create a new StringMonitor MBean and add it to the MBeanServer.
 246             //
 247             echo(">>> CREATE a new StringMonitor MBean");
 248             ObjectName stringMonitorName = new ObjectName(
 249                             domain + ":type=" + StringMonitor.class.getName());
 250             stringMonitor = new StringMonitor();
 251             server.registerMBean(stringMonitor, stringMonitorName);
 252 
 253             echo(">>> ADD a listener to the StringMonitor");
 254             stringMonitor.addNotificationListener(this, null, null);
 255 
 256             //
 257             // MANAGEMENT OF A STANDARD MBEAN
 258             //
 259 
 260             echo(">>> CREATE a new ObservedObject MBean");
 261 
 262             ObjectName obsObjName =
 263                 ObjectName.getInstance(domain + ":type=ObservedObject");
 264             ObservedObject obsObj = new ObservedObject();
 265             server.registerMBean(obsObj, obsObjName);
 266 
 267             echo(">>> SET the attributes of the StringMonitor:");
 268 
 269             stringMonitor.addObservedObject(obsObjName);
 270             echo("\tATTRIBUTE \"ObservedObject\"    = " + obsObjName);
 271 
 272             stringMonitor.setObservedAttribute("StringAttribute");
 273             echo("\tATTRIBUTE \"ObservedAttribute\" = StringAttribute");
 274 
 275             stringMonitor.setNotifyMatch(true);
 276             echo("\tATTRIBUTE \"NotifyMatch\"       = true");
 277 
 278             stringMonitor.setNotifyDiffer(false);
 279             echo("\tATTRIBUTE \"NotifyDiffer\"      = false");
 280 
 281             stringMonitor.setStringToCompare("do_match_now");
 282             echo("\tATTRIBUTE \"StringToCompare\"   = \"do_match_now\"");
 283 
 284             int granularityperiod = 500;
 285             stringMonitor.setGranularityPeriod(granularityperiod);
 286             echo("\tATTRIBUTE \"GranularityPeriod\" = " + granularityperiod);
 287 
 288             echo(">>> START the StringMonitor");
 289             stringMonitor.start();
 290 
 291             // Check if notification was received
 292             //
 293             doWait();
 294             if (messageReceived) {
 295                 echo("\tOK: StringMonitor notification received");
 296             } else {
 297                 echo("\tKO: StringMonitor notification missed or not emitted");
 298                 return 1;
 299             }
 300         } finally {
 301             if (stringMonitor != null)
 302                 stringMonitor.stop();
 303         }
 304 
 305         return 0;
 306     }
 307 
 308     /**
 309      * Test the monitor notifications.
 310      */
 311     public int monitorNotifications() throws Exception {
 312         echo(">>> ----------------------------------------");
 313         messageReceived = false;
 314         int error = counterMonitorNotification();
 315         echo(">>> ----------------------------------------");
 316         messageReceived = false;
 317         error += gaugeMonitorNotification();
 318         echo(">>> ----------------------------------------");
 319         messageReceived = false;
 320         error += stringMonitorNotification();
 321         echo(">>> ----------------------------------------");
 322         return error;
 323     }
 324 
 325     /*
 326      * Print message
 327      */
 328     private static void echo(String message) {
 329         System.out.println(message);
 330     }
 331 
 332     /*
 333      * Wait messageReceived to be true
 334      */
 335     synchronized void doWait() {
 336         while (!messageReceived) {
 337             try {
 338                 wait();
 339             } catch (InterruptedException e) {
 340                 System.err.println("Got unexpected exception: " + e);
 341                 e.printStackTrace();
 342                 break;
 343             }
 344         }
 345     }
 346 
 347     /*
 348      * Standalone entry point.
 349      *
 350      * Run the test and report to stdout.
 351      */
 352     public static void main (String args[]) throws Exception {
 353         NonComparableAttributeValueTest test = new NonComparableAttributeValueTest();
 354         int error = test.monitorNotifications();
 355         if (error > 0) {
 356             echo(">>> Unhappy Bye, Bye!");
 357             throw new IllegalStateException("Test FAILED: Didn't get all " +
 358                                             "the notifications that were " +
 359                                             "expected by the test!");
 360         } else {
 361             echo(">>> Happy Bye, Bye!");
 362         }
 363     }
 364 }