package org.jolokia.detector;
/*
* 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.
*/
import java.lang.instrument.Instrumentation;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
import javax.management.*;
import org.jolokia.backend.executor.MBeanServerExecutor;
import org.jolokia.request.JmxRequest;
import org.jolokia.request.JmxRequestBuilder;
import org.jolokia.util.RequestType;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import static org.easymock.EasyMock.*;
import static org.testng.Assert.*;
/**
* @author roland
* @since 02.09.11
*/
public class JBossDetectorTest extends BaseDetectorTest {
private JBossDetector detector;
private MBeanServer server;
private MBeanServerExecutor servers;
@BeforeMethod
public void setup() {
detector = new JBossDetector();
server = createMock(MBeanServer.class);
servers = getMBeanServerManager(server);
}
@Test
public void simpleNotFound() throws MalformedObjectNameException {
for (String name : new String[]{
"jboss.system:type=Server",
"jboss.as:*",
"jboss.modules:*"
}) {
expect(server.queryNames(new ObjectName(name), null)).andReturn(Collections.<ObjectName>emptySet()).anyTimes();
}
replay(server);
assertNull(detector.detect(servers));
verify(server);
}
@Test
public void simpleFound() throws MalformedObjectNameException, InstanceNotFoundException, ReflectionException, AttributeNotFoundException, MBeanException, IntrospectionException {
expect(server.queryNames(new ObjectName("jboss.as:management-root=server"),null)).andReturn(Collections.EMPTY_SET);
ObjectName oName = prepareQuery("jboss.system:type=Server");
expect(server.isRegistered(oName)).andStubReturn(true);
expect(server.getAttribute(oName, "Version")).andReturn("5.1.0");
replay(server);
ServerHandle handle = detector.detect(servers);
assertEquals(handle.getVersion(),"5.1.0");
assertEquals(handle.getVendor(),"RedHat");
assertEquals(handle.getProduct(),"jboss");
// Verify workaround
reset(server);
ObjectName memoryBean = new ObjectName("java.lang:type=Memory");
expect(server.isRegistered(memoryBean)).andStubReturn(true);
replay(server);
handle.preDispatch(servers, new JmxRequestBuilder(RequestType.READ, memoryBean).attribute("HeapMemoryUsage").<JmxRequest>build());
verify(server);
}
@Test
public void version71() throws MalformedObjectNameException, IntrospectionException, InstanceNotFoundException, ReflectionException, AttributeNotFoundException, MBeanException {
expect(server.queryNames(new ObjectName("jboss.system:type=Server"),null)).andReturn(Collections.<ObjectName>emptySet());
prepareQuery("jboss.as:*");
ObjectName oName = new ObjectName("jboss.as:management-root=server");
expect(server.getAttribute(oName,"productVersion")).andReturn(null);
expect(server.getAttribute(oName,"releaseVersion")).andReturn("7.1.1.Final");
expect(server.getAttribute(oName,"productName")).andReturn(null);
replay(server);
ServerHandle handle = detector.detect(servers);
assertEquals(handle.getVersion(),"7.1.1.Final");
assertEquals(handle.getVendor(),"RedHat");
assertEquals(handle.getProduct(),"jboss");
verifyNoWorkaround(handle);
}
@Test
public void version101() throws MalformedObjectNameException, IntrospectionException, InstanceNotFoundException, ReflectionException, AttributeNotFoundException, MBeanException {
expect(server.queryNames(new ObjectName("jboss.system:type=Server"),null)).andReturn(Collections.<ObjectName>emptySet());
prepareQuery("jboss.as:*");
ObjectName oName = new ObjectName("jboss.as:management-root=server");
expect(server.getAttribute(oName,"productVersion")).andReturn("10.1.0.Final");
expect(server.getAttribute(oName,"productName")).andReturn("WildFly Full");
replay(server);
ServerHandle handle = detector.detect(servers);
assertEquals(handle.getVersion(),"10.1.0.Final");
assertEquals(handle.getVendor(),"RedHat");
assertEquals(handle.getProduct(),"WildFly Full");
verifyNoWorkaround(handle);
}
private void verifyNoWorkaround(ServerHandle pHandle) throws MalformedObjectNameException {
// Verify that no workaround is active
reset(server);
ObjectName memoryBean = new ObjectName("java.lang:type=Memory");
replay(server);
pHandle.preDispatch(servers, new JmxRequestBuilder(RequestType.READ, memoryBean).attribute("HeapMemoryUsage").<JmxRequest>build());
verify(server);
}
@Test
public void version7() throws MalformedObjectNameException, IntrospectionException, InstanceNotFoundException, ReflectionException {
expect(server.queryNames(new ObjectName("jboss.system:type=Server"),null)).andReturn(Collections.<ObjectName>emptySet());
expect(server.queryNames(new ObjectName("jboss.as:*"),null)).andReturn(Collections.<ObjectName>emptySet());
prepareQuery("jboss.modules:*");
replay(server);
ServerHandle handle = detector.detect(servers);
assertEquals(handle.getVersion(),"7");
assertEquals(handle.getVendor(),"RedHat");
assertEquals(handle.getProduct(),"jboss");
// Verify that no workaround is active
verifyNoWorkaround(handle);
}
private ObjectName prepareQuery(String pName) throws MalformedObjectNameException {
ObjectName oName = new ObjectName(pName);
Set<ObjectName> oNames = new HashSet<ObjectName>(Arrays.asList(oName));
expect(server.queryNames(oName,null)).andReturn(oNames);
return oName;
}
@Test
public void addMBeanServers() {
replay(server);
detector.addMBeanServers(new HashSet<MBeanServerConnection>());
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void verifyIsClassLoadedArgumentChecksNullInstrumentation() {
detector.isClassLoaded("xx", null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void verifyIsClassLoadedArgumentChecks2NullClassname() {
detector.isClassLoaded(null, createMock(Instrumentation.class));
}
@Test
public void verifyIsClassLoadedNotLoaded() {
Instrumentation inst = createMock(Instrumentation.class);
expect(inst.getAllLoadedClasses()).andReturn(new Class[] {}).once();
replay(inst);
assertFalse(detector.isClassLoaded("org.Dummy", inst));
verify(inst);
}
@Test
public void verifyIsClassLoadedLoaded() {
Instrumentation inst = createMock(Instrumentation.class);
expect(inst.getAllLoadedClasses()).andReturn(new Class[] {JBossDetectorTest.class}).once();
replay(inst);
assertTrue(detector.isClassLoaded(JBossDetectorTest.class.getName(), inst));
verify(inst);
}
@Test
public void verifyJvmAgentStartup() throws MalformedURLException {
Instrumentation inst = createMock(Instrumentation.class);
expect(inst.getAllLoadedClasses()).andReturn(new Class[] {}).times(3);
expect(inst.getAllLoadedClasses()).andReturn(new Class[] {JBossDetectorTest.class}).atLeastOnce();
ClassLoader cl = createMock(ClassLoader.class);
expect(cl.getResource("org/jboss/modules/Main.class")).andReturn(new URL("http", "dummy", "")).anyTimes();
String prevPkgValue = System.setProperty("jboss.modules.system.pkgs", "blah");
String prevLogValue = System.setProperty("java.util.logging.manager", JBossDetectorTest.class.getName());
replay(inst,cl);
try {
detector.jvmAgentStartup(inst, cl);
} finally {
resetSysProp(prevLogValue, "java.util.logging.manager");
resetSysProp(prevPkgValue, "jboss.modules.system.pkgs");
}
verify(inst);
}
protected void resetSysProp(String prevValue, String key) {
if (prevValue == null) {
System.getProperties().remove(key);
} else {
System.setProperty(key, prevValue);
}
}
}