com.espertech.esper.regression.support.ResultAssertExecution.java Source code

Java tutorial

Introduction

Here is the source code for com.espertech.esper.regression.support.ResultAssertExecution.java

Source

/*
 * *************************************************************************************
 *  Copyright (C) 2008 EsperTech, Inc. All rights reserved.                            *
 *  http://esper.codehaus.org                                                          *
 *  http://www.espertech.com                                                           *
 *  ---------------------------------------------------------------------------------- *
 *  The software in this package is published under the terms of the GPL license       *
 *  a copy of which has been included with this distribution in the license.txt file.  *
 * *************************************************************************************
 */

package com.espertech.esper.regression.support;

import com.espertech.esper.client.EPRuntime;
import com.espertech.esper.client.EPServiceProvider;
import com.espertech.esper.client.EPStatement;
import com.espertech.esper.client.EventBean;
import com.espertech.esper.client.scopetest.EPAssertionUtil;
import com.espertech.esper.client.scopetest.SupportUpdateListener;
import com.espertech.esper.client.time.CurrentTimeEvent;
import com.espertech.esper.collection.UniformPair;
import com.espertech.esper.support.bean.SupportBean;
import junit.framework.Assert;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.util.Arrays;
import java.util.Map;
import java.util.TreeMap;

public class ResultAssertExecution {
    private static final Log log = LogFactory.getLog(ResultAssertExecution.class);
    private static final Log preformatlog = LogFactory.getLog("PREFORMATTED");

    private final EPServiceProvider engine;
    private EPStatement stmt;
    private final SupportUpdateListener listener;
    private final ResultAssertTestResult expected;
    private static final TreeMap<Long, TimeAction> input = ResultAssertInput.getActions();

    public ResultAssertExecution(EPServiceProvider engine, EPStatement stmt, SupportUpdateListener listener,
            ResultAssertTestResult expected) {
        this.engine = engine;
        this.stmt = stmt;
        this.listener = listener;
        this.expected = expected;
    }

    public void execute() {
        boolean isAssert = System.getProperty("ASSERTION_DISABLED") == null;

        // First execution is for ISTREAM only, which is the default
        execute(isAssert, true);

        // Second execution is for IRSTREAM, asserting both the insert and remove stream
        stmt.stop();
        String epl = stmt.getText();
        String irStreamEPL = epl.replace("select ", "select irstream ");
        stmt = engine.getEPAdministrator().createEPL(irStreamEPL);
        stmt.addListener(listener);
        execute(isAssert, false);
    }

    private void execute(boolean isAssert, boolean isExpectNullRemoveStream) {
        // For use in join tests, send join-to events
        engine.getEPRuntime().sendEvent(new SupportBean("IBM", 0));
        engine.getEPRuntime().sendEvent(new SupportBean("MSFT", 0));
        engine.getEPRuntime().sendEvent(new SupportBean("YAH", 0));

        if (preformatlog.isDebugEnabled()) {
            preformatlog.debug(String.format("Category: %s   Output rate limiting: %s", expected.getCategory(),
                    expected.getTitle()));
            preformatlog.debug("");
            preformatlog.debug("Statement:");
            preformatlog.debug(stmt.getText());
            preformatlog.debug("");
            preformatlog.debug(String.format("%28s  %38s", "Input", "Output"));
            preformatlog.debug(String.format("%45s  %15s  %15s", "", "Insert Stream", "Remove Stream"));
            preformatlog.debug(String.format("%28s  %30s", "-----------------------------------------------",
                    "----------------------------------"));
            preformatlog.debug(String.format("%5s %5s%8s%8s", "Time", "Symbol", "Volume", "Price"));
        }

        for (Map.Entry<Long, TimeAction> timeEntry : input.entrySet()) {
            long time = timeEntry.getKey();
            String timeInSec = String.format("%3.1f", time / 1000.0);

            log.info(".execute At " + timeInSec + " sending timer event");
            sendTimer(time);

            if (preformatlog.isDebugEnabled()) {
                String comment = timeEntry.getValue().getActionDesc();
                comment = (comment == null) ? "" : comment;
                preformatlog.debug(String.format("%5s %24s %s", timeInSec, "", comment));
            }

            processAction(time, timeInSec, timeEntry.getValue(), isAssert, isExpectNullRemoveStream);
        }
    }

