/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2010-2011 The OpenNMS Group, Inc.
* OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc.
*
* OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
*
* OpenNMS(R) 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, either version 3 of the License,
* or (at your option) any later version.
*
* OpenNMS(R) 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 OpenNMS(R). If not, see:
* http://www.gnu.org/licenses/
*
* For more information contact:
* OpenNMS(R) Licensing <license@opennms.org>
* http://www.opennms.org/
* http://www.opennms.com/
*******************************************************************************/
package org.opennms.netmgt.config.jdbc;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.SchemaOutputResolver;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;
import org.custommonkey.xmlunit.DetailedDiff;
import org.custommonkey.xmlunit.Difference;
import org.custommonkey.xmlunit.XMLUnit;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.opennms.test.FileAnticipator;
import org.xml.sax.SAXException;
public class JdbcDataCollectionConfigTest {
private Marshaller m;
private Unmarshaller um;
private FileAnticipator fa;
private JAXBContext c;
private JdbcDataCollectionConfig jdcc;
static private class TestOutputResolver extends SchemaOutputResolver {
private final File m_schemaFile;
public TestOutputResolver(File schemaFile) {
m_schemaFile = schemaFile;
}
public Result createOutput(String namespaceUri, String suggestedFileName) throws IOException {
return new StreamResult(m_schemaFile);
}
}
@Before
public void setUp() throws Exception {
fa = new FileAnticipator();
c = JAXBContext.newInstance(JdbcDataCollectionConfig.class);
m = c.createMarshaller();
um = c.createUnmarshaller();
// Mock up a JdbcDataCollectionConfig class.
JdbcRrd jdbcRrd = new JdbcRrd();
jdbcRrd.addRra("RRA:AVERAGE:0.5:1:2016");
jdbcRrd.addRra("RRA:AVERAGE:0.5:12:1488");
jdbcRrd.addRra("RRA:AVERAGE:0.5:288:366");
jdbcRrd.addRra("RRA:MAX:0.5:288:366");
jdbcRrd.addRra("RRA:MIN:0.5:288:366");
jdbcRrd.setStep(300);
JdbcStatement jdbcStatement = new JdbcStatement();
jdbcStatement.setJdbcQuery(
"SELECT COUNT(eventid) as EventCount\n"+
"FROM events\n"+
"WHERE eventtime\n"+
"BETWEEN (CURRENT_TIMESTAMP - INTERVAL '1 day')\n"+
"AND CURRENT_TIMESTAMP;");
JdbcColumn column = new JdbcColumn();
column.setColumnName("eventCount");
column.setDataSourceName("EventCount");
column.setDataType("GAUGE");
column.setAlias("eventCount");
JdbcQuery jdbcQuery = new JdbcQuery();
jdbcQuery.setQueryName("opennmsQuery");
jdbcQuery.setJdbcStatement(jdbcStatement);
jdbcQuery.addJdbcColumn(column);
jdbcQuery.setRecheckInterval(3600000);
jdbcQuery.setIfType("all");
jdbcQuery.setResourceType("node");
JdbcDataCollection jdbcDataCollection = new JdbcDataCollection();
jdbcDataCollection.setJdbcRrd(jdbcRrd);
jdbcDataCollection.addQuery(jdbcQuery);
jdbcDataCollection.setName("default");
jdcc = new JdbcDataCollectionConfig();
jdcc.addDataCollection(jdbcDataCollection);
jdcc.setRrdRepository("/opt/opennms/share/rrd/snmp/");
XMLUnit.setIgnoreWhitespace(true);
XMLUnit.setIgnoreAttributeOrder(true);
XMLUnit.setNormalize(true);
}
@After
public void tearDown() throws Exception {
}
@Test
public void generateSchema() throws Exception {
File schemaFile = fa.expecting("jdbc-datacollection-config.xsd");
c.generateSchema(new TestOutputResolver(schemaFile));
if (fa.isInitialized()) {
fa.deleteExpected();
}
}
@Test
public void generateXML() throws Exception {
// Marshal the test object to an XML string
StringWriter objectXML = new StringWriter();
m.marshal(jdcc, objectXML);
// Read the example XML from src/test/resources
StringBuffer exampleXML = new StringBuffer();
File jdbcCollectionConfig = new File(ClassLoader.getSystemResource("jdbc-datacollection-config.xml").getFile());
assertTrue("jdbc-datacollection-config.xml is readable", jdbcCollectionConfig.canRead());
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(jdbcCollectionConfig), "UTF-8"));
String line;
while (true) {
line = reader.readLine();
if (line == null) {
reader.close();
break;
}
exampleXML.append(line).append("\n");
}
System.err.println("========================================================================");
System.err.println("Object XML:");
System.err.println("========================================================================");
System.err.print(objectXML.toString());
System.err.println("========================================================================");
System.err.println("Example XML:");
System.err.println("========================================================================");
System.err.print(exampleXML.toString());
DetailedDiff myDiff = getDiff(objectXML, exampleXML);
assertEquals("number of XMLUnit differences between the example XML and the mock object XML is 0", 0, myDiff.getAllDifferences().size());
}
@Test
public void readXML() throws Exception {
// Retrieve the file we're parsing.
File jdbcCollectionConfig = new File(ClassLoader.getSystemResource("jdbc-datacollection-config.xml").getFile());
assertTrue("jdbc-datacollection-config.xml is readable", jdbcCollectionConfig.canRead());
InputStream reader = new FileInputStream(jdbcCollectionConfig);
um.setSchema(null);
JdbcDataCollectionConfig exampleJdcc = (JdbcDataCollectionConfig)um.unmarshal(reader);
assertTrue("Compare JDBC Data Collection Config objects.", jdcc.equals(exampleJdcc));
reader.close();
}
@SuppressWarnings("unchecked")
private DetailedDiff getDiff(StringWriter objectXML,
StringBuffer exampleXML) throws SAXException, IOException {
DetailedDiff myDiff = new DetailedDiff(XMLUnit.compareXML(exampleXML.toString(), objectXML.toString()));
List<Difference> allDifferences = myDiff.getAllDifferences();
if (allDifferences.size() > 0) {
for (Difference d : allDifferences) {
System.err.println(d);
}
}
return myDiff;
}
}