package com.splunk.modularinput; import com.splunk.SDKTestCase; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.w3c.dom.Document; import javax.xml.parsers.ParserConfigurationException; import javax.xml.stream.XMLStreamException; import javax.xml.transform.TransformerException; import java.io.InputStream; import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.util.Date; /** * Test the behavior of subclasses of the Script class. This is to check whether modular inputs really * do what they're supposed to. */ public class ScriptTest extends ModularInputTestCase { EventWriter eventWriter; StringWriter out, err; InputStream in; @Before public void setUp() throws XMLStreamException { out = new StringWriter(); err = new StringWriter(); eventWriter = new EventWriter(out, err); } /* * A script that returns a null scheme should generate no output on stdout and an error on stderr * saying that it the scheme was null. */ @Test public void testErrorOnScriptWithNullScheme() throws XMLStreamException { Script script = new Script() { @Override public Scheme getScheme() { return null; } @Override public void streamEvents(InputDefinition inputs, EventWriter ew) throws MalformedDataException, XMLStreamException { // Not used. } }; String[] args = new String[] {"--scheme"}; int returnValue = script.run(args, eventWriter, in); Assert.assertEquals("", out.toString()); Assert.assertEquals("FATAL Modular input script returned a null scheme.\n", err.toString()); Assert.assertNotEquals(0, returnValue); } /* * Check that a scheme generated by a script is what we expect. */ @Test public void testSchemeProperlyGeneratedByScript() throws TransformerException, ParserConfigurationException { Script script = new Script() { @Override public Scheme getScheme() { Scheme scheme = new Scheme("abcd"); scheme.setDescription("\uC3BC and \uC3B6 and <&> f\u00FCr"); scheme.setStreamingMode(Scheme.StreamingMode.SIMPLE); scheme.setUseExternalValidation(false); scheme.setUseSingleInstance(true); Argument arg1 = new Argument("arg1"); scheme.addArgument(arg1); Argument arg2 = new Argument("arg2"); arg2.setDescription("\uC3BC and \uC3B6 and <&> f\u00FCr"); arg2.setDataType(Argument.DataType.NUMBER); arg2.setRequiredOnCreate(true); arg2.setRequiredOnEdit(true); arg2.setValidation("is_pos_int('some_name')"); scheme.addArgument(arg2); return scheme; } @Override public void streamEvents(InputDefinition inputs, EventWriter ew) throws MalformedDataException, XMLStreamException { // Not used. } }; String[] args = new String[] {"--scheme"}; int returnValue = script.run(args, eventWriter, in); Assert.assertEquals("", err.toString()); Assert.assertEquals(0, returnValue); Document found = stringToXmlDocument(out.toString()); Document expected = resourceToXmlDocument("modularinput/data/scheme_without_defaults.xml"); assertXmlEqual(expected, found); } /* * Check that successful validation yield no text and a 0 exit value. */ @Test public void testSuccessfulValidation() throws UnsupportedEncodingException { Script script = new Script() { @Override public Scheme getScheme() { return null; // Unused } @Override public void validateInput(ValidationDefinition definition) throws Exception { // Always succeed } @Override public void streamEvents(InputDefinition inputs, EventWriter ew) throws MalformedDataException, XMLStreamException { // Unused } }; String[] args = new String[] {"--validate-arguments"}; int returnValue = script.run( args, eventWriter, SDKTestCase.openResource("modularinput/data/validation.xml") ); Assert.assertEquals("", err.toString()); Assert.assertEquals("", out.toString()); Assert.assertEquals(0, returnValue); } /* * Check that failed validation writes sensible XML to stdout. */ @Test public void testFailedValidation() throws TransformerException, ParserConfigurationException { Script script = new Script() { @Override public Scheme getScheme() { return null; // Unused } @Override public void validateInput(ValidationDefinition definition) throws Exception { throw new MalformedDataException("Oh, the vogonity!"); } @Override public void streamEvents(InputDefinition inputs, EventWriter ew) throws MalformedDataException, XMLStreamException { // Unused } }; String[] args = new String[] {"--validate-arguments"}; int returnValue = script.run( args, eventWriter, SDKTestCase.openResource("modularinput/data/validation.xml") ); Document expectedXml = resourceToXmlDocument("modularinput/data/validation_error.xml"); Document foundXml = stringToXmlDocument(out.toString()); Assert.assertEquals("", err.toString()); assertXmlEqual(expectedXml, foundXml); Assert.assertNotEquals(0, returnValue); } /* * Check that passing an input definition and writing a couple events goes smoothly. */ @Test public void testWriteEvents() throws TransformerException, ParserConfigurationException { Script script = new Script() { @Override public Scheme getScheme() { return null; // Unused } @Override public void streamEvents(InputDefinition inputs, EventWriter ew) throws MalformedDataException, XMLStreamException { 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); ew.writeEvent(event); } }; String[] args = new String[] {}; InputStream input = SDKTestCase.openResource("modularinput/data/conf_with_2_inputs.xml"); int returnValue = script.run(args, eventWriter, input); Assert.assertEquals(0, returnValue); Assert.assertEquals("", err.toString()); Document expectedXml = resourceToXmlDocument("modularinput/data/stream_with_two_events.xml"); Document foundXml = stringToXmlDocument(out.toString()); assertXmlEqual(expectedXml, foundXml); } }