/* * 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.profileservice.test; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.TreeSet; import javax.naming.InitialContext; import junit.framework.Test; import junit.framework.TestSuite; import org.jboss.deployers.spi.management.KnownDeploymentTypes; import org.jboss.deployers.spi.management.ManagementView; import org.jboss.deployers.spi.management.deploy.DeploymentManager; import org.jboss.managed.api.ComponentType; import org.jboss.managed.api.DeploymentTemplateInfo; import org.jboss.managed.api.ManagedComponent; import org.jboss.managed.api.ManagedDeployment; import org.jboss.managed.api.ManagedOperation; import org.jboss.managed.api.ManagedProperty; import org.jboss.managed.api.RunState; import org.jboss.managed.api.annotation.ViewUse; import org.jboss.metatype.api.types.CompositeMetaType; import org.jboss.metatype.api.types.MapCompositeMetaType; import org.jboss.metatype.api.types.MetaType; import org.jboss.metatype.api.values.CompositeValue; import org.jboss.metatype.api.values.MetaValue; import org.jboss.metatype.api.values.SimpleValueSupport; import org.jboss.profileservice.spi.NoSuchProfileException; import org.jboss.profileservice.spi.ProfileKey; import org.jboss.profileservice.spi.ProfileService; import org.jboss.test.util.jms.JMSDestinationsUtil; /** Test of using ProfileService @author Scott.Stark@jboss.org @version $Revision: 105883 $ */ public class ProfileServiceUnitTestCase extends AbstractProfileServiceTest { /** The profileservice server name. */ public static final String PROFILESERVICE_SERVER_NAME = "profileservice"; /** * We need to define the order in which tests runs * @return * @throws Exception */ public static Test suite() throws Exception { TestSuite suite = new TestSuite(); // these tests are written for JBM if (JMSDestinationsUtil.isJBM()) { suite.addTest(new ProfileServiceUnitTestCase("testProfileKeys")); suite.addTest(new ProfileServiceUnitTestCase("testDeploymentNames")); suite.addTest(new ProfileServiceUnitTestCase("testIgnoredDeploymentNames")); suite.addTest(new ProfileServiceUnitTestCase("testTemplateNames")); suite.addTest(new ProfileServiceUnitTestCase("testNoSuchProfileException")); // JMS suite.addTest(new ProfileServiceUnitTestCase("testJmsDestinationComponents")); // DataSource suite.addTest(new ProfileServiceUnitTestCase("testLocalTxDataSourceTemplatePropertiesAreMetaValues")); suite.addTest(new ProfileServiceUnitTestCase("testXADataSourceTemplateTemplatePropertiesAreMetaValues")); suite.addTest(new ProfileServiceUnitTestCase("testDataSourceDeploymentType")); suite.addTest(new ProfileServiceUnitTestCase("testListDataSourceComponents")); suite.addTest(new ProfileServiceUnitTestCase("testUpdateDefaultDS")); suite.addTest(new ProfileServiceUnitTestCase("testDefaultDSOps")); suite.addTest(new ProfileServiceUnitTestCase("testDefaultDSStats")); } return suite; } public ProfileServiceUnitTestCase(String name) { super(name); } /** * Basic test of accessing the ProfileService and checking the * available profile keys. * * As we are running the -c profileservice, the default key should be profileservice. * */ public void testProfileKeys() throws Exception { InitialContext ctx = super.getInitialContext(); ProfileService ps = (ProfileService) ctx.lookup("ProfileService"); Collection<ProfileKey> keys = ps.getActiveProfileKeys(); log.info("getProfileKeys: "+keys); ProfileKey defaultKey = new ProfileKey(PROFILESERVICE_SERVER_NAME); assertTrue("keys contains profileservice", keys.contains(defaultKey)); } /** * Validate some of the expected deployment names. This test will have * to be updated as the profile repository format evolves, and descriptors * change. * @throws Exception */ public void testDeploymentNames() throws Exception { ManagementView mgtView = getManagementView(); Set<String> names = mgtView.getDeploymentNames(); log.info("getDeploymentNames, "+names); /* Build a set of the simple deployment names with their immeadiate * parent directory */ HashSet<String> simpleNames = new HashSet<String>(); for (String name : names) { // Look for /server/profileservice/ String serverName = "/server/"+ PROFILESERVICE_SERVER_NAME + "/"; int index = name.indexOf(serverName); if (index == -1) { // ignore names from /testsuite/output/lib for now continue; } String sname = name.substring(index + serverName.length(), name.length()); simpleNames.add(sname); } log.info("Deployment simple names: " + simpleNames); // Validate some well known deployments String[] expectedNames = { "conf/bootstrap/aop.xml", "conf/bootstrap/classloader.xml", "conf/bootstrap/deployers.xml", "conf/bootstrap/jmx.xml", "conf/bootstrap/profile.xml", "conf/jboss-service.xml", "deployers/jbossweb.deployer/", "deployers/ear-deployer-jboss-beans.xml", "deployers/jbossws.deployer/", "deployers/ejb-deployer-jboss-beans.xml", "deployers/ejb3.deployer/", "deployers/jboss-aop-jboss5.deployer/", "deployers/security-deployer-jboss-beans.xml", "deployers/jboss-jca.deployer/", "deploy/hsqldb-ds.xml", "deploy/jboss-local-jdbc.rar/", "deploy/jboss-xa-jdbc.rar/", "deploy/jca-jboss-beans.xml", "deploy/jbossws.sar/", "deploy/messaging/connection-factories-service.xml", "deploy/messaging/destinations-service.xml", "deploy/jms-ra.rar/", "deploy/jmx-console.war/", "deploy/jmx-invoker-service.xml", "deploy/jsr88-service.xml", "deploy/mail-service.xml", "deploy/ROOT.war/" }; TreeSet<String> missingNames = new TreeSet<String>(); for (String name : expectedNames) { if(simpleNames.contains(name) == false) missingNames.add(name); } assertEquals("There are missing names: "+missingNames + ", available: " + simpleNames, 0, missingNames.size()); } public void testManagedDeployments() throws Exception { ManagementView mgtView = getManagementView(); Set<String> names = mgtView.getDeploymentNames(); for(String name : names) { ManagedDeployment deployment = mgtView.getDeployment(name); log.info(deployment); } } /** * Test that ignored deployments are not deployed. * e.g. ignore.war.bak in the deploy dir * * @throws Exception */ public void testIgnoredDeploymentNames() throws Exception { ManagementView mgtView = getManagementView(); Set<String> names = mgtView.getDeploymentNames(); for(String name : names) { if(name.endsWith(".bak")) fail("deployment should be ignored: " + name); } } public void test() throws Exception { ManagementView mgtView = getManagementView(); ManagedDeployment aop = mgtView.getDeployment("ejb3-interceptors-aop.xml"); assertNotNull(aop); log.info(aop); } /** * Test the expected template names * @throws Exception */ public void testTemplateNames() throws Exception { ManagementView mgtView = getManagementView(); Set<String> names = mgtView.getTemplateNames(); log.info("getTemplateNames, "+names); assertTrue("TopicTemplate exists", names.contains("TopicTemplate")); assertTrue("QueueTemplate exists", names.contains("QueueTemplate")); assertTrue("LocalTxDataSourceTemplate exists", names.contains("LocalTxDataSourceTemplate")); assertTrue("TxConnectionFactoryTemplate exists", names.contains("TxConnectionFactoryTemplate")); assertTrue("NoTxConnectionFactoryTemplate exists", names.contains("NoTxConnectionFactoryTemplate")); } /** * Basic test to validate NoSuchProfileException is thrown for * a ProfileKey that does not map to a profile. * */ public void testNoSuchProfileException() throws Exception { DeploymentManager deployMgr = getDeploymentManager(); ProfileKey badKey = new ProfileKey("no-such-profile"); try { deployMgr.loadProfile(badKey); fail("Did not see NoSuchProfileException"); } catch(NoSuchProfileException e) { assertTrue("NoSuchProfileException", e.getMessage().contains("no-such-profile")); } } /** * Test that one can query for deployments of type jca-ds to * obtain data source deployments. * TODO: don't know if we should keep this */ public void testDataSourceDeploymentType() throws Exception { ManagementView mgtView = getManagementView(); Set<String> names = mgtView.getDeploymentNamesForType("jca-ds"); log.info("jca-ds names: "+names); assertTrue("names.size > 0 ", names.size() > 0); boolean sawHsqldbDS = false; for (String name : names) { sawHsqldbDS = name.endsWith("hsqldb-ds.xml"); if (sawHsqldbDS) break; } assertTrue("Saw hsqldb-ds.xml in names", sawHsqldbDS); } public void testWarDeploymentType() throws Exception { ManagementView mgtView = getManagementView(); Set<String> names = mgtView.getDeploymentNamesForType(KnownDeploymentTypes.JavaEEWebApplication.getType()); log.info("war names: "+names); assertTrue("names.size > 0 ", names.size() > 0); boolean sawRootWar = false; for (String name : names) { sawRootWar = name.endsWith("ROOT.war") || name.endsWith("ROOT.war/"); if (sawRootWar) break; } assertTrue("Saw ROOT.war in names", sawRootWar); } public void testSarDeploymentType() throws Exception { ManagementView mgtView = getManagementView(); Set<String> names = mgtView.getDeploymentNamesForType(KnownDeploymentTypes.JBossServices.getType()); log.info("sar names: "+names); assertTrue("names.size > 0 ", names.size() > 0); // To check for a jbossweb.sar boolean sawJbosswebSar = false; // To check for a transaction-service.xml boolean sawTSService = false; for (String name : names) { if(sawJbosswebSar == false) sawJbosswebSar = name.endsWith("jbossweb.sar") || name.endsWith("jbossweb.sar/"); if(sawTSService == false) sawTSService = name.endsWith("transaction-service.xml"); } assertTrue("Saw jbossweb.sar in names", sawJbosswebSar); assertTrue("Saw transaction-service.xml in names", sawTSService); } public void testMCBeansDeploymentType() throws Exception { ManagementView mgtView = getManagementView(); Set<String> names = mgtView.getDeploymentNamesForType(KnownDeploymentTypes.MCBeans.getType()); log.info("beans names: "+names); assertTrue("names.size > 0 ", names.size() > 0); // To check for a jbossweb.deployer boolean sawJbosswebDeployer = false; // To check for a profileservice-beans.xml boolean sawPSBeans = false; // To check for a security-beans.xml boolean sawSecurityBeans = false; for (String name : names) { if(sawJbosswebDeployer == false) sawJbosswebDeployer = name.endsWith("jbossweb.deployer") || name.endsWith("jbossweb.deployer/"); if(sawPSBeans == false) sawPSBeans = name.endsWith("profileservice-beans.xml"); if(sawSecurityBeans == false) sawSecurityBeans = name.endsWith("security-beans.xml"); } assertTrue("Saw jbossweb.deployer in names", sawJbosswebDeployer); assertTrue("Saw profileservice-beans.xml in names", sawPSBeans); assertTrue("Saw security-beans.xml in names", sawSecurityBeans); } /** * test api usage only * @throws Exception */ public void testRemoveComponent () throws Exception { String componentName = "defaultDS"; ManagementView mgtView = getManagementView(); ComponentType type = new ComponentType("DataSource", "LocalTx"); Set<ManagedComponent> comps = mgtView.getComponentsForType(type); // maybe a mgtView.getComponentByNameAndType(type, componentName) would be helpful // i'm assuming componentName and type will be unique in a given profile. if (comps != null) { for (ManagedComponent comp : comps) { if (componentName.equals(comp.getName())) { ManagedDeployment deployment = comp.getDeployment(); deployment.removeComponent(componentName); break; } } } } /** * Query for the ComponentType("DataSource", "LocalTx") * and validate the expected property names. * @throws Exception */ public void testListDataSourceComponents() throws Exception { log.info("+++ testListDataSourceComponents"); ManagementView mgtView = getManagementView(); ComponentType type = new ComponentType("DataSource", "LocalTx"); ManagedComponent ds = getManagedComponent(mgtView, type, "DefaultDS"); assertNotNull("hsqldb-ds.xml ManagedComponent", ds); Map<String,ManagedProperty> props = ds.getProperties(); log.info("hsqldb-ds.props: "+props); // Validate the property names ManagedProperty p = props.get("jndi-name"); assertEquals("jndi-name", SimpleValueSupport.wrap("DefaultDS"), p.getValue()); p = props.get("driver-class"); assertEquals("driver-class", SimpleValueSupport.wrap("org.hsqldb.jdbcDriver"), p.getValue()); p = props.get("connection-url"); assertEquals("connection-url", SimpleValueSupport.wrap("jdbc:hsqldb:${jboss.server.data.dir}${/}hypersonic${/}localDB"), p.getValue()); p = props.get("user-name"); assertEquals("user-name", SimpleValueSupport.wrap("sa"), p.getValue()); p = props.get("password"); assertEquals("password", SimpleValueSupport.wrap(""), p.getValue()); p = props.get("min-pool-size"); assertEquals("min-pool-size", SimpleValueSupport.wrap(5), p.getValue()); p = props.get("max-pool-size"); assertEquals("max-pool-size", SimpleValueSupport.wrap(20), p.getValue()); p = props.get("idle-timeout-minutes"); assertEquals("idle-timeout-minutes", SimpleValueSupport.wrap(0), p.getValue()); p = props.get("prepared-statement-cache-size"); assertEquals("prepared-statement-cache-size", SimpleValueSupport.wrap(32), p.getValue()); /* TODO - Uncomment when Weston has ManagedConnectionFactoryDeploymentMetaData/DBMSMetaData done p = props.get("type-mapping"); assertEquals("type-mapping", SimpleValueSupport.wrap("Hypersonic SQL"), p.getValue()); */ p = props.get("security-domain"); assertNotNull("security-domain", p); CompositeMetaType secType = (CompositeMetaType) p.getMetaType(); assertNotNull(secType); assertTrue(secType.containsItem("domain")); assertTrue(secType.containsItem("securityDeploymentType")); log.info("security-domain: "+secType); } /** * Query for the ComponentType("JMSDestination", "Queue"/"Topic") types. * @throws Exception */ public void testJmsDestinationComponents() throws Exception { ManagementView mgtView = getManagementView(); ComponentType queueType = new ComponentType("JMSDestination", "Queue"); Set<ManagedComponent> queues = mgtView.getComponentsForType(queueType); log.info("queues: "+queues); assertNotNull("Null JMS queues", queues); assertTrue("queues.size", queues.size() > 0); ComponentType topicType = new ComponentType("JMSDestination", "Topic"); Set<ManagedComponent> topics = mgtView.getComponentsForType(topicType); log.info("topics: "+topics); assertNotNull(topics); assertTrue("topics.size", topics.size() > 0); } /** * Test an update of the hsqldb-ds.xml min/max pool size. This queries * the mbeans to validate runtime changes to the min/max pool size. This * couples the test to the deployment implementation details. * * @throws Exception */ public void testUpdateDefaultDS() throws Exception { log.info("+++ testUpdateDefaultDS"); ManagementView mgtView = getManagementView(); ComponentType type = new ComponentType("DataSource", "LocalTx"); ManagedComponent hsqldb = mgtView.getComponent("DefaultDS", type); Map<String,ManagedProperty> props = hsqldb.getProperties(); log.info("hsqldb.props: "+props); // Update properties ManagedProperty minSize = props.get("min-pool-size"); minSize.setValue(SimpleValueSupport.wrap(new Integer(13))); ManagedProperty maxSize = props.get("max-pool-size"); maxSize.setValue(SimpleValueSupport.wrap(new Integer(53))); mgtView.updateComponent(hsqldb); // TODO: Query the mbeans to validate the change // TODO: Query the profile service repository for the overriden data } /** * Validate that the LocalTxDataSourceTemplate ManagedPropertys are values are of type MetaValue * @throws Exception */ public void testLocalTxDataSourceTemplatePropertiesAreMetaValues() throws Exception { ManagementView mgtView = getManagementView(); DeploymentTemplateInfo dsInfo = mgtView.getTemplate("LocalTxDataSourceTemplate"); Map<String,ManagedProperty> props = dsInfo.getProperties(); validatePropertyMetaValues(props); } /** * Validate that the XADataSourceTemplate ManagedPropertys are values are of type MetaValue * @throws Exception */ public void testXADataSourceTemplateTemplatePropertiesAreMetaValues() throws Exception { ManagementView mgtView = getManagementView(); DeploymentTemplateInfo dsInfo = mgtView.getTemplate("XADataSourceTemplate"); Map<String,ManagedProperty> props = dsInfo.getProperties(); validatePropertyMetaValues(props); } /** * Validate that there is only 1 DefaultDS ManagedComponent * @throws Exception */ public void testDefaultDSComponentCount() throws Exception { ManagementView mgtView = getManagementView(); ComponentType type = new ComponentType("DataSource", "LocalTx"); Set<ManagedComponent> comps = mgtView.getComponentsForType(type); int count = 0; for (ManagedComponent comp : comps) { String cname = comp.getName(); if( cname.endsWith("DefaultDS") ) { count ++; } } assertEquals("There is 1 DefaultDS ManagedComponent", 1, 1); } /** * Validate that all ManagedPropertys are values are of type MetaValue * @throws Exception */ public void testDefaultDSPropertiesAreMetaValues() throws Exception { ManagementView mgtView = getManagementView(); ComponentType type = new ComponentType("DataSource", "LocalTx"); ManagedComponent hsqldb = mgtView.getComponent("DefaultDS", type); Map<String,ManagedProperty> props = hsqldb.getProperties(); validatePropertyMetaValues(props); // Validate the config-property ManagedProperty configProperty = hsqldb.getProperty("config-property"); assertNotNull(configProperty); MetaValue value = configProperty.getValue(); assertTrue("MapCompositeMetaType", value.getMetaType() instanceof MapCompositeMetaType); log.debug("config-property: "+configProperty); assertTrue(value instanceof CompositeValue); log.debug("config-property.value: "+value); // Validate more details on specific properties ManagedProperty interleaving = props.get("interleaving"); assertNotNull("interleaving", interleaving); assertNotNull("interleaving.value", interleaving.getValue()); ManagedProperty poolJndiName = props.get("poolJndiName"); assertNotNull("poolJndiName", poolJndiName); assertNotNull("poolJndiName.value", poolJndiName.getValue()); ManagedProperty securityDomain = props.get("security-domain"); assertNotNull("security-domain", securityDomain); MetaType securityDomainType = securityDomain.getMetaType(); assertTrue("security-domain type is a GenericMetaType", securityDomainType instanceof CompositeMetaType); log.debug("security-domain type: "+securityDomainType); MetaValue securityDomainValue = securityDomain.getValue(); assertTrue("security-domain value is a GenericValue", securityDomainValue instanceof CompositeValue); log.debug("security-domain value: "+securityDomainValue); } /** * Validate the DefaultDS stats that are non-null * * @throws Exception */ public void testDefaultDSStats() throws Exception { ManagementView mgtView = getManagementView(); ComponentType type = new ComponentType("DataSource", "LocalTx"); ManagedComponent hsqldb = mgtView.getComponent("DefaultDS", type); Map<String,ManagedProperty> props = hsqldb.getProperties(); ArrayList<ManagedProperty> stats = new ArrayList<ManagedProperty>(); for(ManagedProperty prop : props.values()) { if(prop.hasViewUse(ViewUse.STATISTIC)) { log.info("STATISTIC: "+prop+", value: "+prop.getValue()); stats.add(prop); } } assertTrue("Saw ManagedProperty(ViewUse.STATISTIC)", stats.size() > 0); HashSet<String> nullStats = new HashSet<String>(); // These should also have non-null values for(ManagedProperty stat : stats) { Object value = stat.getValue(); if(value == null) nullStats.add(stat.getName()); } assertTrue("There are no null stats: "+nullStats, nullStats.size() == 0); // Validate the component run state RunState state = hsqldb.getRunState(); assertEquals("DefaultDS is running", RunState.RUNNING, state); } /** * Validate that the DefaultDS management ops work and that they have the * expected MetaValue return type. * * @throws Exception */ public void testDefaultDSOps() throws Exception { ManagementView mgtView = getManagementView(); ComponentType type = new ComponentType("DataSource", "LocalTx"); ManagedComponent hsqldb = mgtView.getComponent("DefaultDS", type); Set<ManagedOperation> ops = hsqldb.getOperations(); log.info("DefaultDS ops: "+ops); assertNotNull("Set<ManagedOperation>", ops); assertTrue("Set<ManagedOperation> > 0", ops.size() > 0); ManagedOperation listFormattedSubPoolStatistics = null; HashMap<String, ManagedOperation> opsByName = new HashMap<String, ManagedOperation>(); for (ManagedOperation op : ops) { opsByName.put(op.getName(), op); } // Validate the listFormattedSubPoolStatistics op listFormattedSubPoolStatistics = opsByName.get("listFormattedSubPoolStatistics"); assertNotNull("listFormattedSubPoolStatistics", listFormattedSubPoolStatistics); MetaValue[] params = {}; Object result = listFormattedSubPoolStatistics.invoke(params); assertNotNull("Expecting non null result", result); log.info("listFormattedSubPoolStatistics.invoke: "+result); // It needs to be a MetaValue as well assertTrue("result is a MetaValue", result instanceof MetaValue); // Validate the listStatistics op ManagedOperation listStatistics = opsByName.get("listStatistics"); assertNotNull("listStatistics", listStatistics); result = listStatistics.invoke(params); assertNotNull("Expecting non null result", result); log.info("listStatistics.invoke: "+result); // It needs to be a MetaValue as well assertTrue("result is a MetaValue", result instanceof MetaValue); } /** * Validate that there is only 1 DefaultDS ManagedComponent * @throws Exception */ public void testJTAComponentCount() throws Exception { ManagementView mgtView = getManagementView(); ComponentType type = new ComponentType("MCBean", "JTA"); Set<ManagedComponent> comps = mgtView.getComponentsForType(type); int count = comps.size(); assertEquals("There is 1 MCBean:JTA ManagedComponent", 1, 1); ManagedComponent comp = comps.iterator().next(); Map<String, ManagedProperty> props = comp.getProperties(); for(ManagedProperty prop : props.values()) { log.info(prop+", : "+prop.getValue()); } } // Private and protected protected void createComponentTest(String templateName, Map<String, MetaValue> propValues, String deploymentName, ComponentType componentType, String componentName) throws Exception { ManagementView mgtView = getManagementView(); DeploymentTemplateInfo dsInfo = mgtView.getTemplate(templateName); assertNotNull("template " + templateName + " found", dsInfo); Map<String, ManagedProperty> props = dsInfo.getProperties(); for(String propName : propValues.keySet()) { ManagedProperty prop = props.get(propName); // If the property does not exist on the template we don't set it if(prop == null) continue; log.debug("template property before: "+prop.getName()+","+prop.getValue()); assertNotNull("property " + propName + " found in template " + templateName, prop); prop.setValue(propValues.get(propName)); log.debug("template property after: "+prop.getName()+","+prop.getValue()); } // Assert map composite if(dsInfo.getProperties().get("config-property") != null) assertTrue(dsInfo.getProperties().get("config-property").getMetaType() instanceof MapCompositeMetaType); mgtView.applyTemplate(deploymentName, dsInfo); // reload the view activeView = null; mgtView = getManagementView(); ManagedComponent dsMC = getManagedComponent(mgtView, componentType, componentName); assertNotNull(dsMC); Set<String> mcPropNames = new HashSet<String>(dsMC.getPropertyNames()); for(String propName : propValues.keySet()) { ManagedProperty prop = dsMC.getProperty(propName); log.debug("Checking: "+propName); assertNotNull(propName, prop); Object propValue = prop.getValue(); Object expectedValue = propValues.get(propName); if(propValue instanceof MetaValue) { if (prop.getMetaType().isComposite()) { // TODO / FIXME - compare composites log.warn("Not checking composite: "+propValue); } else { // Compare the MetaValues assertEquals(prop.getName(), expectedValue, propValue); } } else if(propValue != null) { fail(prop.getName()+" is not a MetaValue: "+propValue); } mcPropNames.remove(propName); } if(!mcPropNames.isEmpty()) { log.warn(getName() + "> untested properties: " + mcPropNames); for(String propName : mcPropNames) { ManagedProperty prop = dsMC.getProperty(propName); log.info(prop); } } } protected void validatePropertyMetaValues(Map<String, ManagedProperty> props) { HashMap<String, Object> invalidValues = new HashMap<String, Object>(); HashMap<String, Object> nullValues = new HashMap<String, Object>(); for(ManagedProperty prop : props.values()) { Object value = prop.getValue(); if((value instanceof MetaValue) == false) { if(value == null) nullValues.put(prop.getName(), value); else invalidValues.put(prop.getName(), value); } } log.info("Propertys with null values: "+nullValues); assertEquals("InvalidPropertys: "+invalidValues, 0, invalidValues.size()); // Validate more details on specific properties ManagedProperty securityDomain = props.get("security-domain"); assertNotNull("security-domain", securityDomain); MetaType securityDomainType = securityDomain.getMetaType(); assertTrue("security-domain type("+securityDomainType+") is a GenericMetaType", securityDomainType instanceof CompositeMetaType); log.debug("security-domain type: "+securityDomainType); } }