    private void processAction(long currentTime, String timeInSec, TimeAction value, boolean isAssert,
            boolean isExpectNullRemoveStream) {

        Map<Integer, StepDesc> assertions = expected.getAssertions().get(currentTime);

        // Assert step 0 which is the timer event result then send events and assert remaining
        assertStep(timeInSec, 0, assertions, expected.getProperties(), isAssert, isExpectNullRemoveStream);

        for (int step = 1; step < 10; step++) {
            if (value.getEvents().size() >= step) {
                EventSendDesc sendEvent = value.getEvents().get(step - 1);
                log.info(".execute At " + timeInSec + " sending event: " + sendEvent.getTheEvent() + " "
                        + sendEvent.getEventDesc());
                engine.getEPRuntime().sendEvent(sendEvent.getTheEvent());

                if (preformatlog.isDebugEnabled()) {
                    preformatlog.debug(String.format("%5s  %5s%8s %7.1f   %s", "",
                            sendEvent.getTheEvent().getSymbol(), sendEvent.getTheEvent().getVolume(),
                            sendEvent.getTheEvent().getPrice(), sendEvent.getEventDesc()));
                }
            }

            assertStep(timeInSec, step, assertions, expected.getProperties(), isAssert, isExpectNullRemoveStream);
        }
    }

    private void assertStep(String timeInSec, int step, Map<Integer, StepDesc> stepAssertions, String[] fields,
            boolean isAssert, boolean isExpectNullRemoveStream) {

        if (preformatlog.isDebugEnabled()) {
            if (listener.isInvoked()) {
                UniformPair<String[]> received = renderReceived(fields);
                String[] newRows = received.getFirst();
                String[] oldRows = received.getSecond();
                int numMaxRows = (newRows.length > oldRows.length) ? newRows.length : oldRows.length;
                for (int i = 0; i < numMaxRows; i++) {
                    String newRow = (newRows.length > i) ? newRows[i] : "";
                    String oldRow = (oldRows.length > i) ? oldRows[i] : "";
                    preformatlog.debug(String.format("%48s %-18s %-20s", "", newRow, oldRow));
                }
                if (numMaxRows == 0) {
                    preformatlog.debug(String.format("%48s %-18s %-20s", "", "(empty result)", "(empty result)"));
                }
            }
        }

        if (!isAssert) {
            listener.reset();
            return;
        }

        StepDesc stepDesc = null;
        if (stepAssertions != null) {
            stepDesc = stepAssertions.get(step);
        }

        // If there is no assertion, there should be no event received
        if (stepDesc == null) {
            Assert.assertFalse("At time " + timeInSec + " expected no events but received one or more",
                    listener.isInvoked());
        } else {
            // If we do expect remove stream events, asset both
            if (!isExpectNullRemoveStream) {
                String message = "At time " + timeInSec;
                Assert.assertTrue(message + " expected events but received none", listener.isInvoked());
                EPAssertionUtil.assertPropsPerRow(listener.getLastNewData(), expected.getProperties(),
                        stepDesc.getNewDataPerRow(), "newData");

                EPAssertionUtil.assertPropsPerRow(listener.getLastOldData(), expected.getProperties(),
                        stepDesc.getOldDataPerRow(), "oldData");
            }
            // If we don't expect remove stream events (istream only), then asset new data only if there
            else {
                // If we do expect new data, assert
                if (stepDesc.getNewDataPerRow() != null) {
                    Assert.assertTrue("At time " + timeInSec + " expected events but received none",
                            listener.isInvoked());
                    EPAssertionUtil.assertPropsPerRow(listener.getLastNewData(), expected.getProperties(),
                            stepDesc.getNewDataPerRow(), "newData");
                } else {
                    // If we don't expect new data, make sure its null
                    Assert.assertNull(
                            "At time " + timeInSec + " expected no insert stream events but received some",
                            listener.getLastNewData());
                }

                Assert.assertNull("At time " + timeInSec
                        + " expected no remove stream events but received some(check irstream/istream(default) test case)",
                        listener.getLastOldData());
            }
        }
        listener.reset();
    }

    private UniformPair<String[]> renderReceived(String[] fields) {

        String[] renderNew = renderReceived(listener.getNewDataListFlattened(), fields);
        String[] renderOld = renderReceived(listener.getOldDataListFlattened(), fields);
        return new UniformPair<String[]>(renderNew, renderOld);
    }

    private String[] renderReceived(EventBean[] newDataListFlattened, String[] fields) {
        if (newDataListFlattened == null) {
            return new String[0];
        }
        String[] result = new String[newDataListFlattened.length];
        for (int i = 0; i < newDataListFlattened.length; i++) {
            Object[] values = new Object[fields.length];
            EventBean theEvent = newDataListFlattened[i];
            for (int j = 0; j < fields.length; j++) {
                values[j] = theEvent.get(fields[j]);
            }
            result[i] = Arrays.toString(values);
        }
        return result;
    }

    private void sendTimer(long timeInMSec) {
        CurrentTimeEvent theEvent = new CurrentTimeEvent(timeInMSec);
        EPRuntime runtime = engine.getEPRuntime();
        runtime.sendEvent(theEvent);
    }
}