/* * JBoss, Home of Professional Open Source. * Copyright 2008, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.management.test; import java.lang.reflect.UndeclaredThrowableException; import java.rmi.RemoteException; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import javax.management.AttributeList; import javax.management.JMException; import javax.management.MBeanAttributeInfo; import javax.management.MBeanInfo; import javax.management.Notification; import javax.management.NotificationListener; import javax.management.ObjectName; import javax.management.j2ee.ListenerRegistration; import javax.management.j2ee.Management; import javax.management.j2ee.ManagementHome; import javax.management.j2ee.statistics.StatelessSessionBeanStats; import javax.management.j2ee.statistics.Statistic; import javax.rmi.PortableRemoteObject; import junit.framework.Test; import junit.framework.TestSuite; import org.jboss.management.j2ee.J2EEManagedObject; import org.jboss.management.j2ee.J2EETypeConstants; import org.jboss.test.JBossTestCase; import org.jboss.test.util.jms.JMSDestinationsUtil; /** * Test of JSR-77 specification conformance using the Management interface. * These test the basic JSR-77 handling and access. * * @author Andreas Schaefer * @author Scott.Stark@jboss.org * @version $Revision: 105907 $ */ public class JSR77SpecUnitTestCase extends JBossTestCase { // Constants ----------------------------------------------------- public static final String TEST_DATASOURCE = "DefaultDS"; public static final String TEST_MAIL = "DefaultMail"; private String jsr77Domain; // Constructors -------------------------------------------------- public JSR77SpecUnitTestCase(String name) { super(name); } // Public -------------------------------------------------------- /** Test that the JSR77 MEJB is available * @throws Exception */ public void testConnect() throws Exception { log.debug("+++ testConnect"); Management jsr77MEJB = getManagementEJB(); String lDomain = jsr77MEJB.getDefaultDomain(); log.debug("+++ testConnect, domain: " + lDomain); jsr77MEJB.remove(); } /** Test the JSR-77 J2EEDomain availability * @throws Exception */ public void testJ2EEDomain() throws Exception { getLog().debug("+++ testJ2EEDomain"); Management jsr77MEJB = getManagementEJB(); String domain = jsr77MEJB.getDefaultDomain(); log.debug("domain=("+domain+")"); String nameStr = domain + ":" + J2EEManagedObject.TYPE + "=" + J2EETypeConstants.J2EEDomain + ",name="+domain; log.debug("nameStr=("+nameStr+")"); ObjectName domainQuery = new ObjectName(nameStr); log.debug("domainQuery=("+domainQuery+")"); Set names = jsr77MEJB.queryNames(domainQuery, null); if (names.isEmpty()) { fail("Could not find JSR-77 J2EEDomain '" + J2EETypeConstants.J2EEDomain + "'"); } if (names.size() > 1) { fail("Found more than one JSR-77 J2EEDomain '" + J2EETypeConstants.J2EEDomain + "'"); } ObjectName jsr77MEJBDomain = (ObjectName) names.iterator().next(); getLog().debug("+++ testJ2EEDomain, root: " + jsr77MEJBDomain); jsr77MEJB.remove(); } /** Test the JSR-77 J2EEServer availability * @throws Exception */ public void testJ2EEServer() throws Exception { getLog().debug("+++ testJ2EEServer"); Management jsr77MEJB = getManagementEJB(); String domainName = jsr77MEJB.getDefaultDomain(); ObjectName queryName = new ObjectName(domainName + ":" + J2EEManagedObject.TYPE + "=" + J2EETypeConstants.J2EEServer + "," + "*"); Set names = jsr77MEJB.queryNames(queryName, null); if (names.isEmpty()) { fail("Could not find JSR-77 J2EEServer '" + J2EETypeConstants.J2EEServer + "'"); } Iterator iter = names.iterator(); ObjectName serverName = null; while (iter.hasNext()) { serverName = (ObjectName) iter.next(); getLog().debug("J2EEServer: " + serverName); } // Get the server info String vendor = (String) jsr77MEJB.getAttribute(serverName, "serverVendor"); getLog().debug("ServerVendor: " + vendor); String version = (String) jsr77MEJB.getAttribute(serverName, "serverVersion"); getLog().debug("ServerVersion: " + version); // Get the list of JVMs String[] jvms = (String[]) jsr77MEJB.getAttribute(serverName, "javaVMs"); if (jvms == null || jvms.length == 0) fail("Failed to find any JavaVMs"); ObjectName jvm = new ObjectName(jvms[0]); getLog().debug("JavaVMs[0]: " + jvms[0]); String javaVendor = (String) jsr77MEJB.getAttribute(jvm, "javaVendor"); getLog().debug("JavaVendor: " + javaVendor); String javaVersion = (String) jsr77MEJB.getAttribute(jvm, "javaVersion"); getLog().debug("JavaVersion: " + javaVersion); String node = (String) jsr77MEJB.getAttribute(jvm, "node"); getLog().debug("Node: " + node); jsr77MEJB.remove(); } /** Test the JSR-77 JNDIResource availability * @throws Exception */ public void testJNDIResource() throws Exception { getLog().debug("+++ testJNDIResource"); Management jsr77MEJB = getManagementEJB(); String domainName = jsr77MEJB.getDefaultDomain(); ObjectName queryName = new ObjectName(domainName + ":" + J2EEManagedObject.TYPE + "=" + J2EETypeConstants.JNDIResource + "," + "*"); // TODO - this used to work, Scott's new naming required? /* Set names = jsr77MEJB.queryNames(queryName, null); if (names.isEmpty()) { fail("Could not find JSR-77 JNDIResource '" + J2EETypeConstants.JNDIResource + "'"); } Iterator iter = names.iterator(); while (iter.hasNext()) getLog().debug("JNDIResource: " + iter.next()); */ jsr77MEJB.remove(); } /** Test JavaMailResource availability. * @throws Exception */ public void testJavaMailResource() throws Exception { getLog().debug("+++ testJavaMailResource"); Management jsr77MEJB = getManagementEJB(); String domainName = jsr77MEJB.getDefaultDomain(); ObjectName queryName = new ObjectName(domainName + ":" + J2EEManagedObject.TYPE + "=" + J2EETypeConstants.JavaMailResource + "," + "*"); Set names = jsr77MEJB.queryNames(queryName, null); if (names.isEmpty()) { fail("Could not find JSR-77 JavaMailResource '" + J2EETypeConstants.JavaMailResource + "'"); } Iterator iter = names.iterator(); while (iter.hasNext()) getLog().debug("JavaMailResource: " + iter.next()); jsr77MEJB.remove(); } // NYI - see JBAS-5545 // // /** Test JCAResource availability. // * @throws Exception // */ // public void testJCAResource() throws Exception // { // getLog().debug("+++ testJCAResource"); // Management jsr77MEJB = getManagementEJB(); // String domainName = jsr77MEJB.getDefaultDomain(); // ObjectName queryName = new ObjectName(domainName + ":" + // J2EEManagedObject.TYPE + "=" + J2EETypeConstants.JCAResource + "," + "*"); // Set names = jsr77MEJB.queryNames(queryName, null); // if (names.isEmpty()) // { // fail("Could not find JSR-77 JCAResource '" + J2EETypeConstants.JCAResource + "'"); // } // Iterator iter = names.iterator(); // while (iter.hasNext()) // getLog().debug("JCAResource: " + iter.next()); // jsr77MEJB.remove(); // } /** Test JTAResource availability. * @throws Exception */ public void testJTAResource() throws Exception { getLog().debug("+++ testJTAResource"); Management jsr77MEJB = getManagementEJB(); String domainName = jsr77MEJB.getDefaultDomain(); ObjectName queryName = new ObjectName(domainName + ":" + J2EEManagedObject.TYPE + "=" + J2EETypeConstants.JTAResource + "," + "*"); Set names = jsr77MEJB.queryNames(queryName, null); if (names.isEmpty()) { fail("Could not find JSR-77 JTAResource '" + J2EETypeConstants.JTAResource + "'"); } Iterator iter = names.iterator(); while (iter.hasNext()) getLog().debug("JTAResource: " + iter.next()); jsr77MEJB.remove(); } /** Test JMSResource availability. * @throws Exception */ public void testJMSResource() throws Exception { getLog().debug("+++ testJMSResource"); Management jsr77MEJB = getManagementEJB(); String domainName = jsr77MEJB.getDefaultDomain(); ObjectName queryName = new ObjectName(domainName + ":" + J2EEManagedObject.TYPE + "=" + J2EETypeConstants.JMSResource + "," + "*"); Set names = jsr77MEJB.queryNames(queryName, null); if (names.isEmpty()) { fail("Could not find JSR-77 JMSResource '" + J2EETypeConstants.JMSResource + "'"); } Iterator iter = names.iterator(); while (iter.hasNext()) getLog().debug("JMSResource: " + iter.next()); jsr77MEJB.remove(); } // NYI - see JBAS-5545 // // /** Test the default JCAConnectionFactory availability. // * @throws Exception // */ // public void testJCAConnectionFactory() // throws // Exception // { // getLog().debug("+++ testJCAConnectionFactory"); // Management jsr77MEJB = getManagementEJB(); // Set names = jsr77MEJB.queryNames( // getConnectionFactoryName(jsr77MEJB), // null // ); // if (names.isEmpty()) // { // fail("Could not found JSR-77 JCAConnectionFactory named '" // + TEST_DATASOURCE + "'"); // } // if (names.size() > 1) // { // fail("Found more than one JSR-77 JCAConnectionFactory named '" // + TEST_DATASOURCE + "'"); // } // ObjectName factory = (ObjectName) names.iterator().next(); // getLog().debug("+++ testJCAConnectionFactory, " + TEST_DATASOURCE // + ": " + factory); // jsr77MEJB.remove(); // } // NYI - see JBAS-5545 // /** Test EJBModule for the ejb-management.jar * @throws Exception */ public void testEJBModule() throws Exception { getLog().debug("+++ testEJBModule"); Management jsr77MEJB = getManagementEJB(); String domainName = jsr77MEJB.getDefaultDomain(); ObjectName mejbModuleName = new ObjectName(domainName + ":" + "J2EEServer=Local,J2EEApplication=null," + J2EEManagedObject.TYPE + "=" + J2EETypeConstants.EJBModule + ",name=ejb-management.jar"); boolean isRegistered = jsr77MEJB.isRegistered(mejbModuleName); assertTrue(mejbModuleName + " is not registered", isRegistered); String[] ejbs = (String[]) jsr77MEJB.getAttribute(mejbModuleName, "ejbs"); // TODO assertTrue("ejb-management.jar.Ejbs.length == 0", ejbs.length > 0); for (int n = 0; n < ejbs.length; n++) { ObjectName ejb = new ObjectName(ejbs[n]); getLog().debug("Ejbs[" + n + "]=" + ejb); StatelessSessionBeanStats stats = (StatelessSessionBeanStats) jsr77MEJB.getAttribute(ejb, "stats"); String[] statNames = stats.getStatisticNames(); for (int s = 0; s < statNames.length; s++) { Statistic theStat = stats.getStatistic(statNames[s]); getLog().debug(theStat); } } jsr77MEJB.remove(); } /** * Query for the *:j2eeType=WebModule,* bean attributes. Assert each has: * - objectName * - stateManageable * - statisticsProvider * - eventProvider * - deploymentDescriptor * - servlets ; may be null * - javaVMs * - server */ public void testWebModules() throws Exception { String[] attributes = {"deploymentDescriptor", "objectName", "servlets", "statisticsProvider", "javaVMs", "stateManageable", "eventProvider", "server" }; getLog().debug("+++ testWebModules"); Management jsr77MEJB = getManagementEJB(); String domainName = jsr77MEJB.getDefaultDomain(); ObjectName webModules = new ObjectName(domainName+":j2eeType=WebModule,*"); Set<ObjectName> names = jsr77MEJB.queryNames(webModules, null); assertTrue("", names.size() > 0); getLog().debug("Found web modules: "+names); boolean sawNullAttributes = false; for(ObjectName name : names) { getLog().debug("Checking module: "+name); for(String attrName : attributes) { Object attr = jsr77MEJB.getAttribute(name, attrName); if(attr == null) { getLog().error(name+" has null attribute: "+attrName); sawNullAttributes = true; } } } assertFalse("All web modules had non-null attributes", sawNullAttributes); } /** A test of accessing all StatelessSessionBean stats * @throws Exception */ public void testEJBStats() throws Exception { getLog().debug("+++ testEJBStats"); Management jsr77MEJB = getManagementEJB(); String beanName = null; String query = "*:j2eeType=StatelessSessionBean,*"; log.info(query); ObjectName ejbName = new ObjectName(query); Set managedObjects = jsr77MEJB.queryNames(ejbName, null); log.info("Found " + managedObjects.size() + " objects"); Iterator i = managedObjects.iterator(); while (i.hasNext()) { ObjectName oName = (ObjectName) i.next(); beanName = oName.getKeyProperty("name"); StatelessSessionBeanStats stats = (StatelessSessionBeanStats) jsr77MEJB.getAttribute(oName, "stats"); Statistic[] allStats = stats.getStatistics(); for (int s = 0; s < allStats.length; s++) { Statistic theStat = allStats[s]; getLog().debug(theStat); } } jsr77MEJB.remove(); } // NYI - see JBAS-5545 // /** Test WebModule for the jmx-console.war * @throws Exception */ public void testWebModule() throws Exception { getLog().debug("+++ testWebModule"); Management jsr77MEJB = getManagementEJB(); String domainName = jsr77MEJB.getDefaultDomain(); ObjectName webModuleName = new ObjectName(domainName + ":" + "J2EEServer=Local,J2EEApplication=null," + J2EEManagedObject.TYPE + "=" + J2EETypeConstants.WebModule + ",name=jmx-console.war"); boolean isRegistered = jsr77MEJB.isRegistered(webModuleName); assertTrue(webModuleName + " is not registered", isRegistered); String[] servlets = (String[]) jsr77MEJB.getAttribute(webModuleName, "servlets"); // TODO assertTrue("jmx-console.war.Servlets.length == 0", servlets.length > 0); for (int n = 0; n < servlets.length; n++) getLog().debug("Servlets[" + n + "]=" + servlets[n]); jsr77MEJB.remove(); } // NYI - see JBAS-5545 // /** Test ResourceAdapterModule for the jboss-local-jdbc.rar * @throws Exception */ public void testResourceAdapterModule() throws Exception { getLog().debug("+++ testResourceAdapterModule"); Management jsr77MEJB = getManagementEJB(); String domainName = jsr77MEJB.getDefaultDomain(); ObjectName rarModuleName = new ObjectName(domainName + ":" + "J2EEServer=Local,J2EEApplication=null," + J2EEManagedObject.TYPE + "=" + J2EETypeConstants.ResourceAdapterModule + ",name=jboss-local-jdbc.rar"); boolean isRegistered = jsr77MEJB.isRegistered(rarModuleName); assertTrue(rarModuleName + " is not registered", isRegistered); String[] ras = (String[]) jsr77MEJB.getAttribute(rarModuleName, "resourceAdapters"); // TODO assertTrue("jboss-local-jdbc.rar.ResourceAdapters.length == 0", ras.length > 0); for (int n = 0; n < ras.length; n++) getLog().debug("ResourceAdapters[" + n + "]=" + ras[n]); jsr77MEJB.remove(); } /** * Test the notification delivery by restarting Default DataSource */ public void testNotificationDeliver() throws Exception { try { getLog().debug("+++ testNotificationDeliver"); Management jsr77MEJB = getManagementEJB(); Set names = jsr77MEJB.queryNames(getMailName(jsr77MEJB), null); if (names.isEmpty()) { fail("Could not found JSR-77 JavaMailResource'" + TEST_MAIL + "'"); } ObjectName lMail = (ObjectName) names.iterator().next(); Listener lLocalListener = new Listener(); ListenerRegistration lListenerFactory = jsr77MEJB.getListenerRegistry(); getLog().debug("+++ testNotificationDeliver, add Notification Listener to " + TEST_MAIL + " with Listener Registry: " + lListenerFactory); lListenerFactory.addNotificationListener( lMail, lLocalListener, null, null ); getLog().debug("+++ testNotificationDeliver, stop " + TEST_MAIL + ""); jsr77MEJB.invoke(lMail, "stop", new Object[]{}, new String[]{}); getLog().debug("+++ testNotificationDeliver, start " + TEST_MAIL + ""); jsr77MEJB.invoke(lMail, "start", new Object[]{}, new String[]{}); // Wait 5 seconds to ensure that the notifications are delivered Thread.sleep(5000); if (lLocalListener.getNumberOfNotifications() < 2) { fail("Not enough notifications received: " + lLocalListener.getNumberOfNotifications()); } getLog().debug("+++ testNotificationDeliver, remove Notification Listener from " + TEST_MAIL + ""); lListenerFactory.removeNotificationListener( lMail, lLocalListener ); jsr77MEJB.remove(); } catch (Exception e) { log.debug("failed", e); throw e; } } /** * Test the Navigation through the current JSR-77 tree */ public void testNavigation() throws Exception { log.info("+++ testNavigation"); Management jsr77MEJB = null; try { // Get Management EJB and then the management domain jsr77MEJB = getManagementEJB(); String domain = jsr77MEJB.getDefaultDomain(); ObjectName domainQuery = new ObjectName(domain + ":" + J2EEManagedObject.TYPE + "=" + J2EETypeConstants.J2EEDomain + ",name="+domain); Set names = jsr77MEJB.queryNames(domainQuery, null); if (names.isEmpty()) { fail("Could not find any J2EEDomain"); } if (names.size() > 1) { fail("Found more than one J2EEDomain, "+names); } ObjectName jsr77MEJBDomain = (ObjectName) names.iterator().next(); log.info("J2EEDomain: "+jsr77MEJBDomain); jsr77Domain = jsr77MEJBDomain.getDomain(); // Report the attributes and references report(jsr77MEJB, jsr77MEJBDomain, new HashSet()); } catch (Exception e) { log.debug("failed", e); throw e; } catch (Error err) { log.debug("failed", err); throw err; } finally { if (jsr77MEJB != null) { jsr77MEJB.remove(); } } } private void report(Management jsr77EJB, ObjectName mbean, HashSet reportedNames) throws JMException, RemoteException { if (mbean == null) return; if (reportedNames.contains(mbean)) { log.debug("Skipping already reported MBean: " + mbean); return; } log.debug("Begin Report Object: " + mbean); reportedNames.add(mbean); MBeanInfo mbeanInfo = jsr77EJB.getMBeanInfo(mbean); MBeanAttributeInfo[] attrInfo = mbeanInfo.getAttributes(); String[] attrNames = new String[attrInfo.length]; // First just report all attribute names and types for (int i = 0; i < attrInfo.length; i++) { String name = attrInfo[i].getName(); String type = attrInfo[i].getType(); boolean readable = attrInfo[i].isReadable(); log.debug("Attribute: " + name + ", " + type + ", readable: " + readable); attrNames[i] = attrInfo[i].getName(); } // Now try to obtain the values for (int i = 0; i < attrNames.length; i++) { String name = attrNames[i]; Object value = null; try { if (attrInfo[i].isReadable() == true) value = jsr77EJB.getAttribute(mbean, name); } catch (UndeclaredThrowableException e) { Throwable ex = e.getUndeclaredThrowable(); log.debug("Failed to access attribute: " + name + ", " + ex.getMessage()); } catch (Exception e) { // HACK: Ignore moved attribute error for message cache on the persistence manager if (name.equals("MessageCache")) continue; /* This is not a fatal exception as not all attributes are remotable but all javax.management.* and org.jboss.management.j2ee.* types should be. */ log.debug("Failed to access attribute: " + name, e); String type = attrInfo[i].getType(); boolean isJSR77Type = type.startsWith("javax.management") || type.startsWith("org.jboss.management.j2ee"); assertTrue("Bad attribute(" + name + ") is not a JSR77 type", isJSR77Type == false); } if (value == null) { log.debug("Attribute: " + name + " is empty"); } else if (ObjectName.class.getName().equals(attrInfo[i].getType())) { // Check if this attribute should not be followed ObjectName toName = (ObjectName) value; if (checkBlock(toName, name)) { log.debug("Blocked Attribute: " + name + " contains: " + toName); continue; } // Report this Object's attribute first log.debug("Attribute: " + name + ", value: " + value + ", is reported"); report(jsr77EJB, (ObjectName) value, reportedNames); } else if (ObjectName[].class.getName().equals(attrInfo[i].getType())) { ObjectName[] names = (ObjectName[]) value; for (int j = 0; j < names.length; j++) { ObjectName toName = names[j]; // Check if this name should not be followed if (checkBlock(toName, name)) { log.debug("Blocked ObjectName: " + toName); continue; } log.debug("Attribute: " + name + ", value: " + toName + ", is reported"); report(jsr77EJB, toName, reportedNames); } } else { log.debug("Attribute: " + name + " contains: " + value); } } log.debug("End Report Object: " + mbean); } /** * @return True if the given attribute must be blocked to avoid * an endless loop in the graph of JSR-77 object name * references (like J2EEServer refences J2EEDeployedObjects * and this references J2EEServer) */ private boolean checkBlock(ObjectName name, String attrName) { // If the mbean is not a jsr77 mean ignore the attribute String domain = name == null ? "" : name.getDomain(); if( domain.equals(this.jsr77Domain) == false ) return true; String type = (String) name.getKeyPropertyList().get(J2EEManagedObject.TYPE); if (J2EETypeConstants.EJBModule.equals(type) || J2EETypeConstants.WebModule.equals(type) || J2EETypeConstants.ResourceAdapterModule.equals(type) || J2EETypeConstants.ServiceModule.equals(type)) { if ("Server".equals(attrName)) { // Block Attribute Server for any J2EE Deployed Objects return true; } } return "Parent".equals(attrName) || "ObjectName".equals(attrName); } private Management getManagementEJB() throws Exception { getLog().debug("+++ getManagementEJB()"); Object lObject = getInitialContext().lookup("ejb/mgmt/MEJB"); ManagementHome home = (ManagementHome) PortableRemoteObject.narrow( lObject, ManagementHome.class ); getLog().debug("Found JSR-77 Management EJB (MEJB)"); return home.create(); } private ObjectName getConnectionFactoryName(Management jsr77MEJB) throws Exception { String domainName = jsr77MEJB.getDefaultDomain(); return new ObjectName(domainName + ":" + J2EEManagedObject.TYPE + "=" + J2EETypeConstants.JCAConnectionFactory + "," + "name=" + TEST_DATASOURCE + "," + "*" ); } private ObjectName getMailName(Management jsr77MEJB) throws Exception { String domainName = jsr77MEJB.getDefaultDomain(); return new ObjectName(domainName + ":" + J2EEManagedObject.TYPE + "=" + J2EETypeConstants.JavaMailResource + "," + "*" ); } // Inner classes ------------------------------------------------- private class Listener implements NotificationListener { private int mNrOfNotifications = 0; public int getNumberOfNotifications() { return mNrOfNotifications; } public void handleNotification(Notification pNotification, Object pHandbank) { mNrOfNotifications++; } } public static Test suite() throws Exception { TestSuite suite = new TestSuite(); suite.addTest(new JSR77SpecUnitTestCase("testConnect")); suite.addTest(new JSR77SpecUnitTestCase("testJ2EEDomain")); suite.addTest(new JSR77SpecUnitTestCase("testJ2EEServer")); suite.addTest(new JSR77SpecUnitTestCase("testJNDIResource")); suite.addTest(new JSR77SpecUnitTestCase("testJavaMailResource")); suite.addTest(new JSR77SpecUnitTestCase("testJTAResource")); if (JMSDestinationsUtil.isJBM()) { // This test is only supported on JBM suite.addTest(new JSR77SpecUnitTestCase("testJMSResource")); } suite.addTest(new JSR77SpecUnitTestCase("testEJBModule")); suite.addTest(new JSR77SpecUnitTestCase("testWebModules")); suite.addTest(new JSR77SpecUnitTestCase("testEJBStats")); suite.addTest(new JSR77SpecUnitTestCase("testWebModule")); suite.addTest(new JSR77SpecUnitTestCase("testResourceAdapterModule")); suite.addTest(new JSR77SpecUnitTestCase("testNotificationDeliver")); suite.addTest(new JSR77SpecUnitTestCase("testNavigation")); return getDeploySetup(suite, "ejb-management.jar"); } }