package com.splunk.modularinput;
import org.junit.Assert;
import org.junit.Test;
import org.w3c.dom.Document;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import javax.xml.transform.TransformerException;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Date;
import java.util.logging.Level;
/**
* Checks if Event and EventWriter behavior correctly.
*/
public class EventTest extends ModularInputTestCase {
/**
* An event without a data field should throw an error when asked to write itself onto a stream. Be sure
* that it does.
*/
@Test
public void testEventWithoutEnoughFieldsFails() throws XMLStreamException {
StringWriter sb = new StringWriter();
XMLStreamWriter writer = XMLOutputFactory.newInstance().createXMLStreamWriter(sb);
Event event = new Event();
try {
event.writeTo(writer);
} catch (MalformedDataException e) {
Assert.assertTrue(true);
return;
}
Assert.fail();
}
/**
* Generate XML from an event object with a small number of fields, and see if it matches what we expect.
*/
@Test
public void testXmlOfEventWithMinimalConfiguration() throws XMLStreamException, MalformedDataException, TransformerException,
ParserConfigurationException {
StringWriter sb = new StringWriter();
XMLStreamWriter writer = XMLOutputFactory.newInstance().createXMLStreamWriter(sb);
Event event = new Event();
event.setTime(new Date(1372187084000L));
event.setStanza("fubar");
event.setData("This is a test of the emergency broadcast system.");
event.writeTo(writer);
Document found = stringToXmlDocument(sb.toString());
Document expected = resourceToXmlDocument("modularinput/data/event_minimal.xml");
assertXmlEqual(expected, found);
}
/**
* Generate XML from an event with all its fields set, and see if it matches what we expect.
*/
@Test
public void testXmlOfEventWithMoreConfiguration() throws MalformedDataException, XMLStreamException, TransformerException,
ParserConfigurationException {
StringWriter sb = new StringWriter();
XMLStreamWriter writer = XMLOutputFactory.newInstance().createXMLStreamWriter(sb);
Event event = new Event();
event.setTime(new Date(1372274622493L));
event.setStanza("fubar");
event.setData("This is a test of the emergency broadcast system.");
event.setHost("localhost");
event.setIndex("main");
event.setSource("hilda");
event.setSourceType("misc");
event.setDone(true);
event.setUnbroken(true);
event.writeTo(writer);
Document found = stringToXmlDocument(sb.toString());
Document expected = resourceToXmlDocument("modularinput/data/event_maximal.xml");
assertXmlEqual(expected, found);
}
/**
* Write a pair of events with an EventWriter, and ensure that they are being encoded immediately and correctly
* onto the output stream.
*/
@Test
public void testWritingEventsOnEventWriter() throws XMLStreamException, TransformerException,
ParserConfigurationException, MalformedDataException {
StringWriter out = new StringWriter();
StringWriter err = new StringWriter();
EventWriter ew = new EventWriter(out, err);
Event event = new Event();
event.setTime(new Date(1372275124466L));
event.setStanza("fubar");
event.setData("This is a test of the emergency broadcast system.");
event.setHost("localhost");
event.setIndex("main");
event.setSource("hilda");
event.setSourceType("misc");
event.setDone(true);
event.setUnbroken(true);
ew.writeEvent(event);
Document found = stringToXmlDocument(out.toString() + "</stream>");
Document expected = resourceToXmlDocument("modularinput/data/stream_with_one_event.xml");
assertXmlEqual(expected, found);
Assert.assertEquals("", err.toString());
err.getBuffer().setLength(0);
ew.writeEvent(event);
ew.close();
found = stringToXmlDocument(out.toString());
expected = resourceToXmlDocument("modularinput/data/stream_with_two_events.xml");
assertXmlEqual(expected, found);
}
/**
* An event which cannot write itself onto an output stream (such as because it doesn't have a data field set)
* should write an error to stderr. Check that it does so.
*/
@Test
public void testErrorInEventWriter() throws XMLStreamException {
StringWriter out = new StringWriter();
StringWriter err = new StringWriter();
EventWriter ew = new EventWriter(out, err);
Event event = new Event();
try {
ew.writeEvent(event);
} catch (MalformedDataException e) {
Assert.assertTrue(err.toString().startsWith("WARN"));
return;
}
Assert.fail();
}
/**
* Check that the log method on EventWriter produces the expected error message on the stderr stream.
*/
@Test
public void testLoggingErrorsWithEventWriter() throws XMLStreamException, IOException {
StringWriter out = new StringWriter();
StringWriter err = new StringWriter();
EventWriter ew = new EventWriter(out, err);
ew.log(EventWriter.ERROR, "Something happened!");
Assert.assertEquals("ERROR Something happened!\n", err.toString());
}
/**
* Check that EventWriter.writeXmlDocument writes sensible XML to the output stream.
*/
@Test
public void testWriteXmlDocumentIsSane() throws XMLStreamException, IOException, TransformerException, ParserConfigurationException {
StringWriter out = new StringWriter();
StringWriter err = new StringWriter();
EventWriter ew = new EventWriter(out, err);
Document expectedXml = resourceToXmlDocument("modularinput/data/event_maximal.xml");
ew.writeXmlDocument(expectedXml);
Document foundXml = stringToXmlDocument(out.toString());
assertXmlEqual(expectedXml, foundXml);
}
}