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 java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.management.MalformedObjectNameException;
import org.jolokia.backend.BackendManager;
import org.jolokia.config.ConfigKey;
import org.jolokia.config.Configuration;
import org.jolokia.util.*;
import org.json.simple.*;
import org.testng.annotations.AfterClass;
import org.testng.annotations.Test;
import static org.testng.Assert.*;
/**
*/
public class RawObjectNameTest {
private Configuration config = new Configuration(ConfigKey.AGENT_ID, UUID.randomUUID().toString());
private LogHandler logHandler = new LogHandler.StdoutLogHandler(false);
private BackendManager backendManager = new BackendManager(config, logHandler, null, true /* Lazy Init */);
@Test
public void testListRawObjectNameAccess() throws Exception {
assertPropertyNamesOrderedCorrectly(listRequestBuilder(), false);
}
@Test
public void testListCanonicalNameAccess() throws Exception {
assertPropertyNamesOrderedCorrectly(listRequestBuilder(), true);
}
@Test
public void testReadRawObjectNameAccess() throws Exception {
assertPropertyNamesOrderedCorrectly(readRequestBuilder(), false);
}
@Test
public void testReadCanonicalNameAccess() throws Exception {
assertPropertyNamesOrderedCorrectly(readRequestBuilder(), true);
}
@Test
public void testSearchRawObjectNameAccess() throws Exception {
assertPropertyNamesOrderedCorrectly(searchRequestBuilder(), false);
}
@Test
public void testSearchCanonicalNameAccess() throws Exception {
assertPropertyNamesOrderedCorrectly(searchRequestBuilder(), true);
}
@AfterClass
public void destroy() throws Exception {
backendManager.destroy();
}
private JmxRequestBuilder listRequestBuilder() throws MalformedObjectNameException {
return new JmxRequestBuilder(RequestType.LIST).path("java.lang");
}
private JmxRequestBuilder readRequestBuilder() throws MalformedObjectNameException {
return new JmxRequestBuilder(RequestType.READ,"java.lang:*").option(ConfigKey.IGNORE_ERRORS,"true");
}
private JmxRequestBuilder searchRequestBuilder() throws MalformedObjectNameException {
return new JmxRequestBuilder(RequestType.SEARCH,"java.lang:*");
}
private void assertPropertyNamesOrderedCorrectly(JmxRequestBuilder builder, boolean canonical) throws Exception {
if (!canonical) {
builder = builder.option(ConfigKey.CANONICAL_NAMING, "false");
}
JmxRequest req = builder.build();
JSONObject json = backendManager.handleRequest(req);
JSONAware value = (JSONAware) json.get("value");
String memoryKey = null;
Set keys = value instanceof JSONObject ?
((JSONObject) value).keySet() :
new HashSet((JSONArray) value);
for (Object key : keys) {
String keyText = key.toString();
if (keyText.contains("MemoryPool")) {
memoryKey = keyText;
}
}
assertNotNull("Should have found a JMX key matching java.lang:type=MemoryPool", memoryKey);
// canonical order will have name first; raw format should start with type=MemoryPool
String prefix = "^(java\\.lang:)?type=MemoryPool";
Pattern prefixPattern = Pattern.compile(prefix);
Matcher matcher = prefixPattern.matcher(memoryKey);
if (canonical) {
assertFalse(matcher.find(), "Raw order should not start with '" + prefix + "' but was '"
+ memoryKey + "' which is probably the raw unsorted order?");
} else {
assertTrue(matcher.find(), "Raw order should start with '" + prefix + "' but was '"
+ memoryKey + "' which is probably the canonical sorted order?");
}
}
}