/* * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * WSO2 Inc. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except * in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.wso2.siddhi.core.managment; import org.apache.log4j.Logger; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.wso2.siddhi.core.ExecutionPlanRuntime; import org.wso2.siddhi.core.SiddhiManager; import org.wso2.siddhi.core.event.Event; import org.wso2.siddhi.core.query.output.callback.QueryCallback; import org.wso2.siddhi.core.stream.input.InputHandler; import org.wso2.siddhi.core.stream.output.StreamCallback; import org.wso2.siddhi.core.util.EventPrinter; import org.wso2.siddhi.core.util.SiddhiTestHelper; import java.util.concurrent.atomic.AtomicInteger; public class QuerySyncTestCase { private static final Logger log = Logger.getLogger(QuerySyncTestCase.class); private AtomicInteger inEventCount; private AtomicInteger removeEventCount; private boolean eventArrived; private AtomicInteger count; @Before public void init() { count = new AtomicInteger(0); inEventCount = new AtomicInteger(0); removeEventCount = new AtomicInteger(0); eventArrived = false; } @Test public void querySyncTest1() throws InterruptedException { log.info("querySync test1"); SiddhiManager siddhiManager = new SiddhiManager(); String cseEventStream = "" + "define stream cseEventStream (symbol string, price float, volume int);"; String query = "" + "@info(name = 'query1') " + "@synchronized('true') " + "from cseEventStream#window.time(2 sec) " + "select symbol,price,volume " + "insert all events into outputStream ;"; ExecutionPlanRuntime executionPlanRuntime = siddhiManager.createExecutionPlanRuntime(cseEventStream + query); executionPlanRuntime.addCallback("query1", new QueryCallback() { @Override public void receive(long timeStamp, Event[] inEvents, Event[] removeEvents) { EventPrinter.print(timeStamp, inEvents, removeEvents); if (inEvents != null) { inEventCount.addAndGet(inEvents.length); } if (removeEvents != null) { Assert.assertTrue("InEvents arrived before RemoveEvents", inEventCount.get() > removeEventCount .get()); removeEventCount.addAndGet(removeEvents.length); } eventArrived = true; } }); InputHandler inputHandler = executionPlanRuntime.getInputHandler("cseEventStream"); executionPlanRuntime.start(); inputHandler.send(new Object[]{"IBM", 700f, 0}); inputHandler.send(new Object[]{"WSO2", 60.5f, 1}); Thread.sleep(4000); Assert.assertEquals(2, inEventCount.get()); Assert.assertEquals(2, removeEventCount.get()); Assert.assertTrue(eventArrived); executionPlanRuntime.shutdown(); } @Test public void querySyncTest2() throws InterruptedException { log.info("querySync test2"); SiddhiManager siddhiManager = new SiddhiManager(); String executionPlan = "" + "@Plan:name('SnapshotOutputRateLimitTest3') " + "" + "define stream LoginEvents (timeStamp long, ip string);" + "" + "@info(name = 'query1') " + "@synchronized('true') " + "from LoginEvents " + "select ip " + "output snapshot every 1 sec " + "insert all events into uniqueIps ;"; ExecutionPlanRuntime executionPlanRuntime = siddhiManager.createExecutionPlanRuntime(executionPlan); log.info("Running : " + executionPlanRuntime.getName()); executionPlanRuntime.addCallback("uniqueIps", new StreamCallback() { @Override public void receive(Event[] events) { EventPrinter.print(events); eventArrived = true; for (Event event : events) { if (event.isExpired()) { Assert.fail("Remove events emitted"); } else { count.incrementAndGet(); Assert.assertTrue("192.10.1.3".equals(event.getData(0)) || "192.10.1.4".equals(event.getData (0))); } } } }); InputHandler inputHandler = executionPlanRuntime.getInputHandler("LoginEvents"); executionPlanRuntime.start(); inputHandler.send(new Object[]{System.currentTimeMillis(), "192.10.1.5"}); Thread.sleep(100); inputHandler.send(new Object[]{System.currentTimeMillis(), "192.10.1.3"}); Thread.sleep(2200); inputHandler.send(new Object[]{System.currentTimeMillis(), "192.10.1.9"}); Thread.sleep(100); inputHandler.send(new Object[]{System.currentTimeMillis(), "192.10.1.4"}); Thread.sleep(1100); executionPlanRuntime.shutdown(); Assert.assertEquals("Event arrived", true, eventArrived); Assert.assertTrue("Number of output event value", 3 == count.get()); } @Test public void querySyncTest3() throws InterruptedException { log.info("querySync test3"); SiddhiManager siddhiManager = new SiddhiManager(); String streams = "" + "define stream cseEventStream (symbol string, price float, volume int); " + "define stream twitterStream (user string, tweet string, company string); "; String query = "" + "@info(name = 'query1') " + "@synchronized('true') " + "from cseEventStream#window.time(1 sec) as a join twitterStream#window.time(1 sec) as b " + "on a.symbol== b.company " + "select a.symbol as symbol, b.tweet, a.price " + "insert all events into outputStream ;"; ExecutionPlanRuntime executionPlanRuntime = siddhiManager.createExecutionPlanRuntime(streams + query); try { executionPlanRuntime.addCallback("query1", new QueryCallback() { @Override public void receive(long timeStamp, Event[] inEvents, Event[] removeEvents) { EventPrinter.print(timeStamp, inEvents, removeEvents); if (inEvents != null) { inEventCount.addAndGet(inEvents.length); } if (removeEvents != null) { removeEventCount.addAndGet(removeEvents.length); } eventArrived = true; } }); InputHandler cseEventStreamHandler = executionPlanRuntime.getInputHandler("cseEventStream"); InputHandler twitterStreamHandler = executionPlanRuntime.getInputHandler("twitterStream"); executionPlanRuntime.start(); cseEventStreamHandler.send(new Object[]{"WSO2", 55.6f, 100}); twitterStreamHandler.send(new Object[]{"User1", "Hello World", "WSO2"}); cseEventStreamHandler.send(new Object[]{"IBM", 75.6f, 100}); Thread.sleep(500); cseEventStreamHandler.send(new Object[]{"WSO2", 57.6f, 100}); SiddhiTestHelper.waitForEvents(100, 2, inEventCount, 60000); SiddhiTestHelper.waitForEvents(100, 2, removeEventCount, 60000); Assert.assertEquals(2, inEventCount.get()); Assert.assertEquals(2, removeEventCount.get()); Assert.assertTrue(eventArrived); } finally { executionPlanRuntime.shutdown(); } } @Test public void querySyncTest4() throws InterruptedException { log.info("querySync test4"); SiddhiManager siddhiManager = new SiddhiManager(); String streams = "" + "define stream Stream1 (symbol string, price float, volume int); " + "define stream Stream2 (symbol string, price float, volume int); "; String query = "" + "@info(name = 'query1') " + "@synchronized('true') " + "from every ( e1=Stream1[price>20] -> e3=Stream1[price>20]) -> e2=Stream2[price>e1.price] " + "select e1.price as price1, e3.price as price3, e2.price as price2 " + "insert into OutputStream ;"; ExecutionPlanRuntime executionPlanRuntime = siddhiManager.createExecutionPlanRuntime(streams + query); executionPlanRuntime.addCallback("query1", new QueryCallback() { @Override public void receive(long timeStamp, Event[] inEvents, Event[] removeEvents) { EventPrinter.print(timeStamp, inEvents, removeEvents); if (inEvents != null) { for (Event event : inEvents) { inEventCount.incrementAndGet(); switch (inEventCount.get()) { case 1: org.junit.Assert.assertArrayEquals(new Object[]{55.6f, 54f, 57.7f}, event.getData()); break; case 2: org.junit.Assert.assertArrayEquals(new Object[]{53.6f, 53f, 57.7f}, event.getData()); break; default: org.junit.Assert.assertSame(2, inEventCount); } } eventArrived = true; } if (removeEvents != null) { removeEventCount.addAndGet(removeEvents.length); } eventArrived = true; } }); InputHandler stream1 = executionPlanRuntime.getInputHandler("Stream1"); InputHandler stream2 = executionPlanRuntime.getInputHandler("Stream2"); executionPlanRuntime.start(); stream1.send(new Object[]{"WSO2", 55.6f, 100}); Thread.sleep(100); stream1.send(new Object[]{"GOOG", 54f, 100}); Thread.sleep(100); stream1.send(new Object[]{"WSO2", 53.6f, 100}); Thread.sleep(100); stream1.send(new Object[]{"GOOG", 53f, 100}); Thread.sleep(100); stream2.send(new Object[]{"IBM", 57.7f, 100}); Thread.sleep(100); org.junit.Assert.assertEquals("Number of success events", 2, inEventCount.get()); org.junit.Assert.assertEquals("Number of remove events", 0, removeEventCount.get()); org.junit.Assert.assertEquals("Event arrived", true, eventArrived); executionPlanRuntime.shutdown(); } }