Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/test/javax/management/mxbean/MiscTest.java
38840 views
/*1* Copyright (c) 2005, 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* @run clean MiscTest31* @run build MiscTest32* @run main MiscTest33*/3435import java.io.*;36import java.lang.management.*;37import javax.management.*;38import javax.management.openmbean.*;3940public class MiscTest {4142private static final MBeanNotificationInfo notifs[] =43new MBeanNotificationInfo[] {44new MBeanNotificationInfo(45new String[] {AttributeChangeNotification.ATTRIBUTE_CHANGE},46AttributeChangeNotification.class.getName(),47"This notification is emitted when the reset() method is called.")48};4950private static Class<?> testClasses[] = {51Test11.class, Test12.class,52Test21.class, Test22.class,53Test31.class, Test32.class,54Test33.class, Test34.class,55Test41.class, Test42.class,56Test43.class, Test44.class,57};5859private static Class<?> testIntfs[] = {60Test11MBean.class, Test12MBean.class,61Test21MXBean.class, Test22MXBean.class,62Test31SMB.class, Test32SMB.class,63Test33SMB.class, Test34SMB.class,64Test41SMX.class, Test42SMX.class,65Test43SMX.class, Test44SMX.class,66};6768public interface SuperInterface {69public String getState();70public void setState(String s);71public int getNbChanges();72public void reset();73public void close(boolean force);74public MemoryUsage getMemoryUsage();75}7677public static class BaseTest {7879public String getState() {80return state;81}8283public void setState(String s) {84state = s;85nbChanges++;86}8788public int getNbChanges() {89return nbChanges;90}9192public void reset() {93state = "initial state";94nbChanges = 0;95nbResets++;96}9798public String getName() {99return "name";100}101102public void setName(String s) {103}104105public void close(boolean force) {106}107108public MemoryUsage getMemoryUsage() {109return new MemoryUsage(10, 20, 30, 40);110}111112public int getNbResets() {113return nbResets;114}115116private String state = "initial state";117private int nbChanges = 0;118private int nbResets = 0;119}120121public static class BaseEmitterTest122extends NotificationBroadcasterSupport {123124public String getState() {125return state;126}127128public void setState(String s) {129state = s;130nbChanges++;131}132133public int getNbChanges() {134return nbChanges;135}136137public void reset() {138state = "initial state";139nbChanges = 0;140nbResets++;141}142143public String getName() {144return "name";145}146147public void setName(String s) {148}149150public void close(boolean force) {151}152153public MemoryUsage getMemoryUsage() {154return new MemoryUsage(10, 20, 30, 40);155}156157public int getNbResets() {158return nbResets;159}160161public MBeanNotificationInfo[] getNotificationInfo() {162return notifs;163}164165private String state = "initial state";166private int nbChanges = 0;167private int nbResets = 0;168}169170public static interface Test11MBean extends SuperInterface {171}172173public static interface Test12MBean extends SuperInterface {174}175176public static interface Test21MXBean extends SuperInterface {177}178179public static interface Test22MXBean extends SuperInterface {180}181182public static interface Test31SMB extends SuperInterface {183}184185public static interface Test32SMB extends SuperInterface {186}187188public static interface Test33SMB extends SuperInterface {189}190191public static interface Test34SMB extends SuperInterface {192}193194public static interface Test41SMX extends SuperInterface {195}196197public static interface Test42SMX extends SuperInterface {198}199200public static interface Test43SMX extends SuperInterface {201}202203public static interface Test44SMX extends SuperInterface {204}205206public static class Test11 extends BaseTest207implements Test11MBean {208}209210public static class Test12 extends BaseEmitterTest211implements Test12MBean {212}213214public static class Test21 extends BaseTest215implements Test21MXBean {216}217218public static class Test22 extends BaseEmitterTest219implements Test22MXBean {220}221222public static class Test31 extends BaseTest223implements Test31SMB {224}225226public static class Test32 extends BaseEmitterTest227implements Test32SMB {228}229230public static class Test33 extends StandardMBean231implements Test33SMB {232233public Test33() {234super(Test33SMB.class, false);235}236237public String getState() {238return state;239}240241public void setState(String s) {242state = s;243nbChanges++;244}245246public int getNbChanges() {247return nbChanges;248}249250public void reset() {251state = "initial state";252nbChanges = 0;253nbResets++;254}255256public String getName() {257return "name";258}259260public void setName(String s) {261}262263public void close(boolean force) {264}265266public MemoryUsage getMemoryUsage() {267return new MemoryUsage(10, 20, 30, 40);268}269270public int getNbResets() {271return nbResets;272}273274private String state = "initial state";275private int nbChanges = 0;276private int nbResets = 0;277}278279public static class Test34 extends StandardEmitterMBean280implements Test34SMB {281282public Test34() {283super(Test34SMB.class, false,284new NotificationBroadcasterSupport(notifs));285}286287public String getState() {288return state;289}290291public void setState(String s) {292state = s;293nbChanges++;294}295296public int getNbChanges() {297return nbChanges;298}299300public void reset() {301state = "initial state";302nbChanges = 0;303nbResets++;304}305306public String getName() {307return "name";308}309310public void setName(String s) {311}312313public void close(boolean force) {314}315316public MemoryUsage getMemoryUsage() {317return new MemoryUsage(10, 20, 30, 40);318}319320public int getNbResets() {321return nbResets;322}323324private String state = "initial state";325private int nbChanges = 0;326private int nbResets = 0;327}328329public static class Test41 extends BaseTest330implements Test41SMX {331}332333public static class Test42 extends BaseEmitterTest334implements Test42SMX {335}336337public static class Test43 extends StandardMBean338implements Test43SMX {339340public Test43() {341super(Test43SMX.class, true);342}343344public String getState() {345return state;346}347348public void setState(String s) {349state = s;350nbChanges++;351}352353public int getNbChanges() {354return nbChanges;355}356357public void reset() {358state = "initial state";359nbChanges = 0;360nbResets++;361}362363public String getName() {364return "name";365}366367public void setName(String s) {368}369370public void close(boolean force) {371}372373public MemoryUsage getMemoryUsage() {374return new MemoryUsage(10, 20, 30, 40);375}376377public int getNbResets() {378return nbResets;379}380381private String state = "initial state";382private int nbChanges = 0;383private int nbResets = 0;384}385386public static class Test44 extends StandardEmitterMBean387implements Test44SMX {388389public Test44() {390super(Test44SMX.class, true,391new NotificationBroadcasterSupport(notifs));392}393394public String getState() {395return state;396}397398public void setState(String s) {399state = s;400nbChanges++;401}402403public int getNbChanges() {404return nbChanges;405}406407public void reset() {408state = "initial state";409nbChanges = 0;410nbResets++;411}412413public String getName() {414return "name";415}416417public void setName(String s) {418}419420public void close(boolean force) {421}422423public MemoryUsage getMemoryUsage() {424return new MemoryUsage(10, 20, 30, 40);425}426427public int getNbResets() {428return nbResets;429}430431private String state = "initial state";432private int nbChanges = 0;433private int nbResets = 0;434}435436public static void main(String[] args) throws Exception {437// Instantiate the MBean server438//439echo("\n>>> Create the MBean server");440MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();441442// Get default domain443//444echo("\n>>> Get the MBean server's default domain");445String domain = mbs.getDefaultDomain();446echo("\tDefault Domain = " + domain);447448for (int i = 0; i < testClasses.length; i++) {449// Create and register the Test MBean450//451String cn = testClasses[i].getName();452String ons = domain + ":type=" + cn;453echo("\n>>> Create the " + cn +454" MBean within the MBeanServer");455echo("\tObjectName = " + ons);456ObjectName on = ObjectName.getInstance(ons);457if (testClasses[i] == Test31.class ||458testClasses[i] == Test41.class) {459StandardMBean s = new StandardMBean(460testClasses[i].newInstance(),461(Class) testIntfs[i],462testClasses[i] == Test41.class);463mbs.registerMBean(s, on);464} else if (testClasses[i] == Test32.class ||465testClasses[i] == Test42.class) {466Object o = testClasses[i].newInstance();467StandardEmitterMBean s = new StandardEmitterMBean(468o,469(Class) testIntfs[i],470testClasses[i] == Test42.class,471(NotificationEmitter) o);472mbs.registerMBean(s, on);473} else {474mbs.createMBean(cn, on);475}476477// Check notifs478//479MBeanInfo mbi = mbs.getMBeanInfo(on);480MBeanNotificationInfo mbni[] = mbi.getNotifications();481if (i % 2 == 0) {482if (mbni.length != 0) {483throw new IllegalArgumentException(484"Should not be a NotificationEmitter");485}486} else {487if (mbni.length != 1) {488throw new IllegalArgumentException(489"Should not a NotificationEmitter with one notification");490}491}492// Manage the Test MBean493//494manageMBean(mbs, on, cn);495}496}497498private static void manageMBean(MBeanServer mbs,499ObjectName on,500String cn)501throws Exception {502503echo("\n>>> Manage the " + cn +504" MBean using its attributes ");505echo(" and operations exposed for management");506507// Get attribute values508printAttributes(mbs, on);509510// Change State attribute511echo("\n Setting State attribute to value \"new state\"...");512Attribute stateAttribute = new Attribute("State","new state");513mbs.setAttribute(on, stateAttribute);514515// Get attribute values516printAttributes(mbs, on);517518// Invoking reset operation519echo("\n Invoking reset operation...");520mbs.invoke(on, "reset", null, null);521522// Invoking close operation523echo("\n Invoking close operation...");524String type = on.getKeyProperty("type");525String signature[] = {"boolean"};526mbs.invoke(on, "close", new Object[] {true}, signature);527528// Get attribute values529printAttributes(mbs, on);530531// Create proxy532if (type.equals(Test11.class.getName())) {533Test11MBean p = JMX.newMBeanProxy(mbs,534on,535Test11MBean.class);536// Get attribute values537echo("\n Getting attribute values through proxies:");538echo("\tState = \"" + p.getState() + "\"");539echo("\tNbChanges = " + p.getNbChanges());540echo("\tMemoryUsage = " + p.getMemoryUsage());541checkDescriptor(mbs, on, "true", Test11MBean.class.getName());542} else if (type.equals(Test12.class.getName())) {543Test12MBean p = JMX.newMBeanProxy(mbs,544on,545Test12MBean.class,546true);547// Get attribute values548echo("\n Getting attribute values through proxies:");549echo("\tState = \"" + p.getState() + "\"");550echo("\tNbChanges = " + p.getNbChanges());551echo("\tMemoryUsage = " + p.getMemoryUsage());552checkDescriptor(mbs, on, "false", Test12MBean.class.getName());553} else if (type.equals(Test21.class.getName())) {554Test21MXBean p = JMX.newMXBeanProxy(mbs,555on,556Test21MXBean.class);557// Get attribute values558echo("\n Getting attribute values through proxies:");559echo("\tState = \"" + p.getState() + "\"");560echo("\tNbChanges = " + p.getNbChanges());561echo("\tMemoryUsage = " + p.getMemoryUsage());562checkDescriptor(mbs, on, "true", Test21MXBean.class.getName());563} else if (type.equals(Test22.class.getName())) {564Test22MXBean p = JMX.newMXBeanProxy(mbs,565on,566Test22MXBean.class,567true);568// Get attribute values569echo("\n Getting attribute values through proxies:");570echo("\tState = \"" + p.getState() + "\"");571echo("\tNbChanges = " + p.getNbChanges());572echo("\tMemoryUsage = " + p.getMemoryUsage());573checkDescriptor(mbs, on, "true", Test22MXBean.class.getName());574} else if (type.equals(Test31.class.getName())) {575Test31SMB p = JMX.newMBeanProxy(mbs,576on,577Test31SMB.class);578// Get attribute values579echo("\n Getting attribute values through proxies:");580echo("\tState = \"" + p.getState() + "\"");581echo("\tNbChanges = " + p.getNbChanges());582echo("\tMemoryUsage = " + p.getMemoryUsage());583checkDescriptor(mbs, on, "true", Test31SMB.class.getName());584} else if (type.equals(Test32.class.getName())) {585Test32SMB p = JMX.newMBeanProxy(mbs,586on,587Test32SMB.class,588true);589// Get attribute values590echo("\n Getting attribute values through proxies:");591echo("\tState = \"" + p.getState() + "\"");592echo("\tNbChanges = " + p.getNbChanges());593echo("\tMemoryUsage = " + p.getMemoryUsage());594checkDescriptor(mbs, on, "true", Test32SMB.class.getName());595} else if (type.equals(Test33.class.getName())) {596Test33SMB p = JMX.newMBeanProxy(mbs,597on,598Test33SMB.class,599true);600// Get attribute values601echo("\n Getting attribute values through proxies:");602echo("\tState = \"" + p.getState() + "\"");603echo("\tNbChanges = " + p.getNbChanges());604echo("\tMemoryUsage = " + p.getMemoryUsage());605checkDescriptor(mbs, on, "true", Test33SMB.class.getName());606} else if (type.equals(Test34.class.getName())) {607Test34SMB p = JMX.newMBeanProxy(mbs,608on,609Test34SMB.class,610true);611// Get attribute values612echo("\n Getting attribute values through proxies:");613echo("\tState = \"" + p.getState() + "\"");614echo("\tNbChanges = " + p.getNbChanges());615echo("\tMemoryUsage = " + p.getMemoryUsage());616checkDescriptor(mbs, on, "true", Test34SMB.class.getName());617} else if (type.equals(Test41.class.getName())) {618Test41SMX p = JMX.newMXBeanProxy(mbs,619on,620Test41SMX.class);621// Get attribute values622echo("\n Getting attribute values through proxies:");623echo("\tState = \"" + p.getState() + "\"");624echo("\tNbChanges = " + p.getNbChanges());625echo("\tMemoryUsage = " + p.getMemoryUsage());626checkDescriptor(mbs, on, "true", Test41SMX.class.getName());627} else if (type.equals(Test42.class.getName())) {628Test42SMX p = JMX.newMXBeanProxy(mbs,629on,630Test42SMX.class,631true);632// Get attribute values633echo("\n Getting attribute values through proxies:");634echo("\tState = \"" + p.getState() + "\"");635echo("\tNbChanges = " + p.getNbChanges());636echo("\tMemoryUsage = " + p.getMemoryUsage());637checkDescriptor(mbs, on, "true", Test42SMX.class.getName());638} else if (type.equals(Test43.class.getName())) {639Test43SMX p = JMX.newMXBeanProxy(mbs,640on,641Test43SMX.class);642// Get attribute values643echo("\n Getting attribute values through proxies:");644echo("\tState = \"" + p.getState() + "\"");645echo("\tNbChanges = " + p.getNbChanges());646echo("\tMemoryUsage = " + p.getMemoryUsage());647checkDescriptor(mbs, on, "true", Test43SMX.class.getName());648} else if (type.equals(Test44.class.getName())) {649Test44SMX p = JMX.newMXBeanProxy(mbs,650on,651Test44SMX.class,652true);653// Get attribute values654echo("\n Getting attribute values through proxies:");655echo("\tState = \"" + p.getState() + "\"");656echo("\tNbChanges = " + p.getNbChanges());657echo("\tMemoryUsage = " + p.getMemoryUsage());658checkDescriptor(mbs, on, "true", Test44SMX.class.getName());659} else {660throw new IllegalArgumentException("Invalid MBean type");661}662}663664private static void printAttributes(MBeanServer mbs,665ObjectName on)666throws Exception {667echo("\n Getting attribute values:");668String state = (String) mbs.getAttribute(on, "State");669Integer nbChanges = (Integer) mbs.getAttribute(on,"NbChanges");670echo("\tState = \"" + state + "\"");671echo("\tNbChanges = " + nbChanges);672String type = on.getKeyProperty("type");673if (type.indexOf("Test2") != -1 || type.indexOf("Test4") != -1) {674CompositeData memoryUsage =675(CompositeData) mbs.getAttribute(on, "MemoryUsage");676echo("\tMemoryUsage = " + memoryUsage);677} else {678MemoryUsage memoryUsage =679(MemoryUsage) mbs.getAttribute(on, "MemoryUsage");680echo("\tMemoryUsage = " + memoryUsage);681}682}683684public static void checkDescriptor(MBeanServer mbs,685ObjectName on,686String immutable,687String intf)688throws Exception {689690MBeanInfo mbi = mbs.getMBeanInfo(on);691692Descriptor d = mbi.getDescriptor();693if (d == null || d.getFieldNames().length == 0)694throw new IllegalArgumentException("Empty descriptor");695if (!d.getFieldValue("immutableInfo").equals(immutable)) {696final String msg =697"Bad descriptor: expected immutableInfo=" + immutable + ": " + d;698throw new IllegalArgumentException(msg);699}700if (!d.getFieldValue("interfaceClassName").equals(intf)) {701final String msg =702"Bad descriptor: expected interfaceClassName=" + intf + ": " + d;703throw new IllegalArgumentException(msg);704}705706if (intf.indexOf("MX") != -1) {707MBeanAttributeInfo attrs[] = mbi.getAttributes();708if (attrs == null || attrs.length == 0)709throw new IllegalArgumentException("No attributes");710boolean nbChangesFound = false;711for (MBeanAttributeInfo attr : attrs) {712if (attr.getName().equals("NbChanges")) {713nbChangesFound = true;714Descriptor ad = attr.getDescriptor();715OpenType<?> opty = (OpenType<?>)716ad.getFieldValue("openType");717if (!opty.equals(SimpleType.INTEGER)) {718throw new IllegalArgumentException("Open type should " +719"be INTEGER: " + opty);720}721String orty =722(String) ad.getFieldValue("originalType");723if (!orty.equals(Integer.TYPE.getName())) {724throw new IllegalArgumentException("Orig type should " +725"be int: " + orty);726}727}728}729if (!nbChangesFound)730throw new IllegalArgumentException("Did not find NbChanges");731}732}733734private static void echo(String msg) {735System.out.println(msg);736}737}738739740