package org.jolokia.request;
/*
* 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.util.*;
import org.jolokia.config.*;
import org.jolokia.util.HttpMethod;
import org.jolokia.util.RequestType;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import static org.jolokia.request.JmxRequestBuilder.createMap;
import static org.testng.Assert.assertEquals;
/**
* @author roland
* @since 16.03.11
*/
public class JmxRequestFactoryTest {
private ProcessingParameters procParams;
@BeforeTest
public void setup() {
procParams = new Configuration().getProcessingParameters(new HashMap<String, String>());
}
@Test
public void simpleGet() {
JmxReadRequest req = JmxRequestFactory.createGetRequest("read/java.lang:type=Memory/HeapMemoryUsage", procParams);
assert req.getType() == RequestType.READ : "Type is read";
assert req.getObjectName().getCanonicalName().equals("java.lang:type=Memory") : "Name properly parsed";
assertEquals(req.getAttributeName(),"HeapMemoryUsage","Attribute parsed properly");
assert req.getPathParts() == null : "PathParts are null";
assert req.getPath() == null : "Path is null";
}
@Test
public void simplePost() {
Map<String,Object> reqMap = createMap(
"type","read",
"mbean","java.lang:type=Memory",
"attribute","HeapMemoryUsage");
JmxReadRequest req = JmxRequestFactory.createPostRequest(reqMap, procParams);
assert req.getType() == RequestType.READ : "Type is read";
assert req.getObjectName().getCanonicalName().equals("java.lang:type=Memory") : "Name properly parsed";
assertEquals(req.getAttributeName(),"HeapMemoryUsage","Attribute parsed properly");
assert req.getPathParts() == null : "PathParts are null";
assert req.getPath() == null : "Path is null";
}
@Test
public void simplePostWithPath() {
Map<String,Object> reqMap = createMap(
"type","read",
"mbean","java.lang:type=Memory",
"attribute","HeapMemoryUsage",
"path","blub!/bla/hello");
JmxReadRequest req = JmxRequestFactory.createPostRequest(reqMap, procParams);
List<String> path = req.getPathParts();
assertEquals(path.size(),2);
assertEquals(path.get(0),"blub/bla");
assertEquals(path.get(1),"hello");
assertEquals(req.getPath(),"blub!/bla/hello");
}
@Test(expectedExceptions = { IllegalArgumentException.class })
public void simplePostWithMalformedObjectName() {
JmxRequestFactory.createPostRequest(createMap("type", "read", "mbean", "bal::blub", "attribute", "HeapMemoryUsage"), procParams);
}
@Test
public void simplePostWithMergedMaps() {
Map config = new HashMap();
config.put("maxDepth","10");
Map<String,Object> reqMap = createMap(
"type","read",
"mbean","java.lang:type=Memory",
"attribute","HeapMemoryUsage",
"config",config);
Map param = new HashMap();;
param.put("maxObjects","100");
JmxReadRequest req = (JmxReadRequest) JmxRequestFactory.createPostRequest(reqMap,new Configuration().getProcessingParameters(param));
assertEquals(req.getAttributeName(),"HeapMemoryUsage");
assertEquals(req.getParameter(ConfigKey.MAX_DEPTH),"10");
assertEquals(req.getParameterAsInt(ConfigKey.MAX_OBJECTS), 100);
}
@Test
public void multiPostRequests() {
Map<String,Object> req1Map = createMap(
"type","read",
"mbean","java.lang:type=Memory",
"attribute","HeapMemoryUsage");
Map<String,Object> req2Map = createMap(
"type","list");
List<JmxRequest> req = JmxRequestFactory.createPostRequests(Arrays.asList(req1Map, req2Map),procParams);
assertEquals(req.get(0).getType(), RequestType.READ);
assertEquals(req.get(1).getType(), RequestType.LIST);
}
@Test(expectedExceptions = { IllegalArgumentException.class })
public void multiPostRequestsWithWrongArg() {
Map<String,Object> reqMap = createMap(
"type", "list");
JmxRequestFactory.createPostRequests(Arrays.asList(reqMap, "Wrong"),procParams);
}
@Test
public void simpleGetWithPath() {
JmxWriteRequest req = JmxRequestFactory.createGetRequest("write/java.lang:type=Runtime/SystemProperties/7788/[com.sun.management.jmxremote.port]/value", procParams);
assert req.getType() == RequestType.WRITE : "Type is write";
assert req.getObjectName().getCanonicalName().equals("java.lang:type=Runtime") : "Name properly parsed";
List<String> parts = req.getPathParts();
assert parts.get(0).equals("[com.sun.management.jmxremote.port]") : "Path part 0:" + parts.get(0);
assert parts.get(1).equals("value") : "Path part 1: " + parts.get(1) ;
assert req.getPath().equals("[com.sun.management.jmxremote.port]/value");
}
@Test
public void simpleGetWithEscapedAttribute() {
JmxReadRequest req = JmxRequestFactory.createGetRequest("read/java.lang:type=Memory/!/Heap!/Memory!/Usage!/",procParams);
assertEquals(req.getAttributeName(),"/Heap/Memory/Usage/","Attribute properly parsed");
}
@Test
public void simpleGetWithEscapedPath() {
JmxReadRequest req = JmxRequestFactory.createGetRequest("read/java.lang:type=Memory/HeapMemoryUsage/used!/bla!/blub/bloe",procParams);
assertEquals(req.getPathParts().size(),2,"Size of path");
assertEquals(req.getPath(),"used!/bla!/blub/bloe","Path properly parsed");
}
@Test(expectedExceptionsMessageRegExp = ".*pathinfo.*",expectedExceptions = {IllegalArgumentException.class})
public void illegalPath() {
JmxRequestFactory.createGetRequest("read", procParams);
}
@Test(expectedExceptionsMessageRegExp = ".*Invalid object name.*",expectedExceptions = {IllegalArgumentException.class})
public void invalidObjectName() {
JmxRequestFactory.createGetRequest("read/bla::blub",procParams);
}
@Test(expectedExceptions = {UnsupportedOperationException.class})
public void unsupportedType() {
JmxRequestFactory.createGetRequest("regnotif",procParams);
}
@Test
public void emptyRequest() {
JmxVersionRequest req = JmxRequestFactory.createGetRequest("",procParams);
req = JmxRequestFactory.createGetRequest(null,procParams);
}
@Test(expectedExceptions = NullPointerException.class)
public void nullProcParams() {
JmxRequestFactory.createGetRequest("",null);
}
@Test
public void simpleGetWithQueryPath() {
Map<String,String> params = new HashMap<String, String>();
params.put("p","list/java.lang/type=Memory");
JmxListRequest req = JmxRequestFactory.createGetRequest(null,new Configuration().getProcessingParameters(params));
assert req.getHttpMethod() == HttpMethod.GET : "GET by default";
assert req.getPath().equals("java.lang/type=Memory") : "Path extracted";
}
@Test
public void readWithPattern() {
JmxReadRequest req = JmxRequestFactory.createGetRequest("read/java.lang:type=*",procParams);
assert req.getType() == RequestType.READ : "Type is read";
assert req.getObjectName().getCanonicalName().equals("java.lang:type=*") : "Name properly parsed";
assert req.getObjectName().isPattern() : "Name is pattern";
assert req.getAttributeNames() == null : "No attributes names";
assert req.getAttributeName() == null : "No attributes names";
assert req.getPath() == null : "Path is null";
req = JmxRequestFactory.createGetRequest("read/java.lang:type=*/HeapMemoryUsage",procParams);
assert req.getAttributeName().equals("HeapMemoryUsage") : "No attributes names";
}
@Test
public void readWithPatternAndAttribute() {
JmxReadRequest req = JmxRequestFactory.createGetRequest("read/java.lang:type=*/",procParams);
assert req.getType() == RequestType.READ : "Type is read";
assert req.getObjectName().getCanonicalName().equals("java.lang:type=*") : "Name properly parsed";
assert req.getObjectName().isPattern() : "Name is pattern";
assert req.getAttributeNames() == null : "No attributes names";
assert req.getAttributeName() == null : "No attributes names";
assert req.getPath() == null : "Path is null";
}
@Test(expectedExceptions = { ClassCastException.class } )
public void castException() {
JmxReadRequest req = JmxRequestFactory.createGetRequest("exec/java.lang:type=Memory/gc", procParams);
}
}