/*
* 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.domain.configuration.test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.List;
import org.testng.annotations.Test;
import org.rhq.core.domain.configuration.AbstractResourceConfigurationUpdate;
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.PropertyList;
import org.rhq.core.domain.configuration.PropertyMap;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.configuration.RawConfiguration;
import org.rhq.core.domain.configuration.ResourceConfigurationUpdate;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.shared.TransactionCallback;
import org.rhq.core.domain.test.AbstractEJB3Test;
import org.rhq.core.util.MessageDigestGenerator;
import org.rhq.core.util.exception.ThrowableUtil;
public class ConfigurationTest extends AbstractEJB3Test {
@Test(groups = "integration.ejb3")
public void testPersistConfigurationUpdateHistory() throws Exception {
executeInTransaction(new TransactionCallback() {
public void execute() throws Exception {
ResourceType type = new ResourceType("platform", "", ResourceCategory.PLATFORM, null);
em.persist(type);
Resource resource = new Resource("key", "name", type);
em.persist(resource);
Configuration c = new Configuration();
PropertySimple p1 = new PropertySimple("first", "firstValue");
p1.setErrorMessage(ThrowableUtil.getStackAsString(new Exception(
"This should be a boolean value - true or false")));
c.put(p1);
em.persist(c);
AbstractResourceConfigurationUpdate cur = new ResourceConfigurationUpdate(resource, c, "dummy");
em.persist(cur);
AbstractResourceConfigurationUpdate copy = em.find(AbstractResourceConfigurationUpdate.class,
cur.getId());
assert copy.getStatus().equals(ConfigurationUpdateStatus.INPROGRESS) : copy;
assert copy.getSubjectName().equals("dummy") : copy;
assert copy.getCreatedTime() > 0 : copy;
assert copy.getModifiedTime() > 0 : copy;
assert copy.getErrorMessage() == null : copy;
assert copy.getConfiguration().getSimple("first") != null : copy;
assert copy.getConfiguration().getSimple("first").getErrorMessage()
.indexOf("This should be a boolean value - true or false") > -1 : copy;
assert copy.getConfiguration().getSimple("first").getStringValue().equals("firstValue") : copy;
// let's pretend we failed the update
cur.setErrorMessage(ThrowableUtil.getStackAsString((new Exception("update error here"))));
assert copy.getStatus().equals(ConfigurationUpdateStatus.FAILURE) : copy; // setting the error message also sets status to failure
copy = em.find(AbstractResourceConfigurationUpdate.class, cur.getId());
assert copy.getStatus().equals(ConfigurationUpdateStatus.FAILURE) : copy;
assert copy.getErrorMessage().indexOf("update error here") > -1 : copy;
assert copy.getConfiguration().getSimple("first") != null : copy;
assert copy.getConfiguration().getSimple("first").getErrorMessage()
.indexOf("This should be a boolean value - true or false") > -1 : copy;
assert copy.getConfiguration().getSimple("first").getStringValue().equals("firstValue") : copy;
}
});
}
@Test(groups = "integration.ejb3")
public void testPersistConfiguration() throws Exception {
executeInTransaction(new TransactionCallback() {
public void execute() throws Exception {
Configuration c = new Configuration();
PropertySimple p1 = new PropertySimple("first", "firstValue");
p1.setErrorMessage(ThrowableUtil.getStackAsString(new Exception(
"This should be a boolean value - true or false")));
c.put(p1);
em.persist(c);
Configuration copy = em.find(Configuration.class, c.getId());
assert c.equals(copy);
assert copy.getSimple("first") != null;
assert copy.getSimple("first").getErrorMessage()
.indexOf("This should be a boolean value - true or false") > -1;
assert copy.getSimple("first").getStringValue().equals("firstValue");
}
});
}
@Test(groups = "integration.ejb3")
public void testConfigurationSerialization() throws Exception {
executeInTransaction(new TransactionCallback() {
public void execute() throws Exception {
Configuration c = new Configuration();
c.setId(1);
c.setNotes("hi");
c.setVersion(1);
PropertySimple p1 = new PropertySimple("a", true);
c.put(p1);
PropertyMap p2 = new PropertyMap("b");
p2.put(new PropertySimple("b1", "alpha"));
p2.put(new PropertySimple("b2", "beta"));
c.put(p2);
PropertyMap p3 = new PropertyMap("c");
c.put(p3);
PropertyList p4 = new PropertyList("d", new PropertySimple("d1", "alpha"));
c.put(p4);
PropertyList p5 = new PropertyList("e");
c.put(p5);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(c);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
Configuration c1 = (Configuration) ois.readObject();
assert c.getNotes().equals(c1.getNotes());
assert c1.getNames().containsAll(c.getNames());
assert c1.getMap("c").getMap().isEmpty();
System.out.println("Serialized version of config was " + baos.size() + " bytes");
}
});
}
@Test(groups = "integration.ejb3")
public void testStoreConfiguration() throws Exception {
executeInTransaction(new TransactionCallback() {
public void execute() throws Exception {
Configuration configuration = new Configuration();
configuration.setNotes("Testing");
configuration.setVersion(1);
configuration.put(new PropertySimple("Integer", 3));
configuration.put(new PropertySimple("String", "Hello, World"));
configuration.put(new PropertyList("EmptyList"));
configuration.put(new PropertyList("MyList", new PropertySimple("letter", "a"), new PropertySimple(
"letter", "b"), new PropertySimple("letter", "c")));
PropertyMap myMap = new PropertyMap("MyMap");
myMap.put(new PropertySimple("Alpha", "Uno"));
myMap.put(new PropertySimple("Beta", "Dose"));
myMap.put(new PropertyList("ListInAMap", new PropertySimple("foo", Math.PI), new PropertySimple("foo",
Math.E), new PropertySimple("foo", Double.MAX_VALUE), new PropertySimple("foo", Double.MIN_VALUE)));
configuration.put(myMap);
em.persist(configuration);
em.flush();
em.remove(configuration); // added by ips (03/29/07)
}
});
}
@Test(groups = "integration.ejb3")
public void testReadConfigurations() throws Exception {
executeInTransaction(new TransactionCallback() {
public void execute() throws Exception {
@SuppressWarnings("unchecked")
List<Configuration> configurations = em.createQuery("Select c from Configuration c").setMaxResults(5)
.getResultList();
for (Configuration configuration : configurations) {
System.out.println("Configuration Found: " + configuration.getNotes());
for (Property prop : configuration.getProperties()) {
prettyPrintProperty(prop, 1);
}
}
}
});
}
@Test(groups = "integration.ejb3")
public void verifyPersistSavesRawConfiguration() throws Exception {
executeInTransaction(new TransactionCallback() {
public void execute() throws Exception {
RawConfiguration rawConfig = createRawConfiguration();
Configuration config = new Configuration();
config.addRawConfiguration(rawConfig);
em.persist(config);
assertTrue("Failed to cascade save to " + RawConfiguration.class.getSimpleName(),
rawConfig.getId() != 0);
}
});
}
@Test(groups = "integration.ejb3")
public void verifyOrphanedRawConfigurationDeletedFromDatabase() throws Exception {
executeInTransaction(new TransactionCallback() {
public void execute() throws Exception {
RawConfiguration rawConfiguration = createRawConfiguration();
Configuration config = new Configuration();
config.addRawConfiguration(rawConfiguration);
em.persist(config);
config.removeRawConfiguration(rawConfiguration);
config = em.merge(config);
em.flush();
em.clear();
assertNull("Failed to remove the orphaned " + RawConfiguration.class.getSimpleName()
+ " from the persistence context.", em.find(RawConfiguration.class, rawConfiguration.getId()));
}
});
}
RawConfiguration createRawConfiguration() {
RawConfiguration rawConfig = new RawConfiguration();
String contents = "contents";
String sha256 = new MessageDigestGenerator(MessageDigestGenerator.SHA_256).calcDigestString(contents);
rawConfig.setContents(contents, sha256);
rawConfig.setPath("/tmp/foo");
return rawConfig;
}
public static void prettyPrintConfiguration(Configuration configuration) {
System.out.println("Configuration: " + configuration.getNotes());
for (Property p : configuration.getProperties()) {
prettyPrintProperty(p, 1);
}
}
private static void prettyPrintProperty(Property property, int indent) {
if (property instanceof PropertyList) {
for (int i = 0; i < indent; i++) {
System.out.print("\t");
}
System.out.println("List Property [" + property.getName() + "]");
for (Property p : ((PropertyList) property).getList()) {
prettyPrintProperty(p, indent + 1);
}
} else if (property instanceof PropertyMap) {
for (int i = 0; i < indent; i++) {
System.out.print("\t");
}
System.out.println("Map Property [" + property.getName() + "]");
for (Property p : ((PropertyMap) property).getMap().values()) {
prettyPrintProperty(p, indent + 1);
}
} else if (property instanceof PropertySimple) {
for (int i = 0; i < indent; i++) {
System.out.print("\t");
}
System.out.println(property.getName() + " = " + ((PropertySimple) property).getStringValue());
}
}
}