View Javadoc
1   /*
2    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
3    * The software in this package is published under the terms of the CPAL v1.0
4    * license, a copy of which has been included with this distribution in the
5    * LICENSE.txt file.
6    */
7   package org.mule.management.mbeans;
8   
9   import static org.junit.Assert.assertEquals;
10  import static org.junit.Assert.assertTrue;
11  
12  import java.util.ArrayList;
13  import java.util.Arrays;
14  import java.util.Collection;
15  import java.util.Iterator;
16  import java.util.List;
17  import java.util.Set;
18  
19  import javax.management.MBeanServer;
20  import javax.management.MalformedObjectNameException;
21  import javax.management.ObjectInstance;
22  
23  import org.junit.Test;
24  import org.junit.runners.Parameterized.Parameters;
25  import org.mule.module.management.agent.JmxAgent;
26  import org.mule.module.management.agent.JmxServerNotificationAgent;
27  import org.mule.module.management.mbean.ConnectorService;
28  import org.mule.module.management.mbean.EndpointService;
29  import org.mule.module.management.mbean.FlowConstructService;
30  import org.mule.module.management.mbean.FlowConstructStats;
31  import org.mule.module.management.mbean.ModelService;
32  import org.mule.module.management.mbean.MuleConfigurationService;
33  import org.mule.module.management.mbean.MuleService;
34  import org.mule.module.management.mbean.RouterStats;
35  import org.mule.module.management.mbean.ServiceService;
36  import org.mule.module.management.mbean.StatisticsService;
37  import org.mule.module.management.support.JmxSupport;
38  import org.mule.tck.AbstractServiceAndFlowTestCase;
39  
40  /**
41   * Verify that expected MBeans are registered based on the config.
42   */
43  public class MBeansRegistrationTestCase extends AbstractServiceAndFlowTestCase
44  {
45  
46      private MBeanServer mBeanServer;
47      private String domainName;
48      private JmxSupport jmxSupport;
49  
50      public MBeansRegistrationTestCase(ConfigVariant variant, String configResources)
51      {
52          super(variant, configResources);
53      }
54  
55      @Override
56      protected void doSetUp() throws Exception
57      {
58          super.doSetUp();
59          JmxAgent jmxAgent = (JmxAgent) muleContext.getRegistry().lookupAgent("jmx-agent");
60          jmxSupport = jmxAgent.getJmxSupportFactory().getJmxSupport();
61          domainName = jmxSupport.getDomainName(muleContext);
62          mBeanServer = jmxAgent.getMBeanServer();
63      }
64  
65      @Parameters
66      public static Collection<Object[]> parameters()
67      {
68          return Arrays.asList(new Object[][]{{ConfigVariant.SERVICE, "mbeans-test-service.xml"},
69              {ConfigVariant.FLOW, "mbeans-test-flow.xml"}});
70      }
71  
72      /**
73       * Verify that all expected MBeans are registered for a default config
74       */
75      @Test
76      public void testDefaultMBeansRegistration() throws Exception
77      {
78          List<String> mbeanClasses = getMBeanClasses();
79  
80          assertTrue(mbeanClasses.contains(JmxServerNotificationAgent.class.getName()
81                                           + "$BroadcastNotificationService"));
82          assertTrue(mbeanClasses.contains(JmxServerNotificationAgent.class.getName() + "$NotificationListener"));
83          assertTrue(mbeanClasses.contains(MuleService.class.getName()));
84          assertTrue(mbeanClasses.contains(MuleConfigurationService.class.getName()));
85          assertTrue(mbeanClasses.contains(StatisticsService.class.getName()));
86          assertTrue(mbeanClasses.contains(ModelService.class.getName()));
87  
88          // Only if registerMx4jAdapter="true"
89          assertTrue(mbeanClasses.contains(mx4j.tools.adaptor.http.HttpAdaptor.class.getName()));
90      }
91  
92      /**
93       * Verify that all expected MBeans are registered for connectors, services,
94       * routers, and endpoints.
95       */
96      @Test
97      public void testServiceMBeansRegistration() throws Exception
98      {
99          List<String> mbeanClasses = getMBeanClasses();
100 
101         assertTrue(mbeanClasses.contains(ConnectorService.class.getName()));
102         assertTrue(mbeanClasses.contains(ModelService.class.getName()));
103         
104         if(variant.equals(ConfigVariant.SERVICE))
105         {
106             assertTrue(mbeanClasses.contains(ServiceService.class.getName()));
107             assertTrue(mbeanClasses.contains(RouterStats.class.getName()));
108         }
109         else
110         {
111             assertTrue(mbeanClasses.contains(FlowConstructService.class.getName()));            
112             assertTrue(mbeanClasses.contains(FlowConstructStats.class.getName()));
113         }
114                
115         
116         assertTrue(mbeanClasses.contains(EndpointService.class.getName()));
117     }
118 
119     /**
120      * Verify that all MBeans were unregistered during disposal phase.
121      */
122     @Test
123     public void testMBeansUnregistration() throws Exception
124     {
125         muleContext.dispose();
126         assertEquals("No MBeans should be registered after disposal of MuleContext", 0,
127             getMBeanClasses().size());
128     }
129 
130     protected List<String> getMBeanClasses() throws MalformedObjectNameException
131     {
132         Set<ObjectInstance> mbeans = getMBeans();
133         Iterator<ObjectInstance> it = mbeans.iterator();
134         List<String> mbeanClasses = new ArrayList<String>();
135         while (it.hasNext())
136         {
137             mbeanClasses.add(it.next().getClassName());
138         }
139         return mbeanClasses;
140     }
141 
142     protected Set<ObjectInstance> getMBeans() throws MalformedObjectNameException
143     {
144         return mBeanServer.queryMBeans(jmxSupport.getObjectName(domainName + ":*"), null);
145     }
146 
147 }