Repository: metron
Updated Branches:
  refs/heads/master b2375a1f1 -> c08cd07f3


http://git-wip-us.apache.org/repos/asf/metron/blob/c08cd07f/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/BasicStellarTest.java
----------------------------------------------------------------------
diff --git 
a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/BasicStellarTest.java
 
b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/BasicStellarTest.java
index 06edb12..d6c3713 100644
--- 
a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/BasicStellarTest.java
+++ 
b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/BasicStellarTest.java
@@ -24,6 +24,7 @@ import com.google.common.collect.ImmutableSet;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.metron.stellar.common.StellarProcessor;
 import org.apache.metron.stellar.dsl.Context;
+import org.apache.metron.stellar.dsl.DefaultVariableResolver;
 import org.apache.metron.stellar.dsl.ParseException;
 import org.apache.metron.stellar.dsl.Stellar;
 import org.apache.metron.stellar.dsl.StellarFunction;
@@ -37,6 +38,7 @@ import org.junit.rules.ExpectedException;
 import java.util.*;
 
 import static org.apache.metron.stellar.common.utils.StellarProcessorUtils.run;
+import static 
org.apache.metron.stellar.common.utils.StellarProcessorUtils.validate;
 import static 
org.apache.metron.stellar.common.utils.StellarProcessorUtils.runPredicate;
 
 @SuppressWarnings("ALL")
@@ -146,6 +148,32 @@ public class BasicStellarTest {
     }
   }
 
+  @Test(expected = ParseException.class)
+  public void testMissingVariablesWithParse() {
+    String query = "someVar";
+    run(query,new HashMap<>());
+  }
+
+  @Test
+  public void testValidateDoesNotThrow(){
+    String query = "someVar";
+    validate(query);
+  }
+
+  @Test
+  public void testContextActivityTypeReset(){
+    String query = "someVar";
+    Context context = Context.EMPTY_CONTEXT();
+
+    validate(query,context);
+    Assert.assertNull(context.getActivityType());
+
+    run(query,ImmutableMap.of("someVar","someValue"),context);
+    Assert.assertNull(context.getActivityType());
+
+
+  }
+
   @Test
   public void testIfThenElseBug1() {
     String query = "50 + (true == true ? 10 : 20)";
@@ -411,10 +439,10 @@ public class BasicStellarTest {
     Collection c = new ArrayList();
     Assert.assertEquals(0,run(query,ImmutableMap.of("foo",c)));
   }
-  @Test
+  @Test(expected = ParseException.class)
   public void testNoVarLength(){
     String query = "LENGTH(foo)";
-    Assert.assertEquals(0,run(query,ImmutableMap.of()));
+    run(query,ImmutableMap.of());
   }
 
   @Test
@@ -547,14 +575,14 @@ public class BasicStellarTest {
       put("empty", "");
       put("spaced", "metron is great");
     }};
