package org.jolokia.jmx;
/*
* Copyright 2009-2013 Roland Huss
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.lang.management.ManagementFactory;
import java.util.*;
import javax.management.*;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.testng.Assert;
import org.testng.annotations.*;
import static org.testng.Assert.assertEquals;
/**
* @author roland
* @since 26.01.13
*/
public class JsonDymamicMBeanImplTest {
private JolokiaMBeanServer server;
private MBeanServer platformServer;
private ObjectName testName;
private ObjectName userManagerName;
@BeforeClass
public void setup() {
server = new JolokiaMBeanServer();
platformServer = ManagementFactory.getPlatformMBeanServer();
}
@BeforeMethod
public void registerBeans() throws Exception {
testName = on("test:type=json");
userManagerName = on("test:type=mxbean");
register(testName, new Testing());
register(userManagerName, new UserTestManager());
}
@AfterMethod
public void unregisterBeans() throws Exception {
unregister(testName);
unregister(userManagerName);
}
@Test
public void getAttribute() throws Exception {
assertEquals(platformServer.getAttribute(testName, "Chili"), "jolokia");
String user = (String) platformServer.getAttribute(testName,"User");
JSONObject userJ = (JSONObject) toJSON(user);
assertEquals(userJ.get("firstName"), "Hans");
assertEquals(userJ.get("lastName"), "Kalb");
}
@Test
public void checkMBeanInfo() throws Exception {
MBeanInfo info = platformServer.getMBeanInfo(testName);
MBeanAttributeInfo aInfo[] = info.getAttributes();
Map<String,MBeanAttributeInfo> attributes = new HashMap<String, MBeanAttributeInfo>();
for (MBeanAttributeInfo a : aInfo) {
attributes.put(a.getName(),a);
}
assertEquals(attributes.get("Chili").getType(), String.class.getName());
assertEquals(attributes.get("Numbers").getType(), String.class.getName());
assertEquals(attributes.get("User").getType(), String.class.getName());
MBeanOperationInfo oInfo[] = info.getOperations();
Map<String,MBeanOperationInfo> ops = new HashMap<String, MBeanOperationInfo>();
for (MBeanOperationInfo o : oInfo) {
ops.put(o.getName(), o);
}
assertEquals(ops.get("lookup").getReturnType(), String.class.getName());
assertEquals(ops.get("epoch").getReturnType(), "long");
assertEquals(ops.get("charTest").getReturnType(), "char");
MBeanParameterInfo p[] = ops.get("lookup").getSignature();
assertEquals(p[0].getType(), String.class.getName());
assertEquals(p[1].getType(), String.class.getName());
p = ops.get("epoch").getSignature();
assertEquals(p[0].getType(), String.class.getName());
p = ops.get("charTest").getSignature();
assertEquals(p[0].getType(), Character.class.getName());
}
private Object toJSON(String string) throws ParseException {
return new JSONParser().parse(string);
}
@Test
public void setAttribute() throws Exception {
platformServer.setAttribute(testName,new Attribute("Chili","fatalii"));
assertEquals(platformServer.getAttribute(testName, "Chili"), "fatalii");
platformServer.setAttribute(testName,new Attribute("Numbers","8,15"));
String nums = (String) platformServer.getAttribute(testName,"Numbers");
JSONArray numsJ = (JSONArray) toJSON(nums);
assertEquals(numsJ.get(0), 8L);
assertEquals(numsJ.get(1), 15L);
assertEquals(numsJ.size(), 2);
}
@Test
public void exec() throws Exception {
String res = (String) platformServer.invoke(testName,"lookup",new Object[] { "Bumbes", "Eins, Zwei" }, new String[] { "java.lang.String", "java.lang.String" });
JSONObject user = (JSONObject) toJSON(res);
assertEquals(user.get("firstName"), "Hans");
assertEquals(user.get("lastName"), "Kalb");
Date date = new Date();
long millis = (Long) platformServer.invoke(testName,"epoch", new Object[] { date.getTime() + "" }, new String[] { "java.lang.String"});
assertEquals(date.getTime(), millis);
char c = (Character) platformServer.invoke(testName,"charTest", new Object[] { 'y' }, new String[] { Character.class.getName() });
assertEquals(c, 'y');
}
@Test
public void setGetAttributes() throws Exception {
AttributeList attrList = new AttributeList(Arrays.asList(
new Attribute("Chili","aji"),
new Attribute("Numbers","16,11,68")));
platformServer.setAttributes(testName,attrList);
AttributeList ret = platformServer.getAttributes(testName,new String[] { "Chili", "Numbers" });
Attribute chili = (Attribute) ret.get(0);
Attribute num = (Attribute) ret.get(1);
assertEquals(chili.getValue(), "aji");
JSONArray numsJ = (JSONArray) toJSON((String) num.getValue());
assertEquals(numsJ.get(0), 16L);
assertEquals(numsJ.get(1), 11L);
assertEquals(numsJ.get(2), 68L);
assertEquals(numsJ.size(), 3);
Assert.assertTrue(platformServer.getAttributes(testName, new String[0]).size() == 0);
}
@Test(expectedExceptions = RuntimeMBeanException.class, expectedExceptionsMessageRegExp = ".*convert.*")
public void unconvertableArgument() throws AttributeNotFoundException, MBeanException, ReflectionException, InstanceNotFoundException, InvalidAttributeValueException {
User other = new User("Max","Morlock");
platformServer.setAttribute(testName, new Attribute("User", other.toJSONString()));
}
@Test
public void openMBean() throws AttributeNotFoundException, MBeanException, ReflectionException, InstanceNotFoundException, InvalidAttributeValueException, ParseException {
platformServer.setAttribute(userManagerName,new Attribute("User","{\"firstName\": \"Bumbes\", \"lastName\": \"Schmidt\"}"));
String user = (String) platformServer.getAttribute(userManagerName,"User");
JSONObject userJ = (JSONObject) toJSON(user);
assertEquals(userJ.get("firstName"), "Bumbes");
assertEquals(userJ.get("lastName"), "Schmidt");
user = (String) platformServer.invoke(userManagerName,"lookup",
new Object[] {
"Schmidt",
"[{\"firstName\": \"Mama\", \"lastName\": \"Schmidt\"}," +
"{\"firstName\": \"Papa\", \"lastName\": \"Schmidt\"}]"},
new String[] { String.class.getName(), String.class.getName() });
userJ = (JSONObject) toJSON(user);
assertEquals(userJ.get("firstName"), "Bumbes");
assertEquals(userJ.get("lastName"), "Schmidt");
}
@AfterClass
public void teardown() {
}
private ObjectName on(String name) throws MalformedObjectNameException {
return new ObjectName(name);
}
private JsonDynamicMBeanImpl register(ObjectName oName, Object bean) throws Exception {
server.registerMBean(bean, oName);
JsonDynamicMBeanImpl jsonMBean = new JsonDynamicMBeanImpl(server,oName,server.getMBeanInfo(oName),null);
platformServer.registerMBean(jsonMBean,oName);
return jsonMBean;
}
private void unregister(ObjectName oName) throws Exception {
server.unregisterMBean(oName);
platformServer.unregisterMBean(oName);
}
// ===============================================================================
// Test MBean
public interface UserTestManagerMXBean {
public void setUser(User user);
public User getUser();
public User lookup(String name, User[] parents);
}
public class UserTestManager implements UserTestManagerMXBean {
User user = new User("Hans", "Kalb");
public void setUser(User user) {
this.user = user;
}
public User getUser() {
return user;
}
public User lookup(String name, User[] parents) {
return user;
}
}
public interface TestingMBean {
public String getChili();
public void setChili(String name);
public int[] getNumbers();
public void setNumbers(int[] numbers);
public User getUser();
public User lookup(String name, String[] parents);
public long epoch(Date date);
public char charTest(Character c);
}
public static class User {
private String firstName, lastName;
public User() {
}
public User(String pFirstName, String pLastName) {
firstName = pFirstName;
lastName = pLastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public void setFirstName(String pFirstName) {
firstName = pFirstName;
}
public void setLastName(String pLastName) {
lastName = pLastName;
}
public String toJSONString() {
return "{\"firstName\": \"" + firstName + "\", \"lastName\" : \"" + lastName + "\"}";
}
}
public static class Testing implements TestingMBean {
String chili = "jolokia";
int[] numbers = new int[] { 47, 11};
User user = new User("Hans", "Kalb");
public String getChili() {
return chili;
}
public void setChili(String name) {
chili = name;
}
public int[] getNumbers() {
return numbers;
}
public void setNumbers(int[] numbers) {
this.numbers = numbers;
}
public User lookup(String name, String[] parents) {
return user;
}
public long epoch(Date date) {
return date.getTime();
}
public char charTest(Character c) {
return c;
}
public User getUser() {
return user;
}
}
}