3789983e89
Reviewed-by: darcy, ihse
365 lines
13 KiB
Java
365 lines
13 KiB
Java
/*
|
|
* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* This code is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
* accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU General Public License version
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
* or visit www.oracle.com if you need additional information or have any
|
|
* questions.
|
|
*/
|
|
|
|
/*
|
|
* @test
|
|
* @bug 6273541
|
|
* @summary Test that the counter/gauge/string monitors emit a
|
|
* jmx.monitor.error.type notification when the attribute
|
|
* being monitored returns a non comparable value.
|
|
* @author Luis-Miguel Alventosa
|
|
*
|
|
* @run clean NonComparableAttributeValueTest
|
|
* @run build NonComparableAttributeValueTest
|
|
* @run main NonComparableAttributeValueTest
|
|
*/
|
|
|
|
import javax.management.*;
|
|
import javax.management.monitor.*;
|
|
|
|
public class NonComparableAttributeValueTest implements NotificationListener {
|
|
|
|
// Flag to notify that a message has been received
|
|
private volatile boolean messageReceived = false;
|
|
|
|
// MBean class
|
|
public class ObservedObject implements ObservedObjectMBean {
|
|
public Object getIntegerAttribute() {
|
|
return new Object();
|
|
}
|
|
public Object getStringAttribute() {
|
|
return new Object();
|
|
}
|
|
}
|
|
|
|
// MBean interface
|
|
public interface ObservedObjectMBean {
|
|
public Object getIntegerAttribute();
|
|
public Object getStringAttribute();
|
|
}
|
|
|
|
// Notification handler
|
|
public void handleNotification(Notification notification,
|
|
Object handback) {
|
|
MonitorNotification n = (MonitorNotification) notification;
|
|
echo("\tInside handleNotification...");
|
|
String type = n.getType();
|
|
try {
|
|
if (type.equals(
|
|
MonitorNotification.OBSERVED_ATTRIBUTE_TYPE_ERROR)) {
|
|
echo("\t\t" + n.getObservedAttribute() + " is null");
|
|
echo("\t\tDerived Gauge = " + n.getDerivedGauge());
|
|
echo("\t\tTrigger = " + n.getTrigger());
|
|
|
|
synchronized (this) {
|
|
messageReceived = true;
|
|
notifyAll();
|
|
}
|
|
} else {
|
|
echo("\t\tSkipping notification of type: " + type);
|
|
}
|
|
} catch (Exception e) {
|
|
echo("\tError in handleNotification!");
|
|
e.printStackTrace(System.out);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Update the counter and check for notifications
|
|
*/
|
|
public int counterMonitorNotification() throws Exception {
|
|
|
|
CounterMonitor counterMonitor = null;
|
|
try {
|
|
MBeanServer server = MBeanServerFactory.newMBeanServer();
|
|
|
|
String domain = server.getDefaultDomain();
|
|
|
|
// Create a new CounterMonitor MBean and add it to the MBeanServer.
|
|
//
|
|
echo(">>> CREATE a new CounterMonitor MBean");
|
|
ObjectName counterMonitorName = new ObjectName(
|
|
domain + ":type=" + CounterMonitor.class.getName());
|
|
counterMonitor = new CounterMonitor();
|
|
server.registerMBean(counterMonitor, counterMonitorName);
|
|
|
|
echo(">>> ADD a listener to the CounterMonitor");
|
|
counterMonitor.addNotificationListener(this, null, null);
|
|
|
|
//
|
|
// MANAGEMENT OF A STANDARD MBEAN
|
|
//
|
|
|
|
echo(">>> CREATE a new ObservedObject MBean");
|
|
|
|
ObjectName obsObjName =
|
|
ObjectName.getInstance(domain + ":type=ObservedObject");
|
|
ObservedObject obsObj = new ObservedObject();
|
|
server.registerMBean(obsObj, obsObjName);
|
|
|
|
echo(">>> SET the attributes of the CounterMonitor:");
|
|
|
|
counterMonitor.addObservedObject(obsObjName);
|
|
echo("\tATTRIBUTE \"ObservedObject\" = " + obsObjName);
|
|
|
|
counterMonitor.setObservedAttribute("IntegerAttribute");
|
|
echo("\tATTRIBUTE \"ObservedAttribute\" = IntegerAttribute");
|
|
|
|
counterMonitor.setNotify(true);
|
|
echo("\tATTRIBUTE \"NotifyFlag\" = true");
|
|
|
|
Integer threshold = 2;
|
|
counterMonitor.setInitThreshold(threshold);
|
|
echo("\tATTRIBUTE \"Threshold\" = " + threshold);
|
|
|
|
int granularityperiod = 500;
|
|
counterMonitor.setGranularityPeriod(granularityperiod);
|
|
echo("\tATTRIBUTE \"GranularityPeriod\" = " + granularityperiod);
|
|
|
|
echo(">>> START the CounterMonitor");
|
|
counterMonitor.start();
|
|
|
|
// Check if notification was received
|
|
//
|
|
doWait();
|
|
if (messageReceived) {
|
|
echo("\tOK: CounterMonitor notification received");
|
|
} else {
|
|
echo("\tKO: CounterMonitor notification missed or not emitted");
|
|
return 1;
|
|
}
|
|
} finally {
|
|
if (counterMonitor != null)
|
|
counterMonitor.stop();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Update the gauge and check for notifications
|
|
*/
|
|
public int gaugeMonitorNotification() throws Exception {
|
|
|
|
GaugeMonitor gaugeMonitor = null;
|
|
try {
|
|
MBeanServer server = MBeanServerFactory.newMBeanServer();
|
|
|
|
String domain = server.getDefaultDomain();
|
|
|
|
// Create a new GaugeMonitor MBean and add it to the MBeanServer.
|
|
//
|
|
echo(">>> CREATE a new GaugeMonitor MBean");
|
|
ObjectName gaugeMonitorName = new ObjectName(
|
|
domain + ":type=" + GaugeMonitor.class.getName());
|
|
gaugeMonitor = new GaugeMonitor();
|
|
server.registerMBean(gaugeMonitor, gaugeMonitorName);
|
|
|
|
echo(">>> ADD a listener to the GaugeMonitor");
|
|
gaugeMonitor.addNotificationListener(this, null, null);
|
|
|
|
//
|
|
// MANAGEMENT OF A STANDARD MBEAN
|
|
//
|
|
|
|
echo(">>> CREATE a new ObservedObject MBean");
|
|
|
|
ObjectName obsObjName =
|
|
ObjectName.getInstance(domain + ":type=ObservedObject");
|
|
ObservedObject obsObj = new ObservedObject();
|
|
server.registerMBean(obsObj, obsObjName);
|
|
|
|
echo(">>> SET the attributes of the GaugeMonitor:");
|
|
|
|
gaugeMonitor.addObservedObject(obsObjName);
|
|
echo("\tATTRIBUTE \"ObservedObject\" = " + obsObjName);
|
|
|
|
gaugeMonitor.setObservedAttribute("IntegerAttribute");
|
|
echo("\tATTRIBUTE \"ObservedAttribute\" = IntegerAttribute");
|
|
|
|
gaugeMonitor.setNotifyLow(false);
|
|
gaugeMonitor.setNotifyHigh(true);
|
|
echo("\tATTRIBUTE \"Notify Low Flag\" = false");
|
|
echo("\tATTRIBUTE \"Notify High Flag\" = true");
|
|
|
|
Double highThreshold = 3.0, lowThreshold = 2.5;
|
|
gaugeMonitor.setThresholds(highThreshold, lowThreshold);
|
|
echo("\tATTRIBUTE \"Low Threshold\" = " + lowThreshold);
|
|
echo("\tATTRIBUTE \"High Threshold\" = " + highThreshold);
|
|
|
|
int granularityperiod = 500;
|
|
gaugeMonitor.setGranularityPeriod(granularityperiod);
|
|
echo("\tATTRIBUTE \"GranularityPeriod\" = " + granularityperiod);
|
|
|
|
echo(">>> START the GaugeMonitor");
|
|
gaugeMonitor.start();
|
|
|
|
// Check if notification was received
|
|
//
|
|
doWait();
|
|
if (messageReceived) {
|
|
echo("\tOK: GaugeMonitor notification received");
|
|
} else {
|
|
echo("\tKO: GaugeMonitor notification missed or not emitted");
|
|
return 1;
|
|
}
|
|
} finally {
|
|
if (gaugeMonitor != null)
|
|
gaugeMonitor.stop();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Update the string and check for notifications
|
|
*/
|
|
public int stringMonitorNotification() throws Exception {
|
|
|
|
StringMonitor stringMonitor = null;
|
|
try {
|
|
MBeanServer server = MBeanServerFactory.newMBeanServer();
|
|
|
|
String domain = server.getDefaultDomain();
|
|
|
|
// Create a new StringMonitor MBean and add it to the MBeanServer.
|
|
//
|
|
echo(">>> CREATE a new StringMonitor MBean");
|
|
ObjectName stringMonitorName = new ObjectName(
|
|
domain + ":type=" + StringMonitor.class.getName());
|
|
stringMonitor = new StringMonitor();
|
|
server.registerMBean(stringMonitor, stringMonitorName);
|
|
|
|
echo(">>> ADD a listener to the StringMonitor");
|
|
stringMonitor.addNotificationListener(this, null, null);
|
|
|
|
//
|
|
// MANAGEMENT OF A STANDARD MBEAN
|
|
//
|
|
|
|
echo(">>> CREATE a new ObservedObject MBean");
|
|
|
|
ObjectName obsObjName =
|
|
ObjectName.getInstance(domain + ":type=ObservedObject");
|
|
ObservedObject obsObj = new ObservedObject();
|
|
server.registerMBean(obsObj, obsObjName);
|
|
|
|
echo(">>> SET the attributes of the StringMonitor:");
|
|
|
|
stringMonitor.addObservedObject(obsObjName);
|
|
echo("\tATTRIBUTE \"ObservedObject\" = " + obsObjName);
|
|
|
|
stringMonitor.setObservedAttribute("StringAttribute");
|
|
echo("\tATTRIBUTE \"ObservedAttribute\" = StringAttribute");
|
|
|
|
stringMonitor.setNotifyMatch(true);
|
|
echo("\tATTRIBUTE \"NotifyMatch\" = true");
|
|
|
|
stringMonitor.setNotifyDiffer(false);
|
|
echo("\tATTRIBUTE \"NotifyDiffer\" = false");
|
|
|
|
stringMonitor.setStringToCompare("do_match_now");
|
|
echo("\tATTRIBUTE \"StringToCompare\" = \"do_match_now\"");
|
|
|
|
int granularityperiod = 500;
|
|
stringMonitor.setGranularityPeriod(granularityperiod);
|
|
echo("\tATTRIBUTE \"GranularityPeriod\" = " + granularityperiod);
|
|
|
|
echo(">>> START the StringMonitor");
|
|
stringMonitor.start();
|
|
|
|
// Check if notification was received
|
|
//
|
|
doWait();
|
|
if (messageReceived) {
|
|
echo("\tOK: StringMonitor notification received");
|
|
} else {
|
|
echo("\tKO: StringMonitor notification missed or not emitted");
|
|
return 1;
|
|
}
|
|
} finally {
|
|
if (stringMonitor != null)
|
|
stringMonitor.stop();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Test the monitor notifications.
|
|
*/
|
|
public int monitorNotifications() throws Exception {
|
|
echo(">>> ----------------------------------------");
|
|
messageReceived = false;
|
|
int error = counterMonitorNotification();
|
|
echo(">>> ----------------------------------------");
|
|
messageReceived = false;
|
|
error += gaugeMonitorNotification();
|
|
echo(">>> ----------------------------------------");
|
|
messageReceived = false;
|
|
error += stringMonitorNotification();
|
|
echo(">>> ----------------------------------------");
|
|
return error;
|
|
}
|
|
|
|
/*
|
|
* Print message
|
|
*/
|
|
private static void echo(String message) {
|
|
System.out.println(message);
|
|
}
|
|
|
|
/*
|
|
* Wait messageReceived to be true
|
|
*/
|
|
synchronized void doWait() {
|
|
while (!messageReceived) {
|
|
try {
|
|
wait();
|
|
} catch (InterruptedException e) {
|
|
System.err.println("Got unexpected exception: " + e);
|
|
e.printStackTrace();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Standalone entry point.
|
|
*
|
|
* Run the test and report to stdout.
|
|
*/
|
|
public static void main (String args[]) throws Exception {
|
|
NonComparableAttributeValueTest test = new NonComparableAttributeValueTest();
|
|
int error = test.monitorNotifications();
|
|
if (error > 0) {
|
|
echo(">>> Unhappy Bye, Bye!");
|
|
throw new IllegalStateException("Test FAILED: Didn't get all " +
|
|
"the notifications that were " +
|
|
"expected by the test!");
|
|
} else {
|
|
echo(">>> Happy Bye, Bye!");
|
|
}
|
|
}
|
|
}
|