/*
* RHQ Management Platform
* Copyright (C) 2005-2011 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.sync.test;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jmock.Expectations;
import org.testng.annotations.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.criteria.MeasurementDefinitionCriteria;
import org.rhq.core.domain.measurement.MeasurementDefinition;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.sync.ExporterMessages;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.measurement.MeasurementDefinitionManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementScheduleManagerLocal;
import org.rhq.enterprise.server.sync.ExportingInputStream;
import org.rhq.enterprise.server.sync.MetricTemplateSynchronizer;
import org.rhq.enterprise.server.sync.SynchronizationConstants;
import org.rhq.enterprise.server.sync.Synchronizer;
import org.rhq.enterprise.server.sync.validators.ConsistencyValidator;
import org.rhq.test.JMockTest;
/**
*
*
* @author Lukas Krejci
*/
@Test
public class MetricTemplateExporterTest extends JMockTest {
private static final Log LOG = LogFactory.getLog(MetricTemplateExporterTest.class);
public void testCanExport() throws Exception {
final MeasurementDefinitionManagerLocal measurementDefinitionManager = context.mock(MeasurementDefinitionManagerLocal.class);
final MeasurementScheduleManagerLocal measurementScheduleManager = context.mock(MeasurementScheduleManagerLocal.class);
context.checking(new Expectations() {
{
allowing(measurementDefinitionManager).findMeasurementDefinitionsByCriteria(with(any(Subject.class)), with(any(MeasurementDefinitionCriteria.class)));
will(returnValue(getFakeMeasurementDefinitions()));
}
});
MetricTemplateSynchronizer exporter = new MetricTemplateSynchronizer(measurementDefinitionManager, measurementScheduleManager);
Set<Synchronizer<?, ?>> exporters = new HashSet<Synchronizer<?, ?>>();
exporters.add(exporter);
InputStream eis = new ExportingInputStream(exporters, new HashMap<String, ExporterMessages>(), 65536, false);
// String exportContents = readAll(new InputStreamReader(eis, "UTF-8"));
//
// LOG.warn("Export contents:\n" + exportContents);
//
// eis = new ByteArrayInputStream(exportContents.getBytes("UTF-8"));
// <?xml version="1.0" ?>
// <configuration-export>
// <validator class="org.rhq.enterprise.server.sync.validators.DeployedAgentPluginsValidator">
// <plugin name="fakePlugin" hash="12345" version="1.0.0.test"></plugin>
// </validator>
// <entities id="org.rhq.enterprise.server.sync.exporters.MetricTemplatesExporter">
// <entity>
// <data>
// <metricTemplate referencedEntityId="1" enabled="false" defaultInterval="0" metricName="m1" resourceTypePlugin="fakePlugin" resourceTypeName="fakeType"></metricTemplate>
// </data>
// </entity>
// <entity>
// <data>
// <metricTemplate referencedEntityId="2" enabled="false" defaultInterval="0" metricName="m2" resourceTypePlugin="fakePlugin" resourceTypeName="fakeType"></metricTemplate>
// </data>
// </entity>
// <entity>
// <data>
// <metricTemplate referencedEntityId="3" enabled="false" defaultInterval="0" metricName="m3" resourceTypePlugin="fakePlugin" resourceTypeName="fakeType"></metricTemplate>
// </data>
// </entity>
// </entities>
// </configuration-export>
DocumentBuilder bld = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = bld.parse(eis);
Element root = doc.getDocumentElement();
List<Node> validators = getDirectChildrenByTagName(root, SynchronizationConstants.VALIDATOR_ELEMENT);
Set<ConsistencyValidator> declaredValidators = exporter.getRequiredValidators();
assertEquals(validators.size(), declaredValidators.size(), "Unexpected number of validators in the export xml");
for (Node v : validators) {
Element validator = (Element) v;
String cls = validator.getAttribute(SynchronizationConstants.CLASS_ATTRIBUTE);
boolean found = false;
for (ConsistencyValidator dv : declaredValidators) {
if (cls.equals(dv.getClass().getName())) {
found = true;
break;
}
}
assertTrue(found, "The metric template exporter doesn't seem to declare a validator with class: " + cls
+ ", but one such appeared in the export");
}
Element entities = (Element) getFirstDirectChildByTagName(root, SynchronizationConstants.ENTITIES_EXPORT_ELEMENT);
assertEquals(entities.getAttribute(SynchronizationConstants.ID_ATTRIBUTE), MetricTemplateSynchronizer.class.getName(), "Unexpected id of the entities element.");
NodeList metricTemplates = entities.getElementsByTagName("metricTemplate");
assertEquals(metricTemplates.getLength(), 3, "Unexpected number of exported metric templates.");
for(int i = 0; i < metricTemplates.getLength(); ++i) {
Element m = (Element) metricTemplates.item(i);
String index = Integer.toString(i + 1);
String expectedName = "m" + index;
assertEquals(m.getAttribute("referencedEntityId"), index, "Unexpected referencedEntityId value");
assertEquals(m.getAttribute("enabled"), "false", "Unexpected enabled value");
assertEquals(m.getAttribute("defaultInterval"), "0", "Unexpected defaultInterval value");
assertEquals(m.getAttribute("metricName"), expectedName, "Unexpected metricName value");
assertEquals(m.getAttribute("resourceTypePlugin"), "fakePlugin", "Unexpected resourceTypePlugin value");
assertEquals(m.getAttribute("resourceTypeName"), "fakeType", "Unexpected resourceTypeName value");
}
}
private static String readAll(Reader rdr) throws IOException {
try {
StringBuilder bld = new StringBuilder();
int c;
while ((c = rdr.read()) != -1) {
bld.append((char) c);
}
return bld.toString();
} finally {
rdr.close();
}
}
private static Node getFirstDirectChildByTagName(Node node, String tagName) {
for (int i = 0; i < node.getChildNodes().getLength(); ++i) {
Node n = node.getChildNodes().item(i);
if (n.getNodeName().equals(tagName)) {
return n;
}
}
return null;
}
private static List<Node> getDirectChildrenByTagName(Node node, String tagName) {
List<Node> ret = new ArrayList<Node>();
for (int i = 0; i < node.getChildNodes().getLength(); ++i) {
Node n = node.getChildNodes().item(i);
if (n.getNodeName().equals(tagName)) {
ret.add(n);
}
}
return ret;
}
private static PageList<MeasurementDefinition> getFakeMeasurementDefinitions() {
List<MeasurementDefinition> ret = new ArrayList<MeasurementDefinition>();
ResourceType rt = new ResourceType("fakeType", "fakePlugin", ResourceCategory.PLATFORM, null);
ret.add(new MeasurementDefinition(rt, "m1"));
ret.add(new MeasurementDefinition(rt, "m2"));
ret.add(new MeasurementDefinition(rt, "m3"));
for(int i = 0; i < ret.size(); ++i) {
ret.get(i).setId(i + 1);
}
return new PageList<MeasurementDefinition>(ret, PageControl.getUnlimitedInstance());
}
}