/*
* 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, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* 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 and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.rhq.core.clientapi.agent.metadata.test;
import java.net.URL;
import java.util.List;
import java.util.Map;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.util.ValidationEventCollector;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;
import org.rhq.core.clientapi.agent.metadata.ConfigurationMetadataParser;
import org.rhq.core.clientapi.agent.metadata.InvalidPluginDescriptorException;
import org.rhq.core.clientapi.descriptor.DescriptorPackages;
import org.rhq.core.clientapi.descriptor.plugin.PluginDescriptor;
import org.rhq.core.clientapi.descriptor.plugin.ServerDescriptor;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.configuration.definition.ActivationPolicy;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.configuration.definition.PropertyDefinition;
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.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;
/**
* @author Jason Dobies
*/
public class ConfigurationMetadataParserTest {
private static final Log LOG = LogFactory.getLog(ConfigurationMetadataParserTest.class);
private static final String DESCRIPTOR_FILENAME = "test1-plugin.xml";
private PluginDescriptor pluginDescriptor;
@BeforeSuite
public void loadPluginDescriptor() throws Exception {
try {
URL descriptorUrl = this.getClass().getClassLoader().getResource(DESCRIPTOR_FILENAME);
LOG.info("Loading plugin descriptor at: " + descriptorUrl);
JAXBContext jaxbContext = JAXBContext.newInstance(DescriptorPackages.PC_PLUGIN);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
ValidationEventCollector vec = new ValidationEventCollector();
unmarshaller.setEventHandler(vec);
pluginDescriptor = (PluginDescriptor) unmarshaller.unmarshal(descriptorUrl.openStream());
} catch (Throwable t) {
// Catch RuntimeExceptions and Errors and dump their stack trace, because Surefire will completely swallow them
// and throw a cryptic NPE (see http://jira.codehaus.org/browse/SUREFIRE-157)!
t.printStackTrace();
throw new RuntimeException(t);
}
}
@Test
public void parseValidDefinitionServer1() throws InvalidPluginDescriptorException {
ConfigurationDefinition definition = loadDescriptor("testServer1");
Configuration defaultTemplate = definition.getDefaultTemplate().getConfiguration();
assert definition != null : "Definition was returned as null from parser";
assertSimplePropertyType(definition, "serverProperty2", PropertySimpleType.BOOLEAN);
assertSimplePropertyType(definition, "serverProperty3", PropertySimpleType.DIRECTORY);
assertSimplePropertyType(definition, "serverProperty4", PropertySimpleType.FILE);
assertSimplePropertyType(definition, "serverProperty5", PropertySimpleType.FLOAT);
assertSimplePropertyType(definition, "serverProperty5a", PropertySimpleType.DOUBLE);
assertSimplePropertyType(definition, "serverProperty6", PropertySimpleType.INTEGER);
assertSimplePropertyType(definition, "serverProperty6a", PropertySimpleType.LONG);
assertSimplePropertyType(definition, "serverProperty7", PropertySimpleType.LONG_STRING);
assertSimplePropertyType(definition, "serverProperty8", PropertySimpleType.PASSWORD);
assertSimplePropertyType(definition, "serverProperty9", PropertySimpleType.STRING);
assertSimpleActivationPolicy(definition, "serverProperty1", ActivationPolicy.IMMEDIATE);
assertSimpleActivationPolicy(definition, "serverProperty10", ActivationPolicy.IMMEDIATE);
assertSimpleActivationPolicy(definition, "serverProperty11", ActivationPolicy.RESTART);
assertSimpleActivationPolicy(definition, "serverProperty12", ActivationPolicy.SHUTDOWN);
PropertyDefinitionSimple simple;
PropertySimple defaultValue;
simple = definition.getPropertyDefinitionSimple("serverProperty15");
assert simple != null : "serverProperty15 was not loaded";
defaultValue = defaultTemplate.getSimple("serverProperty15");
assert defaultValue != null : "serverProperty15 default value was not loaded";
assert "Default String".equals(defaultValue.getStringValue()) : "serverProperty15 default value was incorrect";
simple = definition.getPropertyDefinitionSimple("serverProperty16");
assert simple != null : "serverProperty16 was not loaded";
defaultValue = defaultTemplate.getSimple("serverProperty16");
assert defaultValue != null : "serverProperty16 default value was not loaded";
assert defaultValue.getIntegerValue() == 5 : "serverProperty16 default value was incorrect";
simple = definition.getPropertyDefinitionSimple("serverProperty20");
assert simple != null : "serverProperty20 was not loaded";
assert "Test Description".equals(simple.getDescription()) : "serverProperty20 description was not loaded";
assert "Server Property".equals(simple.getDisplayName()) : "serverProperty20 display name was not loaded";
// TODO: jdobies, Jan 9, 2007: Units are not in domain model, does Greg want to delete them?
simple = definition.getPropertyDefinitionSimple("serverProperty21");
assert simple != null : "serverProperty21 was not loaded";
assert "External Description".equals(simple.getDescription()) : "serverProperty21 description was not loaded";
assert "serverProperty21".equals(simple.getName()) : "serverProperty21 name not as expected ["
+ simple.getName() + "]";
assert "Server Property 21".equals(simple.getDisplayName()) : "serverProperty21 display name not as expected ["
+ simple.getDisplayName() + "]";
simple = definition.getPropertyDefinitionSimple("serverProperty22");
assert simple != null : "serverProperty22 was not loaded";
assert "Internal Description".equals(simple.getDescription()) : "serverProperty22 description loaded from external instead of internal";
simple = definition.getPropertyDefinitionSimple("serverProperty23");
assert simple != null : "serverProperty23 was not loaded";
assert "Internal Default Value".equals(simple.getDefaultValue()) : "serverProperty23 default value description loaded from external instead of internal";
simple = definition.getPropertyDefinitionSimple("serverProperty25");
assert simple != null : "serverProperty25 was not loaded";
assert !simple.isRequired() : "serverProperty25 is incorrectly read as required";
// TODO: jdobies, Jan 9, 2007: There is no tracking of read only in the domain model
simple = definition.getPropertyDefinitionSimple("serverProperty26");
assert simple != null : "serverProperty26 was not loaded";
assert simple.isRequired() : "serverProperty26 is incorrectly read as not required";
simple = definition.getPropertyDefinitionSimple("serverProperty31");
assert simple != null : "serverProperty31 was not loaded";
assert simple.getConstraints() != null : "serverProperty31 had no constraints loaded";
assert simple.getConstraints().size() == 3 : "serverProperty31 had an incorrect number of constraints loaded";
boolean noMaxRangeFound = false;
boolean noMinRangeFound = false;
boolean bothRangeFound = false;
for (Constraint c : simple.getConstraints()) {
assert c instanceof IntegerRangeConstraint : "serverProperty31 loaded with invalid constraint of class: "
+ c.getClass();
IntegerRangeConstraint ic = (IntegerRangeConstraint) c;
if ((ic.getMinimum() != null) && (ic.getMaximum() == null)) {
assert ic.getMinimum().compareTo((long) 0) == 0 : "serverProperty31 minimum integer range read incorrectly with no maximum range";
noMaxRangeFound = true;
} else if ((ic.getMinimum() == null) && (ic.getMaximum() != null)) {
assert ic.getMaximum().compareTo((long) 100) == 0 : "serverProperty31 maximum integer range read incorrectly with no minimum range";
noMinRangeFound = true;
} else if ((ic.getMinimum() != null) && (ic.getMaximum() != null)) {
assert ic.getMinimum().compareTo((long) 20) == 0 : "serverProperty31 minimum integer range read incorrectly with maximum range";
assert ic.getMaximum().compareTo((long) 80) == 0 : "serverProperty31 maximum integer range read incorrectly with minimum range";
bothRangeFound = true;
} else {
assert false : "serverProperty31 loaded with unexpected integer range";
}
}
assert noMaxRangeFound : "serverProperty31 loaded without no maximum range constraint";
assert noMinRangeFound : "serverProperty31 loaded without no minimum range constraint";
assert bothRangeFound : "serverProperty31 loaded without both ranges constraint";
simple = definition.getPropertyDefinitionSimple("serverProperty32");
assert simple != null : "serverProperty32 was not loaded";
assert simple.getConstraints().size() == 3 : "serverProperty32 had an incorrect number of constraints loaded";
noMaxRangeFound = false;
noMinRangeFound = false;
bothRangeFound = false;
for (Constraint c : simple.getConstraints()) {
assert c instanceof FloatRangeConstraint : "serverProperty32 loaded with invalid constraint of class: "
+ c.getClass();
FloatRangeConstraint fc = (FloatRangeConstraint) c;
if ((fc.getMinimum() != null) && (fc.getMaximum() == null)) {
assert fc.getMinimum().compareTo(new Double("0.5")) == 0 : "serverProperty32 minimum float range read incorrectly with no maximum range";
noMaxRangeFound = true;
} else if ((fc.getMinimum() == null) && (fc.getMaximum() != null)) {
assert fc.getMaximum().compareTo(new Double("99.9")) == 0 : "serverProperty32 maximum float range read incorrectly with no minimum range";
noMinRangeFound = true;
} else if ((fc.getMinimum() != null) && (fc.getMaximum() != null)) {
assert fc.getMinimum().compareTo(new Double("20.2")) == 0 : "serverProperty32 minimum float range read incorrectly with maximum range";
assert fc.getMaximum().compareTo(new Double("80.8")) == 0 : "serverProperty32 maximum float range read incorrectly with minimum range";
bothRangeFound = true;
} else {
assert false : "serverProperty32 loaded with unexpected float range";
}
}
assert noMaxRangeFound : "serverProperty32 loaded without no maximum range constraint";
assert noMinRangeFound : "serverProperty32 loaded without no minimum range constraint";
assert bothRangeFound : "serverProperty32 loaded without both ranges constraint";
PropertyDefinitionList list;
list = definition.getPropertyDefinitionList("serverProperty40");
assert list != null : "serverProperty40 was not loaded";
assert "serverProperty40".equals(list.getName());
assert list.getMemberDefinition() == null : "serverProperty40 incorrectly loaded with member definition";
list = definition.getPropertyDefinitionList("serverProperty41");
assert list != null : "serverProperty41 was not loaded";
assert list.getMemberDefinition() != null : "serverProperty41 member definition was not loaded";
simple = (PropertyDefinitionSimple) list.getMemberDefinition();
assert simple.getType() == PropertySimpleType.INTEGER : "serverProperty41 members type is incorrect";
list = definition.getPropertyDefinitionList("serverProperty42");
assert list != null : "serverProperty42 was not loaded";
assert "List Description".equals(list.getDescription()) : "serverProperty42 description is incorrect";
assert "List Property".equals(list.getDisplayName()) : "serverProperty42 display name is incorrect";
list = definition.getPropertyDefinitionList("serverProperty43");
assert list != null : "serverProperty43 was not loaded";
assert "External Description".equals(list.getDescription()) : "serverProperty43 description is incorrect";
assert "Server Property 43".equals(list.getDisplayName()) : "serverProperty43 display name is incorrect";
list = definition.getPropertyDefinitionList("serverProperty44");
assert list != null : "serverProperty44 was not loaded";
assert "Internal Description".equals(list.getDescription()) : "serverProperty44 description loaded from external instead of internal";
PropertyDefinitionMap map;
Map<String, PropertyDefinition> nestedProperties;
map = definition.getPropertyDefinitionMap("serverProperty50");
assert map != null : "serverProperty50 was not loaded";
assert map.get("invalidProperty") == null : "serverProperty50 returned an invalid nested property";
map = definition.getPropertyDefinitionMap("serverProperty51");
assert map != null : "serverProperty51 was not loaded";
nestedProperties = map.getMap();
assert nestedProperties != null : "serverProperty51 did not have any nested properties";
assert nestedProperties.size() == 3 : "serverProperty51 did not contain the correct number of nested properties";
assert nestedProperties.get("simpleProperty51") instanceof PropertyDefinitionSimple : "serverProperty51 nested simple property was incorrect";
assert nestedProperties.get("listProperty51") instanceof PropertyDefinitionList : "serverProperty51 nested list property was incorrect";
assert nestedProperties.get("mapProperty51") instanceof PropertyDefinitionMap : "serverProperty51 nested map property was incorrect";
map = definition.getPropertyDefinitionMap("serverProperty52");
assert map != null : "serverProperty52 was not loaded";
assert "Map Description".equals(map.getDescription()) : "serverProperty52 description is incorrect";
assert "Map Property".equals(map.getDisplayName()) : "serverProperty52 display name is incorrect";
map = definition.getPropertyDefinitionMap("serverProperty53");
assert map != null : "serverProperty53 was not loaded";
assert "External Description".equals(map.getDescription()) : "serverProperty53 description is incorrect";
assert "Server Property 53".equals(map.getDisplayName()) : "serverProperty53 displayName is incorrect";
map = definition.getPropertyDefinitionMap("serverProperty54");
assert map != null : "serverProperty54 was not loaded";
assert "Internal Description".equals(map.getDescription()) : "serverProperty54 description loaded from external instead of internal";
simple = definition.getPropertyDefinitionSimple("myJDBCAcronymProperty");
assert "My JDBC Acronym Property".equals(simple.getDisplayName()) : "myJDBCAcronymProperty display name not as expected ["
+ simple.getDisplayName() + "]";
simple = definition.getPropertyDefinitionSimple("myJDBC33Property");
assert "My JDBC 33 Property".equals(simple.getDisplayName()) : "myJDBC33Property display name not as expected ["
+ simple.getDisplayName() + "]";
}
private void assertSimplePropertyType(ConfigurationDefinition definition, String propertyName,
PropertySimpleType type) {
PropertyDefinitionSimple simple = definition.getPropertyDefinitionSimple(propertyName);
assert simple != null : propertyName + " was not loaded";
assert simple.getType() == type : propertyName + " was read with incorrect type";
assert simple.getName().equals(propertyName) : propertyName + " was read with no name";
}
private void assertSimpleActivationPolicy(ConfigurationDefinition definition, String propertyName,
ActivationPolicy policy) {
PropertyDefinitionSimple simple = definition.getPropertyDefinitionSimple(propertyName);
assert simple != null : propertyName + " was not loaded";
assert simple.getActivationPolicy() == policy : propertyName + " was read with incorrect activation policy";
}
private ConfigurationDefinition loadDescriptor(String serverName) throws InvalidPluginDescriptorException {
List<ServerDescriptor> servers = pluginDescriptor.getServers();
ServerDescriptor serverDescriptor = findServer(serverName, servers);
assert serverDescriptor != null : "Server descriptor not found in test plugin descriptor";
return ConfigurationMetadataParser.parse("null", serverDescriptor.getResourceConfiguration());
}
private ServerDescriptor findServer(String name, List<ServerDescriptor> servers) {
for (ServerDescriptor server : servers) {
if (server.getName().equals(name)) {
return server;
}
}
return null;
}
}