package org.jolokia.detector; /* * 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 javax.management.*; import org.jolokia.backend.executor.MBeanServerExecutor; import org.jolokia.config.ConfigKey; import org.jolokia.config.Configuration; import org.jolokia.util.LogHandler; import org.testng.annotations.Test; import static org.easymock.EasyMock.*; import static org.testng.Assert.assertNull; import static org.testng.AssertJUnit.assertEquals; /** * @author roland * @since 06.06.12 */ public class GlassfishDetectorTest extends BaseDetectorTest { ServerDetector detector = new GlassfishDetector(); @Test public void noDetect() throws MalformedObjectNameException { detectDeep(null,null); } @Test public void detectFromSystemProperty() throws MalformedObjectNameException { detectDeep(" GlassFish v2 ","2"); } @Test public void detectWrongVersion() throws MalformedObjectNameException { detectDeep(" Blub ",null); } @Test public void detectFromSystemPropertyWithOracle() throws MalformedObjectNameException { detectDeep("Oracle Glassfish v3.1.2","3.1.2"); } private void detectDeep(String property,String version) throws MalformedObjectNameException { MBeanServer mockServer = createMock(MBeanServer.class); expect(mockServer.queryNames(new ObjectName("com.sun.appserv:j2eeType=J2EEServer,*"), null)). andReturn(Collections.<ObjectName>emptySet()).anyTimes(); expect(mockServer.queryNames(new ObjectName("amx:type=domain-root,*"),null)). andReturn(Collections.<ObjectName>emptySet()).anyTimes(); replay(mockServer); if (property != null) { System.setProperty("glassfish.version",property); if (version == null) { assertNull(detector.detect(getMBeanServerManager(mockServer))); } else { assertEquals(detector.detect(getMBeanServerManager(mockServer)).getVersion(),version); } System.clearProperty("glassfish.version"); } else { assertNull(detector.detect(getMBeanServerManager(mockServer))); } verify(mockServer); } @Test public void detectFallback() throws InstanceNotFoundException, ReflectionException, AttributeNotFoundException, MBeanException, MalformedObjectNameException { ObjectName serverMbean = new ObjectName(SERVER_MBEAN); MBeanServer mockServer = createMock(MBeanServer.class); expect(mockServer.queryNames(new ObjectName("com.sun.appserv:j2eeType=J2EEServer,*"),null)). andReturn(new HashSet<ObjectName>(Arrays.asList(serverMbean))).anyTimes(); expect(mockServer.isRegistered(serverMbean)).andStubReturn(true); expect(mockServer.getAttribute(serverMbean, "serverVersion")).andReturn("GlassFish 3x"); expect(mockServer.queryNames(new ObjectName("com.sun.appserver:type=Host,*"),null)). andReturn(new HashSet<ObjectName>(Arrays.asList(serverMbean))).anyTimes(); replay(mockServer); ServerHandle info = detector.detect(getMBeanServerManager(mockServer)); assertEquals(info.getVersion(), "3"); assertEquals(info.getProduct(),"glassfish"); } @Test public void detect() throws MalformedObjectNameException, InstanceNotFoundException, ReflectionException, AttributeNotFoundException, MBeanException { doPlainDetect(); } private ServerHandle doPlainDetect() throws MalformedObjectNameException, MBeanException, AttributeNotFoundException, InstanceNotFoundException, ReflectionException { ObjectName serverMbean = new ObjectName(SERVER_MBEAN); MBeanServer mockServer = createMock(MBeanServer.class); expect(mockServer.queryNames(new ObjectName("com.sun.appserv:j2eeType=J2EEServer,*"),null)). andReturn(new HashSet<ObjectName>(Arrays.asList(serverMbean))).anyTimes(); expect(mockServer.isRegistered(serverMbean)).andStubReturn(true); expect(mockServer.getAttribute(serverMbean, "serverVersion")).andReturn("GlassFish v3"); expect(mockServer.queryNames(new ObjectName("amx:type=domain-root,*"),null)). andReturn(new HashSet<ObjectName>(Arrays.asList(serverMbean))).anyTimes(); expect(mockServer.getAttribute(serverMbean,"ApplicationServerFullVersion")).andReturn(" GlassFish v3.1 "); replay(mockServer); MBeanServerExecutor mbeanServers = getMBeanServerManager(mockServer); ServerHandle info = detector.detect(mbeanServers); assertEquals(info.getVersion(), "3.1"); assertEquals(info.getProduct(),"glassfish"); Map<String,String> extra = info.getExtraInfo(mbeanServers); assertEquals(extra.get("amxBooted"), "true"); return info; } @Test public void postDetectWithPositiveConfig() throws MalformedObjectNameException, InstanceNotFoundException, ReflectionException, AttributeNotFoundException, MBeanException { postDetectPositive("{\"glassfish\": {\"bootAmx\" : true}}"); } @Test public void postDetectWithNullConfig() throws MalformedObjectNameException, InstanceNotFoundException, ReflectionException, AttributeNotFoundException, MBeanException { postDetectPositive(null); } @Test public void postDetectWithNegativConfig() throws MalformedObjectNameException, InstanceNotFoundException, ReflectionException, AttributeNotFoundException, MBeanException { ServerHandle handle = doPlainDetect(); MBeanServer mockServer = createMock(MBeanServer.class); expect(mockServer.queryNames(new ObjectName("amx:type=domain-root,*"),null)).andReturn(null).anyTimes(); replay(mockServer); Configuration config = new Configuration(ConfigKey.DETECTOR_OPTIONS,"{\"glassfish\": {\"bootAmx\" : false}}"); handle.postDetect(getMBeanServerManager(mockServer), config, null); verify(mockServer); } private void postDetectPositive(String opts) throws MalformedObjectNameException, MBeanException, AttributeNotFoundException, InstanceNotFoundException, ReflectionException { ServerHandle handle = doPlainDetect(); MBeanServer mockServer = createMock(MBeanServer.class); expect(mockServer.queryNames(new ObjectName("amx:type=domain-root,*"),null)).andReturn(Collections.<ObjectName>emptySet()).anyTimes(); ObjectName bootAmxName = new ObjectName("amx-support:type=boot-amx"); expect(mockServer.isRegistered(bootAmxName)).andStubReturn(true); expect(mockServer.invoke(bootAmxName,"bootAMX",null,null)).andReturn(null); replay(mockServer); Configuration config = new Configuration(ConfigKey.DETECTOR_OPTIONS,opts); MBeanServerExecutor servers = getMBeanServerManager(mockServer); handle.postDetect(servers, config, null); handle.preDispatch(servers,null); verify(mockServer); } @Test public void detectInstanceNotFoundException() throws MalformedObjectNameException, MBeanException, AttributeNotFoundException, InstanceNotFoundException, ReflectionException { detectExceptionDuringPostProcess("^.*No bootAmx.*$",new InstanceNotFoundException("Negative")); } @Test public void detectOtherException() throws MalformedObjectNameException, MBeanException, AttributeNotFoundException, InstanceNotFoundException, ReflectionException { detectExceptionDuringPostProcess("^.*bootAmx.*$",new MBeanException(new Exception("Negative"))); } private void detectExceptionDuringPostProcess(String regexp,Exception exp) throws MalformedObjectNameException, MBeanException, AttributeNotFoundException, InstanceNotFoundException, ReflectionException { ServerHandle handle = doPlainDetect(); MBeanServer mockServer = createMock(MBeanServer.class); expect(mockServer.queryNames(new ObjectName("amx:type=domain-root,*"),null)).andReturn(Collections.<ObjectName>emptySet()).anyTimes(); ObjectName bootAmxName = new ObjectName("amx-support:type=boot-amx"); expect(mockServer.isRegistered(bootAmxName)).andStubReturn(true); expect(mockServer.invoke(bootAmxName, "bootAMX", null, null)).andThrow(exp); LogHandler log = createMock(LogHandler.class); log.error(matches(regexp),isA(exp.getClass())); replay(mockServer,log); MBeanServerExecutor servers = getMBeanServerManager(mockServer); handle.postDetect(servers,new Configuration(),log); handle.preDispatch(servers,null); verify(mockServer); } private static String SERVER_MBEAN = "com.sun.appserv:j2eeType=J2EEServer,type=bla"; }