package com.neverwinterdp.scribengin.dataflow.test; import java.io.File; import org.apache.commons.lang.StringUtils; import org.tap4j.model.TestResult; import org.tap4j.model.TestSet; import org.tap4j.producer.TapProducer; import org.tap4j.producer.TapProducerFactory; import org.tap4j.util.StatusValues; import com.beust.jcommander.Parameter; import com.neverwinterdp.scribengin.client.shell.ScribenginShell; import com.neverwinterdp.scribengin.dataflow.DataflowDescriptor; import com.neverwinterdp.scribengin.dataflow.test.DataflowTestReport.DataflowSinkValidatorReport; import com.neverwinterdp.scribengin.dataflow.test.DataflowTestReport.DataflowSourceGeneratorReport; abstract public class DataflowTest { @Parameter(names = "--flow-name", description = "The flow name") protected String name = "hello"; @Parameter(names = "--worker", description = "Number of the workers") protected int numOfWorkers = 3; @Parameter(names = "--executor-per-worker", description = "The number of executor per worker") protected int numOfExecutorPerWorker = 3; @Parameter(names = "--task-max-execute-time", description = "The max time an executor should work on a task") protected long taskMaxExecuteTime = 10000; @Parameter(names = "--duration", description = "Max duration for the test") protected long duration = 60000; @Parameter(names = "--print-dataflow-info", description = "Max duration for the test") protected long printDataflowInfo = 5000; @Parameter(names = "--junit-report", description = "The junit report output file") protected String junitReport; public void run(ScribenginShell shell) throws Exception { doRun(shell); } protected Thread newPrintDataflowThread(ScribenginShell shell, DataflowDescriptor descriptor) throws Exception { return new PrintDataflowInfoThread(shell, descriptor, printDataflowInfo); } abstract protected void doRun(ScribenginShell shell) throws Exception; protected void junitReport(DataflowTestReport dataFlowTestReport) throws Exception { if (junitReport == null) { return; } DataflowSourceGeneratorReport sourceReport = dataFlowTestReport.getSourceGeneratorReport(); DataflowSinkValidatorReport sinkReport = dataFlowTestReport.getSinkValidatorReport(); TestSet testSet = new TestSet(); int testNum = 0; testSet.addTestResult(newTestResult(++testNum, "Source Name: " + sourceReport.getSourceName(), StringUtils.isNotBlank(sourceReport.getSourceName()))); testSet.addTestResult(newTestResult(++testNum, "Source Streams: " + sourceReport.getNumberOfStreams(), sourceReport.getNumberOfStreams() > 0)); testSet.addTestResult(newTestResult(++testNum, "Write Duration (ms): " + sourceReport.getDuration(), sourceReport.getDuration() > 0.0)); testSet.addTestResult(newTestResult(++testNum, "Write Count: " + sourceReport.getWriteCount(), sourceReport.getWriteCount() > 0)); testSet.addTestResult(newTestResult(++testNum, "Sink Name: " + sinkReport.getSinkName(), StringUtils.isNotBlank(sinkReport.getSinkName()))); testSet.addTestResult(newTestResult(++testNum, "Sink Streams: " + sinkReport.getNumberOfStreams(), sinkReport.getNumberOfStreams() > 0)); testSet.addTestResult(newTestResult(++testNum, "Read Duration (ms): " + sinkReport.getDuration(), sinkReport.getDuration() > 0)); testSet.addTestResult(newTestResult(++testNum, "Read Count: " + sinkReport.getReadCount(), sinkReport.getReadCount() > 0)); testSet.addTestResult(newTestResult(++testNum, "Overall Test success : " + (sinkReport.getReadCount() >= sourceReport.getWriteCount()), sinkReport.getReadCount() >= sourceReport.getWriteCount())); TapProducer tapProducer = TapProducerFactory.makeTapJunitProducer(junitReport); tapProducer.dump(testSet, new File(junitReport)); } private TestResult newTestResult(int testNum, String desc, boolean passed) { TestResult tr = null; if (passed) { tr = new TestResult(StatusValues.OK, testNum); } else { tr = new TestResult(StatusValues.NOT_OK, testNum); } tr.setDescription(desc); return tr; } public static class PrintDataflowInfoThread extends Thread { ScribenginShell shell; DataflowDescriptor descriptor; long period; PrintDataflowInfoThread(ScribenginShell shell, DataflowDescriptor descriptor, long period) { this.shell = shell; this.descriptor = descriptor; this.period = period; } public void run() { try { while (true) { Thread.sleep(period); try { shell.execute("dataflow info --running " + descriptor.getName()); } catch (Exception ex) { System.err.println(ex.getMessage()); } } } catch (InterruptedException ex) { } } } }