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