/**
* Copyright (c) 2011-2014, OpenIoT
*
* This file is part of OpenIoT.
*
* OpenIoT is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* OpenIoT is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with OpenIoT. If not, see <http://www.gnu.org/licenses/>.
*
* Contact: OpenIoT mailto: info@openiot.eu
* @author gsn_devs
* @author Mehdi Riahi
* @author Ali Salehi
* @author Timotee Maret
*/
package org.openiot.gsn.beans;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import org.openiot.gsn.Main;
import org.openiot.gsn.beans.windowing.WindowType;
import org.openiot.gsn.storage.DataEnumerator;
import org.openiot.gsn.storage.StorageManager;
import org.openiot.gsn.storage.StorageManagerFactory;
import org.openiot.gsn.utils.GSNRuntimeException;
import org.openiot.gsn.wrappers.AbstractWrapper;
import org.openiot.gsn.wrappers.SystemTime;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.log4j.PropertyConfigurator;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class TestStreamSource {
private AbstractWrapper wrapper = new SystemTime();
private static StorageManager sm = null;//StorageManager.getInstance();
private AddressBean[] addressing = new AddressBean[] {new AddressBean("system-time")};
@BeforeClass
public static void setUpBeforeClass() throws Exception {
PropertyConfigurator.configure ( Main.DEFAULT_GSN_LOG4J_PROPERTIES );
DriverManager.registerDriver( new org.h2.Driver( ) );
sm = StorageManagerFactory.getInstance("org.h2.Driver","sa","" ,"jdbc:h2:mem:.", Main.DEFAULT_MAX_DB_CONNECTIONS);
}
@Before
public void setup() throws SQLException {
sm.executeCreateTable(wrapper.getDBAliasInStr(), new DataField[] {},true);
wrapper.setActiveAddressBean(new AddressBean("system-time"));
assertTrue(wrapper.initialize());
}
@After
public void teardown() throws SQLException {
sm.executeDropTable(wrapper.getDBAliasInStr());
}
@Test
public void testGetSQLQuery() {
InputStream is = new InputStream();
StreamSource ss = new StreamSource();
ss.setAddressing(addressing);
ss.setAlias("my-stream");
ss.setRawHistorySize("10m");
ss.setInputStream(is);
assertTrue(ss.getSqlQuery().trim().equals("select * from wrapper"));
ss = new StreamSource();
ss.setAddressing(addressing);
ss.setAlias("my-stream");
ss.setRawHistorySize("10m");
ss.setSqlQuery(" ");
ss.setInputStream(is);
assertEquals(ss.getSqlQuery().trim(),"select * from wrapper");
}
@Test
public void testValidate() {
InputStream is = new InputStream();
StreamSource ss = new StreamSource().setAlias("my-stream").setAddressing(addressing).setSqlQuery("select * from wrapper").setRawHistorySize("10m");
assertTrue(ss.validate());
assertFalse(ss.isStorageCountBased());
assertEquals(ss.getParsedStorageSize(),10*60*1000);
ss = new StreamSource().setAlias("my-stream").setAddressing(addressing).setSqlQuery("select * from wrapper").setRawHistorySize("10 m").setInputStream(is);
assertFalse(ss.isStorageCountBased());
assertEquals(ss.getParsedStorageSize(),10*60*1000);
ss = new StreamSource().setAlias("my-stream").setAddressing(addressing).setSqlQuery("select * from wrapper").setRawHistorySize("10 s").setInputStream(is);
assertFalse(ss.isStorageCountBased());
assertEquals(ss.getParsedStorageSize(),10*1000);
assertFalse(ss.isStorageCountBased());
ss = new StreamSource().setAlias("my-stream").setAddressing(addressing).setSqlQuery("select * from wrapper").setRawHistorySize("2 h").setInputStream(is);
assertFalse(ss.isStorageCountBased());
assertEquals(ss.getParsedStorageSize(),2*60*60*1000);
}
@Test (expected=GSNRuntimeException.class)
public void testBadStreamSources() throws GSNRuntimeException{
InputStream is = new InputStream();
StreamSource ss = new StreamSource().setAlias("my-stream").setAddressing(addressing).setSqlQuery("select * from wrapper").setRawHistorySize("10 min").setInputStream(is);
}
@Test (expected=GSNRuntimeException.class)
public void testBadStreamSources2() throws GSNRuntimeException{
InputStream is = new InputStream();
StreamSource ss = new StreamSource().setAlias("my-stream").setAddressing(addressing).setSqlQuery("select * from wrapper").setRawHistorySize("10 m20").setInputStream(is);
}
@Test (expected=GSNRuntimeException.class)
public void testBadStreamSources3() throws GSNRuntimeException{
InputStream is = new InputStream();
StreamSource ss = new StreamSource().setAlias("my-stream").setAddressing(addressing).setSqlQuery("select * from wrapper").setRawHistorySize("m").setInputStream(is);
}
@Test
public void testBadWindowSize() throws GSNRuntimeException{
StreamSource ss = new StreamSource().setAlias("my-stream").setAddressing(addressing).setSqlQuery("select * from wrapper").setRawHistorySize("10 sec");
assertFalse(ss.validate());
}
@Test
public void testBadSlideValue() throws GSNRuntimeException{
StreamSource ss = new StreamSource().setAlias("my-stream").setAddressing(addressing).setSqlQuery("select * from wrapper").setRawHistorySize("10 s").setRawSlideValue("5 sec");
assertFalse(ss.validate());
}
@Test
public void testWindowType1(){
StreamSource ss = new StreamSource().setAlias("my-stream").setAddressing(addressing).setSqlQuery("select * from wrapper").setRawHistorySize("10 s");
assertEquals(ss.getWindowingType(), WindowType.TIME_BASED_SLIDE_ON_EACH_TUPLE);
ss.setRawSlideValue("5 s");
assertEquals(ss.getWindowingType(), WindowType.TIME_BASED);
ss.setRawSlideValue("2");
assertEquals(ss.getWindowingType(), WindowType.TIME_BASED_WIN_TUPLE_BASED_SLIDE);
ss.setRawSlideValue("");
assertEquals(ss.getWindowingType(), WindowType.TIME_BASED_SLIDE_ON_EACH_TUPLE);
}
@Test
public void testWindowType2(){
StreamSource ss = new StreamSource().setAlias("my-stream").setAddressing(addressing).setSqlQuery("select * from wrapper").setRawHistorySize("10 ");
assertTrue(ss.validate());
assertTrue(ss.validate());
assertEquals(ss.getWindowingType(), WindowType.TUPLE_BASED_SLIDE_ON_EACH_TUPLE);
ss.setRawSlideValue("5 s");
assertEquals(ss.getWindowingType(), WindowType.TUPLE_BASED_WIN_TIME_BASED_SLIDE);
ss.setRawSlideValue("2");
assertEquals(ss.getWindowingType(), WindowType.TUPLE_BASED);
ss.setRawSlideValue("");
assertEquals(ss.getWindowingType(), WindowType.TUPLE_BASED_SLIDE_ON_EACH_TUPLE);
ss.setRawHistorySize("");
ss.setRawSlideValue("");
assertEquals(ss.getWindowingType(), WindowType.TUPLE_BASED_SLIDE_ON_EACH_TUPLE);
}
@Test
public void testUID() {
InputStream is = new InputStream();
StreamSource ss = new StreamSource().setAlias("my-stream").setAddressing(addressing).setSqlQuery("select * from wrapper").setRawHistorySize("10 s").setInputStream(is);
assertTrue(ss.validate());
assertNotNull(ss.getUIDStr());
ss = new StreamSource().setAlias("my-stream").setAddressing(addressing).setSqlQuery("select * from wrapper").setRawHistorySize("10min");
assertFalse(ss.validate());
assertNull(ss.getUIDStr());
}
@Test
public void testRateZeroQueries() throws SQLException{
InputStream is = new InputStream();
StreamSource ss = new StreamSource().setAlias("my-stream").setAddressing(addressing).setSqlQuery("select * from wrapper").setRawHistorySize("10 m").setInputStream(is);
ss.setSamplingRate(0);
ss.setWrapper(wrapper);
assertTrue(ss.validate());
StringBuilder query = ss.toSql();
assertTrue(query.toString().toLowerCase().indexOf("mod")<0);
assertTrue(query.toString().toLowerCase().indexOf("false")>0);
sm.executeInsert(ss.getWrapper().getDBAliasInStr(), ss.getWrapper().getOutputFormat(),new StreamElement(new DataField[] {},new Serializable[] {},System.currentTimeMillis()/2) );
DataEnumerator dm = sm.executeQuery(query, true);
assertFalse(dm.hasMoreElements());
sm.executeInsert(ss.getWrapper().getDBAliasInStr(), ss.getWrapper().getOutputFormat(),new StreamElement(new DataField[] {},new Serializable[] {},System.currentTimeMillis()) );
dm = sm.executeQuery(query, true);
assertFalse(dm.hasMoreElements());
wrapper.removeListener(ss);
}
@Test(expected=GSNRuntimeException.class)
public void badSamplingRate() {
StreamSource ss = new StreamSource().setAlias("my-stream").setSqlQuery("select * from wrapper").setRawHistorySize("10 s");
ss.setSamplingRate(-0.1f);
}
@Test(expected=GSNRuntimeException.class)
public void badSamplingRateBadOrder() throws SQLException {
StreamSource ss = new StreamSource().setAlias("my-stream").setSqlQuery("select * from wrapper").setRawHistorySize("10 s");
ss.setWrapper(wrapper);
ss.setSamplingRate(0.2f);
}
@Test
public void testCountWindowSizeZero() throws SQLException {
InputStream is = new InputStream();
StreamSource ss = new StreamSource().setAlias("my-stream").setAddressing(addressing).setSqlQuery("select * from wrapper").setRawHistorySize("0 ").setInputStream(is);
ss.setWrapper(wrapper);
assertTrue(ss.validate());
assertTrue(ss.toSql().toString().toLowerCase().indexOf("false")>0);
wrapper.removeListener(ss);
}
@Test(expected=GSNRuntimeException.class)
public void testNullWrapper() {
StreamSource ss = new StreamSource().setAlias("my-stream").setSqlQuery("select * from wrapper").setRawHistorySize("10 s");
ss.toSql();
}
@Test(expected=GSNRuntimeException.class)
public void testInvalidStreamSource() throws SQLException {
InputStream is = new InputStream();
StreamSource ss = new StreamSource().setAlias("my-stream").setSqlQuery("select * from wrapper").setRawHistorySize("10 s").setInputStream(is);
ss.setWrapper(wrapper);
ss.toSql();
wrapper.removeListener(ss);
}
@Test
public void testTimeBasedWindow() throws SQLException{
InputStream is = new InputStream();
StreamSource ss = new StreamSource().setAlias("my-stream").setAddressing(addressing).setSqlQuery("select * from wrapper").setRawHistorySize("1 s").setInputStream(is);
ss.setSamplingRate(1);
ss.setWrapper(wrapper );
assertTrue(ss.validate());
StringBuilder query = ss.toSql();
assertTrue(query.toString().toLowerCase().indexOf("mod")<0);
sm.executeInsert(ss.getWrapper().getDBAliasInStr(),ss.getWrapper().getOutputFormat(), new StreamElement(new DataField[] {},new Serializable[] {},System.currentTimeMillis()/2) );
DataEnumerator dm = sm.executeQuery(query, true);
assertFalse(dm.hasMoreElements());
sm.executeInsert(ss.getWrapper().getDBAliasInStr(), ss.getWrapper().getOutputFormat(),new StreamElement(new DataField[] {},new Serializable[] {},System.currentTimeMillis())) ;
Connection conn = sm.getConnection();
ResultSet rs =sm.executeQueryWithResultSet(query, conn);
assertTrue(rs.next());
assertFalse(rs.next());
dm = sm.executeQuery(query, true);
assertTrue(dm.hasMoreElements());
dm.nextElement();
assertFalse(dm.hasMoreElements());
sm.executeInsert(ss.getWrapper().getDBAliasInStr(),ss.getWrapper().getOutputFormat(), new StreamElement(new DataField[] {},new Serializable[] {},System.currentTimeMillis()) );
dm = sm.executeQuery(query, true);
assertTrue(dm.hasMoreElements());
dm.nextElement();
assertTrue(dm.hasMoreElements());
dm.nextElement();
assertFalse(dm.hasMoreElements());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
dm = sm.executeQuery(query, true);
assertFalse(dm.hasMoreElements());
sm.executeInsert(ss.getWrapper().getDBAliasInStr(),ss.getWrapper().getOutputFormat(), new StreamElement(new DataField[] {},new Serializable[] {},System.currentTimeMillis()) );
dm = sm.executeQuery(query, true);
assertTrue(dm.hasMoreElements());
dm.nextElement();
assertFalse(dm.hasMoreElements());
wrapper.removeListener(ss);
}
@Test
public void testCountBasedWindowSize1() throws SQLException{
InputStream is = new InputStream();
StreamSource ss = new StreamSource().setAlias("my-stream").setAddressing(addressing).setSqlQuery("select * from wrapper").setRawHistorySize("1").setInputStream(is);
ss.setSamplingRate(1);
assertTrue(ss.validate());
ss.setWrapper(wrapper );
StringBuilder query = ss.toSql();
assertTrue(query.toString().toLowerCase().indexOf("mod")<0);
sm.executeInsert(ss.getWrapper().getDBAliasInStr(),ss.getWrapper().getOutputFormat(), new StreamElement(new DataField[] {},new Serializable[] {},System.currentTimeMillis()) );
DataEnumerator dm = sm.executeQuery(query, true);
assertTrue(dm.hasMoreElements());
sm.executeInsert(ss.getWrapper().getDBAliasInStr(),ss.getWrapper().getOutputFormat(), new StreamElement(new DataField[] {},new Serializable[] {},System.currentTimeMillis()) );
dm = sm.executeQuery(query, true);
assertTrue(dm.hasMoreElements());
dm.nextElement();
assertFalse(dm.hasMoreElements());
long timed = System.currentTimeMillis()+100;
sm.executeInsert(ss.getWrapper().getDBAliasInStr(),ss.getWrapper().getOutputFormat(), new StreamElement(new DataField[] {},new Serializable[] {},timed) );
dm = sm.executeQuery(query, true);
assertTrue(dm.hasMoreElements());
assertEquals(dm.nextElement().getTimeStamp(), timed);
assertFalse(dm.hasMoreElements());
wrapper.removeListener(ss);
}
@Test
public void testCountBasedWindowSize2() throws SQLException{
InputStream is = new InputStream();
StreamSource ss = new StreamSource().setAlias("my-stream").setAddressing(addressing).setSqlQuery("select * from wrapper").setRawHistorySize("2").setInputStream(is);
ss.setSamplingRate(1);
ss.setWrapper(wrapper );
assertTrue(ss.validate());
StringBuilder query = ss.toSql();
assertTrue(query.toString().toLowerCase().indexOf("mod")<0);
sm.executeInsert(ss.getWrapper().getDBAliasInStr(), ss.getWrapper().getOutputFormat(), new StreamElement(new DataField[] {},new Serializable[] {},System.currentTimeMillis()) );
long time1 = System.currentTimeMillis()+10;
sm.executeInsert(ss.getWrapper().getDBAliasInStr(), ss.getWrapper().getOutputFormat(),new StreamElement(new DataField[] {},new Serializable[] {},time1) );
long time2 = System.currentTimeMillis()+100;
sm.executeInsert(ss.getWrapper().getDBAliasInStr(), ss.getWrapper().getOutputFormat(),new StreamElement(new DataField[] {},new Serializable[] {},time2) );
DataEnumerator dm = sm.executeQuery(query, true);
Connection conn = sm.getConnection();
ResultSet rs =sm.executeQueryWithResultSet(query, conn);
assertTrue(rs.next());
assertTrue(rs.next());
assertFalse(rs.next());
assertTrue(dm.hasMoreElements());
assertEquals(dm.nextElement().getTimeStamp(), time2);
assertTrue(dm.hasMoreElements());
assertEquals(dm.nextElement().getTimeStamp(), time1);
assertFalse(dm.hasMoreElements());
wrapper.removeListener(ss);
sm.close(rs.getStatement().getConnection());
}
/**
* This method is only used for testing purposes.
* @param query
* @throws SQLException
*/
public static void printTable(StringBuilder query) throws SQLException {
System.out.println("Printing for Query : "+query);
DataEnumerator dm = sm.executeQuery(query, true);
while (dm.hasMoreElements()) {
StreamElement se = dm.nextElement();
for (int i=0;i<se.getData().length;i++) {
System.out.print(se.getFieldNames()[i]+"="+se.getData()[i]+" , ");
}
System.out.println("TimeStamp="+se.getTimeStamp());
}
}
}