Path: blob/master/test/jdk/javax/management/mxbean/MiscTest.java
41152 views
/*1* Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/*24* @test25* @bug 6175517 630499626* @summary General MXBean test: createMBean, registerMBean, immutableInfo,27* interfaceClassName, openType, originalType, StandardMBean,28* StandardEmitterMBean.29* @author Luis-Miguel Alventosa30*31* @run clean MiscTest32* @run build MiscTest33* @run main MiscTest34*/3536import java.io.*;37import java.lang.management.*;38import javax.management.*;39import javax.management.openmbean.*;4041public class MiscTest {4243private static final MBeanNotificationInfo notifs[] =44new MBeanNotificationInfo[] {45new MBeanNotificationInfo(46new String[] {AttributeChangeNotification.ATTRIBUTE_CHANGE},47AttributeChangeNotification.class.getName(),48"This notification is emitted when the reset() method is called.")49};5051private static Class<?> testClasses[] = {52Test11.class, Test12.class,53Test21.class, Test22.class,54Test31.class, Test32.class,55Test33.class, Test34.class,56Test41.class, Test42.class,57Test43.class, Test44.class,58};5960private static Class<?> testIntfs[] = {61Test11MBean.class, Test12MBean.class,62Test21MXBean.class, Test22MXBean.class,63Test31SMB.class, Test32SMB.class,64Test33SMB.class, Test34SMB.class,65Test41SMX.class, Test42SMX.class,66Test43SMX.class, Test44SMX.class,67};6869public interface SuperInterface {70public String getState();71public void setState(String s);72public int getNbChanges();73public void reset();74public void close(boolean force);75public MemoryUsage getMemoryUsage();76}7778public static class BaseTest {7980public String getState() {81return state;82}8384public void setState(String s) {85state = s;86nbChanges++;87}8889public int getNbChanges() {90return nbChanges;91}9293public void reset() {94state = "initial state";95nbChanges = 0;96nbResets++;97}9899public String getName() {100return "name";101}102103public void setName(String s) {104}105106public void close(boolean force) {107}108109public MemoryUsage getMemoryUsage() {110return new MemoryUsage(10, 20, 30, 40);111}112113public int getNbResets() {114return nbResets;115}116117private String state = "initial state";118private int nbChanges = 0;119private int nbResets = 0;120}121122public static class BaseEmitterTest123extends NotificationBroadcasterSupport {124125public String getState() {126return state;127}128129public void setState(String s) {130state = s;131nbChanges++;132}133134public int getNbChanges() {135return nbChanges;136}137138public void reset() {139state = "initial state";140nbChanges = 0;141nbResets++;142}143144public String getName() {145return "name";146}147148public void setName(String s) {149}150151public void close(boolean force) {152}153154public MemoryUsage getMemoryUsage() {155return new MemoryUsage(10, 20, 30, 40);156}157158public int getNbResets() {159return nbResets;160}161162public MBeanNotificationInfo[] getNotificationInfo() {163return notifs;164}165166private String state = "initial state";167private int nbChanges = 0;168private int nbResets = 0;169}170171public static interface Test11MBean extends SuperInterface {172}173174public static interface Test12MBean extends SuperInterface {175}176177public static interface Test21MXBean extends SuperInterface {178}179180public static interface Test22MXBean extends SuperInterface {181}182183public static interface Test31SMB extends SuperInterface {184}185186public static interface Test32SMB extends SuperInterface {187}188189public static interface Test33SMB extends SuperInterface {190}191192public static interface Test34SMB extends SuperInterface {193}194195public static interface Test41SMX extends SuperInterface {196}197198public static interface Test42SMX extends SuperInterface {199}200201public static interface Test43SMX extends SuperInterface {202}203204public static interface Test44SMX extends SuperInterface {205}206207public static class Test11 extends BaseTest208implements Test11MBean {209}210211public static class Test12 extends BaseEmitterTest212implements Test12MBean {213}214215public static class Test21 extends BaseTest216implements Test21MXBean {217}218219public static class Test22 extends BaseEmitterTest220implements Test22MXBean {221}222223public static class Test31 extends BaseTest224implements Test31SMB {225}226227public static class Test32 extends BaseEmitterTest228implements Test32SMB {229}230231public static class Test33 extends StandardMBean232implements Test33SMB {233234public Test33() {235super(Test33SMB.class, false);236}237238public String getState() {239return state;240}241242public void setState(String s) {243state = s;244nbChanges++;245}246247public int getNbChanges() {248return nbChanges;249}250251public void reset() {252state = "initial state";253nbChanges = 0;254nbResets++;255}256257public String getName() {258return "name";259}260261public void setName(String s) {262}263264public void close(boolean force) {265}266267public MemoryUsage getMemoryUsage() {268return new MemoryUsage(10, 20, 30, 40);269}270271public int getNbResets() {272return nbResets;273}274275private String state = "initial state";276private int nbChanges = 0;277private int nbResets = 0;278}279280public static class Test34 extends StandardEmitterMBean281implements Test34SMB {282283public Test34() {284super(Test34SMB.class, false,285new NotificationBroadcasterSupport(notifs));286}287288public String getState() {289return state;290}291292public void setState(String s) {293state = s;294nbChanges++;295}296297public int getNbChanges() {298return nbChanges;299}300301public void reset() {302state = "initial state";303nbChanges = 0;304nbResets++;305}306307public String getName() {308return "name";309}310311public void setName(String s) {312}313314public void close(boolean force) {315}316317public MemoryUsage getMemoryUsage() {318return new MemoryUsage(10, 20, 30, 40);319}320321public int getNbResets() {322return nbResets;323}324325private String state = "initial state";326private int nbChanges = 0;327private int nbResets = 0;328}329330public static class Test41 extends BaseTest331implements Test41SMX {332}333334public static class Test42 extends BaseEmitterTest335implements Test42SMX {336}337338public static class Test43 extends StandardMBean339implements Test43SMX {340341public Test43() {342super(Test43SMX.class, true);343}344345public String getState() {346return state;347}348349public void setState(String s) {350state = s;351nbChanges++;352}353354public int getNbChanges() {355return nbChanges;356}357358public void reset() {359state = "initial state";360nbChanges = 0;361nbResets++;362}363364public String getName() {365return "name";366}367368public void setName(String s) {369}370371public void close(boolean force) {372}373374public MemoryUsage getMemoryUsage() {375return new MemoryUsage(10, 20, 30, 40);376}377378public int getNbResets() {379return nbResets;380}381382private String state = "initial state";383private int nbChanges = 0;384private int nbResets = 0;385}386387public static class Test44 extends StandardEmitterMBean388implements Test44SMX {389390public Test44() {391super(Test44SMX.class, true,392new NotificationBroadcasterSupport(notifs));393}394395public String getState() {396return state;397}398399public void setState(String s) {400state = s;401nbChanges++;402}403404public int getNbChanges() {405return nbChanges;406}407408public void reset() {409state = "initial state";410nbChanges = 0;411nbResets++;412}413414public String getName() {415return "name";416}417418public void setName(String s) {419}420421public void close(boolean force) {422}423424public MemoryUsage getMemoryUsage() {425return new MemoryUsage(10, 20, 30, 40);426}427428public int getNbResets() {429return nbResets;430}431432private String state = "initial state";433private int nbChanges = 0;434private int nbResets = 0;435}436437public static void main(String[] args) throws Exception {438// Instantiate the MBean server439//440echo("\n>>> Create the MBean server");441MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();442443// Get default domain444//445echo("\n>>> Get the MBean server's default domain");446String domain = mbs.getDefaultDomain();447echo("\tDefault Domain = " + domain);448449for (int i = 0; i < testClasses.length; i++) {450// Create and register the Test MBean451//452String cn = testClasses[i].getName();453String ons = domain + ":type=" + cn;454echo("\n>>> Create the " + cn +455" MBean within the MBeanServer");456echo("\tObjectName = " + ons);457ObjectName on = ObjectName.getInstance(ons);458if (testClasses[i] == Test31.class ||459testClasses[i] == Test41.class) {460StandardMBean s = new StandardMBean(461testClasses[i].newInstance(),462(Class) testIntfs[i],463testClasses[i] == Test41.class);464mbs.registerMBean(s, on);465} else if (testClasses[i] == Test32.class ||466testClasses[i] == Test42.class) {467Object o = testClasses[i].newInstance();468StandardEmitterMBean s = new StandardEmitterMBean(469o,470(Class) testIntfs[i],471testClasses[i] == Test42.class,472(NotificationEmitter) o);473mbs.registerMBean(s, on);474} else {475mbs.createMBean(cn, on);476}477478// Check notifs479//480MBeanInfo mbi = mbs.getMBeanInfo(on);481MBeanNotificationInfo mbni[] = mbi.getNotifications();482if (i % 2 == 0) {483if (mbni.length != 0) {484throw new IllegalArgumentException(485"Should not be a NotificationEmitter");486}487} else {488if (mbni.length != 1) {489throw new IllegalArgumentException(490"Should not a NotificationEmitter with one notification");491}492}493// Manage the Test MBean494//495manageMBean(mbs, on, cn);496}497}498499private static void manageMBean(MBeanServer mbs,500ObjectName on,501String cn)502throws Exception {503504echo("\n>>> Manage the " + cn +505" MBean using its attributes ");506echo(" and operations exposed for management");507508// Get attribute values509printAttributes(mbs, on);510511// Change State attribute512echo("\n Setting State attribute to value \"new state\"...");513Attribute stateAttribute = new Attribute("State","new state");514mbs.setAttribute(on, stateAttribute);515516// Get attribute values517printAttributes(mbs, on);518519// Invoking reset operation520echo("\n Invoking reset operation...");521mbs.invoke(on, "reset", null, null);522523// Invoking close operation524echo("\n Invoking close operation...");525String type = on.getKeyProperty("type");526String signature[] = {"boolean"};527mbs.invoke(on, "close", new Object[] {true}, signature);528529// Get attribute values530printAttributes(mbs, on);531532// Create proxy533if (type.equals(Test11.class.getName())) {534Test11MBean p = JMX.newMBeanProxy(mbs,535on,536Test11MBean.class);537// Get attribute values538echo("\n Getting attribute values through proxies:");539echo("\tState = \"" + p.getState() + "\"");540echo("\tNbChanges = " + p.getNbChanges());541echo("\tMemoryUsage = " + p.getMemoryUsage());542checkDescriptor(mbs, on, "true", Test11MBean.class.getName());543} else if (type.equals(Test12.class.getName())) {544Test12MBean p = JMX.newMBeanProxy(mbs,545on,546Test12MBean.class,547true);548// Get attribute values549echo("\n Getting attribute values through proxies:");550echo("\tState = \"" + p.getState() + "\"");551echo("\tNbChanges = " + p.getNbChanges());552echo("\tMemoryUsage = " + p.getMemoryUsage());553checkDescriptor(mbs, on, "false", Test12MBean.class.getName());554} else if (type.equals(Test21.class.getName())) {555Test21MXBean p = JMX.newMXBeanProxy(mbs,556on,557Test21MXBean.class);558// Get attribute values559echo("\n Getting attribute values through proxies:");560echo("\tState = \"" + p.getState() + "\"");561echo("\tNbChanges = " + p.getNbChanges());562echo("\tMemoryUsage = " + p.getMemoryUsage());563checkDescriptor(mbs, on, "true", Test21MXBean.class.getName());564} else if (type.equals(Test22.class.getName())) {565Test22MXBean p = JMX.newMXBeanProxy(mbs,566on,567Test22MXBean.class,568true);569// Get attribute values570echo("\n Getting attribute values through proxies:");571echo("\tState = \"" + p.getState() + "\"");572echo("\tNbChanges = " + p.getNbChanges());573echo("\tMemoryUsage = " + p.getMemoryUsage());574checkDescriptor(mbs, on, "true", Test22MXBean.class.getName());575} else if (type.equals(Test31.class.getName())) {576Test31SMB p = JMX.newMBeanProxy(mbs,577on,578Test31SMB.class);579// Get attribute values580echo("\n Getting attribute values through proxies:");581echo("\tState = \"" + p.getState() + "\"");582echo("\tNbChanges = " + p.getNbChanges());583echo("\tMemoryUsage = " + p.getMemoryUsage());584checkDescriptor(mbs, on, "true", Test31SMB.class.getName());585} else if (type.equals(Test32.class.getName())) {586Test32SMB p = JMX.newMBeanProxy(mbs,587on,588Test32SMB.class,589true);590// Get attribute values591echo("\n Getting attribute values through proxies:");592echo("\tState = \"" + p.getState() + "\"");593echo("\tNbChanges = " + p.getNbChanges());594echo("\tMemoryUsage = " + p.getMemoryUsage());595checkDescriptor(mbs, on, "true", Test32SMB.class.getName());596} else if (type.equals(Test33.class.getName())) {597Test33SMB p = JMX.newMBeanProxy(mbs,598on,599Test33SMB.class,600true);601// Get attribute values602echo("\n Getting attribute values through proxies:");603echo("\tState = \"" + p.getState() + "\"");604echo("\tNbChanges = " + p.getNbChanges());605echo("\tMemoryUsage = " + p.getMemoryUsage());606checkDescriptor(mbs, on, "true", Test33SMB.class.getName());607} else if (type.equals(Test34.class.getName())) {608Test34SMB p = JMX.newMBeanProxy(mbs,609on,610Test34SMB.class,611true);612// Get attribute values613echo("\n Getting attribute values through proxies:");614echo("\tState = \"" + p.getState() + "\"");615echo("\tNbChanges = " + p.getNbChanges());616echo("\tMemoryUsage = " + p.getMemoryUsage());617checkDescriptor(mbs, on, "true", Test34SMB.class.getName());618} else if (type.equals(Test41.class.getName())) {619Test41SMX p = JMX.newMXBeanProxy(mbs,620on,621Test41SMX.class);622// Get attribute values623echo("\n Getting attribute values through proxies:");624echo("\tState = \"" + p.getState() + "\"");625echo("\tNbChanges = " + p.getNbChanges());626echo("\tMemoryUsage = " + p.getMemoryUsage());627checkDescriptor(mbs, on, "true", Test41SMX.class.getName());628} else if (type.equals(Test42.class.getName())) {629Test42SMX p = JMX.newMXBeanProxy(mbs,630on,631Test42SMX.class,632true);633// Get attribute values634echo("\n Getting attribute values through proxies:");635echo("\tState = \"" + p.getState() + "\"");636echo("\tNbChanges = " + p.getNbChanges());637echo("\tMemoryUsage = " + p.getMemoryUsage());638checkDescriptor(mbs, on, "true", Test42SMX.class.getName());639} else if (type.equals(Test43.class.getName())) {640Test43SMX p = JMX.newMXBeanProxy(mbs,641on,642Test43SMX.class);643// Get attribute values644echo("\n Getting attribute values through proxies:");645echo("\tState = \"" + p.getState() + "\"");646echo("\tNbChanges = " + p.getNbChanges());647echo("\tMemoryUsage = " + p.getMemoryUsage());648checkDescriptor(mbs, on, "true", Test43SMX.class.getName());649} else if (type.equals(Test44.class.getName())) {650Test44SMX p = JMX.newMXBeanProxy(mbs,651on,652Test44SMX.class,653true);654// Get attribute values655echo("\n Getting attribute values through proxies:");656echo("\tState = \"" + p.getState() + "\"");657echo("\tNbChanges = " + p.getNbChanges());658echo("\tMemoryUsage = " + p.getMemoryUsage());659checkDescriptor(mbs, on, "true", Test44SMX.class.getName());660} else {661throw new IllegalArgumentException("Invalid MBean type");662}663}664665private static void printAttributes(MBeanServer mbs,666ObjectName on)667throws Exception {668echo("\n Getting attribute values:");669String state = (String) mbs.getAttribute(on, "State");670Integer nbChanges = (Integer) mbs.getAttribute(on,"NbChanges");671echo("\tState = \"" + state + "\"");672echo("\tNbChanges = " + nbChanges);673String type = on.getKeyProperty("type");674if (type.indexOf("Test2") != -1 || type.indexOf("Test4") != -1) {675CompositeData memoryUsage =676(CompositeData) mbs.getAttribute(on, "MemoryUsage");677echo("\tMemoryUsage = " + memoryUsage);678} else {679MemoryUsage memoryUsage =680(MemoryUsage) mbs.getAttribute(on, "MemoryUsage");681echo("\tMemoryUsage = " + memoryUsage);682}683}684685public static void checkDescriptor(MBeanServer mbs,686ObjectName on,687String immutable,688String intf)689throws Exception {690691MBeanInfo mbi = mbs.getMBeanInfo(on);692693Descriptor d = mbi.getDescriptor();694if (d == null || d.getFieldNames().length == 0)695throw new IllegalArgumentException("Empty descriptor");696if (!d.getFieldValue("immutableInfo").equals(immutable)) {697final String msg =698"Bad descriptor: expected immutableInfo=" + immutable + ": " + d;699throw new IllegalArgumentException(msg);700}701if (!d.getFieldValue("interfaceClassName").equals(intf)) {702final String msg =703"Bad descriptor: expected interfaceClassName=" + intf + ": " + d;704throw new IllegalArgumentException(msg);705}706707if (intf.indexOf("MX") != -1) {708MBeanAttributeInfo attrs[] = mbi.getAttributes();709if (attrs == null || attrs.length == 0)710throw new IllegalArgumentException("No attributes");711boolean nbChangesFound = false;712for (MBeanAttributeInfo attr : attrs) {713if (attr.getName().equals("NbChanges")) {714nbChangesFound = true;715Descriptor ad = attr.getDescriptor();716OpenType<?> opty = (OpenType<?>)717ad.getFieldValue("openType");718if (!opty.equals(SimpleType.INTEGER)) {719throw new IllegalArgumentException("Open type should " +720"be INTEGER: " + opty);721}722String orty =723(String) ad.getFieldValue("originalType");724if (!orty.equals(Integer.TYPE.getName())) {725throw new IllegalArgumentException("Orig type should " +726"be int: " + orty);727}728}729}730if (!nbChangesFound)731throw new IllegalArgumentException("Did not find NbChanges");732}733}734735private static void echo(String msg) {736System.out.println(msg);737}738}739740741