//
// ========================================================================
// Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.jmx;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import java.lang.management.ManagementFactory;
import java.util.ArrayList;
import java.util.Arrays;
import javax.management.Attribute;
import javax.management.AttributeList;
import javax.management.AttributeNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanInfo;
import javax.management.ReflectionException;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.log.StdErrLog;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import com.acme.Derived;
import com.acme.DerivedExtended;
import com.acme.DerivedManaged;
public class ObjectMBeanUtilTest
{
private ObjectMBean objectMBean;
private DerivedExtended derivedExtended;
private MBeanContainer container;
private MBeanInfo objectMBeanInfo;
private Object mBean;
private String value;
private Attribute attribute;
private AttributeList attributes;
private ObjectMBean mBeanDerivedManaged;
private Derived[] derivedes;
private ArrayList<Derived> aliasNames;
private DerivedManaged derivedManaged;
private static final int EMPTY = 0;
@BeforeClass
public static void beforeClass()
{
Logger ombLog = Log.getLogger(ObjectMBean.class);
if (ombLog instanceof StdErrLog && !ombLog.isDebugEnabled())
((StdErrLog)ombLog).setHideStacks(true);
}
@AfterClass
public static void afterClass()
{
Logger ombLog = Log.getLogger(ObjectMBean.class);
if (ombLog instanceof StdErrLog)
((StdErrLog)ombLog).setHideStacks(false);
}
@Before
public void setUp()
{
derivedExtended = new DerivedExtended();
objectMBean = new ObjectMBean(derivedExtended);
container = new MBeanContainer(ManagementFactory.getPlatformMBeanServer());
objectMBean.setMBeanContainer(container);
objectMBeanInfo = objectMBean.getMBeanInfo();
}
@Test
public void testBasicOperations()
{
assertEquals("Managed objects should be equal",derivedExtended,objectMBean.getManagedObject());
assertNull("This method call always returns null in the actual code",objectMBean.getObjectName());
assertNull("This method call always returns null in the actual code",objectMBean.getObjectNameBasis());
assertNull("This method call always returns null in the actual code",objectMBean.getObjectContextBasis());
assertEquals("Mbean container should be equal",container,objectMBean.getMBeanContainer());
assertEquals("Mbean description must be equal to : Test the mbean extended stuff","Test the mbean extended stuff",objectMBeanInfo.getDescription());
}
@Test
public void testMbeanForNullCheck()
{
// when
mBean = ObjectMBean.mbeanFor(null);
// then
assertNull("As we are passing null value the output should be null",mBean);
}
@Test(expected = ReflectionException.class)
public void testGetAttributeReflectionException() throws Exception
{
// given
setUpGetAttribute("doodle4","charu");
// when
objectMBean.getAttribute("doodle4");
// then
fail("An InvocationTargetException must have occured by now as doodle4() internally throwing exception");
}
private void setUpGetAttribute(String property, String value) throws Exception
{
Attribute attribute = new Attribute(property,value);
objectMBean.setAttribute(attribute);
}
@Test(expected = AttributeNotFoundException.class)
public void testGetAttributeAttributeNotFoundException() throws Exception
{
// when
objectMBean.getAttribute("ffname");
// then
fail("An AttributeNotFoundException must have occured by now as there is no " + "attribute with the name ffname in bean");
}
@Test
public void testSetAttributeWithCorrectAttrName() throws Exception
{
// given
setUpGetAttribute("fname","charu");
// when
value = (String)objectMBean.getAttribute("fname");
// then
assertEquals("Attribute(fname) value must be equl to charu","charu",value);
}
@Test(expected = AttributeNotFoundException.class)
public void testSetAttributeNullCheck() throws Exception
{
// given
objectMBean.setAttribute(null);
// when
objectMBean.getAttribute(null);
// then
fail("An AttributeNotFoundException must have occured by now as there is no attribute with the name null");
}
@Test(expected = AttributeNotFoundException.class)
public void testSetAttributeAttributeWithWrongAttrName() throws Exception
{
// given
attribute = new Attribute("fnameee","charu");
// when
objectMBean.setAttribute(attribute);
// then
fail("An AttributeNotFoundException must have occured by now as there is no attribute " + "with the name ffname in bean");
}
@Test
public void testSetAttributesWithCorrectValues() throws Exception
{
// given
attributes = getAttributes("fname","vijay");
attributes = objectMBean.setAttributes(attributes);
// when
attributes = objectMBean.getAttributes(new String[]
{ "fname" });
// then
assertEquals("Fname value must be equal to vijay","vijay",((Attribute)(attributes.get(0))).getValue());
}
@Test
public void testSetAttributesForArrayTypeAttribue() throws Exception
{
// given
derivedes = getArrayTypeAttribute();
// when
derivedManaged.setAddresses(derivedes);
mBeanDerivedManaged.getMBeanInfo();
// then
assertNotNull("Address object shouldn't be null",mBeanDerivedManaged.getAttribute("addresses"));
}
@Test
public void testSetAttributesForCollectionTypeAttribue() throws Exception
{
// given
aliasNames = getCollectionTypeAttribute();
// when
derivedManaged.setAliasNames(aliasNames);
mBeanDerivedManaged.getMBeanInfo();
// then
assertNotNull("Address object shouldn't be null",mBeanDerivedManaged.getAttribute("aliasNames"));
assertNull("Derived object shouldn't registerd with container so its value will be null",mBeanDerivedManaged.getAttribute("derived"));
}
private Derived[] getArrayTypeAttribute()
{
derivedManaged = new DerivedManaged();
mBeanDerivedManaged = new ObjectMBean(derivedManaged);
MBeanContainer mBeanDerivedManagedContainer = new MBeanContainer(ManagementFactory.getPlatformMBeanServer());
mBeanDerivedManaged.setMBeanContainer(mBeanDerivedManagedContainer);
Derived derived0 = new Derived();
mBeanDerivedManagedContainer.beanAdded(null,derived0);
Derived[] derivedes = new Derived[3];
for (int i = 0; i < 3; i++)
{
derivedes[i] = new Derived();
}
derivedManaged.setAddresses(derivedes);
mBeanDerivedManaged.getMBeanInfo();
ArrayList<Derived> aliasNames = new ArrayList<Derived>(Arrays.asList(derivedes));
derivedManaged.setAliasNames(aliasNames);
return derivedes;
}
private ArrayList<Derived> getCollectionTypeAttribute()
{
ArrayList<Derived> aliasNames = new ArrayList<Derived>(Arrays.asList(getArrayTypeAttribute()));
return aliasNames;
}
@Test
public void testSetAttributesException()
{
// given
attributes = getAttributes("fnameee","charu");
// when
attributes = objectMBean.setAttributes(attributes);
// then
// Original code eating the exception and returning zero size list
assertEquals("As there is no attribute with the name fnameee, this should return empty",EMPTY,attributes.size());
}
private AttributeList getAttributes(String name, String value)
{
Attribute attribute = new Attribute(name,value);
AttributeList attributes = new AttributeList();
attributes.add(attribute);
return attributes;
}
@Test(expected = MBeanException.class)
public void testInvokeMBeanException() throws Exception
{
// given
setMBeanInfoForInvoke();
// when
objectMBean.invoke("doodle2",new Object[] {},new String[] {});
// then
fail("An MBeanException must have occured by now as doodle2() in Derived bean throwing exception");
}
@Test(expected = ReflectionException.class)
public void testInvokeReflectionException() throws Exception
{
// given
setMBeanInfoForInvoke();
// when
objectMBean.invoke("doodle1",new Object[] {},new String[] {});
// then
fail("An ReflectionException must have occured by now as doodle1() has private access in Derived bean");
}
@Test
public void testInvoke() throws Exception
{
// given
setMBeanInfoForInvoke();
// when
value = (String)objectMBean.invoke("good",new Object[] {},new String[] {});
// then
assertEquals("Method(good) invocation on objectMBean must return not bad","not bad",value);
}
@Test(expected = ReflectionException.class)
public void testInvokeNoSuchMethodException() throws Exception
{
// given
setMBeanInfoForInvoke();
// when
// DerivedMBean contains a managed method with the name good,we must
// call this method without any arguments
objectMBean.invoke("good",new Object[] {},new String[]
{ "int aone" });
// then
fail("An ReflectionException must have occured by now as we cannot call a methow with wrong signature");
}
private void setMBeanInfoForInvoke()
{
objectMBean = (ObjectMBean)ObjectMBean.mbeanFor(derivedExtended);
container.beanAdded(null,derivedExtended);
objectMBean.getMBeanInfo();
}
@Test
public void testToVariableName()
{
assertEquals("fullName",objectMBean.toVariableName("isfullName"));
}
}