/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.enterprise.server.resource.metadata.test; import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; import javax.transaction.Status; import org.testng.annotations.Test; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.configuration.PropertySimple; import org.rhq.core.domain.configuration.definition.ConfigurationDefinition; import org.rhq.core.domain.configuration.definition.ConfigurationTemplate; import org.rhq.core.domain.configuration.definition.PropertyDefinition; import org.rhq.core.domain.configuration.definition.PropertyDefinitionEnumeration; import org.rhq.core.domain.configuration.definition.PropertyDefinitionList; import org.rhq.core.domain.configuration.definition.PropertyDefinitionMap; import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple; import org.rhq.core.domain.configuration.definition.PropertyGroupDefinition; import org.rhq.core.domain.configuration.definition.PropertySimpleType; import org.rhq.core.domain.configuration.definition.constraint.Constraint; import org.rhq.core.domain.configuration.definition.constraint.FloatRangeConstraint; import org.rhq.core.domain.configuration.definition.constraint.IntegerRangeConstraint; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.ResourceType; /** * Tests the updating of persisted ResourceTypes' resource and plugin ConfigurationDefinitions, which is essentially * handled by {@link org.rhq.enterprise.server.configuration.metadata.ConfigurationMetadataManagerBean}. * * @author Heiko Rupp */ public class UpdateConfigurationSubsystemTest extends UpdatePluginMetadataTestBase { private static final boolean ENABLED = true; @Override protected String getSubsystemDirectory() { return "configuration"; } /** * Test updating of plugin configs. * * @throws Exception */ @Test(enabled = ENABLED) public void testUpdatePluginConfig() throws Exception { // Note, plugins are registered in new transactions. for tests, this means // you can't do everything in a trans and roll back at the end. You must clean up // manually. try { registerPlugin("update5-v1_0.xml", null); ResourceType platform1 = getResourceType("myPlatform5"); getTransactionManager().begin(); platform1 = em.find(ResourceType.class, platform1.getId()); Set<ResourceType> servers = platform1.getChildResourceTypes(); assert servers.size() == 1 : "Expected to find 1 server in v1, but got " + servers.size(); ResourceType server1 = servers.iterator().next(); ConfigurationDefinition cDef = server1.getPluginConfigurationDefinition(); assert cDef != null : "Expected to find a PluginConfigurationDefinition in v1"; List<PropertyGroupDefinition> groups1 = cDef.getGroupDefinitions(); assert groups1.size() == 3 : "Expected to find 3 groups in v1, but got " + groups1.size(); int found = 0; for (PropertyGroupDefinition pgd : groups1) { if (containedIn(pgd.getName(), new String[] { "connection", "tuning", "control" })) { found++; } if (pgd.getName().equals("tuning")) { List<PropertyDefinition> pdl = cDef.getPropertiesInGroup("tuning"); for (PropertyDefinition pd : pdl) { if (pd.getName().equals("rampDownTime")) { assert pd.isRequired() == false : "rampDownTime is not required in 'tuning' in v1"; assert pd.isReadOnly() == true : "rampDownTime should be r/o in v1"; assert pd.isSummary() == false : "rampDownTime should not be summary in v1"; } } // TODO more checking per group } } assert found == 3 : "Expected to find 3 specially named control groups in v1, but only found " + found; // TODO check more stuff here getTransactionManager().rollback(); System.out.println("-------- done with v1"); /* * Now deploy version 2 */ registerPlugin("update5-v2_0.xml", null); ResourceType platform2 = getResourceType("myPlatform5"); getTransactionManager().begin(); em = getEntityManager(); platform2 = em.find(ResourceType.class, platform2.getId()); Set<ResourceType> servers2 = platform2.getChildResourceTypes(); assert servers2.size() == 1 : "Expected to find 1 server in v2, but got " + servers2.size(); ResourceType server2 = servers2.iterator().next(); ConfigurationDefinition cDef2 = server2.getPluginConfigurationDefinition(); assert cDef2 != null : "Expected to find a PluginConfigurationDefinition in v2"; List<PropertyGroupDefinition> groups2 = cDef2.getGroupDefinitions(); assert groups2.size() == 3 : "Expected to find 3 groups in v2, but got " + groups2.size(); found = 0; for (PropertyGroupDefinition pgd : groups2) { if (pgd.getName().equals("fun")) { found++; List<PropertyDefinition> pdl = cDef2.getPropertiesInGroup("fun"); assert pdl.size() == 1 : "Expected to find 1 property for group 'fun' in v2, but got " + pdl.size(); PropertyDefinition pd = pdl.get(0); assert pd.getName().equals("funRampUpTime") : "Expected to find the property 'rampUpTime', but got " + pd.getName(); } else if (pgd.getName().equals("tuning")) { found++; List<PropertyDefinition> pdl = cDef2.getPropertiesInGroup("tuning"); assert pdl.size() == 3 : "Expected 3 properties in group 'tuning' in v2, but got " + pdl.size(); for (PropertyDefinition pd : pdl) { if (pd.getName().equals("rampDownTime")) { assert pd.isRequired() == true : "rampDownTime is now required in 'tuning' in v2"; assert pd.isReadOnly() == false : "rampDownTime should be r/w in v2"; assert pd.isSummary() == true : "rampDownTime should be summary in v2"; } } } else if (pgd.getName().equals("control")) { found++; } else { // assert true==false : "Unknown definition in v2: " + pgd.getName(); System.out.println("Unknown definition in v2: " + pgd.getName()); } // TODO more checking per group } assert found == 3 : "Expected to find 3 specially named control groups in v2, but only found " + found; // TODO check resource-config as well getTransactionManager().rollback(); System.out.println("-------- done with v2"); // TODO check changing back } finally { if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) { getTransactionManager().rollback(); } } } // This test fails but I'm not sure why. It may be a bad test or it may be a real problem. It should // be investigated and either enabled or deleted. @Test(enabled = false) public void testBZ_573034() throws Exception { // Note, plugins are registered in new transactions. for tests, this means // you can't do everything in a trans and roll back at the end. You must clean up // manually. try { // register plugin String version1 = "1.0"; String version2 = "2.0"; registerPlugin("BZ_573034_v1.xml", version1); // create resource with plugin configuration ResourceType testServerResourceType = getResourceType("TestServer"); getTransactionManager().begin(); testServerResourceType = em.find(ResourceType.class, testServerResourceType.getId()); ConfigurationDefinition pluginConfigurationDef = testServerResourceType.getPluginConfigurationDefinition(); PropertyDefinition testPropertyDef = pluginConfigurationDef.getPropertyDefinitionSimple("testProperty"); Configuration pluginConfiguration = null; int pluginConfigurationId = 0; try { assertNotNull( "Expected plugin configuration definition to have a property definition for 'testProperty'", testPropertyDef); String resourceKey = testServerResourceType.getName() + System.currentTimeMillis(); Resource testResource = new Resource(resourceKey, resourceKey, testServerResourceType); testResource.setUuid("" + new Random().nextInt()); em.persist(testResource); em.flush(); setUpAgent(testResource); testResource = em.find(Resource.class, testResource.getId()); pluginConfigurationId = testResource.getPluginConfiguration().getId(); pluginConfiguration = em.find(Configuration.class, pluginConfigurationId); PropertySimple testProperty = pluginConfiguration.getSimple("testProperty"); assertNull( "Did not expect to find a value for 'testProperty' since a value has not been supplied for it yet", testProperty); getTransactionManager().commit(); } catch (Exception e) { getTransactionManager().rollback(); fail("testBZ_573034:" + e); } // register new version of plugin that specifies new plugin configuration property having a default value registerPlugin("BZ_573034_v2.xml", version2); // verify existing resource has its plugin configuration updated with new property having default value testServerResourceType = getResourceType("TestServer"); getTransactionManager().begin(); em = getEntityManager(); testServerResourceType = em.find(ResourceType.class, testServerResourceType.getId()); pluginConfigurationDef = testServerResourceType.getPluginConfigurationDefinition(); PropertyDefinition testPropertyWithDefaultDef = pluginConfigurationDef .getPropertyDefinitionSimple("testPropertyWithDefault"); assertNotNull( "Expected updated plugin configuration definition to define the property 'testPropertyWithDefault'", testPropertyWithDefaultDef); pluginConfiguration = em.find(Configuration.class, pluginConfigurationId); PropertySimple testPropertyWithDefault = pluginConfiguration.getSimple("testPropertyWithDefault"); assertNotNull( "Expected to find the property 'testPropertyWithDefault' in the updated plugin configuration", testPropertyWithDefault); assertEquals("Expected default value to be set", "default", testPropertyWithDefault.getStringValue()); getTransactionManager().rollback(); } finally { if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) { getTransactionManager().rollback(); } } } /** * Tests the behaviour wrt <resource-configuration> entries * * @throws Exception */ @Test(enabled = ENABLED) public void testResourceConfiguration() throws Exception { // Note, plugins are registered in new transactions. for tests, this means // you can't do everything in a trans and roll back at the end. You must clean up // manually. try { registerPlugin("update5-v1_0.xml", "1"); ResourceType platform1 = getResourceType("myPlatform5"); getTransactionManager().begin(); platform1 = em.find(ResourceType.class, platform1.getId()); Set<ResourceType> servers = platform1.getChildResourceTypes(); assert servers.size() == 1 : "Expected to find 1 server in v1, but got " + servers.size(); ResourceType server1 = servers.iterator().next(); ConfigurationDefinition def1 = server1.getResourceConfigurationDefinition(); List<PropertyDefinition> cpdl = def1.getNonGroupedProperties(); assert cpdl.size() == 3 : "Did not find 3 properties in <resource-configuration> in v1 but " + cpdl.size(); for (PropertyDefinition pd : cpdl) { if (pd.getName().equals("jnpPort")) { assert pd instanceof PropertyDefinitionSimple : "jnpPort is no simple-property in v1"; PropertyDefinitionSimple pds = (PropertyDefinitionSimple) pd; List<PropertyDefinitionEnumeration> pdel = pds.getEnumeratedValues(); assert pdel.size() == 3 : "jnpPort did not have 3 options in v1, but " + pdel.size(); int found = 0; for (PropertyDefinitionEnumeration pde : pdel) { if (containedIn(pde.getName(), new String[] { "option1", "option2", "option3" })) { found++; } } assert found == 3 : "Did not find the three expected options in v1"; } else if (pd.getName().equals("secureJnpPort")) { assert pd instanceof PropertyDefinitionSimple : "secureJnpPort is no simple-property in v1"; PropertyDefinitionSimple pds = (PropertyDefinitionSimple) pd; assert pds.getType() == PropertySimpleType.INTEGER : "Type of secureJnpPort is not integer in v1"; Set<Constraint> constraints = pds.getConstraints(); assert constraints.size() == 4 : "Did not find 4 constraints for secureJnpPort in v1, but " + constraints.size(); } } getTransactionManager().rollback(); /* * Now check the changed plugin */ registerPlugin("update5-v2_0.xml", "2"); ResourceType platform2 = getResourceType("myPlatform5"); getTransactionManager().begin(); em = getEntityManager(); platform2 = em.find(ResourceType.class, platform2.getId()); Set<ResourceType> servers2 = platform2.getChildResourceTypes(); assert servers2.size() == 1 : "Expected to find 1 server in v2, but got " + servers2.size(); ResourceType server2 = servers2.iterator().next(); ConfigurationDefinition def2 = server2.getResourceConfigurationDefinition(); def2 = getEntityManager().find(ConfigurationDefinition.class, def2.getId()); List<PropertyDefinition> cpdl2 = def2.getNonGroupedProperties(); assert cpdl2.size() == 3 : "Did not find 3 properties in <resource-configuration> in v2 but " + cpdl2.size(); int found = 0; for (PropertyDefinition pd : cpdl2) { if (containedIn(pd.getName(), new String[] { "jnpPort", "secureJnpPort", "memorySize" })) { found++; } } assert found == 3 : "Did not find the 3 specific properties in v2"; for (PropertyDefinition pd : cpdl2) { if (pd.getName().equals("jnpPort")) { if (pd instanceof PropertyDefinitionSimple) { PropertyDefinitionSimple pds = (PropertyDefinitionSimple) pd; List<PropertyDefinitionEnumeration> pdel = pds.getEnumeratedValues(); /* * TODO there is a strange effect where pdel has also "null" elements in it, that were not * present at the time the new enumeration has been computed in the ResourceMetadataManager. * That is why I am here first removing the nulls and then do the assertion */ for (int i = pdel.size() - 1; i >= 0; i--) { if (pdel.get(i) == null) { pdel.remove(i); } } assert pdel.size() == 4 : "jnpPort did not have 4 options in v2, but " + pdel.size(); found = 0; for (PropertyDefinitionEnumeration pde : pdel) { if (containedIn(pde.getName(), new String[] { "option2", "option3", "newOption4", "newOption5" })) { found++; } if (pde.getName().equals("option3")) { assert pde.getValue().equals("changed") : "Value for option 'option3' did not change in v2"; } } assert found == 4 : "Did not find the four expected options in v2 "; } } else if (pd.getName().equals("secureJnpPort")) { assert pd instanceof PropertyDefinitionSimple : "secureJnpPort is no simple-property in v2"; PropertyDefinitionSimple pds = (PropertyDefinitionSimple) pd; Set<Constraint> constraints = pds.getConstraints(); assert constraints.size() == 3 : "Did not find 3 constraints for secureJnpPort in v2, but " + constraints.size(); } } getTransactionManager().rollback(); /* * And now back to the first version */ registerPlugin("update5-v1_0.xml", "3"); platform1 = getResourceType("myPlatform5"); getTransactionManager().begin(); em = getEntityManager(); platform1 = em.find(ResourceType.class, platform1.getId()); servers = platform1.getChildResourceTypes(); assert servers.size() == 1 : "Expected to find 1 server in v1, but got " + servers.size(); ResourceType server3 = servers.iterator().next(); ConfigurationDefinition def3 = server3.getResourceConfigurationDefinition(); List<PropertyDefinition> cpdl3 = def3.getNonGroupedProperties(); assert cpdl3.size() == 3 : "Did not find 3 properties in <resource-configuration> in v3 again but " + cpdl3.size(); for (PropertyDefinition pd : cpdl3) { if (pd.getName().equals("jnpPort")) { if (pd instanceof PropertyDefinitionSimple) { PropertyDefinitionSimple pds = (PropertyDefinitionSimple) pd; List<PropertyDefinitionEnumeration> pdel = pds.getEnumeratedValues(); /* * TODO there is a strange effect where pdel has also "null" elements in it, that were not * present at the time the new enumeration has been computed in the ResourceMetadataManager. * That is why I am here first removing the nulls and then do the assertion */ for (int i = pdel.size() - 1; i >= 0; i--) { if (pdel.get(i) == null) { pdel.remove(i); } } assert pdel.size() == 3 : "jnpPort did not have 3 options in v3, but " + pdel.size(); found = 0; for (PropertyDefinitionEnumeration pde : pdel) { if (containedIn(pde.getName(), new String[] { "option1", "option2", "option3" })) { found++; } } assert found == 3 : "Did not find the three expected options in v3"; } } } getTransactionManager().rollback(); } finally { if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) { getTransactionManager().rollback(); } } } /** * Test for storing of back links from Constraint to PropertyDefinitionSimple. See JBNADM-1587 * * @throws Exception */ @Test(enabled = ENABLED) public void testConstraint() throws Exception { // Note, plugins are registered in new transactions. for tests, this means // you can't do everything in a trans and roll back at the end. You must clean up // manually. try { registerPlugin("constraint.xml"); ResourceType platform = getResourceType("constraintPlatform"); getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); ConfigurationDefinition config = platform.getResourceConfigurationDefinition(); PropertyDefinitionSimple propDef = config.getPropertyDefinitionSimple("secureJnpPort"); Set<Constraint> constraints = propDef.getConstraints(); assert constraints.size() == 4 : "Expected to get 4 constraints, but got " + constraints.size(); assert propDef.getDefaultValue().equals("1234"); getTransactionManager().rollback(); } finally { if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) { getTransactionManager().rollback(); } } } /** * Test for storing of back links from Constraint to PropertyDefinitionSimple. See JBNADM-1587 * * @throws Exception */ @Test(enabled = ENABLED) public void testConstraint2() throws Exception { // Note, plugins are registered in new transactions. for tests, this means // you can't do everything in a trans and roll back at the end. You must clean up // manually. try { registerPlugin("constraint.xml"); ResourceType platform = getResourceType("constraintPlatform"); getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); ConfigurationDefinition config = platform.getResourceConfigurationDefinition(); Map<String, PropertyDefinition> propDefMap = config.getPropertyDefinitions(); PropertyDefinitionSimple propDef = (PropertyDefinitionSimple) propDefMap.get("secureJnpPort"); Set<Constraint> constraints = propDef.getConstraints(); assert constraints.size() == 4 : "Expected to get 4 constraints, but got " + constraints.size(); assert propDef.getDefaultValue().equals("1234"); getTransactionManager().rollback(); } finally { if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) { getTransactionManager().rollback(); } } } /** * Test for setting min/max in contraints. See JBNADM-1596 See JBNADM-1597 * * @throws Exception */ @Test(enabled = ENABLED) public void testConstraintMinMax() throws Exception { // Note, plugins are registered in new transactions. for tests, this means // you can't do everything in a trans and roll back at the end. You must clean up // manually. try { registerPlugin("constraintMinMax.xml"); ResourceType platform = getResourceType("constraintPlatform"); getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); ConfigurationDefinition config = platform.getResourceConfigurationDefinition(); PropertyDefinitionSimple propDef = config.getPropertyDefinitionSimple("secureJnpPort"); Set<Constraint> constraints = propDef.getConstraints(); assert constraints.size() == 2 : "Expected to get 2 constraints, but got " + constraints.size(); for (Constraint co : constraints) { if (co instanceof IntegerRangeConstraint) { IntegerRangeConstraint irc = (IntegerRangeConstraint) co; assert irc.getMinimum() == 5; // TODO change when JBNADM-1597 is being worked on assert irc.getMaximum() == 0; } else if (co instanceof FloatRangeConstraint) { FloatRangeConstraint frc = (FloatRangeConstraint) co; assert frc != null; assert frc.getMaximum() == 0.0; // TODO change when JBNADM-1597 is being worked on assert frc.getMinimum() == 5.0; } } getTransactionManager().rollback(); } finally { if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) { getTransactionManager().rollback(); } } } @Test(enabled = ENABLED) public void testListOfLists() throws Exception { try { // extra block for variable scoping purposes registerPlugin("propertyList-v1.xml"); ResourceType platform = getResourceType("myPlatform6"); getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); ConfigurationDefinition cd = platform.getResourceConfigurationDefinition(); Map<String, PropertyDefinition> propDefs = cd.getPropertyDefinitions(); assert propDefs.size() == 4 : "Expected to see 4 <list-property>s in v1, but got " + propDefs.size(); for (PropertyDefinition def : propDefs.values()) { assert def instanceof PropertyDefinitionList : "PropertyDefinition " + def.getName() + " is no list-property in v1"; PropertyDefinitionList pdl = (PropertyDefinitionList) def; PropertyDefinition member = pdl.getMemberDefinition(); if (pdl.getName().equals("myList1")) { assert pdl.getDescription().equals("Just a simple list"); assert member instanceof PropertyDefinitionSimple : "Expected the member of myList1 to be a simple property in v1"; PropertyDefinitionSimple pds = (PropertyDefinitionSimple) member; assert pds.getName().equals("foo"); } else if (pdl.getName().equals("myList2")) { assert member instanceof PropertyDefinitionList : "Expected the member of myList2 to be a list property in v1"; } else if (pdl.getName().equals("myList3")) { assert member instanceof PropertyDefinitionSimple : "Expected the member of myList3 to be a simple property in v1"; PropertyDefinitionSimple pds = (PropertyDefinitionSimple) member; assert pds.getName().equals("baz"); } else if (pdl.getName().equals("rec1")) { assert member instanceof PropertyDefinitionList : "Expected the member of rc1 to be a list property in v1"; PropertyDefinitionList pdl2 = (PropertyDefinitionList) member; // TODO check min/max for the lists on the way. Commented out. See JBNADM-1595 assert pdl2.getName().equals("rec2"); // assert pdl2.getMin()==2 : "Expected rec2:min to be 2, but it was " + pdl2.getMin(); // assert pdl2.getMax()==20; pdl2 = (PropertyDefinitionList) pdl2.getMemberDefinition(); assert pdl2.getName().equals("rec3"); // assert pdl2.getMin()==3; // assert pdl2.getMax()==30; pdl2 = (PropertyDefinitionList) pdl2.getMemberDefinition(); assert pdl2.getName().equals("rec4"); // assert pdl2.getMin()==4; // assert pdl2.getMax()==40; assert pdl2.getMemberDefinition() instanceof PropertyDefinitionSimple; PropertyDefinitionSimple pds = (PropertyDefinitionSimple) pdl2.getMemberDefinition(); assert pds.getName().equals("rec5"); assert pds.getDescription().equals("Deeply nested"); List<PropertyDefinitionEnumeration> options = pds.getEnumeratedValues(); assert options.size() == 4; int found = 0; String[] optionVals = new String[] { "a", "b", "c", "d" }; for (PropertyDefinitionEnumeration option : options) { if (containedIn(option.getValue(), optionVals)) { found++; } } assert found == 4; Set<Constraint> constraints = pds.getConstraints(); assert constraints.size() == 1; } else { assert true == false : "Unknown list-definition in v1: " + pdl.getName(); } } getTransactionManager().rollback(); /* * Deploy v2 of the plugin */ registerPlugin("propertyList-v2.xml"); platform = getResourceType("myPlatform6"); getTransactionManager().begin(); em = getEntityManager(); platform = em.find(ResourceType.class, platform.getId()); cd = platform.getResourceConfigurationDefinition(); propDefs = cd.getPropertyDefinitions(); assert propDefs.size() == 4 : "Expected to see 4 <list-property>s in v2, but got " + propDefs.size(); for (PropertyDefinition def : propDefs.values()) { assert def instanceof PropertyDefinitionList : "PropertyDefinition " + def.getName() + " is no list-property in v2"; PropertyDefinitionList pdl = (PropertyDefinitionList) def; PropertyDefinition member = pdl.getMemberDefinition(); if (pdl.getName().equals("myList2")) { assert member instanceof PropertyDefinitionList : "Expected the member of myList2 to be a list property in v2"; } else if (pdl.getName().equals("myList3")) { assert member instanceof PropertyDefinitionList : "Expected the member of myList3 to be a list property in v2"; PropertyDefinitionList pds = (PropertyDefinitionList) member; assert pds.getName().equals("baz"); assert pds.getDescription().equals("myList3:baz"); assert pds.getMemberDefinition() instanceof PropertyDefinitionSimple : "Expected the member of list3:baz to be a simple property in v2"; } else if (pdl.getName().equals("myList4")) { assert pdl.getDescription().equals("Just a simple list"); assert member instanceof PropertyDefinitionSimple : "Expected the member of myList4 to be a simple property in v2"; PropertyDefinitionSimple pds = (PropertyDefinitionSimple) member; assert pds.getName().equals("foo"); } else if (pdl.getName().equals("rec1")) { assert member instanceof PropertyDefinitionList : "Expected the member of rec1 to be a list property in v2"; PropertyDefinitionList pdl2 = (PropertyDefinitionList) member; assert pdl2.getName().equals("rec2"); /* * PropertyDefinitionList.getMin()/getMax() are commented out. See JBNADM1595 */ // assert pdl2.getMin()==12 : "Expected rec2:min to be 12, but it was " + pdl2.getMin(); // assert pdl2.getMax()==200; pdl2 = (PropertyDefinitionList) pdl2.getMemberDefinition(); assert pdl2.getName().equals("rec3+"); // assert pdl2.getMin()==13; // assert pdl2.getMax()==300; pdl2 = (PropertyDefinitionList) pdl2.getMemberDefinition(); assert pdl2.getName().equals("rec4"); // assert pdl2.getMin()==14; // assert pdl2.getMax()==400; assert pdl2.getMemberDefinition() instanceof PropertyDefinitionSimple; PropertyDefinitionSimple pds = (PropertyDefinitionSimple) pdl2.getMemberDefinition(); assert pds.getName().equals("rec5"); assert pds.getDescription().equals("Nested deeply"); List<PropertyDefinitionEnumeration> options = pds.getEnumeratedValues(); assert options.size() == 5; int found = 0; String[] optionVals = new String[] { "b", "c", "d", "x", "z" }; for (PropertyDefinitionEnumeration option : options) { if (containedIn(option.getValue(), optionVals)) { found++; } } assert found == optionVals.length; Set<Constraint> constraints = pds.getConstraints(); assert constraints.size() == 2; for (Constraint constraint : constraints) { if (constraint instanceof IntegerRangeConstraint) { IntegerRangeConstraint irc = (IntegerRangeConstraint) constraint; assert irc != null : "Integer-constraint was null, but should not be"; // See JBNADM-1596/97 assert irc.getDetails().equals("-2#10"); // TODO (ips, 3/31/10): The below is a workaround for IntegerRangeConstraint.onLoad() not being called by Hibernate. irc.setDetails(irc.getDetails()); assert irc.getMaximum() == 10; assert irc.getMinimum() == -2; } else if (constraint instanceof FloatRangeConstraint) { FloatRangeConstraint frc = (FloatRangeConstraint) constraint; assert frc != null : "Float-constraint was null, but should not be"; // See JBNADM-1596/97 assert frc.getDetails().equals("10.0#5.0"); // TODO (ips, 3/31/10): The below is a workaround for FloatRangeConstraint.onLoad() not being called by Hibernate. frc.setDetails(frc.getDetails()); assert frc.getMinimum() == 10; // TODO change when JBNADM-1597 is being worked on assert frc.getMaximum() == 5; } else { assert true == false : "Unknown constraint type encountered"; } } } else { assert true == false : "Unknown list-definition in v2: " + pdl.getName(); } } getTransactionManager().rollback(); } finally { if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) { getTransactionManager().rollback(); } } } @Test(enabled = ENABLED) public void testListPropertyMinMax() throws Exception { // Note, plugins are registered in new transactions. for tests, this means // you can't do everything in a trans and roll back at the end. You must clean up // manually. try { registerPlugin("propertyList-simple.xml"); ResourceType platform = getResourceType("myPlatform"); getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); ConfigurationDefinition cd = platform.getResourceConfigurationDefinition(); Map<String, PropertyDefinition> properties = cd.getPropertyDefinitions(); PropertyDefinitionList a = (PropertyDefinitionList) properties.get("a"); assert a.getDescription().equals("Yada !") : "Expected the description to be 'Yada !', but it was " + a.getDescription(); // The next two are marked as @Transient in PropertyDefinitonList // See JBNADM-1595 // assert a.getMax()==6 : "Expected the max to be 6 but it was " + a.getMax(); // assert a.getMin()==4 : "Expected the min to be 4 but it was " + a.getMin(); getTransactionManager().rollback(); } finally { if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) { getTransactionManager().rollback(); } } } @Test(enabled = ENABLED) public void testMapProperty() throws Exception { // Note, plugins are registered in new transactions. for tests, this means // you can't do everything in a trans and roll back at the end. You must clean up // manually. try { { // extra block for variable scoping purposes registerPlugin("propertyMap-v1.xml"); ResourceType platform = getResourceType("myPlatform7"); getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); ConfigurationDefinition cd = platform.getResourceConfigurationDefinition(); Map<String, PropertyDefinition> propDefs = cd.getPropertyDefinitions(); assert propDefs.size() == 5 : "Expected to find 5 properties in v1, but got " + propDefs.size(); int found = 0; for (PropertyDefinition def : propDefs.values()) { if (containedIn(def.getName(), new String[] { "map1", "map2", "map3", "map4", "map5" })) { found++; } assert def instanceof PropertyDefinitionMap : "Not all properties are maps in v1"; if (def.getName().equals("map4")) { PropertyDefinitionMap map = (PropertyDefinitionMap) def; Map<String, PropertyDefinition> children = map.getMap(); assert children.size() == 1 : "Map4 should have 1 child"; children = map.getMap(); map = (PropertyDefinitionMap) children.get("map4:2"); assert map != null : "Child map4:2 not found"; children = map.getMap(); map = (PropertyDefinitionMap) children.get("map4:2:3"); assert map != null : "Child map4:2:3 not found"; children = map.getMap(); PropertyDefinitionSimple simple = (PropertyDefinitionSimple) children.get("simple"); assert simple != null : "Child simple not found"; } if (def.getName().equals("map5")) { PropertyDefinitionMap map = (PropertyDefinitionMap) def; Map<String, PropertyDefinition> children = map.getMap(); assert children.size() == 1 : "Map4 should have 1 child"; children = map.getMap(); PropertyDefinitionSimple simple = (PropertyDefinitionSimple) children.get("hugo"); assert simple.getDescription().equals("foo"); } } assert found == 5 : "Did not find the 5 desired maps in v1"; getTransactionManager().rollback(); } System.out.println("Done with v1"); /* * Now deploy v2 */ { // extra block for variable scoping purposes registerPlugin("propertyMap-v2.xml"); ResourceType platform = getResourceType("myPlatform7"); getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); ConfigurationDefinition cd = platform.getResourceConfigurationDefinition(); Map<String, PropertyDefinition> propDefs = cd.getPropertyDefinitions(); assert propDefs.size() == 5 : "Expected to find 5 properties in v2, but got " + propDefs.size(); int found = 0; for (PropertyDefinition def : propDefs.values()) { if (containedIn(def.getName(), new String[] { "map1", "map2", "map3", "map4", "map5" })) { found++; } if (def.getName().equals("map1")) { assert def instanceof PropertyDefinitionSimple : "Map 1 should be a simple-property in v2"; } else { assert def instanceof PropertyDefinitionMap : "Not all properties are maps in v2"; } if (def.getName().equals("map3")) { assert def.isRequired() == false : "Map 3 should not be false in v2"; } if (def.getName().equals("map4")) { PropertyDefinitionMap map = (PropertyDefinitionMap) def; Map<String, PropertyDefinition> children = map.getMap(); assert children.size() == 1 : "Map4 should have 1 child, but has " + children.size(); children = map.getMap(); map = (PropertyDefinitionMap) children.get("map4:2+"); assert map != null : "Child map4:2 not found"; children = map.getMap(); assert children.size() == 1 : "Map4:2 should have 1 child, but has " + children.size(); map = (PropertyDefinitionMap) children.get("map4:2:3"); assert map != null : "Child map4:2:3 not found"; children = map.getMap(); assert children.size() == 2 : "Map4:2:3 should have 1 child, but has " + children.size(); PropertyDefinitionList list = (PropertyDefinitionList) children.get("list"); assert list != null : "Child list not found"; PropertyDefinitionSimple simple = (PropertyDefinitionSimple) children.get("simple2"); assert simple != null : "Child simple2 not found"; } if (def.getName().equals("map5")) { PropertyDefinitionMap map = (PropertyDefinitionMap) def; Map<String, PropertyDefinition> children = map.getMap(); assert children.size() == 1 : "Map5 should have 1 child"; children = map.getMap(); PropertyDefinitionSimple simple = (PropertyDefinitionSimple) children.get("hugo"); assert simple.getDescription().equals("bar") : "Map5:hugo should have 'bar' in v2"; } } assert found == 5 : "Did not find the 5 desired properties in v2, instead found " + found; getTransactionManager().rollback(); } } finally { if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) { getTransactionManager().rollback(); } } } /** * This test checks what happens if a property of one type checks its type into another one upon redeploy. * * @throws Exception */ @Test(enabled = ENABLED) public void testChangePropertyType() throws Exception { // Note, plugins are registered in new transactions. for tests, this means // you can't do everything in a trans and roll back at the end. You must clean up // manually. try { { // extra block for variable scoping purposes registerPlugin("propertyChanging-v1.xml"); ResourceType platform = getResourceType("myPlatform7"); getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); ConfigurationDefinition cd = platform.getResourceConfigurationDefinition(); Map<String, PropertyDefinition> propDefs = cd.getPropertyDefinitions(); for (PropertyDefinition def : propDefs.values()) { if (def.getName().equals("one")) { assert def instanceof PropertyDefinitionMap; } else if (def.getName().equals("two")) { assert def instanceof PropertyDefinitionMap; } else if (def.getName().equals("three")) { assert def instanceof PropertyDefinitionList; } else if (def.getName().equals("four")) { assert def instanceof PropertyDefinitionList; } else if (def.getName().equals("five")) { assert def instanceof PropertyDefinitionSimple; } else if (def.getName().equals("six")) { assert def instanceof PropertyDefinitionSimple; } else { assert true == false : "Unknown definition : " + def.getName() + " in v1"; } } getTransactionManager().rollback(); } /* * Now deploy v2 */ { // extra block for variable scoping purposes registerPlugin("propertyChanging-v2.xml"); ResourceType platform = getResourceType("myPlatform7"); getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); ConfigurationDefinition cd = platform.getResourceConfigurationDefinition(); Map<String, PropertyDefinition> propDefs = cd.getPropertyDefinitions(); for (PropertyDefinition def : propDefs.values()) { if (def.getName().equals("one")) { assert def instanceof PropertyDefinitionList : "Expected a list-property, but it was " + def.getClass().getCanonicalName(); } else if (def.getName().equals("two")) { assert def instanceof PropertyDefinitionSimple : "Expected a simple-property, but it was " + def.getClass().getCanonicalName(); } else if (def.getName().equals("three")) { assert def instanceof PropertyDefinitionMap : "Expected a map-property, but it was " + def.getClass().getCanonicalName(); } else if (def.getName().equals("four")) { assert def instanceof PropertyDefinitionSimple : "Expected a simple-property, but it was " + def.getClass().getCanonicalName(); } else if (def.getName().equals("five")) { assert def instanceof PropertyDefinitionMap : "Expected a map-property, but it was " + def.getClass().getCanonicalName(); } else if (def.getName().equals("six")) { assert def instanceof PropertyDefinitionList : "Expected a list-property, but it was " + def.getClass().getCanonicalName(); } else { assert true == false : "Unknown definition : " + def.getName() + " in v2"; } } getTransactionManager().rollback(); } /* * Now deploy v1 again */{ // extra block for variable scoping purposes registerPlugin("propertyChanging-v1.xml", "3.0"); // this is our 3rd version, but reuse v1 ResourceType platform = getResourceType("myPlatform7"); getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); ConfigurationDefinition cd = platform.getResourceConfigurationDefinition(); Map<String, PropertyDefinition> propDefs = cd.getPropertyDefinitions(); for (PropertyDefinition def : propDefs.values()) { if (def.getName().equals("one")) { assert def instanceof PropertyDefinitionMap : "Expected a map-property, but it was " + def.getClass().getCanonicalName(); } else if (def.getName().equals("two")) { assert def instanceof PropertyDefinitionMap : "Expected a map-property, but it was " + def.getClass().getCanonicalName(); } else if (def.getName().equals("three")) { assert def instanceof PropertyDefinitionList : "Expected a list-property, but it was " + def.getClass().getCanonicalName(); } else if (def.getName().equals("four")) { assert def instanceof PropertyDefinitionList : "Expected a list-property, but it was " + def.getClass().getCanonicalName(); } else if (def.getName().equals("five")) { assert def instanceof PropertyDefinitionSimple : "Expected a simple-property, but it was " + def.getClass().getCanonicalName(); } else if (def.getName().equals("six")) { assert def instanceof PropertyDefinitionSimple : "Expected a simple-property, but it was " + def.getClass().getCanonicalName(); } } getTransactionManager().rollback(); } } finally { if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) { getTransactionManager().rollback(); } } } /*==================================== Resource Config Tests ======================================*/ @Test(enabled = ENABLED) public void testGroupDeleted() throws Exception { registerPlugin("groupDeleted-v1.xml"); System.out.println("==> Done with v1"); registerPlugin("groupDeleted-v2.xml"); System.out.println("==> Done with v2"); registerPlugin("groupDeleted-v1.xml", "3.0"); System.out.println("==> Done with v1"); } @Test(enabled = ENABLED) public void testGroupPropDeleted() throws Exception { registerPlugin("groupPropDeleted-v1.xml"); System.out.println("==> Done with v1"); registerPlugin("groupPropDeleted-v2.xml"); System.out.println("==> Done with v2"); registerPlugin("groupPropDeleted-v1.xml", "3.0"); System.out.println("==> Done with v1"); } @Test(enabled = ENABLED) public void testGroupPropDeletedExt() throws Exception { registerPlugin("groupPropDeleted-v3.xml"); System.out.println("==> Done with v1"); registerPlugin("groupPropDeleted-v4.xml"); System.out.println("==> Done with v2"); registerPlugin("groupPropDeleted-v3.xml", "5.0"); System.out.println("==> Done with v1"); } @Test(enabled = ENABLED) public void testGroupPropMoved() throws Exception { registerPlugin("groupPropMoved-v1.xml"); System.out.println("==> Done with v1"); registerPlugin("groupPropMoved-v2.xml"); System.out.println("==> Done with v2"); registerPlugin("groupPropMoved-v1.xml", "3.0"); System.out.println("==> Done with v1"); } @Test(enabled = ENABLED) public void testUpdateDefaultTemplate() throws Exception { try { registerPlugin("updateDefaultTemplate1.xml"); ResourceType platform = getResourceType("myPlatform7"); getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); ConfigurationDefinition cd = platform.getResourceConfigurationDefinition(); ConfigurationTemplate defaultTemplate = cd.getDefaultTemplate(); assert defaultTemplate != null; Configuration config = defaultTemplate.getConfiguration(); PropertySimple ps = config.getSimple("six"); assert "foo".equals(ps.getStringValue()) : "Expected 'foo', but got " + ps.getStringValue(); getTransactionManager().rollback(); registerPlugin("updateDefaultTemplate2.xml"); platform = getResourceType("myPlatform7"); getTransactionManager().begin(); em = getEntityManager(); platform = em.find(ResourceType.class, platform.getId()); cd = platform.getResourceConfigurationDefinition(); defaultTemplate = cd.getDefaultTemplate(); assert defaultTemplate != null; config = defaultTemplate.getConfiguration(); ps = config.getSimple("six"); assert "bar".equals(ps.getStringValue()) : "Expected 'bar', but got " + ps.getStringValue(); getTransactionManager().rollback(); } finally { if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) { getTransactionManager().rollback(); } } } @Test(enabled = ENABLED) public void testAddDeleteTemplate() throws Exception { try { ResourceType platform; ConfigurationTemplate defaultTemplate; ConfigurationDefinition cd; Map<String, ConfigurationTemplate> templateMap; ConfigurationTemplate template; PropertySimple ps; registerPlugin("addDeleteTemplate1.xml"); platform = getResourceType("myPlatform7"); getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); cd = platform.getResourceConfigurationDefinition(); defaultTemplate = cd.getDefaultTemplate(); assert defaultTemplate != null; templateMap = cd.getTemplates(); assert templateMap.size() == 1 : "Expected only the 1 default template but got " + templateMap.size(); getTransactionManager().rollback(); System.out.println("Done with v1"); registerPlugin("addDeleteTemplate2.xml"); platform = getResourceType("myPlatform7"); getTransactionManager().begin(); em = getEntityManager(); platform = em.find(ResourceType.class, platform.getId()); cd = platform.getResourceConfigurationDefinition(); defaultTemplate = cd.getDefaultTemplate(); templateMap = cd.getTemplates(); assert defaultTemplate != null; assert templateMap.size() == 2 : "Expected 2 templates but got " + templateMap; template = templateMap.get("additional"); assert template != null; ps = template.getConfiguration().getSimple("second_one"); assert ps.getStringValue().equals("Bart") : "Expected 'Bart', but got " + ps.getStringValue(); getTransactionManager().rollback(); System.out.println("Done with v2"); registerPlugin("addDeleteTemplate3.xml"); platform = getResourceType("myPlatform7"); getTransactionManager().begin(); em = getEntityManager(); platform = em.find(ResourceType.class, platform.getId()); cd = platform.getResourceConfigurationDefinition(); defaultTemplate = cd.getDefaultTemplate(); templateMap = cd.getTemplates(); assert defaultTemplate != null; assert templateMap.size() == 2 : "Expected 2 templates but got " + templateMap; template = templateMap.get("additional"); assert template != null; ps = template.getConfiguration().getSimple("second_one"); assert ps.getStringValue().equals("Bart Simpson") : "Expected 'Bart Simpson', but got " + ps.getStringValue(); getTransactionManager().rollback(); System.out.println("Done with v3"); registerPlugin("addDeleteTemplate1.xml", "4.0"); // this is our 4th version, but reuse v1 platform = getResourceType("myPlatform7"); getTransactionManager().begin(); em = getEntityManager(); platform = em.find(ResourceType.class, platform.getId()); cd = platform.getResourceConfigurationDefinition(); defaultTemplate = cd.getDefaultTemplate(); templateMap = cd.getTemplates(); assert defaultTemplate != null; assert templateMap.size() == 1 : "Expected only the 1 default template but got " + templateMap; getTransactionManager().rollback(); System.out.println("Done with v1(2)"); } finally { if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) { getTransactionManager().rollback(); } } } }