/* * 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.jmx.test; import javax.management.Attribute; import javax.management.MBeanServerConnection; import javax.management.ObjectName; import javax.naming.InitialContext; import javax.naming.Name; import junit.framework.Test; import junit.framework.TestSuite; import org.jboss.security.SecurityAssociation; import org.jboss.security.SimplePrincipal; import org.jboss.test.JBossTestCase; import org.jboss.test.jmx.xmbean.CustomType; import org.jnp.interfaces.Naming; /** JBoss model mbean deployment tests * * @author <a href="mailto:d_jencks@users.sourceforge.net">David Jencks</a> * @author <a href="mailto:dimitris@jboss.org">Dimitris Andreadis</a> * @author Scott.Stark@jboss.org * @version $Revision: 81036 $ */ public class DeployXMBeanUnitTestCase extends JBossTestCase { private final static String PACKAGE_NAME = "user-xmbean.sar"; public DeployXMBeanUnitTestCase(String name) { super(name); } public static Test suite() throws Exception { // JBAS-3604, the execution order of tests in this test case is important // so it must be defined explicitly when running under some JVMs TestSuite suite = new TestSuite(); suite.addTest(new DeployXMBeanUnitTestCase("testDeployXdocletUserXMBean")); suite.addTest(new DeployXMBeanUnitTestCase("testGeneratedAVCFromWrappedStandardMBeanImpl")); suite.addTest(new DeployXMBeanUnitTestCase("testDeployUserXMBean")); suite.addTest(new DeployXMBeanUnitTestCase("testDeployUserEmbeddedDescriptorXMBean")); suite.addTest(new DeployXMBeanUnitTestCase("testUserXMBeanValues")); suite.addTest(new DeployXMBeanUnitTestCase("testUserXMBeanPersistentValues")); suite.addTest(new DeployXMBeanUnitTestCase("testUserXMBeanPersistentValuesWithCustomPM")); suite.addTest(new DeployXMBeanUnitTestCase("testSecuredXMBean")); suite.addTest(new DeployXMBeanUnitTestCase("testSecuredJndiXMBean")); suite.addTest(new DeployXMBeanUnitTestCase("testPersistentJndiXMBean")); suite.addTest(new DeployXMBeanUnitTestCase("testXMBeanExternalEntityImport")); return suite; } /** Test the xdoclet generated xmbean descriptor * @throws Exception on failure */ public void testDeployXdocletUserXMBean() throws Exception { getLog().info("+++ testDeployXdocletUserXMBean"); ObjectName userName = new ObjectName("jboss.test:service=xmbean-user"); MBeanServerConnection server = getServer(); try { deploy(PACKAGE_NAME); getLog().info("Testing "+userName); boolean isRegistered = server.isRegistered(userName); assertTrue(userName+" is registered", isRegistered); server.setAttribute(userName, new Attribute("ArtificialAttribute", "test-value")); String actual = (String)server.getAttribute(userName, "ArtificialAttribute"); assertTrue("ArtificialAttribute should be 'test-value' rather than " + actual, "test-value".equals(actual)); } finally { undeploy(PACKAGE_NAME); } // end of try-finally } /** Test the generation of AVCs from target resources that are * NotificationBroadcasters, too, like a class extending ServiceMBeanSupport * @throws Exception on failure */ public void testGeneratedAVCFromWrappedStandardMBeanImpl() throws Exception { getLog().info("+++ testGeneratedAVCFromWrappedStandardMBeanImpl"); String module = "listener-xmbean.sar"; ObjectName target = new ObjectName("jboss.test:service=self-listener-xmbean"); MBeanServerConnection server = getServer(); try { deploy(module); getLog().info("Testing " + target); boolean isRegistered = server.isRegistered(target); assertTrue(target + " is registered", isRegistered); server.setAttribute(target, new Attribute("Attr1", Boolean.TRUE)); Boolean gotAttr1AVC = (Boolean)server.getAttribute(target, "GotAttr1AVC"); assertTrue("XMBean got an AVC for the attribute change: " + gotAttr1AVC.booleanValue(), gotAttr1AVC.booleanValue()); } finally { undeploy(module); } } /** Test the hand generated xmbean descriptor * @throws Exception on failure */ public void testDeployUserXMBean() throws Exception { getLog().info("+++ testDeployUserXMBean"); ObjectName user2Name = new ObjectName("jboss.test:service=xmbean-user2"); MBeanServerConnection server = getServer(); try { deploy(PACKAGE_NAME); getLog().info("Testing "+user2Name); assertTrue(user2Name+" is registered", server.isRegistered(user2Name)); // Validate that Attr1 is read-write String attr1 = (String) server.getAttribute(user2Name, "Attr1"); getLog().info("Attr1: "+attr1); assertTrue("Attr1 == attr1-string", attr1.equals("attr1-string")); Attribute attr1Info = new Attribute("Attr1", "attr1-string#2"); server.setAttribute(user2Name, attr1Info); attr1 = (String) server.getAttribute(user2Name, "Attr1"); assertTrue("Attr1 == attr1-string#2", attr1.equals("attr1-string#2")); // Validate that Attr2 is read-write Integer attr2 = (Integer) server.getAttribute(user2Name, "Attr2"); getLog().info("Attr2: "+attr2); assertTrue("Attr2 == 15", attr2.intValue() == 15); Attribute attr2Info = new Attribute("Attr2", new Integer(51)); server.setAttribute(user2Name, attr2Info); attr2 = (Integer) server.getAttribute(user2Name, "Attr2"); assertTrue("Attr2 == 51", attr2.intValue() == 51); // Validate that Attr3 is read-write CustomType attr3 = (CustomType) server.getAttribute(user2Name, "Attr3"); getLog().info("Attr3: "+attr3); assertTrue("Attr3 == 15", attr3.toString().equals("{10.20}")); Attribute attr3Info = new Attribute("Attr3", new CustomType(11, 22)); server.setAttribute(user2Name, attr3Info); attr3 = (CustomType) server.getAttribute(user2Name, "Attr3"); assertTrue("Attr3 == 51", attr3.toString().equals("{11.22}")); // Validate that HashCode is read-only Integer hash = (Integer) server.getAttribute(user2Name, "HashCode"); getLog().info("HashCode: "+hash); Attribute hashInfo = new Attribute("HashCode", new Integer(12345)); try { server.setAttribute(user2Name, hashInfo); fail("Was able to set HashCode attribute"); } catch(Exception e) { getLog().info("set HashCode attribute failed as expected", e); } // Validate that Pi is read-only Double pi = (Double) server.getAttribute(user2Name, "Pi"); getLog().info("Pi: "+pi); assertTrue("Pi == 3.14159", pi.doubleValue() == 3.14159); Attribute piInfo = new Attribute("Pi", new Double(7.654321)); try { server.setAttribute(user2Name, piInfo); fail("Was able to set Pi attribute"); } catch(Exception e) { getLog().info("set Pi attribute failed as expected", e); } // Validate that SecMgr is read-write ObjectName defaultSecMgr = new ObjectName("jboss.security:service=JaasSecurityManager"); ObjectName secMgr = (ObjectName) server.getAttribute(user2Name, "SecMgr"); getLog().info("SecMgr: "+secMgr); assertTrue("SecMgr == jboss.security:service=JaasSecurityManager", secMgr.equals(defaultSecMgr)); ObjectName newSecMgr = new ObjectName("jboss.security:service=JaasSecMgr2"); Attribute secMgrInfo = new Attribute("SecMgr", newSecMgr); server.setAttribute(user2Name, secMgrInfo); secMgr = (ObjectName) server.getAttribute(user2Name, "SecMgr"); assertTrue("SecMgr == jboss.security:service=JaasSecMgr2", secMgr.equals(newSecMgr)); Object[] noopArgs = {}; String[] noopSig = {}; server.invoke(user2Name, "noop", noopArgs, noopSig); Object[] echoArgs = {"testDeployUserXMBean"}; String[] echoSig = {"java.lang.String"}; String rtn = (String) server.invoke(user2Name, "echoDate", echoArgs, echoSig); getLog().info("echoDate: "+rtn); } finally { undeploy(PACKAGE_NAME); } // end of try-finally } /** Test the hand generated xmbean descriptor that is embedded in the service * descriptor. * @throws Exception on failure */ public void testDeployUserEmbeddedDescriptorXMBean() throws Exception { getLog().info("+++ testDeployUserEmbeddedDescriptorXMBean"); ObjectName user2Name = new ObjectName("jboss.test:service=xmbean-user2"); MBeanServerConnection server = getServer(); try { deploy("user2-xmbean-embedded.sar"); getLog().info("Testing "+user2Name); assertTrue(user2Name+" is registered", server.isRegistered(user2Name)); // Validate that Attr1 is read-write String attr1 = (String) server.getAttribute(user2Name, "Attr1"); getLog().info("Attr1: "+attr1); assertTrue("Attr1 == attr1-string", attr1.equals("attr1-string")); Attribute attr1Info = new Attribute("Attr1", "attr1-string#2"); server.setAttribute(user2Name, attr1Info); attr1 = (String) server.getAttribute(user2Name, "Attr1"); assertTrue("Attr1 == attr1-string#2", attr1.equals("attr1-string#2")); // Validate that Attr2 is read-write Integer attr2 = (Integer) server.getAttribute(user2Name, "Attr2"); getLog().info("Attr2: "+attr2); assertTrue("Attr2 == 15", attr2.intValue() == 15); Attribute attr2Info = new Attribute("Attr2", new Integer(51)); server.setAttribute(user2Name, attr2Info); attr2 = (Integer) server.getAttribute(user2Name, "Attr2"); assertTrue("Attr2 == 51", attr2.intValue() == 51); // Validate that Attr3 is read-write CustomType attr3 = (CustomType) server.getAttribute(user2Name, "Attr3"); getLog().info("Attr3: "+attr3); assertTrue("Attr3 == 15", attr3.toString().equals("{10.20}")); Attribute attr3Info = new Attribute("Attr3", new CustomType(11, 22)); server.setAttribute(user2Name, attr3Info); attr3 = (CustomType) server.getAttribute(user2Name, "Attr3"); assertTrue("Attr3 == 51", attr3.toString().equals("{11.22}")); // Validate that HashCode is read-only Integer hash = (Integer) server.getAttribute(user2Name, "HashCode"); getLog().info("HashCode: "+hash); Attribute hashInfo = new Attribute("HashCode", new Integer(12345)); try { server.setAttribute(user2Name, hashInfo); fail("Was able to set HashCode attribute"); } catch(Exception e) { getLog().info("set HashCode attribute failed as expected", e); } // Validate that Pi is read-only Double pi = (Double) server.getAttribute(user2Name, "Pi"); getLog().info("Pi: "+pi); assertTrue("Pi == 3.14159", pi.doubleValue() == 3.14159); Attribute piInfo = new Attribute("Pi", new Double(7.654321)); try { server.setAttribute(user2Name, piInfo); fail("Was able to set Pi attribute"); } catch(Exception e) { getLog().info("set Pi attribute failed as expected", e); } // Validate that SecMgr is read-write ObjectName defaultSecMgr = new ObjectName("jboss.security:service=JaasSecurityManager"); ObjectName secMgr = (ObjectName) server.getAttribute(user2Name, "SecMgr"); getLog().info("SecMgr: "+secMgr); assertTrue("SecMgr == jboss.security:service=JaasSecurityManager", secMgr.equals(defaultSecMgr)); ObjectName newSecMgr = new ObjectName("jboss.security:service=JaasSecMgr2"); Attribute secMgrInfo = new Attribute("SecMgr", newSecMgr); server.setAttribute(user2Name, secMgrInfo); secMgr = (ObjectName) server.getAttribute(user2Name, "SecMgr"); assertTrue("SecMgr == jboss.security:service=JaasSecMgr2", secMgr.equals(newSecMgr)); Object[] noopArgs = {}; String[] noopSig = {}; server.invoke(user2Name, "noop", noopArgs, noopSig); Object[] echoArgs = {"testDeployUserXMBean"}; String[] echoSig = {"java.lang.String"}; String rtn = (String) server.invoke(user2Name, "echoDate", echoArgs, echoSig); getLog().info("echoDate: "+rtn); } finally { undeploy("user2-xmbean-embedded.sar"); } // end of try-finally } /** Tests of the attribute value settings from the xmbean descriptor * @throws Exception on failure */ public void testUserXMBeanValues() throws Exception { getLog().info("+++ testUserXMBeanValues"); try { ObjectName user2Name1 = new ObjectName("jboss.test:service=xmbean-user2,version=values1"); MBeanServerConnection server = getServer(); deploy("user2-xmbean.sar"); getLog().info("Testing "+user2Name1); assertTrue(user2Name1+" is registered", server.isRegistered(user2Name1)); String value = (String) server.getAttribute(user2Name1, "Attr1"); assertTrue("value == Att1InitialValue, value="+value, value.equals("Att1InitialValue")); } finally { undeploy("user2-xmbean.sar"); } } /** Tests of the attribute value settings from the xmbean descriptor * @throws Exception on failure */ public void testUserXMBeanPersistentValues() throws Exception { getLog().info("+++ testUserXMBeanPersistentValues"); MBeanServerConnection server = getServer(); // Deploy the RemoveUser2Store.bsh script deploy("RemoveUser2Store.bsh"); ObjectName user2Name2 = new ObjectName("jboss.test:service=xmbean-user2,version=values2"); try { deploy("user2-xmbean.sar"); log.info("Testing "+user2Name2); assertTrue(user2Name2+" is registered", server.isRegistered(user2Name2)); String value = (String) server.getAttribute(user2Name2, "Attr1"); assertTrue("value == Att1InitialValue, value="+value, value.equals("Att1InitialValue")); log.info("Initial Attr1 value: "+value); // Update the Attr1 value Attribute attr1 = new Attribute("Attr1", "UpdatedAttr1Value"); server.setAttribute(user2Name2, attr1); // Undeploy undeploy("user2-xmbean.sar"); // Reploy and validate persistence of Attr1 deploy("user2-xmbean.sar"); value = (String) server.getAttribute(user2Name2, "Attr1"); assertTrue("value == UpdatedAttr1Value, value="+value, value.equals("UpdatedAttr1Value")); log.info("After redeploy Attr1 value: "+value); } finally { undeploy("user2-xmbean.sar"); undeploy("RemoveUser2Store.bsh"); } } /** Tests of the attribute value settings from the xmbean descriptor * @throws Exception on failure */ public void testUserXMBeanPersistentValuesWithCustomPM() throws Exception { getLog().info("+++ testUserXMBeanPersistentValuesWithCustomPM"); MBeanServerConnection server = getServer(); // Deploy the RemoveUser3Store.bsh script deploy("RemoveUser3Store.bsh"); ObjectName user3Name = new ObjectName("jboss.test:service=xmbean-user2,version=xmlpm"); try { deploy("user3-xmbean.sar"); getLog().info("Testing "+user3Name); assertTrue(user3Name+" is registered", server.isRegistered(user3Name)); String value = (String) server.getAttribute(user3Name, "Attr1"); assertTrue("value == Att1InitialValue, value="+value, value.equals("Att1InitialValueXMLPM")); log.info("Initial Attr1 value: "+value); // Update the Attr1 value Attribute attr1 = new Attribute("Attr1", "UpdatedAttr1ValueXMLPM"); server.setAttribute(user3Name, attr1); // Undeploy undeploy("user3-xmbean.sar"); // Reploy and validate persistence of Attr1 deploy("user3-xmbean.sar"); value = (String) server.getAttribute(user3Name, "Attr1"); assertTrue("value == UpdatedAttr1Value, value="+value, value.equals("UpdatedAttr1ValueXMLPM")); log.info("After redeploy Attr1 value: "+value); } finally { undeploy("user3-xmbean.sar"); undeploy("RemoveUser3Store.bsh"); } } /** Test an xmbean deployment with a custom security interceptor * @throws Exception on failure */ public void testSecuredXMBean() throws Exception { getLog().info("+++ testSecuredXMBean"); ObjectName xmbean = new ObjectName("jboss.test:service=SecuredXMBean"); MBeanServerConnection server = getServer(); try { deploy("interceptors-xmbean.sar"); getLog().info("Testing "+xmbean); boolean isRegistered = server.isRegistered(xmbean); assertTrue(xmbean+" is registered", isRegistered); Object[] args = {"Hello"}; String[] sig = {"java.lang.String"}; try { server.invoke(xmbean, "secretEcho", args, sig); fail("Was able to invoke secretEcho"); } catch(Exception e) { getLog().info("secretEcho op failed as expected", e); } String echo = (String) server.invoke(xmbean, "echo", args, sig); getLog().info("echo returned: "+echo); } finally { undeploy("interceptors-xmbean.sar"); } // end of try-finally } /** Test an xmbean deployment with a custom security interceptor * @throws Exception on failure */ public void testSecuredJndiXMBean() throws Exception { getLog().info("+++ testSecuredJndiXMBean"); ObjectName xmbean = new ObjectName("jboss.test:service=Naming,secured=true,persistent=true"); MBeanServerConnection server = getServer(); try { deploy("interceptors-xmbean.sar"); getLog().info("Testing "+xmbean); boolean isRegistered = server.isRegistered(xmbean); assertTrue(xmbean+" is registered", isRegistered); // Lookup the Naming interface InitialContext ctx = this.getInitialContext(); Naming naming = (Naming) ctx.lookup("secure/Naming"); getLog().info("Found Naming proxy: "+naming); Name hello = ctx.getNameParser("").parse("Hello"); // Try to create a binding without security context try { naming.bind(hello, "HelloBinding", "java.lang.String"); fail("Was able to invoke secretEcho"); } catch(Exception e) { getLog().info("bind op failed as expected", e); } SimplePrincipal jduke = new SimplePrincipal("jduke"); SecurityAssociation.setPrincipal(jduke); SecurityAssociation.setCredential("theduke".toCharArray()); naming.bind(hello, "HelloBinding", "java.lang.String"); getLog().info("Was able to create Hello binding"); SimplePrincipal guest = new SimplePrincipal("guest"); SecurityAssociation.setPrincipal(guest); SecurityAssociation.setCredential("guest".toCharArray()); try { naming.bind(hello, "HelloBinding2", "java.lang.String"); fail("guest was able to create binding"); } catch(Exception e) { getLog().info("guest bind op failed as expected", e); } } finally { undeploy("interceptors-xmbean.sar"); } // end of try-finally } /** Test an xmbean deployment with a custom security interceptor and * persistence interceptor. This runs after the testSecuredJndiXMBean * test and access the * @throws Exception on failure */ public void testPersistentJndiXMBean() throws Exception { getLog().info("+++ testPersistentJndiXMBean"); ObjectName xmbean = new ObjectName("jboss.test:service=Naming,secured=true,persistent=true"); MBeanServerConnection server = getServer(); try { deploy("interceptors-xmbean.sar"); getLog().info("Testing "+xmbean); boolean isRegistered = server.isRegistered(xmbean); assertTrue(xmbean+" is registered", isRegistered); // Lookup the Naming interface InitialContext ctx = this.getInitialContext(); Naming naming = (Naming) ctx.lookup("secure/Naming"); getLog().info("Found Naming proxy: "+naming); Name hello = ctx.getNameParser("").parse("Hello"); SimplePrincipal jduke = new SimplePrincipal("jduke"); SecurityAssociation.setPrincipal(jduke); SecurityAssociation.setCredential("theduke".toCharArray()); // Lookup the previous Hello binding String value = (String) naming.lookup(hello); assertTrue("lookup(Hello) == HelloBinding", value.equals("HelloBinding")); getLog().info("lookup(Hello) = "+value); } finally { undeploy("interceptors-xmbean.sar"); } // end of try-finally } /** Test an xmbean deployment with an xmbean descriptor that * imports an external 'entity' with operation definitions. * The deployed service simply creates a second instance of * JNDIView * @throws Exception on failure */ public void testXMBeanExternalEntityImport() throws Exception { getLog().info("+++ testXMBeanExternalEntityImport"); try { deploy("xmbean-entity-import.sar"); boolean isRegistered = getServer().isRegistered(new ObjectName("jboss:service=JNDIView2")); assertTrue("'jboss:service=JNDIView2' registered", isRegistered); } finally { undeploy("xmbean-entity-import.sar"); } } }