/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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. */ package de.unioninvestment.eai.portal.portlet.crud.domain.model; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Mockito.when; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Map; import java.util.Set; import javax.management.AttributeNotFoundException; import javax.management.InstanceNotFoundException; import javax.management.IntrospectionException; import javax.management.MBeanException; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; import javax.management.ReflectionException; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpUriRequest; import org.jolokia.client.J4pClient; import org.jolokia.client.exception.J4pException; import org.jolokia.client.request.J4pExecRequest; import org.jolokia.client.request.J4pReadRequest; import org.jolokia.client.request.J4pResponse; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; public class JolokiaMBeanServerConnectionTest { private static String TEST_URL = "http://host:port/jolokia"; private static String TEST_RESPONSE_ATTR = "{\"timestamp\":1396507601,\"status\":200," + "\"request\":{\"mbean\":\"org.apache.servicemix:ContainerName=ServiceMix," + "Name=algo-benchmark-targetadapter-sa,Type=ServiceAssembly\"," + "\"attribute\":\"currentState\",\"type\":\"read\"}," + "\"value\":\"Shutdown\"}"; private static String TEST_OBJECT_NAME_ATTR = "org.apache.servicemix:ContainerName=" + "ServiceMix,Name=algo-benchmark-targetadapter-sa,Type=ServiceAssembly"; private static String TEST_RESPONSE_NAMES = "{\"timestamp\":1396514422,\"status\":200," + "\"request\":{\"mbean\":\"org.apache.servicemix:ContainerName=ServiceMix," + "Type=ServiceAssembly,*\",\"type\":\"read\"},\"value\":{\"org.apache.servicemix:" + "ContainerName=ServiceMix,Name=algo-benchmark-targetadapter-sa,Type=" + "ServiceAssembly\":{\"description\":\"Osiris :: Investment :: ibk :: " + "algo-benchmark-targetadapter-sa :: SA\",\"name\":\"algo-benchmark-targetadapter-sa\"," + "\"currentState\":\"Shutdown\",\"serviceUnits\":[{\"objectName\":" + "\"org.apache.servicemix:ContainerName=ServiceMix,Name=algo-benchmark-targetadapter" + "-jms-su,SubType=servicemix-jms,Type=ServiceUnit\"},{\"objectName\":" + "\"org.apache.servicemix:ContainerName=ServiceMix,Name=algo-benchmark-targetadapter-rdbms-su," + "SubType=servicemix-rdbms,Type=ServiceUnit\"}]}}}"; private static String TEST_OBJECT_NAME_NAMES = "org.apache.servicemix:ContainerName=" + "ServiceMix,Type=ServiceAssembly,*"; private static String REMOTE_SCRIPTING_MBEAN_NAME = "crud:service=CrudRemoteScript,name=script"; private static String TEST_RESPONSE_REMOTE_SCRIPTING = "{\"timestamp\":1396524103,\"status\":200," + "\"request\":{\"mbean\":\"crud:name=script,service=CrudRemoteScript\",\"type\":\"search\"}," + "\"value\":[\"crud:name=script,service=CrudRemoteScript\"]}"; private static String TEST_RESPONSE_IVOKE = "{\"timestamp\":1396537169,\"status\":200,\"request\":" + "{\"mbean\":\"crud:name=script,service=CrudRemoteScript\",\"operation\":\"query(java.lang.String," + "java.util.List,java.util.List)\",\"arguments\":[\"org.apache.servicemix:ContainerName=ServiceMix," + "Type=ServiceAssembly,*\",\"[currentState]\",\"[]\"],\"type\":\"exec\"},\"value\":" + "{\"org.apache.servicemix:ContainerName=ServiceMix,Name=algo-benchmark-targetadapter-sa," + "Type=ServiceAssembly\":{\"currentState\":\"Shutdown\"},\"org.apache.servicemix:ContainerName=" + "ServiceMix,Name=ackv-kursziehung-order-sourceadaptor-sa,Type=ServiceAssembly\":{\"currentState\":" + "\"Shutdown\"},\"org.apache.servicemix:ContainerName=ServiceMix,Name=crims-financialratio-targetadaptor-sa," + "Type=ServiceAssembly\":{\"currentState\":\"Shutdown\"}}}"; private static String TEST_RESULT_IVOKE = "{\"org.apache.servicemix:ContainerName=ServiceMix," + "Name=algo-benchmark-targetadapter-sa,Type=ServiceAssembly\":{\"currentState\":\"Shutdown\"}," + "\"org.apache.servicemix:ContainerName=ServiceMix,Name=ackv-kursziehung-order-sourceadaptor-sa," + "Type=ServiceAssembly\":{\"currentState\":\"Shutdown\"},\"org.apache.servicemix:ContainerName=" + "ServiceMix,Name=crims-financialratio-targetadaptor-sa,Type=ServiceAssembly\":{\"currentState\":" + "\"Shutdown\"}}"; @Mock private JolokiaMBeanServerConnection jolokiaMBeanServerConnectionMock; @Mock private J4pClient j4pClientMock; @Mock private HttpClient httpClientMock; @Mock private HttpResponse httpResponseMock; @Mock private HttpEntity httpEntityMock; @Before public void setUp() throws MalformedObjectNameException, NullPointerException, InstanceNotFoundException, IntrospectionException, ReflectionException, IOException { MockitoAnnotations.initMocks(this); } @Test public void shouldGetAttribute() throws IOException, AttributeNotFoundException, InstanceNotFoundException, MBeanException, ReflectionException, J4pException, MalformedObjectNameException, ParseException { ObjectName objectName = new ObjectName(TEST_OBJECT_NAME_ATTR); JolokiaMBeanServerConnection jolokiaMBeanServerConnection = new JolokiaMBeanServerConnection(); jolokiaMBeanServerConnection.setJ4pClient(j4pClientMock); J4pReadRequest request = new J4pReadRequest(objectName, "currentState"); J4pResponse<J4pReadRequest> response = new J4pResponse<J4pReadRequest>( request, (JSONObject) new JSONParser().parse(TEST_RESPONSE_ATTR)) { }; when(j4pClientMock.execute(any(J4pReadRequest.class))).thenReturn( response); assertTrue("Shutdown".equals(jolokiaMBeanServerConnection.getAttribute( objectName, "currentState"))); } @Test public void shouldQueryNames() throws IOException, AttributeNotFoundException, InstanceNotFoundException, MBeanException, ReflectionException, J4pException, MalformedObjectNameException, ParseException { ObjectName objectName = new ObjectName(TEST_OBJECT_NAME_NAMES); JolokiaMBeanServerConnection jolokiaMBeanServerConnection = new JolokiaMBeanServerConnection(); jolokiaMBeanServerConnection.setJ4pClient(j4pClientMock); J4pReadRequest request = new J4pReadRequest(objectName); J4pResponse<J4pReadRequest> response = new J4pResponse<J4pReadRequest>( request, (JSONObject) new JSONParser().parse(TEST_RESPONSE_NAMES)) { }; when(j4pClientMock.execute(any(J4pReadRequest.class))).thenReturn( response); Set<ObjectName> result = jolokiaMBeanServerConnection.queryNames( objectName, null); assertTrue(result.size() == 1); assertTrue(result .contains(new ObjectName( "org.apache.servicemix:ContainerName=ServiceMix," + "Name=algo-benchmark-targetadapter-sa,Type=ServiceAssembly"))); } @Test public void shouldGetObjectNames() throws IOException, AttributeNotFoundException, InstanceNotFoundException, MBeanException, ReflectionException, J4pException, MalformedObjectNameException, ParseException { final ByteArrayInputStream bis = new ByteArrayInputStream( TEST_RESPONSE_REMOTE_SCRIPTING.getBytes()); when(httpClientMock.execute(any(HttpUriRequest.class))).thenReturn( httpResponseMock); when(httpResponseMock.getEntity()).thenReturn(httpEntityMock); when(httpEntityMock.getContent()).thenReturn(bis); JolokiaMBeanServerConnection jolokiaMBeanServerConnection = new JolokiaMBeanServerConnection(); jolokiaMBeanServerConnection.setJ4pClient(new J4pClient(TEST_URL, httpClientMock)); ObjectName objectName = new ObjectName(REMOTE_SCRIPTING_MBEAN_NAME); assertTrue(jolokiaMBeanServerConnection.isRegistered(objectName)); } @Test public void shouldInvoke() throws IOException, AttributeNotFoundException, InstanceNotFoundException, MBeanException, ReflectionException, J4pException, MalformedObjectNameException, ParseException { ArrayList<String> currentState = new ArrayList<String>(); currentState.add("currentState"); Object[] params = new Object[] { "org.apache.servicemix:ContainerName=ServiceMix,Type=ServiceAssembly,*", currentState, new ArrayList<String>() }; String[] signature = new String[] { "java.lang.String", "java.util.List", "java.util.List" }; ObjectName objectName = new ObjectName(REMOTE_SCRIPTING_MBEAN_NAME); JolokiaMBeanServerConnection jolokiaMBeanServerConnection = new JolokiaMBeanServerConnection(); jolokiaMBeanServerConnection.setJ4pClient(j4pClientMock); J4pExecRequest request = new J4pExecRequest( REMOTE_SCRIPTING_MBEAN_NAME, "query(java.lang.String,java.util.List,java.util.List)", params); J4pResponse<J4pExecRequest> response = new J4pResponse<J4pExecRequest>( request, (JSONObject) new JSONParser().parse(TEST_RESPONSE_IVOKE)) { }; when(j4pClientMock.execute(any(J4pExecRequest.class))).thenReturn( response); @SuppressWarnings("rawtypes") Map result = (Map) jolokiaMBeanServerConnection.invoke(objectName, "query", params, signature); assertTrue(result.size() == 3); assertTrue(TEST_RESULT_IVOKE.equals(result.toString())); } }