Java tutorial
/* TestWebMBeanAdapter.java * * Copyright 2009-2012 Comcast Interactive Media, LLC. * * 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. */ package org.fishwife.jrugged.spring.jmx; import org.junit.Before; import org.junit.Test; import org.springframework.test.util.ReflectionTestUtils; import javax.management.Attribute; import javax.management.AttributeList; import javax.management.JMException; import javax.management.MBeanAttributeInfo; import javax.management.MBeanInfo; import javax.management.MBeanOperationInfo; import javax.management.MBeanServer; import javax.management.ObjectName; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import static junit.framework.Assert.assertEquals; import static org.easymock.EasyMock.anyObject; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.reset; import static org.easymock.EasyMock.verify; public class TestWebMBeanAdapter { private MBeanServer mockMBeanServer; private MBeanStringSanitizer mockSanitizer; private WebMBeanAdapter webMBeanAdapter; private ObjectName mockObjectName; private MBeanInfo mockMBeanInfo; private MBeanOperationInvoker mockMBeanOperationInvoker; private static final String ENCODING = "UTF-8"; class MockWebMBeanAdapter extends WebMBeanAdapter { public MockWebMBeanAdapter(MBeanServer mBeanServer, String mBeanName) throws JMException, UnsupportedEncodingException { super(mBeanServer, mBeanName, ENCODING); } @Override MBeanStringSanitizer createMBeanStringSanitizer() { return mockSanitizer; } @Override ObjectName createObjectName(String name) { return mockObjectName; } @Override MBeanOperationInvoker createMBeanOperationInvoker(MBeanServer mBeanServer, ObjectName objectName, MBeanOperationInfo operationInfo) { return mockMBeanOperationInvoker; } } @Before public void setUp() throws Exception { mockMBeanServer = createMock(MBeanServer.class); mockSanitizer = createMock(MBeanStringSanitizer.class); mockMBeanInfo = createMock(MBeanInfo.class); mockObjectName = createMock(ObjectName.class); mockMBeanOperationInvoker = createMock(MBeanOperationInvoker.class); String beanName = "some_bean_name"; expect(mockSanitizer.urlDecode(beanName, ENCODING)).andReturn(beanName); expect(mockMBeanServer.getMBeanInfo(mockObjectName)).andReturn(mockMBeanInfo); replay(mockSanitizer, mockMBeanServer); webMBeanAdapter = new MockWebMBeanAdapter(mockMBeanServer, beanName); verify(mockMBeanServer, mockSanitizer); reset(mockMBeanServer, mockSanitizer); } @Test public void testConstructor() throws Exception { assertEquals(mockMBeanServer, ReflectionTestUtils.getField(webMBeanAdapter, "mBeanServer")); assertEquals(mockObjectName, ReflectionTestUtils.getField(webMBeanAdapter, "objectName")); assertEquals(mockMBeanInfo, ReflectionTestUtils.getField(webMBeanAdapter, "mBeanInfo")); } @Test public void testGetAttributeMetadata() throws Exception { String attributeName1 = "attribute_name_1"; MBeanAttributeInfo mockAttribute1 = createMock(MBeanAttributeInfo.class); String attributeName2 = "attribute_name_2"; MBeanAttributeInfo mockAttribute2 = createMock(MBeanAttributeInfo.class); MBeanAttributeInfo[] attributeList = new MBeanAttributeInfo[2]; attributeList[0] = mockAttribute1; attributeList[1] = mockAttribute2; expect(mockMBeanInfo.getAttributes()).andReturn(attributeList); expect(mockAttribute1.getName()).andReturn(attributeName1); expect(mockAttribute2.getName()).andReturn(attributeName2); replay(mockMBeanServer, mockSanitizer, mockObjectName, mockMBeanInfo, mockAttribute1, mockAttribute2); Map<String, MBeanAttributeInfo> attributeMap = webMBeanAdapter.getAttributeMetadata(); assertEquals(2, attributeMap.size()); assertEquals(mockAttribute1, attributeMap.get(attributeName1)); assertEquals(mockAttribute2, attributeMap.get(attributeName2)); verify(mockMBeanServer, mockSanitizer, mockObjectName, mockMBeanInfo, mockAttribute1, mockAttribute2); } @Test public void testGetOperationMetadata() throws Exception { String operationName1 = "operation_name_1"; MBeanOperationInfo mockOperation1 = createMock(MBeanOperationInfo.class); String operationName2 = "operation_name_2"; MBeanOperationInfo mockOperation2 = createMock(MBeanOperationInfo.class); MBeanOperationInfo[] operationList = new MBeanOperationInfo[2]; operationList[0] = mockOperation1; operationList[1] = mockOperation2; expect(mockMBeanInfo.getOperations()).andReturn(operationList); expect(mockOperation1.getName()).andReturn(operationName1); expect(mockOperation2.getName()).andReturn(operationName2); replay(mockMBeanServer, mockSanitizer, mockObjectName, mockMBeanInfo, mockOperation1, mockOperation2); Map<String, MBeanOperationInfo> operationMap = webMBeanAdapter.getOperationMetadata(); assertEquals(2, operationMap.size()); assertEquals(mockOperation1, operationMap.get(operationName1)); assertEquals(mockOperation2, operationMap.get(operationName2)); verify(mockMBeanServer, mockSanitizer, mockObjectName, mockMBeanInfo, mockOperation1, mockOperation2); } @Test public void testGetOperationInfoWhenItExists() throws Exception { String operationName1 = "operation_name_1"; MBeanOperationInfo mockOperation1 = createMock(MBeanOperationInfo.class); String operationName2 = "operation_name_2"; MBeanOperationInfo mockOperation2 = createMock(MBeanOperationInfo.class); expect(mockSanitizer.urlDecode(operationName2, ENCODING)).andReturn(operationName2); MBeanOperationInfo[] operationList = new MBeanOperationInfo[2]; operationList[0] = mockOperation1; operationList[1] = mockOperation2; expect(mockMBeanInfo.getOperations()).andReturn(operationList); expect(mockOperation1.getName()).andReturn(operationName1); expect(mockOperation2.getName()).andReturn(operationName2); replay(mockMBeanServer, mockSanitizer, mockObjectName, mockMBeanInfo, mockOperation1, mockOperation2); MBeanOperationInfo operationInfo = webMBeanAdapter.getOperationInfo(operationName2); assertEquals(mockOperation2, operationInfo); verify(mockMBeanServer, mockSanitizer, mockObjectName, mockMBeanInfo, mockOperation1, mockOperation2); } @Test(expected = OperationNotFoundException.class) public void testGetOperationInfoThrowsOperationNotFoundException() throws Exception { String operationName = "nonexistent"; expect(mockObjectName.getCanonicalName()).andReturn("some_name"); MBeanOperationInfo[] operationList = new MBeanOperationInfo[0]; expect(mockSanitizer.urlDecode(operationName, ENCODING)).andReturn(operationName); expect(mockMBeanInfo.getOperations()).andReturn(operationList); replay(mockMBeanServer, mockSanitizer, mockObjectName, mockMBeanInfo); webMBeanAdapter.getOperationInfo(operationName); } @Test public void testGetAttributeValues() throws Exception { MBeanAttributeInfo[] attributeInfoArray = new MBeanAttributeInfo[2]; MBeanAttributeInfo mockAttributeInfo1 = createMock(MBeanAttributeInfo.class); MBeanAttributeInfo mockAttributeInfo2 = createMock(MBeanAttributeInfo.class); attributeInfoArray[0] = mockAttributeInfo1; attributeInfoArray[1] = mockAttributeInfo2; expect(mockMBeanInfo.getAttributes()).andReturn(attributeInfoArray); String attributeName1 = "attribute_name_1"; String attributeName2 = "attribute_name_2"; expect(mockAttributeInfo1.getName()).andReturn(attributeName1); expect(mockAttributeInfo2.getName()).andReturn(attributeName2); AttributeList mockAttributeList = createMock(AttributeList.class); expect(mockMBeanServer.getAttributes(eq(mockObjectName), anyObject(String[].class))) .andReturn(mockAttributeList); List<Attribute> attributeList = new ArrayList<Attribute>(); Attribute mockAttribute1 = createMock(Attribute.class); Attribute mockAttribute2 = createMock(Attribute.class); attributeList.add(mockAttribute1); attributeList.add(mockAttribute2); expect(mockAttributeList.asList()).andReturn(attributeList); String name1 = "name 1"; String value1 = "value 1"; expect(mockAttribute1.getName()).andReturn(name1); expect(mockAttribute1.getValue()).andReturn(value1); expect(mockSanitizer.escapeValue(value1)).andReturn(value1); String name2 = "name 2"; String value2 = "value 2"; expect(mockAttribute2.getName()).andReturn(name2); expect(mockAttribute2.getValue()).andReturn(value2); expect(mockSanitizer.escapeValue(value2)).andReturn(value2); replay(mockMBeanServer, mockSanitizer, mockObjectName, mockMBeanInfo, mockAttributeInfo1, mockAttributeInfo2, mockAttributeList, mockAttribute1, mockAttribute2); Map<String, Object> attributeValueMap = webMBeanAdapter.getAttributeValues(); assertEquals(2, attributeValueMap.size()); assertEquals(value1, attributeValueMap.get(name1)); assertEquals(value2, attributeValueMap.get(name2)); verify(mockMBeanServer, mockSanitizer, mockObjectName, mockMBeanInfo, mockAttributeInfo1, mockAttributeInfo2, mockAttributeList, mockAttribute1, mockAttribute2); } @Test public void testGetAttributeValue() throws Exception { String attributeName = "attribute_name"; expect(mockSanitizer.urlDecode(attributeName, ENCODING)).andReturn(attributeName); Object value = new Object(); String valueString = "some_string"; expect(mockMBeanServer.getAttribute(mockObjectName, attributeName)).andReturn(value); expect(mockSanitizer.escapeValue(value)).andReturn(valueString); replay(mockMBeanServer, mockSanitizer, mockObjectName); String attributeValue = webMBeanAdapter.getAttributeValue(attributeName); assertEquals(valueString, attributeValue); verify(mockMBeanServer, mockSanitizer, mockObjectName); } @Test public void testInvokeOperation() throws Exception { String operationName = "operation_name"; expect(mockSanitizer.urlDecode(operationName, ENCODING)).andReturn(operationName); MBeanOperationInfo mockOperation = createMock(MBeanOperationInfo.class); MBeanOperationInfo[] operationList = new MBeanOperationInfo[1]; operationList[0] = mockOperation; expect(mockMBeanInfo.getOperations()).andReturn(operationList); expect(mockOperation.getName()).andReturn(operationName); Map<String, String[]> parameterMap = new HashMap<String, String[]>(); Object value = new Object(); expect(mockMBeanOperationInvoker.invokeOperation(parameterMap)).andReturn(value); String valueString = "some_value"; expect(mockSanitizer.escapeValue(value)).andReturn(valueString); replay(mockMBeanServer, mockSanitizer, mockObjectName, mockMBeanInfo, mockOperation, mockMBeanOperationInvoker); String invokeResult = webMBeanAdapter.invokeOperation(operationName, parameterMap); assertEquals(valueString, invokeResult); verify(mockMBeanServer, mockSanitizer, mockObjectName, mockMBeanInfo, mockOperation, mockMBeanOperationInvoker); } }