/*
 * *************************************************************************************
 *  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.multithread;

import junit.framework.TestCase;
import com.espertech.esper.client.EPServiceProvider;
import com.espertech.esper.client.EPServiceProviderManager;
import com.espertech.esper.client.EPStatement;
import com.espertech.esper.client.Configuration;
import com.espertech.esper.support.bean.SupportTradeEvent;
import com.espertech.esper.multithread.TwoPatternRunnable;

/**
 * Test for multithread-safety for case of 2 patterns:
 *  1. Thread 1 starts pattern "every event1=SupportEvent(userID in ('100','101'), amount>=1000)"
 *  2. Thread 1 repeats sending 100 events and tests 5% received
 *  3. Main thread starts pattern:
 *      ( every event1=SupportEvent(userID in ('100','101')) ->
         (SupportEvent(userID in ('100','101'), direction = event1.direction ) ->
          SupportEvent(userID in ('100','101'), direction = event1.direction )
         ) where timer:within(8 hours)
         and not eventNC=SupportEvent(userID in ('100','101'), direction!= event1.direction )
        ) -> eventFinal=SupportEvent(userID in ('100','101'), direction != event1.direction ) where timer:within(1 hour)
 *   4. Main thread waits for 2 seconds and stops all threads
 */
public class TestMTStmtTwoPatternsStartStop extends TestCase
{
    private EPServiceProvider engine;

    public void setUp()
    {
        Configuration config = new Configuration();
        config.addEventType("SupportEvent", SupportTradeEvent.class);
        
        engine = EPServiceProviderManager.getDefaultProvider(config);
        engine.initialize();
    }

    public void tearDown()
    {
        engine.initialize();
    }

    public void test2Patterns() throws Exception
    {
        String statementTwo = "( every event1=SupportEvent(userId in ('100','101')) ->\n" +
                "         (SupportEvent(userId in ('100','101'), direction = event1.direction ) ->\n" +
                "          SupportEvent(userId in ('100','101'), direction = event1.direction )\n" +
                "         ) where timer:within(8 hours)\n" +
                "         and not eventNC=SupportEvent(userId in ('100','101'), direction!= event1.direction )\n" +
                "        ) -> eventFinal=SupportEvent(userId in ('100','101'), direction != event1.direction ) where timer:within(1 hour)";

        TwoPatternRunnable runnable = new TwoPatternRunnable(engine);
        Thread t = new Thread(runnable);
        t.start();
        Thread.sleep(200);

        // Create a second pattern, wait 200 msec, destroy second pattern in a loop
        for (int i = 0; i < 10; i++)
        {
            EPStatement statement = engine.getEPAdministrator().createPattern(statementTwo);
            Thread.sleep(200);
            statement.destroy();
        }

        runnable.setShutdown(true);
        Thread.sleep(1000);
        assertFalse(t.isAlive());
    }
}
