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 8058865
27  * @summary Checks access to test MXBean
28  * @author Olivier Lagneau
29  * @modules java.management.rmi
30  * @library /lib/testlibrary
31  * @compile Basic.java
32  * @run main/othervm/timeout=300 -DDEBUG_STANDARD MXBeanInteropTest2
33  */
34 
35 import java.util.Iterator;
36 import java.util.Map;
37 import java.util.Set;
38 
39 import javax.management.Attribute;
40 import javax.management.JMX;
41 import javax.management.MBeanAttributeInfo;
42 import javax.management.MBeanConstructorInfo;
43 import javax.management.MBeanServer;
44 import java.lang.management.ManagementFactory;
45 import javax.management.MBeanInfo;
46 import javax.management.MBeanNotificationInfo;
47 import javax.management.MBeanOperationInfo;
48 import javax.management.MBeanServerConnection;
49 import javax.management.ObjectName;
50 import javax.management.remote.JMXConnector;
51 import javax.management.remote.JMXConnectorFactory;
52 import javax.management.remote.JMXConnectorServer;
53 import javax.management.remote.JMXConnectorServerFactory;
54 import javax.management.remote.JMXServiceURL;
55 
56 public class MXBeanInteropTest2 {
57 
58     private static String BASIC_MXBEAN_CLASS_NAME = "Basic";
59 
60     /*
61      * First Debug properties and arguments are collect in expected
62      * map  (argName, value) format, then calls original test's run method.
63      */
main(String args[])64     public static void main(String args[]) throws Exception {
65 
66         System.out.println("=================================================");
67 
68         // Parses parameters
69         Utils.parseDebugProperties();
70         Map<String, Object> map = Utils.parseParameters(args) ;
71 
72         // Run test
73         MXBeanInteropTest2 test = new MXBeanInteropTest2();
74         test.run(map);
75 
76     }
77 
run(Map<String, Object> args)78     public void run(Map<String, Object> args) {
79 
80         System.out.println("MXBeanInteropTest2::run: Start") ;
81         int errorCount = 0 ;
82 
83         try {
84             // JMX MbeanServer used inside single VM as if remote.
85             MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
86 
87             JMXServiceURL url = new JMXServiceURL("rmi", null, 0);
88             JMXConnectorServer cs =
89                 JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
90             cs.start();
91 
92             JMXServiceURL addr = cs.getAddress();
93             JMXConnector cc = JMXConnectorFactory.connect(addr);
94             MBeanServerConnection mbsc = cc.getMBeanServerConnection();
95 
96             // Prints all MBeans whatever the domain is.
97             printMBeans(mbsc) ;
98 
99             // Call test body
100             errorCount += doBasicMXBeanTest(mbsc) ;
101 
102             // Terminate the JMX Client
103             cc.close();
104 
105         } catch(Exception e) {
106             Utils.printThrowable(e, true) ;
107             throw new RuntimeException(e);
108         }
109 
110         if ( errorCount == 0 ) {
111             System.out.println("MXBeanInteropTest2::run: Done without any error") ;
112         } else {
113             System.out.println("MXBeanInteropTest2::run: Done with "
114                     + errorCount
115                     + " error(s)") ;
116             throw new RuntimeException("errorCount = " + errorCount);
117         }
118     }
119 
120 
121     /**
122      * Prints all MBeans whatever the domain is.
123      */
printMBeans(MBeanServerConnection mbsc)124     private static void printMBeans(MBeanServerConnection mbsc) throws Exception {
125         Set<ObjectName> set = mbsc.queryNames(null, null);
126         System.out.println("---- MBeans found :");
127 
128         for (Iterator<ObjectName> iter = set.iterator(); iter.hasNext(); ) {
129             System.out.println(iter.next().toString());
130         }
131 
132         System.out.println("\n") ;
133     }
134 
135 
doBasicMXBeanTest(MBeanServerConnection mbsc)136     private final int doBasicMXBeanTest(MBeanServerConnection mbsc) {
137         int errorCount = 0 ;
138         System.out.println("---- doBasicMXBeanTest") ;
139 
140         try {
141             ObjectName objName =
142                     new ObjectName("sqe:type=BasicMXBean") ;
143             mbsc.createMBean(BASIC_MXBEAN_CLASS_NAME, objName);
144             MBeanInfo mbInfo = mbsc.getMBeanInfo(objName);
145             printMBeanInfo(mbInfo);
146             System.out.println("---- OK\n") ;
147             System.out.println("getMBeanInfo\t\t"
148                     + mbInfo);
149             System.out.println("---- OK\n") ;
150 
151             System.out.println("Check mxbean field in the MBeanInfo");
152             String mxbeanField =
153                     (String)mbInfo.getDescriptor().getFieldValue(JMX.MXBEAN_FIELD);
154 
155             if ( mxbeanField == null || ! mxbeanField.equals("true")) {
156                 System.out.println("---- ERROR : Improper mxbean field value "
157                         + mxbeanField);
158                 errorCount++;
159             }
160             System.out.println("---- OK\n") ;
161 
162             System.out.println("Set attribute ObjectNameAtt");
163             Attribute att = new Attribute("ObjectNameAtt", objName);
164             mbsc.setAttribute(objName, att);
165             ObjectName value =
166                     (ObjectName)mbsc.getAttribute(objName, "ObjectNameAtt");
167 
168             if ( ! value.equals(objName) ) {
169                 errorCount++;
170                 System.out.println("---- ERROR : setAttribute failed, got "
171                         + value
172                         + " while expecting "
173                         + objName);
174             }
175             System.out.println("---- OK\n") ;
176 
177             System.out.println("Call operation doNothing");
178             mbsc.invoke(objName,  "doNothing", null, null);
179             System.out.println("---- OK\n") ;
180 
181             System.out.println("Call operation getWeather");
182             Object weather = mbsc.invoke(objName,
183                     "getWeather",
184                     new Object[]{Boolean.TRUE},
185                     new String[]{"boolean"});
186             System.out.println("Weather is " + weather);
187             System.out.println("---- OK\n") ;
188         } catch (Exception e) {
189             Utils.printThrowable(e, true) ;
190             errorCount++ ;
191             System.out.println("---- ERROR\n") ;
192         }
193 
194         return errorCount ;
195     }
196 
printMBeanInfo(MBeanInfo mbInfo)197     private void printMBeanInfo(MBeanInfo mbInfo) {
198         System.out.println("Description " + mbInfo.getDescription());
199 
200         for (MBeanConstructorInfo ctor : mbInfo.getConstructors()) {
201             System.out.println("Constructor " + ctor.getName());
202         }
203 
204         for (MBeanAttributeInfo att : mbInfo.getAttributes()) {
205             System.out.println("Attribute " + att.getName()
206             + " [" + att.getType() + "]");
207         }
208 
209         for (MBeanOperationInfo oper : mbInfo.getOperations()) {
210             System.out.println("Operation " + oper.getName());
211         }
212 
213         for (MBeanNotificationInfo notif : mbInfo.getNotifications()) {
214             System.out.println("Notification " + notif.getName());
215         }
216     }
217 }
218