-    Assert.assertFalse(runPredicate("not('casey' == foo and true)", v -> 
variableMap.get(v)));
-    Assert.assertTrue(runPredicate("not(not('casey' == foo and true))", v -> 
variableMap.get(v)));
-    Assert.assertTrue(runPredicate("('casey' == foo) && ( false != true )", v 
-> variableMap.get(v)));
-    Assert.assertFalse(runPredicate("('casey' == foo) and (FALSE == TRUE)", v 
-> variableMap.get(v)));
-    Assert.assertFalse(runPredicate("'casey' == foo and FALSE", v -> 
variableMap.get(v)));
-    Assert.assertTrue(runPredicate("'casey' == foo and true", v -> 
variableMap.get(v)));
-    Assert.assertTrue(runPredicate("true", v -> variableMap.get(v)));
-    Assert.assertTrue(runPredicate("TRUE", v -> variableMap.get(v)));
+    Assert.assertFalse(runPredicate("not('casey' == foo and true)", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("not(not('casey' == foo and true))", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("('casey' == foo) && ( false != true )", 
new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("('casey' == foo) and (FALSE == TRUE)", 
new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("'casey' == foo and FALSE", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("'casey' == foo and true", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("true", new DefaultVariableResolver(v -> 
variableMap.get(v),v -> variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("TRUE", new DefaultVariableResolver(v -> 
variableMap.get(v),v -> variableMap.containsKey(v))));
   }
 
   @Test
@@ -563,16 +591,16 @@ public class BasicStellarTest {
       put("foo", "casey");
       put("empty", "");
     }};
-    Assert.assertTrue(runPredicate("foo in [ 'casey', 'david' ]", v -> 
variableMap.get(v)));
-    Assert.assertFalse(runPredicate("foo in [ ]", v -> variableMap.get(v)));
-    Assert.assertTrue(runPredicate("foo in [ foo, 'david' ]", v -> 
variableMap.get(v)));
-    Assert.assertTrue(runPredicate("foo in [ 'casey', 'david' ] and 'casey' == 
foo", v -> variableMap.get(v)));
-    Assert.assertTrue(runPredicate("foo in [ 'casey', 'david' ] and foo == 
'casey'", v -> variableMap.get(v)));
-    Assert.assertTrue(runPredicate("foo in [ 'casey' ]", v -> 
variableMap.get(v)));
-    Assert.assertFalse(runPredicate("foo not in [ 'casey', 'david' ]", v -> 
variableMap.get(v)));
-    Assert.assertFalse(runPredicate("foo not in [ 'casey', 'david' ] and 
'casey' == foo", v -> variableMap.get(v)));
-    Assert.assertTrue(runPredicate("null in [ null, 'something' ]", v -> 
variableMap.get(v)));
-    Assert.assertFalse(runPredicate("null not in [ null, 'something' ]", v -> 
variableMap.get(v)));
+    Assert.assertTrue(runPredicate("foo in [ 'casey', 'david' ]", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("foo in [ ]", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("foo in [ foo, 'david' ]", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("foo in [ 'casey', 'david' ] and 'casey' == 
foo", new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("foo in [ 'casey', 'david' ] and foo == 
'casey'", new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("foo in [ 'casey' ]", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("foo not in [ 'casey', 'david' ]", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("foo not in [ 'casey', 'david' ] and 
'casey' == foo", new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("null in [ null, 'something' ]", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("null not in [ null, 'something' ]", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
   }
 
   @Test
@@ -581,19 +609,19 @@ public class BasicStellarTest {
       put("foo", "casey");
       put("empty", "");
     }};
-    Assert.assertTrue(runPredicate("'casey' in { foo : 5 }", v -> 
variableMap.get(v)));
-    Assert.assertFalse(runPredicate("'casey' not in { foo : 5 }", v -> 
variableMap.get(v)));
-    Assert.assertTrue(runPredicate("foo in { foo : 5 }", v -> 
variableMap.get(v)));
-    Assert.assertFalse(runPredicate("foo not in { foo : 5 }", v -> 
variableMap.get(v)));
-    Assert.assertTrue(runPredicate("'foo' in { 'foo' : 5 }", v -> 
variableMap.get(v)));
-    Assert.assertFalse(runPredicate("'foo' not in { 'foo' : 5 }", v -> 
variableMap.get(v)));
-    Assert.assertTrue(runPredicate("foo in { 'casey' : 5 }", v -> 
variableMap.get(v)));
-    Assert.assertFalse(runPredicate("foo not in { 'casey' : 5 }", v -> 
variableMap.get(v)));
-    Assert.assertFalse(runPredicate("empty in { foo : 5 }", v -> 
variableMap.get(v)));
-    Assert.assertTrue(runPredicate("empty not in { foo : 5 }", v -> 
variableMap.get(v)));
-    Assert.assertFalse(runPredicate("'foo' in { }", v -> variableMap.get(v)));
-    Assert.assertFalse(runPredicate("null in { 'foo' : 5 }", v -> 
variableMap.get(v)));
-    Assert.assertTrue(runPredicate("null not in { 'foo' : 5 }", v -> 
variableMap.get(v)));
+    Assert.assertTrue(runPredicate("'casey' in { foo : 5 }", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("'casey' not in { foo : 5 }", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("foo in { foo : 5 }", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("foo not in { foo : 5 }", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("'foo' in { 'foo' : 5 }", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("'foo' not in { 'foo' : 5 }", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("foo in { 'casey' : 5 }", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("foo not in { 'casey' : 5 }", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("empty in { foo : 5 }", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("empty not in { foo : 5 }", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("'foo' in { }", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("null in { 'foo' : 5 }", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("null not in { 'foo' : 5 }", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
   }
 
   @Test
@@ -602,34 +630,34 @@ public class BasicStellarTest {
       put("foo", "casey");
       put("empty", "");
     }};
-    Assert.assertTrue(runPredicate("'case' in foo", v -> variableMap.get(v)));
-    Assert.assertFalse(runPredicate("'case' not in foo", v -> 
variableMap.get(v)));
-    Assert.assertFalse(runPredicate("'case' in empty", v -> 
variableMap.get(v)));
-    Assert.assertTrue(runPredicate("'case' not in empty", v -> 
variableMap.get(v)));
-    Assert.assertFalse(runPredicate("'case' in [ foo ]", v -> 
variableMap.get(v)));
-    Assert.assertTrue(runPredicate("'case' not in [ foo ]", v -> 
variableMap.get(v)));
-    Assert.assertFalse(runPredicate("null in foo", v -> variableMap.get(v)));
-    Assert.assertTrue(runPredicate("null not in foo", v -> 
variableMap.get(v)));
+    Assert.assertTrue(runPredicate("'case' in foo", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("'case' not in foo", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("'case' in empty", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("'case' not in empty", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("'case' in [ foo ]", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("'case' not in [ foo ]", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("null in foo", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("null not in foo", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
   }
 
   @Test
   public void inNestedInStatement() throws Exception {
     final Map<String, String> variableMap = new HashMap<>();
 
-    Assert.assertTrue(runPredicate("('grok' not in 'foobar') == true", 
variableMap::get));
-    Assert.assertTrue(runPredicate("'grok' not in ('foobar' == true)", 
variableMap::get));
-    Assert.assertFalse(runPredicate("'grok' in 'grokbar' == true", 
variableMap::get));
-    Assert.assertTrue(runPredicate("false in 'grokbar' == true", 
variableMap::get));
+    Assert.assertTrue(runPredicate("('grok' not in 'foobar') == true", new 
DefaultVariableResolver(variableMap::get,variableMap::containsKey)));
+    Assert.assertTrue(runPredicate("'grok' not in ('foobar' == true)", new 
DefaultVariableResolver(variableMap::get,variableMap::containsKey)));
+    Assert.assertFalse(runPredicate("'grok' in 'grokbar' == true", new 
DefaultVariableResolver(variableMap::get,variableMap::containsKey)));
+    Assert.assertTrue(runPredicate("false in 'grokbar' == true", new 
DefaultVariableResolver(variableMap::get,variableMap::containsKey)));
 
-    Assert.assertTrue(runPredicate("('foo' in 'foobar') == true", 
variableMap::get));
-    Assert.assertFalse(runPredicate("'foo' in ('foobar' == true)", 
variableMap::get));
-    Assert.assertTrue(runPredicate("'grok' not in 'grokbar' == true", 
variableMap::get));
-    Assert.assertTrue(runPredicate("false in 'grokbar' == true", 
variableMap::get));
-    Assert.assertTrue(runPredicate("'foo' in ['foo'] AND 'bar' in ['bar']", 
variableMap::get));
-    Assert.assertTrue(runPredicate("('foo' in ['foo']) AND 'bar' in ['bar']", 
variableMap::get));
-    Assert.assertTrue(runPredicate("'foo' in ['foo'] AND ('bar' in ['bar'])", 
variableMap::get));
-    Assert.assertTrue(runPredicate("('foo' in ['foo']) AND ('bar' in 
['bar'])", variableMap::get));
-    Assert.assertTrue(runPredicate("('foo' in ['foo'] AND 'bar' in ['bar'])", 
variableMap::get));
+    Assert.assertTrue(runPredicate("('foo' in 'foobar') == true", new 
DefaultVariableResolver(variableMap::get,variableMap::containsKey)));
+    Assert.assertFalse(runPredicate("'foo' in ('foobar' == true)", new 
DefaultVariableResolver(variableMap::get,variableMap::containsKey)));
+    Assert.assertTrue(runPredicate("'grok' not in 'grokbar' == true", new 
DefaultVariableResolver(variableMap::get,variableMap::containsKey)));
+    Assert.assertTrue(runPredicate("false in 'grokbar' == true", new 
DefaultVariableResolver(variableMap::get,variableMap::containsKey)));
+    Assert.assertTrue(runPredicate("'foo' in ['foo'] AND 'bar' in ['bar']", 
new DefaultVariableResolver(variableMap::get,variableMap::containsKey)));
+    Assert.assertTrue(runPredicate("('foo' in ['foo']) AND 'bar' in ['bar']", 
new DefaultVariableResolver(variableMap::get,variableMap::containsKey)));
+    Assert.assertTrue(runPredicate("'foo' in ['foo'] AND ('bar' in ['bar'])", 
new DefaultVariableResolver(variableMap::get,variableMap::containsKey)));
+    Assert.assertTrue(runPredicate("('foo' in ['foo']) AND ('bar' in 
['bar'])", new 
DefaultVariableResolver(variableMap::get,variableMap::containsKey)));
+    Assert.assertTrue(runPredicate("('foo' in ['foo'] AND 'bar' in ['bar'])", 
new DefaultVariableResolver(variableMap::get,variableMap::containsKey)));
   }
 
   @Test
@@ -639,9 +667,9 @@ public class BasicStellarTest {
       put("empty", "");
       put("spaced", "metron is great");
     }};
-    Assert.assertTrue(runPredicate("exists(foo)", v -> variableMap.get(v)));
-    Assert.assertFalse(runPredicate("exists(bar)", v -> variableMap.get(v)));
-    Assert.assertTrue(runPredicate("exists(bar) or true", v -> 
variableMap.get(v)));
+    Assert.assertTrue(runPredicate("exists(foo)", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("exists(bar)", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("exists(bar) or true", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
   }
 
   @Test
@@ -654,7 +682,7 @@ public class BasicStellarTest {
       put("spaced", "metron is great");
       put("myMap", ImmutableMap.of("casey", "apple"));
     }};
-    Assert.assertTrue(runPredicate("MAP_EXISTS(foo, myMap)", v -> 
variableMap.get(v)));
+    Assert.assertTrue(runPredicate("MAP_EXISTS(foo, myMap)", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
   }
 
   @Test
@@ -668,22 +696,28 @@ public class BasicStellarTest {
       put("empty", "");
       put("spaced", "metron is great");
     }};
-    Assert.assertTrue(runPredicate("IN_SUBNET(ip, '192.168.0.0/24')", v -> 
variableMap.get(v)));
-    Assert.assertTrue(runPredicate("IN_SUBNET(ip, '192.168.0.0/24', 
'11.0.0.0/24')", v -> variableMap.get(v)));
-    Assert.assertTrue(runPredicate("IN_SUBNET(ip, '192.168.0.0/24', 
'11.0.0.0/24') in [true]", v -> variableMap.get(v)));
-    Assert.assertTrue(runPredicate("true in IN_SUBNET(ip, '192.168.0.0/24', 
'11.0.0.0/24')", v -> variableMap.get(v)));
-    Assert.assertFalse(runPredicate("IN_SUBNET(ip_dst_addr, '192.168.0.0/24', 
'11.0.0.0/24')", v -> variableMap.get(v)));
-    Assert.assertFalse(runPredicate("IN_SUBNET(other_ip, '192.168.0.0/24')", v 
-> variableMap.get(v)));
-    Assert.assertFalse(runPredicate("IN_SUBNET(blah, '192.168.0.0/24')", v -> 
variableMap.get(v)));
-    Assert.assertTrue(runPredicate("true and STARTS_WITH(foo, 'ca')", v -> 
variableMap.get(v)));
-    Assert.assertTrue(runPredicate("true and STARTS_WITH(TO_UPPER(foo), 
'CA')", v -> variableMap.get(v)));
-    Assert.assertTrue(runPredicate("(true and STARTS_WITH(TO_UPPER(foo), 
'CA')) || true", v -> variableMap.get(v)));
-    Assert.assertTrue(runPredicate("true and ENDS_WITH(foo, 'sey')", v -> 
variableMap.get(v)));
-    Assert.assertTrue(runPredicate("not(IN_SUBNET(ip_src_addr, 
'192.168.0.0/24') and IN_SUBNET(ip_dst_addr, '192.168.0.0/24'))", v-> 
variableMap.get(v)));
-    Assert.assertTrue(runPredicate("IN_SUBNET(ip_src_addr, '192.168.0.0/24')", 
v-> variableMap.get(v)));
-    Assert.assertFalse(runPredicate("not(IN_SUBNET(ip_src_addr, 
'192.168.0.0/24'))", v-> variableMap.get(v)));
-    Assert.assertFalse(runPredicate("IN_SUBNET(ip_dst_addr, 
'192.168.0.0/24')", v-> variableMap.get(v)));
-    Assert.assertTrue(runPredicate("not(IN_SUBNET(ip_dst_addr, 
'192.168.0.0/24'))", v-> variableMap.get(v)));
+    Assert.assertTrue(runPredicate("IN_SUBNET(ip, '192.168.0.0/24')", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("IN_SUBNET(ip, '192.168.0.0/24', 
'11.0.0.0/24')", new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("IN_SUBNET(ip, '192.168.0.0/24', 
'11.0.0.0/24') in [true]", new DefaultVariableResolver(v -> 
variableMap.get(v),v -> variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("true in IN_SUBNET(ip, '192.168.0.0/24', 
'11.0.0.0/24')", new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("IN_SUBNET(ip_dst_addr, '192.168.0.0/24', 
'11.0.0.0/24')", new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("IN_SUBNET(other_ip, '192.168.0.0/24')", 
new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    boolean thrown = false;
+    try{
+      runPredicate("IN_SUBNET(blah, '192.168.0.0/24')", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v)));
+    }catch(ParseException pe){
+      thrown = true;
+    }
+    Assert.assertTrue(thrown);
+    Assert.assertTrue(runPredicate("true and STARTS_WITH(foo, 'ca')", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("true and STARTS_WITH(TO_UPPER(foo), 
'CA')", new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("(true and STARTS_WITH(TO_UPPER(foo), 
'CA')) || true", new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("true and ENDS_WITH(foo, 'sey')", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("not(IN_SUBNET(ip_src_addr, 
'192.168.0.0/24') and IN_SUBNET(ip_dst_addr, '192.168.0.0/24'))", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("IN_SUBNET(ip_src_addr, '192.168.0.0/24')", 
new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("not(IN_SUBNET(ip_src_addr, 
'192.168.0.0/24'))", new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("IN_SUBNET(ip_dst_addr, 
'192.168.0.0/24')", new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("not(IN_SUBNET(ip_dst_addr, 
'192.168.0.0/24'))", new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
   }
 
   @Test
@@ -703,23 +737,40 @@ public class BasicStellarTest {
 
   @Test
   public void testShortCircuit_boolean() throws Exception {
-    Assert.assertTrue(runPredicate("'metron' in ['metron', 'metronicus', 
'mortron'] or (true or THROW('exception'))", x -> null));
-    Assert.assertTrue(runPredicate("true or (true or THROW('exception'))", x 
-> null));
-    Assert.assertTrue(runPredicate("true or (false or THROW('exception'))", x 
-> null));
-    Assert.assertTrue(runPredicate("TO_UPPER('foo') == 'FOO' or (true or 
THROW('exception'))", x -> null));
-    Assert.assertFalse(runPredicate("false and (true or THROW('exception'))", 
x -> null));
-    Assert.assertTrue(runPredicate("true or false or false or true", x -> 
null));
-    Assert.assertFalse(runPredicate("false or (false and THROW('exception'))", 
x -> null));
-    Assert.assertTrue(runPredicate("'casey' == 'casey' or THROW('exception')", 
x -> null));
-    Assert.assertTrue(runPredicate("TO_UPPER('casey') == 'CASEY' or 
THROW('exception')", x -> null));
-    Assert.assertTrue(runPredicate("NOT(TO_UPPER('casey') != 'CASEY') or 
THROW('exception')", x -> null));
-    Assert.assertTrue(runPredicate("(TO_UPPER('casey') == 'CASEY') or 
THROW('exception')", x -> null));
-    Assert.assertFalse(runPredicate("NOT(NOT(TO_UPPER('casey') != 'CASEY') or 
THROW('exception'))", x -> null));
-    Assert.assertFalse(runPredicate("NOT(NOT(TO_UPPER('casey') != 'CASEY')) 
and THROW('exception')", x -> null));
-    Assert.assertTrue(runPredicate("RET_TRUE('foo') or THROW('exception')", x 
-> null));
-    Assert.assertFalse(runPredicate("NOT(foo == null or THROW('exception')) 
and THROW('and exception')", x -> null));
-    Assert.assertTrue(runPredicate("(foo == null or THROW('exception') ) or 
THROW('and exception')", x -> null));
-    Assert.assertTrue(runPredicate("( RET_TRUE('foo', true, false) or ( foo == 
null or THROW('exception') ) or THROW('and exception')) or THROW('or 
exception')", x -> null));
+    Assert.assertTrue(runPredicate("'metron' in ['metron', 'metronicus', 
'mortron'] or (true or THROW('exception'))", new DefaultVariableResolver(x -> 
null,x -> false)));
+    Assert.assertTrue(runPredicate("true or (true or THROW('exception'))", new 
DefaultVariableResolver(x -> null,x -> false)));
+    Assert.assertTrue(runPredicate("true or (false or THROW('exception'))", 
new DefaultVariableResolver(x -> null,x -> false)));
+    Assert.assertTrue(runPredicate("TO_UPPER('foo') == 'FOO' or (true or 
THROW('exception'))", new DefaultVariableResolver(x -> null,x -> false)));
+    Assert.assertFalse(runPredicate("false and (true or THROW('exception'))", 
new DefaultVariableResolver(x -> null,x -> false)));
+    Assert.assertTrue(runPredicate("true or false or false or true", new 
DefaultVariableResolver(x -> null,x -> false)));
+    Assert.assertFalse(runPredicate("false or (false and THROW('exception'))", 
new DefaultVariableResolver(x -> null,x -> false)));
+    Assert.assertTrue(runPredicate("'casey' == 'casey' or THROW('exception')", 
new DefaultVariableResolver(x -> null,x -> false)));
+    Assert.assertTrue(runPredicate("TO_UPPER('casey') == 'CASEY' or 
THROW('exception')", new DefaultVariableResolver(x -> null,x -> false)));
+    Assert.assertTrue(runPredicate("NOT(TO_UPPER('casey') != 'CASEY') or 
THROW('exception')", new DefaultVariableResolver(x -> null,x -> false)));
+    Assert.assertTrue(runPredicate("(TO_UPPER('casey') == 'CASEY') or 
THROW('exception')", new DefaultVariableResolver(x -> null,x -> false)));
+    Assert.assertFalse(runPredicate("NOT(NOT(TO_UPPER('casey') != 'CASEY') or 
THROW('exception'))", new DefaultVariableResolver(x -> null,x -> false)));
+    Assert.assertFalse(runPredicate("NOT(NOT(TO_UPPER('casey') != 'CASEY')) 
and THROW('exception')", new DefaultVariableResolver(x -> null,x -> false)));
+    Assert.assertTrue(runPredicate("RET_TRUE('foo') or THROW('exception')", 
new DefaultVariableResolver(x -> null,x -> false)));
+    boolean thrown = false;
+    try {
+      runPredicate("NOT(foo == null or THROW('exception')) and THROW('and 
exception')",
+          new DefaultVariableResolver(x -> null, x -> false));
+    }catch(ParseException pe) {
+      thrown = true;
+    }
+    Assert.assertTrue(thrown);
+    thrown = false;
+    try {
+      runPredicate("(foo == null or THROW('exception') ) or THROW('and 
exception')",
+          new DefaultVariableResolver(x -> null, x -> false));
+    }catch(ParseException pe){
+      thrown = true;
+    }
+
+    Assert.assertTrue(thrown);
+
+
+    Assert.assertTrue(runPredicate("( RET_TRUE('foo', true, false) or ( foo == 
null or THROW('exception') ) or THROW('and exception')) or THROW('or 
exception')", new DefaultVariableResolver(x -> null,x -> false)));
   }
 
   @Rule
@@ -732,6 +783,6 @@ public class BasicStellarTest {
     }};
     thrown.expect(IllegalArgumentException.class);
     thrown.expectMessage("The rule 'TO_UPPER(protocol)' does not return a 
boolean value.");
-    runPredicate("TO_UPPER(protocol)", v -> variableMap.get(v));
+    runPredicate("TO_UPPER(protocol)", new DefaultVariableResolver(v -> 
variableMap.get(v),v -> variableMap.containsKey(v)));
   }
 }

http://git-wip-us.apache.org/repos/asf/metron/blob/c08cd07f/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/DateFunctionsTest.java
----------------------------------------------------------------------
diff --git 
a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/DateFunctionsTest.java
 
b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/DateFunctionsTest.java
index a36f8ff..0060694 100644
--- 
a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/DateFunctionsTest.java
+++ 
b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/DateFunctionsTest.java
@@ -22,6 +22,8 @@ package org.apache.metron.stellar.dsl.functions;
 
 import org.apache.metron.stellar.common.StellarProcessor;
 import org.apache.metron.stellar.dsl.Context;
+import org.apache.metron.stellar.dsl.DefaultVariableResolver;
+import org.apache.metron.stellar.dsl.ParseException;
 import org.apache.metron.stellar.dsl.StellarFunctions;
 import org.junit.Before;
 import org.junit.Test;
@@ -48,7 +50,7 @@ public class DateFunctionsTest {
   private Object run(String expr) {
     StellarProcessor processor = new StellarProcessor();
     assertTrue(processor.validate(expr));
-    return processor.parse(expr, x -> variables.get(x), 
StellarFunctions.FUNCTION_RESOLVER(), Context.EMPTY_CONTEXT());
+    return processor.parse(expr, new DefaultVariableResolver( x -> 
variables.get(x), x -> variables.containsKey(x)), 
StellarFunctions.FUNCTION_RESOLVER(), Context.EMPTY_CONTEXT());
   }
 
   /**
@@ -78,12 +80,11 @@ public class DateFunctionsTest {
   }
 
   /**
-   * If refer to variable that does not exist, expect null returned.
+   * If refer to variable that does not exist, expect ParseException.
    */
-  @Test
+  @Test(expected = ParseException.class)
   public void testDayOfWeekNull() {
     Object result = run("DAY_OF_WEEK(nada)");
-    assertEquals(null, result);
   }
 
   @Test
@@ -102,12 +103,11 @@ public class DateFunctionsTest {
   }
 
   /**
-   * If refer to variable that does not exist, expect null returned.
+   * If refer to variable that does not exist, expect ParseException.
    */
-  @Test
+  @Test(expected = ParseException.class)
   public void testWeekOfMonthNull() {
     Object result = run("WEEK_OF_MONTH(nada)");
-    assertEquals(null, result);
   }
 
   @Test
@@ -126,12 +126,11 @@ public class DateFunctionsTest {
   }
 
   /**
-   * If refer to variable that does not exist, expect null returned.
+   * If refer to variable that does not exist, expect ParseException.
    */
-  @Test
+  @Test(expected = ParseException.class)
   public void testMonthNull() {
     Object result = run("MONTH(nada)");
-    assertEquals(null, result);
   }
 
   @Test
@@ -150,12 +149,11 @@ public class DateFunctionsTest {
   }
 
   /**
-   * If refer to variable that does not exist, expect null returned.
+   * If refer to variable that does not exist, expect ParseException.
    */
-  @Test
+  @Test(expected = ParseException.class)
   public void testYearNull() {
     Object result = run("YEAR(nada)");
-    assertEquals(null, result);
   }
 
   @Test
@@ -174,12 +172,11 @@ public class DateFunctionsTest {
   }
 
   /**
-   * If refer to variable that does not exist, expect null returned.
+   * If refer to variable that does not exist, expect ParseException.
    */
-  @Test
+  @Test(expected = ParseException.class)
   public void testDayOfMonthNull() {
     Object result = run("DAY_OF_MONTH(nada)");
-    assertEquals(null, result);
   }
 
   @Test
@@ -198,12 +195,11 @@ public class DateFunctionsTest {
   }
 
   /**
-   * If refer to variable that does not exist, expect null returned.
+   * If refer to variable that does not exist, expect ParseException.
    */
-  @Test
+  @Test(expected = ParseException.class)
   public void testWeekOfYearNull() {
     Object result = run("WEEK_OF_YEAR(nada)");
-    assertEquals(null, result);
   }
 
   @Test
@@ -222,11 +218,10 @@ public class DateFunctionsTest {
   }
 
   /**
-   * If refer to variable that does not exist, expect null returned.
+   * If refer to variable that does not exist, expect ParseException.
    */
-  @Test
+  @Test(expected = ParseException.class)
   public void testDayOfYearNull() {
     Object result = run("DAY_OF_YEAR(nada)");
-    assertEquals(null, result);
   }
 }

http://git-wip-us.apache.org/repos/asf/metron/blob/c08cd07f/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/EncodingFunctionsTest.java
----------------------------------------------------------------------
diff --git 
a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/EncodingFunctionsTest.java
 
b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/EncodingFunctionsTest.java
index ca544aa..6dc4c39 100644
--- 
a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/EncodingFunctionsTest.java
+++ 
b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/EncodingFunctionsTest.java
@@ -35,6 +35,7 @@ import java.util.List;
 import java.util.Map;
 import org.apache.commons.collections4.ListUtils;
 import org.apache.metron.stellar.common.encoding.Encodings;
+import org.apache.metron.stellar.dsl.DefaultVariableResolver;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -62,16 +63,16 @@ public class EncodingFunctionsTest {
 
   @Test
   public void testEncodingIs() throws Exception{
-    Assert.assertTrue(runPredicate("IS_ENCODING(BASE32_FIXTURE,'BASE32')", v 
-> variableMap.get(v)));
-    Assert.assertFalse(runPredicate("IS_ENCODING(STRING_FIXTURE,'BASE32')", v 
-> variableMap.get(v)));
-    
Assert.assertTrue(runPredicate("IS_ENCODING(BASE32HEX_FIXTURE,'BASE32HEX')", v 
-> variableMap.get(v)));
-    Assert.assertFalse(runPredicate("IS_ENCODING(STRING_FIXTURE,'BASE32HEX')", 
v -> variableMap.get(v)));
-    Assert.assertTrue(runPredicate("IS_ENCODING(BASE64_FIXTURE,'BASE64')", v 
-> variableMap.get(v)));
-    
Assert.assertFalse(runPredicate("IS_ENCODING(STRING_FIXTURE_PLUS_NULL,'BASE64')",
 v -> variableMap.get(v)));
-    Assert.assertTrue(runPredicate("IS_ENCODING(BINARY_FIXTURE,'BINARY')", v 
-> variableMap.get(v)));
-    Assert.assertFalse(runPredicate("IS_ENCODING(STRING_FIXTURE,'BINARY')", v 
-> variableMap.get(v)));
-    Assert.assertTrue(runPredicate("IS_ENCODING(HEX_FIXTURE,'HEX')", v -> 
variableMap.get(v)));
-    Assert.assertFalse(runPredicate("IS_ENCODING(STRING_FIXTURE,'HEX')", v -> 
variableMap.get(v)));
+    Assert.assertTrue(runPredicate("IS_ENCODING(BASE32_FIXTURE,'BASE32')", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("IS_ENCODING(STRING_FIXTURE,'BASE32')", 
new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    
Assert.assertTrue(runPredicate("IS_ENCODING(BASE32HEX_FIXTURE,'BASE32HEX')", 
new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("IS_ENCODING(STRING_FIXTURE,'BASE32HEX')", 
new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("IS_ENCODING(BASE64_FIXTURE,'BASE64')", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    
Assert.assertFalse(runPredicate("IS_ENCODING(STRING_FIXTURE_PLUS_NULL,'BASE64')",
 new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("IS_ENCODING(BINARY_FIXTURE,'BINARY')", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("IS_ENCODING(STRING_FIXTURE,'BINARY')", 
new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("IS_ENCODING(HEX_FIXTURE,'HEX')", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("IS_ENCODING(STRING_FIXTURE,'HEX')", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/metron/blob/c08cd07f/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/FunctionalFunctionsTest.java
----------------------------------------------------------------------
diff --git 
a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/FunctionalFunctionsTest.java
 
b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/FunctionalFunctionsTest.java
index 32e863b..c93e4a1 100644
--- 
a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/FunctionalFunctionsTest.java
+++ 
b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/FunctionalFunctionsTest.java
@@ -195,7 +195,12 @@ public class FunctionalFunctionsTest {
     )
             )
     {
-      Object o = run(expr, ImmutableMap.of("foo", 2, "bar", 3));
+      Map<String,Object> variableMap = new HashMap<String,Object>(){{
+        put("foo",2);
+        put("bar", 3);
+        put("baz",null);
+      }};
+      Object o = run(expr,variableMap);
       Assert.assertTrue(o instanceof List);
       List<String> result = (List<String>) o;
       Assert.assertEquals(3, result.size());
@@ -287,7 +292,12 @@ public class FunctionalFunctionsTest {
                                        )
         )
     {
-      Object o = run(expr, ImmutableMap.of("foo", "foo", "bar", "bar"));
+      Map<String,Object> variableMap = new HashMap<String,Object>(){{
+        put("foo","foo");
+        put("bar","bar");
+        put("baz",null);
+      }};
+      Object o = run(expr,variableMap);
       Assert.assertTrue(o instanceof List);
       List<String> result = (List<String>) o;
       Assert.assertEquals(1, result.size());
@@ -303,7 +313,12 @@ public class FunctionalFunctionsTest {
                                        )
         )
     {
-      Object o = run(expr, ImmutableMap.of("foo", "foo", "bar", "bar"));
+      Map<String,Object> variableMap = new HashMap<String,Object>(){{
+        put("foo","foo");
+        put("bar","bar");
+        put("baz",null);
+      }};
+      Object o = run(expr,variableMap);
       Assert.assertTrue(o instanceof List);
       List<String> result = (List<String>) o;
       Assert.assertEquals(1, result.size());
@@ -355,7 +370,12 @@ public class FunctionalFunctionsTest {
                                        )
         )
     {
-      Object o = run(expr, ImmutableMap.of("foo", 1, "bar", 2));
+      Map<String,Object> variableMap = new HashMap<String,Object>(){{
+        put("foo",1);
+        put("bar", 2);
+        put("baz",null);
+      }};
+      Object o = run(expr,variableMap);
       Assert.assertTrue(o instanceof Number);
       Number result = (Number) o;
       Assert.assertEquals(6, result.intValue());
@@ -407,7 +427,7 @@ public class FunctionalFunctionsTest {
                                        )
         )
     {
-      Object o = run(expr, ImmutableMap.of("foo", 1, "bar", 2));
+      Object o = run(expr, ImmutableMap.of("foo", 1, "bar", 2,"x",0,"y",0));
       Assert.assertTrue(o instanceof List);
       List<String> result = (List<String>) o;
       Assert.assertEquals(3, result.size());

http://git-wip-us.apache.org/repos/asf/metron/blob/c08cd07f/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/MathFunctionsTest.java
----------------------------------------------------------------------
diff --git 
a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/MathFunctionsTest.java
 
b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/MathFunctionsTest.java
index cdb1c42..3f0886c 100644
--- 
a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/MathFunctionsTest.java
+++ 
b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/MathFunctionsTest.java
@@ -23,6 +23,7 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import org.apache.metron.stellar.common.StellarProcessor;
 import org.apache.metron.stellar.dsl.Context;
+import org.apache.metron.stellar.dsl.DefaultVariableResolver;
 import org.apache.metron.stellar.dsl.StellarFunctions;
 import org.junit.Assert;
 import org.junit.Test;
@@ -41,7 +42,7 @@ public class MathFunctionsTest {
     Context context = Context.EMPTY_CONTEXT();
     StellarProcessor processor = new StellarProcessor();
     Assert.assertTrue(rule + " not valid.", processor.validate(rule, context));
-    return processor.parse(rule, x -> variables.get(x), 
StellarFunctions.FUNCTION_RESOLVER(), context);
+    return processor.parse(rule, new DefaultVariableResolver(v -> 
variables.get(v),v -> variables.containsKey(v)), 
StellarFunctions.FUNCTION_RESOLVER(), context);
   }
 
   @Test
@@ -175,7 +176,7 @@ public class MathFunctionsTest {
          )
       {
         if (Double.isNaN(test.getValue())) {
-          Assert.assertTrue(expr + " != NaN, where value == " + test.getKey(), 
Double.isNaN(toDouble(run(expr, ImmutableMap.of("value", test.getKey())))));
+          Assert.assertTrue(expr + " != NaN, where value == " + test.getKey(), 
Double.isNaN(toDouble(run(expr, ImmutableMap.of("value", 
test.getKey(),"NaN",Double.NaN)))));
         } else {
           Assert.assertEquals(expr + " != " + test.getValue() + " (where value 
== " + test.getKey() + ")", test.getValue(), toDouble(run(expr, 
ImmutableMap.of("value", test.getKey()))), EPSILON);
         }

http://git-wip-us.apache.org/repos/asf/metron/blob/c08cd07f/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/RegExFunctionsTest.java
----------------------------------------------------------------------
diff --git 
a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/RegExFunctionsTest.java
 
b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/RegExFunctionsTest.java
index 9728bd2..2aefb67 100644
--- 
a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/RegExFunctionsTest.java
+++ 
b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/RegExFunctionsTest.java
@@ -18,6 +18,7 @@
 
 package org.apache.metron.stellar.dsl.functions;
 
+import org.apache.metron.stellar.dsl.DefaultVariableResolver;
 import org.apache.metron.stellar.dsl.ParseException;
 import org.junit.Assert;
 import org.junit.Test;
@@ -39,8 +40,8 @@ public class RegExFunctionsTest {
       put("empty", "");
     }};
 
-    Assert.assertTrue(runPredicate("REGEXP_MATCH(numbers,numberPattern)", v -> 
variableMap.get(v)));
-    Assert.assertFalse(runPredicate("REGEXP_MATCH(letters,numberPattern)", v 
-> variableMap.get(v)));
+    Assert.assertTrue(runPredicate("REGEXP_MATCH(numbers,numberPattern)", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("REGEXP_MATCH(letters,numberPattern)", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
   }
 
   @Test
@@ -52,18 +53,18 @@ public class RegExFunctionsTest {
       put("letters", "abcde");
       put("empty", "");
     }};
-    Assert.assertTrue(runPredicate("REGEXP_GROUP_VAL(numbers,numberPattern,2) 
== '3'", v -> variableMap.get(v)));
-    Assert.assertTrue(runPredicate("REGEXP_GROUP_VAL(letters,numberPattern,2) 
== null", v -> variableMap.get(v)));
-    Assert.assertTrue(runPredicate("REGEXP_GROUP_VAL(empty,numberPattern,2) == 
null", v -> variableMap.get(v)));
-    
Assert.assertTrue(runPredicate("REGEXP_GROUP_VAL(numbers,numberPatternNoCaptures,2)
 == null", v -> variableMap.get(v)));
+    Assert.assertTrue(runPredicate("REGEXP_GROUP_VAL(numbers,numberPattern,2) 
== '3'", new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("REGEXP_GROUP_VAL(letters,numberPattern,2) 
== null", new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("REGEXP_GROUP_VAL(empty,numberPattern,2) == 
null", new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    
Assert.assertTrue(runPredicate("REGEXP_GROUP_VAL(numbers,numberPatternNoCaptures,2)
 == null", new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
 
-    boolean caught = false;
+    boolean thrown = false;
     try{
-      runPredicate("REGEXP_GROUP_VAL(2) == null", v -> variableMap.get(v));
+      runPredicate("REGEXP_GROUP_VAL(2) == null", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v)));
     }catch(ParseException | IllegalStateException ise){
-      caught = true;
+      thrown = true;
     }
-    if(!caught){
+    if(!thrown){
       Assert.assertTrue("Did not fail on wrong number of parameters",false);
     }
   }

http://git-wip-us.apache.org/repos/asf/metron/blob/c08cd07f/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/StringFunctionsTest.java
----------------------------------------------------------------------
diff --git 
a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/StringFunctionsTest.java
 
b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/StringFunctionsTest.java
index ab6ca82..858a043 100644
--- 
a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/StringFunctionsTest.java
+++ 
b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/StringFunctionsTest.java
@@ -21,6 +21,7 @@ package org.apache.metron.stellar.dsl.functions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import org.apache.commons.collections4.map.HashedMap;
+import org.apache.metron.stellar.dsl.DefaultVariableResolver;
 import org.apache.metron.stellar.dsl.ParseException;
 import org.junit.Assert;
 import org.junit.Test;
@@ -43,10 +44,10 @@ public class StringFunctionsTest {
       put("empty", "");
       put("spaced", "metron is great");
     }};
-    Assert.assertTrue(runPredicate("true and TO_UPPER(foo) == 'CASEY'", v -> 
variableMap.get(v)));
-    Assert.assertTrue(runPredicate("foo in [ TO_LOWER('CASEY'), 'david' ]", v 
-> variableMap.get(v)));
-    Assert.assertTrue(runPredicate("TO_UPPER(foo) in [ TO_UPPER('casey'), 
'david' ] and IN_SUBNET(ip, '192.168.0.0/24')", v -> variableMap.get(v)));
-    Assert.assertFalse(runPredicate("TO_LOWER(foo) in [ TO_UPPER('casey'), 
'david' ]", v -> variableMap.get(v)));
+    Assert.assertTrue(runPredicate("true and TO_UPPER(foo) == 'CASEY'", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("foo in [ TO_LOWER('CASEY'), 'david' ]", 
new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("TO_UPPER(foo) in [ TO_UPPER('casey'), 
'david' ] and IN_SUBNET(ip, '192.168.0.0/24')", new DefaultVariableResolver(v 
-> variableMap.get(v),v -> variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("TO_LOWER(foo) in [ TO_UPPER('casey'), 
'david' ]", new DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
   }
 
   @Test
@@ -59,10 +60,10 @@ public class StringFunctionsTest {
       put("spaced", "metron is great");
       put("myList", ImmutableList.of("casey", "apple", "orange"));
     }};
-    Assert.assertTrue(runPredicate("foo in SPLIT(bar, '.')", v -> 
variableMap.get(v)));
-    Assert.assertFalse(runPredicate("foo in SPLIT(ip, '.')", v -> 
variableMap.get(v)));
-    Assert.assertTrue(runPredicate("foo in myList", v -> variableMap.get(v)));
-    Assert.assertFalse(runPredicate("foo not in myList", v -> 
variableMap.get(v)));
+    Assert.assertTrue(runPredicate("foo in SPLIT(bar, '.')", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("foo in SPLIT(ip, '.')", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertTrue(runPredicate("foo in myList", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
+    Assert.assertFalse(runPredicate("foo not in myList", new 
DefaultVariableResolver(v -> variableMap.get(v),v -> 
variableMap.containsKey(v))));
   }
 
   @Test
@@ -188,7 +189,14 @@ public class StringFunctionsTest {
     Assert.assertEquals("000234",         run("FORMAT('%06d', 234)", vars));
     Assert.assertEquals("03 2,2017",      run("FORMAT('%1$tm %1$te,%1$tY', 
cal)", vars));
     Assert.assertEquals("234 > 3",        run("FORMAT('%d > %d', x, y)", 
vars));
-    Assert.assertEquals("missing: null",  run("FORMAT('missing: %d', 
missing)", vars));
+
+    boolean thrown = false;
+    try {
+      run("FORMAT('missing: %d', missing)", vars);
+    } catch (ParseException pe) {
+      thrown = true;
+    }
+    Assert.assertTrue(thrown);
   }
 
   /**
@@ -219,7 +227,6 @@ public class StringFunctionsTest {
     Assert.assertEquals("abc",  run("CHOMP(msg)", ImmutableMap.of("msg", 
"abc\r\n")));
     Assert.assertEquals("",     run("CHOMP(msg)", ImmutableMap.of("msg", 
"\n")));
     Assert.assertEquals("",     run("CHOMP('')", new HashedMap()));
-    Assert.assertEquals(null,   run("CHOMP(msg)", new HashedMap()));
     Assert.assertEquals(null,   run("CHOMP(null)", new HashedMap()));
 
     // No input
@@ -233,6 +240,14 @@ public class StringFunctionsTest {
     Assert.assertTrue(thrown);
     thrown = false;
 
+    // Variable missing
+    try{
+      run("CHOMP(msg)", new HashedMap());
+    } catch (ParseException pe) {
+      thrown = true;
+    }
+    thrown = false;
+
     // Integer input
     try {
       run("CHOMP(123)", Collections.emptyMap());
@@ -253,7 +268,6 @@ public class StringFunctionsTest {
   public void testChop() throws Exception {
     Assert.assertEquals("ab",   run("CHOP('abc')", new HashedMap()));
     Assert.assertEquals(null,   run("CHOP(null)", new HashedMap()));
-    Assert.assertEquals(null,   run("CHOP(msg)", new HashedMap()));
     Assert.assertEquals("abc",  run("CHOP(msg)", ImmutableMap.of("msg", 
"abc\r\n")));
     Assert.assertEquals("",     run("CHOP(msg)", ImmutableMap.of("msg", "")));
     Assert.assertEquals("",     run("CHOP(msg)", ImmutableMap.of("msg", 
"\n")));
@@ -270,6 +284,14 @@ public class StringFunctionsTest {
     Assert.assertTrue(thrown);
     thrown = false;
 
+    // Variable missing
+    try{
+      run("CHOMP(msg)", new HashedMap());
+    } catch (ParseException pe) {
+      thrown = true;
+    }
+    thrown = false;
+
     // Integer input
     try {
       run("CHOP(123)", Collections.emptyMap());

Reply via email to