/**
* Global Sensor Networks (GSN) Source Code
* Copyright (c) 2006-2016, Ecole Polytechnique Federale de Lausanne (EPFL)
*
* This file is part of GSN.
*
* GSN is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GSN 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GSN. If not, see <http://www.gnu.org/licenses/>.
*
* File: src/ch/epfl/gsn/processor/TestScriptletProcessor.java
*
* @author Timotee Maret
*
*/
package ch.epfl.gsn.processor;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotSame;
import groovy.lang.Binding;
import groovy.lang.GroovyShell;
import org.junit.Test;
import ch.epfl.gsn.beans.DataField;
import ch.epfl.gsn.beans.StreamElement;
import ch.epfl.gsn.processor.ScriptletProcessor;
import java.io.Serializable;
import java.util.HashMap;
import java.util.TreeMap;
public class TestScriptletProcessor {
private static final DataField[] dataFields1 = new DataField[]{
new DataField("temperature","INTEGER",""),
new DataField("speed","DOUBLE",""),
new DataField("angle","INTEGER",""),
new DataField("image","DOUBLE","")
};
private static final DataField[] dataFields2 = new DataField[]{
new DataField("temperature","INTEGER",""),
new DataField("speed","DOUBLE",""),
new DataField("atm","DOUBLE","")
};
private static final Serializable[] data1 = new Serializable[] {
23,
2.34,
-9,
-4.5
};
private static final Serializable[] data2 = new Serializable[] {
23,
2.34,
-4.5
};
@Test
public void testCorrectProcessorParameters() {
ScriptletProcessor processor = new ScriptletProcessor();
TreeMap<String,String> parameters = new TreeMap<String,String>();
boolean status = processor.initialize(dataFields1, parameters);
assertFalse(status);
//
parameters = new TreeMap<String,String>();
parameters.put("anyparam","println 'Hello World!';");
status = processor.initialize(dataFields1, parameters);
assertFalse(status);
//
parameters = new TreeMap<String,String>();
parameters.put("scriptlet","println 'Hello World!';");
status = processor.initialize(dataFields1, parameters);
assertTrue(status);
//
parameters = new TreeMap<String,String>();
parameters.put("scriplet-periodic","println 'Hello World!';");
status = processor.initialize(dataFields1, parameters);
assertFalse(status);
//
parameters = new TreeMap<String,String>();
parameters.put("scriplet-periodic","println 'Hello World!';");
parameters.put("period","2000");
status = processor.initialize(dataFields1, parameters);
assertTrue(status);
}
@Test
public void testCorrectScriptExecution() {
ScriptletProcessor processor = getProcessor(dataFields1, "msg = 'Hello ' + ch.epfl.gsn; def msg1 = 'This is a script internal variable.'");
StreamElement se = new StreamElement(dataFields1, data1);
Binding context = processor.updateContext(se);
context.setVariable("ch.epfl.gsn", new String("Groovy GSN"));
processor.evaluate(processor.scriptlet, se, true);
assertNotNull(context.getVariable("msg"));
assertEquals(context.getVariable("msg"), "Hello Groovy GSN");
Object o = null;
try {
o = context.getVariable("msg1");
}
catch (Exception e) {}
assertNull(o);
}
@Test
public void testStatefullScriptlet() {
ScriptletProcessor processor = getProcessor(dataFields1, "msg = (binding.getVariables().get('msg')==null) ? '' : msg; msg = 'Hello World ' + msg + ' ' + ch.epfl.gsn + '!'; println msg; return ch.epfl.gsn;");
StreamElement se = new StreamElement(dataFields1, data1);
Binding context = processor.updateContext(se);
context.setVariable("ch.epfl.gsn", new String("Groovy GSN"));
processor.evaluate(processor.scriptlet, se, true);
assertNotNull(context.getVariable("msg"));
assertEquals(context.getVariable("msg"), "Hello World Groovy GSN!");
context.setVariable("msg", new String("Stateful"));
processor.evaluate(processor.scriptlet, se, true);
assertEquals(context.getVariable("msg"), "Hello World Stateful Groovy GSN!");
}
@Test
public void testBindingOut() {
ScriptletProcessor processor = getProcessor(dataFields2, "return;");
StreamElement se = new StreamElement(dataFields1, data1);
Binding context = processor.updateContext(se);
processor.evaluate(processor.scriptlet, se, true);
StreamElement seo = processor.formatOutputStreamElement(context);
assertNotNull(seo.getData("temperature"));
assertEquals(seo.getData("temperature"), data1[0]);
assertNotNull(seo.getData("speed"));
assertEquals(seo.getData("speed"), data1[1]);
assertNull(seo.getData("atm"));
}
@Test
public void testTimedField() {
ScriptletProcessor processor = getProcessor(dataFields1, "return;");
StreamElement se = new StreamElement(dataFields1, data1);
Binding context = processor.updateContext(se);
processor.evaluate(processor.scriptlet, se, true);
StreamElement seo = processor.formatOutputStreamElement(context);
assertNotSame(seo.getTimeStamp(), 123456L);
se.setTimeStamp(123456L);
context = processor.updateContext(se);
processor.evaluate(processor.scriptlet, se, true);
seo = processor.formatOutputStreamElement(context);
assertEquals(123456L, seo.getTimeStamp());
}
@Test(expected = groovy.lang.MissingMethodException.class)
public void testScriptletExecutionWithCompilationException() {
ScriptletProcessor processor = getProcessor(dataFields1, "prinltn 'This Groovy code has a syntax error;'");
StreamElement se = new StreamElement(dataFields1, data1);
Binding context = processor.updateContext(se);
processor.evaluate(processor.scriptlet, se, true);
}
@Test(expected = groovy.lang.MissingPropertyException.class)
public void testScriptletExecutionWithUnsetVariableException() {
ScriptletProcessor processor = getProcessor(dataFields1, "println 'This variable is not set ' + thevar");
StreamElement se = new StreamElement(dataFields1, data1);
Binding context = processor.updateContext(se);
context.setVariable("ch.epfl.gsn", new String("Groovy GSN"));
processor.evaluate(processor.scriptlet, se, true);
}
@Test(expected = Exception.class)
public void testScriptletExecutionWithSyntaxError() {
ScriptletProcessor processor = getProcessor(dataFields1, "this code is not groovy");
StreamElement se = new StreamElement(dataFields1, data1);
Binding context = processor.updateContext(se);
processor.evaluate(processor.scriptlet, se, true);
}
//
private ScriptletProcessor getProcessor(DataField[] outputStructure, String scriptlet) {
ScriptletProcessor processor = new ScriptletProcessor();
TreeMap<String,String> parameters = new TreeMap<String,String>();
parameters.put("scriptlet", scriptlet);
processor.initialize(outputStructure, parameters);
return processor;
}
}