package org.jolokia.handler;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import javax.management.*;
import javax.management.openmbean.CompositeData;
import org.jolokia.backend.executor.NotChangedException;
import org.jolokia.converter.*;
import org.jolokia.request.JmxExecRequest;
import org.jolokia.request.JmxRequestBuilder;
import org.jolokia.restrictor.AllowAllRestrictor;
import org.testng.annotations.*;
import static org.jolokia.util.RequestType.EXEC;
import static org.testng.Assert.*;
/*
* Copyright 2009-2011 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.
*/
public class OpenExecHandlerTest {
private ExecHandler handler;
private ObjectName oName;
@BeforeMethod
public void createHandler() throws MalformedObjectNameException {
handler = new ExecHandler(new AllowAllRestrictor(),new Converters());
}
@BeforeTest
public void registerMBean() throws MalformedObjectNameException, MBeanException, InstanceAlreadyExistsException, IOException, NotCompliantMBeanException, ReflectionException {
oName = new ObjectName("jolokia:test=openExec");
MBeanServerConnection conn = getMBeanServer();
conn.createMBean(OpenExecData.class.getName(),oName);
}
@AfterTest
public void unregisterMBean() throws InstanceNotFoundException, MBeanRegistrationException, IOException {
MBeanServerConnection conn = getMBeanServer();
conn.unregisterMBean(oName);
}
/**
* If a field in the argument is not set it will be set to its default value
*/
@Test
public void missingField() throws InstanceNotFoundException, IOException, ReflectionException, AttributeNotFoundException, MBeanException, MalformedObjectNameException, NotChangedException {
// set a value just for stringField, leave out intField
JmxExecRequest request = new JmxRequestBuilder(EXEC, oName).
operation("compositeData").
arguments("{ \"stringField\":\"aString\" }").
build();
CompositeData data = (CompositeData) handler.handleRequest(getMBeanServer(),request);
assertEquals(data.get("stringField"),"aString");
assertNull(data.get("map"));
assertEquals(data.get("intField"), 0);
}
/**
* set a non-existing field
*/
@Test(expectedExceptions={IllegalArgumentException.class})
public void invalidField() throws MalformedObjectNameException, InstanceNotFoundException, AttributeNotFoundException, ReflectionException, MBeanException, IOException, NotChangedException {
// set a value just for stringField, leave out intField
JmxExecRequest request = new JmxRequestBuilder(EXEC, oName).
operation("compositeData").
arguments("{ \"nonExistentField\":\"aString\" }").
build();
handler.handleRequest(getMBeanServer(),request);
}
/**
* Give an invalid value (wrong type) for the field
*/
@Test(expectedExceptions={ NumberFormatException.class })
public void invalidValueForField() throws MalformedObjectNameException, InstanceNotFoundException, AttributeNotFoundException, ReflectionException, MBeanException, IOException, NotChangedException {
JmxExecRequest request = new JmxRequestBuilder(EXEC, oName).
operation("compositeData").
arguments("{ \"intField\":\"aString\" }").
build();
handler.handleRequest(getMBeanServer(),request);
}
/**
* The operation argument is an array
*/
@Test
public void arrayOfComposites() throws InstanceNotFoundException, IOException, ReflectionException, AttributeNotFoundException, MBeanException, MalformedObjectNameException, NotChangedException {
JmxExecRequest request = new JmxRequestBuilder(EXEC, oName).
operation("arrayData").
arguments("[ { \"stringField\":\"aString\" } ]").
build();
handler.handleRequest(getMBeanServer(),request);
}
/**
* The operation argument is a List
*/
@Test
public void listOfComposites() throws InstanceNotFoundException, IOException, ReflectionException, AttributeNotFoundException, MBeanException, MalformedObjectNameException, NotChangedException {
JmxExecRequest request = new JmxRequestBuilder(EXEC, oName).
operation("listData").
arguments("[ { \"stringField\":\"aString\" } ]").
build();
handler.handleRequest(getMBeanServer(),request);
}
/**
* The operation argument is a Set
*/
@Test
public void setOfComposites() throws InstanceNotFoundException, IOException, ReflectionException, AttributeNotFoundException, MBeanException, MalformedObjectNameException, NotChangedException {
JmxExecRequest request = new JmxRequestBuilder(EXEC, oName).
operation("opSetData").
arguments("[ { \"stringField\":\"aString\" } ]").
build();
handler.handleRequest(getMBeanServer(),request);
}
/**
* The operation argument is a Map
*/
@Test
public void mapOfComposites() throws InstanceNotFoundException, IOException, ReflectionException, AttributeNotFoundException, MBeanException, MalformedObjectNameException, NotChangedException {
JmxExecRequest request = new JmxRequestBuilder(EXEC, oName).
operation("mapData").
arguments("{ \"aKey\":{ \"stringField\":\"aString\" } }").
build();
handler.handleRequest(getMBeanServer(),request);
}
/**
* Set a nested field inside the composite argument
*/
@Test
public void nested() throws MalformedObjectNameException, InstanceNotFoundException, AttributeNotFoundException, ReflectionException, MBeanException, IOException, NotChangedException {
JmxExecRequest request = new JmxRequestBuilder(EXEC, oName).
operation("compositeData").
arguments("{ \"nestedClass\":{\"nestedField\":\"aString\"} }").
build();
handler.handleRequest(getMBeanServer(),request);
}
/**
* Set an array field inside the composite argument
*/
@Test
public void compositeWithArrayField() throws MalformedObjectNameException, InstanceNotFoundException, AttributeNotFoundException, ReflectionException, MBeanException, IOException, NotChangedException {
JmxExecRequest request = new JmxRequestBuilder(EXEC, oName).
operation("compositeData").
arguments("{ \"array\":[\"one\", \"two\"] }").
build();
handler.handleRequest(getMBeanServer(),request);
}
/**
* Set a List field inside the composite argument with values that can't be converted to
* the list element type
*/
@Test(expectedExceptions={NumberFormatException.class})
public void invalidTypeCompositeWithListField() throws MalformedObjectNameException, InstanceNotFoundException, AttributeNotFoundException, ReflectionException, MBeanException, IOException, NotChangedException {
JmxExecRequest request = new JmxRequestBuilder(EXEC, oName).
operation("compositeData").
arguments("{ \"list\":[\"one\", \"two\"] }").
build();
handler.handleRequest(getMBeanServer(),request);
}
/**
* Set a List field inside the composite argument
*/
@Test
public void compositeWithListField() throws MalformedObjectNameException, InstanceNotFoundException, AttributeNotFoundException, ReflectionException, MBeanException, IOException, NotChangedException {
JmxExecRequest request = new JmxRequestBuilder(EXEC, oName).
operation("compositeData").
arguments("{ \"list\":[\"1\", \"2\"] }").
build();
handler.handleRequest(getMBeanServer(),request);
}
/**
* Set a Map field inside the composite argument
*/
@Test
public void compositeWithMapField() throws MalformedObjectNameException, InstanceNotFoundException, AttributeNotFoundException, ReflectionException, MBeanException, IOException, NotChangedException {
JmxExecRequest request = new JmxRequestBuilder(EXEC, oName).
operation("compositeData").
arguments("{ \"map\":{ \"5\":{\"nestedField\":\"value1\"}, \"7\":{\"nestedField\":\"value2\"} } }").
build();
handler.handleRequest(getMBeanServer(),request);
}
/**
* Set a Set field inside the composite argument
*/
@Test
public void compositeWithSetField() throws MalformedObjectNameException, InstanceNotFoundException, AttributeNotFoundException, ReflectionException, MBeanException, IOException, NotChangedException {
JmxExecRequest request = new JmxRequestBuilder(EXEC, oName).
operation("compositeData").
arguments("{ \"set\": [\"value1\",\"value2\"] }").
build();
handler.handleRequest(getMBeanServer(),request);
}
@Test
public void overloaded() throws MalformedObjectNameException, InstanceNotFoundException, AttributeNotFoundException, ReflectionException, MBeanException, IOException, NotChangedException {
JmxExecRequest request = new JmxRequestBuilder(EXEC, oName).
operation("overloaded(javax.management.openmbean.CompositeData)").
arguments("{ \"stringField\": \"aString\" }").
build();
handler.handleRequest(getMBeanServer(),request);
}
private MBeanServerConnection getMBeanServer() {
return ManagementFactory.getPlatformMBeanServer();
}
}