package org.jolokia.jsr160; /* * 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.io.IOException; import java.util.HashMap; import java.util.Map; import javax.management.*; import org.jolokia.backend.executor.NotChangedException; import org.jolokia.config.Configuration; import org.jolokia.config.ProcessingParameters; import org.jolokia.converter.Converters; import org.jolokia.detector.ServerHandle; import org.jolokia.request.*; import org.jolokia.restrictor.AllowAllRestrictor; import org.json.simple.JSONObject; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import static org.testng.Assert.*; /** * @author roland * @since 02.09.11 */ public class Jsr160RequestDispatcherTest { private Jsr160RequestDispatcher dispatcher; private ProcessingParameters procParams; @BeforeTest private void setup() { dispatcher = createDispatcherPointingToLocalMBeanServer(); procParams = new Configuration().getProcessingParameters(new HashMap<String, String>()); } @Test public void canHandle() { assertFalse(dispatcher.canHandle(JmxRequestFactory.createGetRequest("/read/java.lang:type=Memory", procParams))); JmxRequest req = preparePostReadRequest(null); assertTrue(dispatcher.canHandle(req)); } @Test public void useReturnValue() { assertTrue(dispatcher.useReturnValueWithPath(JmxRequestFactory.createGetRequest("/read/java.lang:type=Memory", procParams))); } @Test(expectedExceptions = IllegalArgumentException.class) public void illegalDispatch() throws InstanceNotFoundException, IOException, ReflectionException, AttributeNotFoundException, MBeanException, NotChangedException { dispatcher.dispatchRequest(JmxRequestFactory.createGetRequest("/read/java.lang:type=Memory/HeapMemoryUsage", procParams)); } @Test(expectedExceptions = IOException.class) public void simpleDispatchFail() throws InstanceNotFoundException, IOException, ReflectionException, AttributeNotFoundException, MBeanException, NotChangedException { JmxRequest req = preparePostReadRequest(null); getOriginalDispatcher().dispatchRequest(req); } @Test public void simpleDispatch() throws InstanceNotFoundException, IOException, ReflectionException, AttributeNotFoundException, MBeanException, NotChangedException { JmxReadRequest req = (JmxReadRequest) preparePostReadRequest(null); Map result = (Map) dispatcher.dispatchRequest(req); assertTrue(result.containsKey("HeapMemoryUsage")); } @Test public void simpleDispatchForSingleAttribute() throws InstanceNotFoundException, IOException, ReflectionException, AttributeNotFoundException, MBeanException, NotChangedException { JmxReadRequest req = preparePostReadRequest(null, "HeapMemoryUsage"); assertNotNull(dispatcher.dispatchRequest(req)); } @Test public void simpleDispatchWithUser() throws InstanceNotFoundException, IOException, ReflectionException, AttributeNotFoundException, MBeanException, NotChangedException { System.setProperty("TEST_WITH_USER","roland"); try { JmxRequest req = preparePostReadRequest("roland"); Map result = (Map) dispatcher.dispatchRequest(req); assertTrue(result.containsKey("HeapMemoryUsage")); } finally { System.clearProperty("TEST_WITH_USER"); } } // ========================================================================================================= private JmxReadRequest preparePostReadRequest(String pUser, String... pAttribute) { JSONObject params = new JSONObject(); JSONObject target = new JSONObject(); target.put("url","service:jmx:test:///jndi/rmi://localhost:9999/jmxrmi"); if (pUser != null) { target.put("user","roland"); target.put("password","s!cr!et"); } if (pAttribute != null && pAttribute.length > 0) { params.put("attribute",pAttribute[0]); } params.put("target",target); params.put("type","read"); params.put("mbean","java.lang:type=Memory"); return (JmxReadRequest) JmxRequestFactory.createPostRequest(params, procParams); } private Jsr160RequestDispatcher createDispatcherPointingToLocalMBeanServer() { Converters converters = new Converters(); ServerHandle handle = new ServerHandle(null,null,null, null); return new Jsr160RequestDispatcher(converters,handle,new AllowAllRestrictor()) { @Override protected Map<String, Object> prepareEnv(Map<String, String> pTargetConfig) { Map ret = super.prepareEnv(pTargetConfig); if (ret == null) { ret = new HashMap(); } ret.put("jmx.remote.protocol.provider.pkgs","org.jolokia.jsr160"); return ret; } }; } private Jsr160RequestDispatcher getOriginalDispatcher() { return new Jsr160RequestDispatcher(new Converters(), new ServerHandle(null,null,null, null), new AllowAllRestrictor()); } }