/*
* Jopr 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.plugins.jbossas.test.util;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
import org.rhq.core.domain.configuration.Property;
import org.rhq.core.domain.configuration.PropertyMap;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
import org.rhq.core.pluginapi.inventory.CreateResourceReport;
import org.rhq.plugins.jbossas.util.DatasourceConfigurationEditor;
/**
* DatasourceConfigurationEditor Tester.
*
* @author mspritzler
* @since 1.0
* @created June 21, 2007
*/
@Test(groups = "jboss.plugin")
public class DatasourceConfigurationEditorTest {
private Log LOG = LogFactory.getLog(DatasourceConfigurationEditorTest.class);
@BeforeClass
public void setUp() {
}
@Test
public void testLoadDatasource() {
String testName = "testLoadDatasource";
LOG.info(testName);
String dsXmlFile = "loadDS.xml";
String datasourceName = "loadingTestDS";
File xmlFile = getDSXmlFile(dsXmlFile);
// Load here will do the asserts
Configuration config = DatasourceConfigurationEditor.loadDatasource(xmlFile, datasourceName);
assertLoadingOfConfiguration(config, datasourceName, testName);
}
@Test(dependsOnMethods = "testLoadDatasource")
public void testCreateDatasource() {
String testName = "testCreateDatasource";
LOG.info(testName);
String dsXmlFile = "newDS.xml";
String datasourceName = "NewDS";
File xmlFile = getDSXmlFile(dsXmlFile);
Configuration config = createConfiguration(new Configuration(), datasourceName);
ResourceType type = new ResourceType("datasource", "jbossas", ResourceCategory.SERVICE, null);
CreateResourceReport report = new CreateResourceReport(datasourceName, type, null, config, null);
DatasourceConfigurationEditor.updateDatasource(xmlFile, datasourceName, report);
config = DatasourceConfigurationEditor.loadDatasource(xmlFile, datasourceName);
assertLoadingOfConfiguration(config, datasourceName, testName);
// Now lets test creating a new datasource into an already existing xxx-ds.XMl file
dsXmlFile = "loadDS.xml";
datasourceName = "NewAndImprovedDS";
xmlFile = getDSXmlFile(dsXmlFile);
config = createConfiguration(new Configuration(), datasourceName);
type = new ResourceType("datasource", "jbossas", ResourceCategory.SERVICE, null);
report = new CreateResourceReport(datasourceName, type, null, config, null);
DatasourceConfigurationEditor.updateDatasource(xmlFile, datasourceName, report);
config = DatasourceConfigurationEditor.loadDatasource(xmlFile, datasourceName);
assertLoadingOfConfiguration(config, datasourceName, testName);
}
@Test(dependsOnMethods = "testCreateDatasource")
public void testUpdateDatasource() {
String testName = "testUpdateDatasource";
LOG.info(testName);
String dsXmlFile = "updateDS.xml";
String datasourceName = "UpdateDS";
File xmlFile = getDSXmlFile(dsXmlFile);
Configuration config = DatasourceConfigurationEditor.loadDatasource(xmlFile, datasourceName);
assertLoadingOfConfiguration(config, datasourceName, testName);
config = this.createConfiguration(config.deepCopy(), datasourceName);
PropertySimple property = config.getSimple("max-pool-size");
property.setIntegerValue(100);
ConfigurationUpdateReport report = new ConfigurationUpdateReport(config);
DatasourceConfigurationEditor.updateDatasource(xmlFile, datasourceName, report);
assert (report.getStatus().equals(ConfigurationUpdateStatus.SUCCESS)) : "Update report status should be successful";
config = DatasourceConfigurationEditor.loadDatasource(xmlFile, datasourceName);
assertLoadingOfConfiguration(config, datasourceName, testName);
Map<String, String> valuesToCheck = new HashMap<String, String>();
valuesToCheck.put("max-pool-size", "100");
assertConfigurationValues(config, valuesToCheck, testName);
}
@Test(dependsOnMethods = "testUpdateDatasource")
public void testDeleteDatasource() {
String testName = "testDeleteDatasource";
LOG.info(testName);
String dsXmlFile = "deleteDS.xml";
String datasourceName = "deleteDS";
File xmlFile = getDSXmlFile(dsXmlFile);
Configuration config; // = DatasourceConfigurationEditor.loadDatasource(xmlFile, datasourceName);
//@TODO this assert should be in the test, but since Maven is running these tests twice
// The second pass through the test the config will be null because the first run through
// already deleted the datasource
//assert config != null: "configuration should not be null";
DatasourceConfigurationEditor.deleteDataSource(xmlFile, datasourceName);
config = DatasourceConfigurationEditor.loadDatasource(xmlFile, datasourceName);
assert config == null : "configuration should be null if it was deleted";
dsXmlFile = "delete2DS.xml";
datasourceName = "delete2DS";
xmlFile = getDSXmlFile(dsXmlFile);
//config = DatasourceConfigurationEditor.loadDatasource(xmlFile, datasourceName);
//@TODO this assert should be in the test, but since Maven is running these tests twice
// The second pass through the test the config will be null because the first run through
// already deleted the datasource
//assert config != null: "configuration should not be null";
DatasourceConfigurationEditor.deleteDataSource(xmlFile, datasourceName);
config = DatasourceConfigurationEditor.loadDatasource(xmlFile, datasourceName);
assert config == null : "configuration should be null if it was deleted";
}
public void testDeleteDatasourceAfterCreatingNew() throws Exception {
String testName = "testCreateDatasource";
LOG.info(testName);
String dsXmlFile = "newDSForDeleteTest.xml";
String datasourceName = "NewDSForDelete";
File xmlFile = getDSXmlFile(dsXmlFile);
Configuration config = createConfiguration(new Configuration(), datasourceName);
ResourceType type = new ResourceType("datasource", "jbossas", ResourceCategory.SERVICE, null);
CreateResourceReport report = new CreateResourceReport(datasourceName, type, null, config, null);
DatasourceConfigurationEditor.updateDatasource(xmlFile, datasourceName, report);
config = DatasourceConfigurationEditor.loadDatasource(xmlFile, datasourceName);
assertLoadingOfConfiguration(config, datasourceName, testName);
DatasourceConfigurationEditor.deleteDataSource(xmlFile, datasourceName);
config = DatasourceConfigurationEditor.loadDatasource(xmlFile, datasourceName);
assert config == null : "configuration should be null if it was deleted";
}
private File getDSXmlFile(String fileName) {
String path = "target//test-classes//" + fileName;
return new File(path);
}
private void assertLoadingOfConfiguration(Configuration config, String datasourceName, String testName) {
assert config != null : "Unable to find Datasource in " + testName;
PropertySimple jndiNameProperty = config.getSimple("jndi-name");
assert jndiNameProperty != null : "Unable to get JNDI Name property";
assert jndiNameProperty.getStringValue().equals(datasourceName) : "Loaded config from Create Datasource test does not have the correct jndi-name value";
}
private void assertConfigurationValues(Configuration config, Map<String, String> valuesToCheck, String testName) {
for (String xmlTagString : DatasourceConfigurationEditor.COMMON_PROPS) {
PropertySimple property = config.getSimple(xmlTagString);
if (property != null) {
String propertyName = property.getName();
if (valuesToCheck.containsKey(propertyName)) {
String propertyValue = property.getStringValue();
String valueToCheck = valuesToCheck.get(propertyName);
assert valueToCheck.equals(propertyValue) : propertyName
+ " is not set correctly in the configuration in test: " + testName;
}
}
}
}
private Configuration createConfiguration(Configuration config, String datasourceName) {
PropertySimple jndiName = config.getSimple("jndi-name");
if (jndiName == null) {
jndiName = new PropertySimple("jndi-name", datasourceName);
}
config.put(jndiName);
PropertySimple type = config.getSimple("type");
if (type == null) {
type = new PropertySimple("type", "local-tx-datasource");
}
config.put(type);
PropertySimple maxPoolSize = config.getSimple("max-pool-size");
if (maxPoolSize == null) {
maxPoolSize = new PropertySimple("max-pool-size", 100);
}
config.put(maxPoolSize);
PropertyMap mapProperty = config.getMap("connection-property");
if (mapProperty == null) {
mapProperty = new PropertyMap("connection-property");
Map<String, Property> map = new HashMap<String, Property>();
mapProperty.setMap(map);
config.put(mapProperty);
}
return config;
}
}