http://git-wip-us.apache.org/repos/asf/metron/blob/a5b13777/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/StellarComparisonExpressionWithOperatorTest.java ---------------------------------------------------------------------- diff --git a/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/StellarComparisonExpressionWithOperatorTest.java b/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/StellarComparisonExpressionWithOperatorTest.java deleted file mode 100644 index ab63d06..0000000 --- a/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/StellarComparisonExpressionWithOperatorTest.java +++ /dev/null @@ -1,293 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF 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.apache.metron.common.stellar; - -import com.google.common.collect.ImmutableMap; -import org.apache.metron.common.dsl.ParseException; -import org.junit.Test; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.stream.Stream; - -import static org.apache.metron.common.utils.StellarProcessorUtils.run; -import static org.apache.metron.common.utils.StellarProcessorUtils.runPredicate; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -@SuppressWarnings("ALL") -public class StellarComparisonExpressionWithOperatorTest { - @SuppressWarnings({"RedundantConditionalExpression", "ConstantConditions"}) - @Test - public void checkLessThanComparisonOperators() throws Exception { - assertEquals(1 < 2, run("1 < 2", ImmutableMap.of())); - assertEquals(1f < 2, run("1f < 2", ImmutableMap.of())); - assertEquals(1f < 2d, run("1f < 2d", ImmutableMap.of())); - assertEquals(1f < 2e-4d, run("1f < 2e-4d", ImmutableMap.of())); - assertEquals(1L < 2e-4d, run("1L < 2e-4d", ImmutableMap.of())); - assertEquals(1 < 2e-4d, run("1 < 2e-4d", ImmutableMap.of())); - assertEquals(1 < 2L, run("1 < 2L", ImmutableMap.of())); - assertEquals(1.0f < 2.0f, run("1.0f < 2.0f", ImmutableMap.of())); - assertEquals(1L < 3.0f, run("1L < 3.0f", ImmutableMap.of())); - assertEquals(1 < 3.0f, run("1 < 3.0f", ImmutableMap.of())); - assertEquals(1.0 < 3.0f, run("1.0 < 3.0f", ImmutableMap.of())); - assertEquals(false, run("foo < 3.0f", ImmutableMap.of())); - assertEquals(false, run("foo < foo", ImmutableMap.of())); - assertEquals(1L < 3.0f ? true : false, run("if 1L < 3.0f then true else false", ImmutableMap.of())); - } - - @SuppressWarnings("ConstantConditions") - @Test - public void checkComparisonOperationsWithFunctions() throws Exception { - assertEquals(1f >= 2, run("TO_FLOAT(1) >= 2", ImmutableMap.of())); - assertEquals(1f <= 2, run("TO_FLOAT(1) <= TO_FLOAT(2)", ImmutableMap.of())); - assertEquals(1f == 2, run("TO_FLOAT(1) == TO_LONG(2)", ImmutableMap.of())); - assertEquals(12.31f == 10.2f, run("TO_FLOAT(12.31) < 10.2f", ImmutableMap.of())); - } - - @Test - public void testSimpleOps() throws Exception { - final Map<String, String> variableMap = new HashMap<String, String>() {{ - put("foo", "casey"); - put("empty", ""); - put("spaced", "metron is great"); - put("foo.bar", "casey"); - }}; - - assertTrue(runPredicate("'casey' == foo.bar", variableMap::get)); - assertTrue(runPredicate("'casey' == foo", variableMap::get)); - assertFalse(runPredicate("'casey' != foo", variableMap::get)); - assertTrue(runPredicate("'stella' == 'stella'", variableMap::get)); - assertFalse(runPredicate("'stella' == foo", variableMap::get)); - assertTrue(runPredicate("foo== foo", variableMap::get)); - assertTrue(runPredicate("empty== ''", variableMap::get)); - assertTrue(runPredicate("spaced == 'metron is great'", variableMap::get)); - assertTrue(runPredicate(null, variableMap::get)); - assertTrue(runPredicate("", variableMap::get)); - assertTrue(runPredicate(" ", variableMap::get)); - } - - @Test - public void compareNumberAndStringWithSameValueShouldBeFalse() throws Exception { - assertFalse(runPredicate("1 == '1'", new HashMap<>()::get)); - assertFalse(runPredicate("'1' == 1", new HashMap<>()::get)); - } - - @Test - public void comparingNullShouldNotCauseNullPointer() throws Exception { - assertFalse(runPredicate("null == '1'", new HashMap<>()::get)); - assertFalse(runPredicate("\"1\" == null", new HashMap<>()::get)); - assertTrue(runPredicate("null == null", new HashMap<>()::get)); - } - - @Test - public void makeSureSingleQuotesAndDoubleQuotesAreEqual() throws Exception { - assertTrue(runPredicate("\"1\" == '1'", new HashMap<>()::get)); - assertTrue(runPredicate("'1' == \"1\"", new HashMap<>()::get)); - assertTrue(runPredicate("'1' == \"1\"", new HashMap<>()::get)); - } - - @Test - public void makeSureSingleQuoteStringsAreEvaluatedAsStrings() throws Exception { - assertFalse(runPredicate("55 == '7'", new HashMap<>()::get)); - assertFalse(runPredicate("97 == 'a'", new HashMap<>()::get)); - } - - @Test - public void testNumericComparisonFunctions() throws Exception { - final Map<String, Object> variableMap = new HashMap<String, Object>() {{ - put("foo", "casey"); - put("bar", "bar.casey.grok"); - put("ip", "192.168.0.1"); - put("num", 7); - put("num2", 8.5); - put("num3", 7); - put("num4", "8.5"); - put("empty", ""); - put("spaced", "metron is great"); - }}; - assertTrue(runPredicate("num == 7", variableMap::get)); - assertTrue(runPredicate("num < num2", variableMap::get)); - assertTrue(runPredicate("num < TO_DOUBLE(num2)", variableMap::get)); - assertTrue(runPredicate("num < TO_DOUBLE(num4)", variableMap::get)); - assertTrue(runPredicate("num < 100", variableMap::get)); - assertTrue(runPredicate("num == num3", variableMap::get)); - assertFalse(runPredicate("num == num2", variableMap::get)); - assertTrue(runPredicate("num == num2 || true", variableMap::get)); - assertFalse(runPredicate("num > num2", variableMap::get)); - assertTrue(runPredicate("num == 7 && num > 2", variableMap::get)); - } - - @Test - public void positiveAndNegativeZeroAreEqual() throws Exception { - final Map<String, Object> variableMap = new HashMap<String, Object>() {{ - put("num", -0); - }}; - - Arrays.asList("!=", "==").forEach(op -> { - assertEquals("==".equals(op), runPredicate("num " + op + " 0", variableMap::get)); - assertEquals("==".equals(op), runPredicate("0 " + op + " -0", variableMap::get)); - assertEquals("==".equals(op), runPredicate("0 " + op + " -0d", variableMap::get)); - assertEquals("==".equals(op), runPredicate("-0 " + op + " 0", variableMap::get)); - assertEquals("==".equals(op), runPredicate("-0F " + op + " 0D", variableMap::get)); - assertEquals("==".equals(op), runPredicate("-0.F " + op + " 0", variableMap::get)); - assertEquals("==".equals(op), runPredicate("-0.F " + op + " 0F", variableMap::get)); - assertEquals("==".equals(op), runPredicate("-0.D " + op + " 0D", variableMap::get)); - }); - } - - @Test - public void naNIsNotEqualToNaN() throws Exception { - final Map<String, Object> variableMap = new HashMap<>(); - Arrays.asList("!=", "==").forEach(op -> { - assertEquals("!=".equals(op), runPredicate("(0f/0f) " + op + " (0f/0f)", variableMap::get)); - assertEquals("!=".equals(op), runPredicate("(-0f/0f) " + op + " (0f/0f)", variableMap::get)); - assertEquals("!=".equals(op), runPredicate("(-0f/-0f) " + op + " (0f/0f)", variableMap::get)); - assertEquals("!=".equals(op), runPredicate("(-0f/-0f) " + op + " (-0f/0f)", variableMap::get)); - assertEquals("!=".equals(op), runPredicate("(-0f/-0f) " + op + " (-0f/-0f)", variableMap::get)); - assertEquals("!=".equals(op), runPredicate("(0f/-0f) " + op + " (0f/0f)", variableMap::get)); - assertEquals("!=".equals(op), runPredicate("(0f/-0f) " + op + " (-0f/0f)", variableMap::get)); - assertEquals("!=".equals(op), runPredicate("(0f/-0f) " + op + " (-0f/-0f)", variableMap::get)); - assertEquals("!=".equals(op), runPredicate("(0f/0f) " + op + " (-0f/0f)", variableMap::get)); - assertEquals("!=".equals(op), runPredicate("(0f/0d) " + op + " (-0f/-0f)", variableMap::get)); - assertEquals("!=".equals(op), runPredicate("(0d/-0f) " + op + " (0f/-0f)", variableMap::get)); - assertEquals("!=".equals(op), runPredicate("(-0f/0f) " + op + " (0f/-0d)", variableMap::get)); - assertEquals("!=".equals(op), runPredicate("(-0d/-0d) " + op + " (0d/-0d)", variableMap::get)); - assertEquals("!=".equals(op), runPredicate("(0d/0d) " + op + " (0d/0d)", variableMap::get)); - }); - } - - @Test - public void booleanComparisonTests() throws Exception { - final Map<String, Object> variableMap = new HashMap<String, Object>() {{ - put("t", true); - put("f", false); - }}; - - assertTrue(runPredicate("t != f", variableMap::get)); - assertTrue(runPredicate("f != t", variableMap::get)); - assertTrue(runPredicate("true != false", variableMap::get)); - assertFalse(runPredicate("true != true", variableMap::get)); - assertTrue(runPredicate("false != true", variableMap::get)); - assertFalse(runPredicate("false != false", variableMap::get)); - - assertFalse(runPredicate("t == f", variableMap::get)); - assertFalse(runPredicate("f == t", variableMap::get)); - assertFalse(runPredicate("true == false", variableMap::get)); - assertTrue(runPredicate("true == true", variableMap::get)); - assertFalse(runPredicate("false == true", variableMap::get)); - assertTrue(runPredicate("false == false", variableMap::get)); - - assertFalse(runPredicate("null == false", variableMap::get)); - assertFalse(runPredicate("null == true", variableMap::get)); - assertFalse(runPredicate("true == NULL", variableMap::get)); - assertFalse(runPredicate("false == NULL", variableMap::get)); - } - - @Test - public void nullComparisonTests() throws Exception { - final Map<String, Object> variableMap = new HashMap<>(); - - assertFalse(runPredicate("null == false", variableMap::get)); - assertFalse(runPredicate("null == true", variableMap::get)); - assertFalse(runPredicate("true == NULL", variableMap::get)); - assertFalse(runPredicate("false == NULL", variableMap::get)); - assertFalse(runPredicate("1 == NULL", variableMap::get)); - assertFalse(runPredicate("'null' == NULL", variableMap::get)); - assertFalse(runPredicate("'' == NULL", variableMap::get)); - assertFalse(runPredicate("null == ''", variableMap::get)); - - assertTrue(runPredicate("NULL == null", variableMap::get)); - } - - @Test - public void precisionEqualityTests() throws Exception { - final Map<String, Object> variableMap = new HashMap<>(); - assertEquals(0.1 + 0.2 == 0.3, runPredicate("0.1 + 0.2 == 0.3", variableMap::get)); - } - - @Test(expected = ParseException.class) - public void differentTypesShouldThrowErrorWhenUsingLT() throws Exception { - final Map<String, Object> variableMap = new HashMap<>(); - runPredicate("1 < '1'", variableMap::get); - } - - @Test(expected = ParseException.class) - public void differentTypesShouldThrowErrorWhenUsingLTE() throws Exception { - final Map<String, Object> variableMap = new HashMap<>(); - runPredicate("'1' <= 1", variableMap::get); - } - - @Test(expected = ParseException.class) - public void differentTypesShouldThrowErrorWhenUsingGT() throws Exception { - final Map<String, Object> variableMap = new HashMap<>(); - runPredicate("1 > '1'", variableMap::get); - } - - @Test(expected = ParseException.class) - public void differentTypesShouldThrowErrorWhenUsingGTE() throws Exception { - final Map<String, Object> variableMap = new HashMap<>(); - runPredicate("'1' >= 1", variableMap::get); - } - - @Test - public void differentTypesShouldThrowErrorWhenUsingComparisons() throws Exception { - final Map<String, Object> variableMap = new HashMap<>(); - final Integer[] result = {0}; - - Stream.of("<", "<=", ">", ">=").forEach(op -> { - assertFalse(runPredicate("'1' " + op + " null", variableMap::get)); - }); - } - - @Test - public void makeSurePrecisionIsProperlyHandled() throws Exception { - final Map<String, Object> variableMap = new HashMap<>(); - { - assertEquals(1 == 1.00000001, runPredicate("1 == 1.00000001", variableMap::get)); - assertEquals(1 < 1.00000001, runPredicate("1 < 1.00000001", variableMap::get)); - assertEquals(1 <= 1.00000001, runPredicate("1 <= 1.00000001", variableMap::get)); - assertEquals(1 > 1.00000001, runPredicate("1 > 1.00000001", variableMap::get)); - assertEquals(1 >= 1.00000001, runPredicate("1 >= 1.00000001", variableMap::get)); - } - { - assertEquals(1 == 1.00000001F, runPredicate("1 == 1.00000001F", variableMap::get)); - assertEquals(1 < 1.00000001F, runPredicate("1 < 1.00000001F", variableMap::get)); - assertEquals(1 <= 1.00000001F, runPredicate("1 <= 1.00000001F", variableMap::get)); - assertEquals(1 > 1.00000001F, runPredicate("1 > 1.00000001F", variableMap::get)); - assertEquals(1 >= 1.00000001F, runPredicate("1 >= 1.00000001F", variableMap::get)); - } - { - assertEquals(1.00000001F == 1.00000001, runPredicate("1.00000001F == 1.00000001", variableMap::get)); - assertEquals(1.00000001F < 1.00000001, runPredicate("1.00000001F < 1.00000001", variableMap::get)); - assertEquals(1.00000001F <= 1.00000001, runPredicate("1.00000001F <= 1.00000001", variableMap::get)); - assertEquals(1.00000001F > 1.00000001, runPredicate("1.00000001F > 1.00000001", variableMap::get)); - assertEquals(1.00000001F >= 1.00000001, runPredicate("1.00000001F >= 1.00000001", variableMap::get)); - } - { - assertEquals(-1L == -1.00000001F, runPredicate("-1L == -1.00000001F", variableMap::get)); - assertEquals(-1L < -1.00000001F, runPredicate("-1L < -1.00000001F", variableMap::get)); - assertEquals(-1L <= -1.00000001F, runPredicate("-1L <= -1.00000001F", variableMap::get)); - assertEquals(-1L > -1.00000001F, runPredicate("-1L > -1.00000001F", variableMap::get)); - assertEquals(-1L >= -1.00000001F, runPredicate("-1L >= -1.00000001F", variableMap::get)); - } - } -}
http://git-wip-us.apache.org/repos/asf/metron/blob/a5b13777/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/StellarInterpreterTest.java ---------------------------------------------------------------------- diff --git a/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/StellarInterpreterTest.java b/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/StellarInterpreterTest.java deleted file mode 100644 index 39563f7..0000000 --- a/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/StellarInterpreterTest.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF 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.apache.metron.common.stellar; - -import org.apache.metron.common.dsl.Context; -import org.apache.metron.common.dsl.Token; -import org.apache.metron.common.dsl.VariableResolver; -import org.apache.metron.common.dsl.functions.resolver.FunctionResolver; -import org.apache.metron.common.stellar.evaluators.ArithmeticEvaluator; -import org.apache.metron.common.stellar.evaluators.ComparisonExpressionWithOperatorEvaluator; -import org.apache.metron.common.stellar.evaluators.NumberLiteralEvaluator; -import org.apache.metron.common.stellar.generated.StellarParser; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.verification.VerificationMode; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -import java.util.ArrayDeque; -import java.util.Deque; -import java.util.Stack; - -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.powermock.api.mockito.PowerMockito.*; - - -@RunWith(PowerMockRunner.class) -@PrepareForTest({Deque.class, ArithmeticEvaluator.class, NumberLiteralEvaluator.class, ComparisonExpressionWithOperatorEvaluator.class}) -public class StellarInterpreterTest { - VariableResolver variableResolver; - FunctionResolver functionResolver; - Context context; - Deque<Token<?>> tokenStack; - ArithmeticEvaluator arithmeticEvaluator; - NumberLiteralEvaluator numberLiteralEvaluator; - ComparisonExpressionWithOperatorEvaluator comparisonExpressionWithOperatorEvaluator; - StellarCompiler compiler; - StellarCompiler.Expression expression; - - @SuppressWarnings("unchecked") - @Before - public void setUp() throws Exception { - variableResolver = mock(VariableResolver.class); - functionResolver = mock(FunctionResolver.class); - context = mock(Context.class); - tokenStack = new ArrayDeque<>(); - arithmeticEvaluator = mock(ArithmeticEvaluator.class); - numberLiteralEvaluator = mock(NumberLiteralEvaluator.class); - comparisonExpressionWithOperatorEvaluator = mock(ComparisonExpressionWithOperatorEvaluator.class); - expression = new StellarCompiler.Expression(tokenStack); - compiler = new StellarCompiler(expression, arithmeticEvaluator, numberLiteralEvaluator, comparisonExpressionWithOperatorEvaluator); - } - - @Test - public void exitIntLiteralShouldProperlyParseStringsAsIntegers() throws Exception { - StellarParser.IntLiteralContext ctx = mock(StellarParser.IntLiteralContext.class); - Token result = mock(Token.class); - when(ctx.getText()).thenReturn("1000"); - when(numberLiteralEvaluator.evaluate(ctx, null)).thenReturn(result); - compiler.exitIntLiteral(ctx); - verify(numberLiteralEvaluator).evaluate(ctx, null); - Assert.assertEquals(1, tokenStack.size()); - Assert.assertEquals(tokenStack.getFirst(), result); - verifyZeroInteractions(variableResolver); - verifyZeroInteractions(functionResolver); - verifyZeroInteractions(context); - verifyZeroInteractions(arithmeticEvaluator); - verifyZeroInteractions(comparisonExpressionWithOperatorEvaluator); - } - - @Test - public void exitDoubleLiteralShouldProperlyParseStringsAsDoubles() throws Exception { - StellarParser.DoubleLiteralContext ctx = mock(StellarParser.DoubleLiteralContext.class); - Token result = mock(Token.class); - when(numberLiteralEvaluator.evaluate(ctx, null)).thenReturn(result); - when(ctx.getText()).thenReturn("1000D"); - - compiler.exitDoubleLiteral(ctx); - - verify(numberLiteralEvaluator).evaluate(ctx, null); - Assert.assertEquals(1, tokenStack.size()); - Assert.assertEquals(tokenStack.getFirst(), result); - verifyZeroInteractions(variableResolver); - verifyZeroInteractions(functionResolver); - verifyZeroInteractions(context); - verifyZeroInteractions(arithmeticEvaluator); - verifyZeroInteractions(comparisonExpressionWithOperatorEvaluator); - } - - @Test - public void exitFloatLiteralShouldProperlyParseStringsAsFloats() throws Exception { - StellarParser.FloatLiteralContext ctx = mock(StellarParser.FloatLiteralContext.class); - when(ctx.getText()).thenReturn("1000f"); - Token result = mock(Token.class); - when(numberLiteralEvaluator.evaluate(ctx, null)).thenReturn(result); - - compiler.exitFloatLiteral(ctx); - - verify(numberLiteralEvaluator).evaluate(ctx, null); - Assert.assertEquals(1, tokenStack.size()); - Assert.assertEquals(tokenStack.getFirst(), result); - verifyZeroInteractions(variableResolver); - verifyZeroInteractions(functionResolver); - verifyZeroInteractions(context); - verifyZeroInteractions(arithmeticEvaluator); - verifyZeroInteractions(comparisonExpressionWithOperatorEvaluator); - } - - @Test - public void exitLongLiteralShouldProperlyParseStringsAsLongs() throws Exception { - StellarParser.LongLiteralContext ctx = mock(StellarParser.LongLiteralContext.class); - when(ctx.getText()).thenReturn("1000l"); - Token result = mock(Token.class); - when(numberLiteralEvaluator.evaluate(ctx, null)).thenReturn(result); - - compiler.exitLongLiteral(ctx); - - verify(numberLiteralEvaluator).evaluate(ctx, null); - Assert.assertEquals(1, tokenStack.size()); - Assert.assertEquals(tokenStack.getFirst(), result); - verifyZeroInteractions(variableResolver); - verifyZeroInteractions(functionResolver); - verifyZeroInteractions(context); - verifyZeroInteractions(arithmeticEvaluator); - verifyZeroInteractions(comparisonExpressionWithOperatorEvaluator); - } - - @Test - public void properlyCompareTwoNumbers() throws Exception { - StellarParser.ComparisonExpressionWithOperatorContext ctx = mock(StellarParser.ComparisonExpressionWithOperatorContext.class); - StellarParser.ComparisonOpContext mockOp = mock(StellarParser.ComparisonOpContext.class); - when(ctx.comp_operator()).thenReturn(mockOp); - Token result = mock(Token.class); - when(comparisonExpressionWithOperatorEvaluator.evaluate(any(Token.class), any(Token.class), any(StellarParser.ComparisonOpContext.class), any())).thenReturn(result); - - compiler.exitComparisonExpressionWithOperator(ctx); - Assert.assertEquals(1, tokenStack.size()); - StellarCompiler.DeferredFunction func = (StellarCompiler.DeferredFunction) tokenStack.pop().getValue(); - tokenStack.push(new Token<>(1000, Integer.class, null)); - tokenStack.push(new Token<>(1500f, Float.class, null)); - func.apply(tokenStack, new StellarCompiler.ExpressionState(context, functionResolver, variableResolver)); - Assert.assertEquals(1, tokenStack.size()); - Assert.assertEquals(tokenStack.getFirst(), result); - verify(comparisonExpressionWithOperatorEvaluator).evaluate(any(Token.class), any(Token.class), eq(mockOp), any()); - verifyZeroInteractions(numberLiteralEvaluator); - verifyZeroInteractions(variableResolver); - verifyZeroInteractions(functionResolver); - verifyZeroInteractions(context); - verifyZeroInteractions(arithmeticEvaluator); - } -} http://git-wip-us.apache.org/repos/asf/metron/blob/a5b13777/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/StellarPredicateProcessorTest.java ---------------------------------------------------------------------- diff --git a/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/StellarPredicateProcessorTest.java b/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/StellarPredicateProcessorTest.java deleted file mode 100644 index c0165a3..0000000 --- a/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/StellarPredicateProcessorTest.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF 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.apache.metron.common.stellar; - -import org.apache.metron.common.dsl.ParseException; -import org.junit.Test; - -import static org.junit.Assert.fail; - -public class StellarPredicateProcessorTest { - @SuppressWarnings("EmptyCatchBlock") - @Test - public void testValidation() throws Exception { - StellarPredicateProcessor processor = new StellarPredicateProcessor(); - try { - processor.validate("enrichedField1 == 'enrichedValue1"); - fail("Invalid rule found to be valid - unclosed single quotes."); - } catch(ParseException e) {} - } -} http://git-wip-us.apache.org/repos/asf/metron/blob/a5b13777/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/StellarTest.java ---------------------------------------------------------------------- diff --git a/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/StellarTest.java b/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/StellarTest.java deleted file mode 100644 index d549e19..0000000 --- a/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/StellarTest.java +++ /dev/null @@ -1,735 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF 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.apache.metron.common.stellar; - -import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import org.apache.commons.lang3.StringUtils; -import org.apache.metron.common.dsl.*; -import org.apache.metron.common.dsl.functions.resolver.ClasspathFunctionResolver; -import org.junit.Assert; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.reflections.Reflections; -import org.reflections.util.ConfigurationBuilder; - -import java.util.*; - -import static org.apache.metron.common.utils.StellarProcessorUtils.run; -import static org.apache.metron.common.utils.StellarProcessorUtils.runPredicate; - -@SuppressWarnings("ALL") -public class StellarTest { - - @Stellar( - description="throw exception", - name="THROW", - params = { - "message - exception message" - }, - returns="nothing" - ) - public static class Throw implements StellarFunction { - - @Override - public Object apply(List<Object> args, Context context) throws ParseException { - throw new IllegalStateException(Joiner.on(" ").join(args)); - } - - @Override - public void initialize(Context context) { - - } - - @Override - public boolean isInitialized() { - return true; - } - } - - @Stellar( - description="Always returns true", - name="RET_TRUE", - params = { - "arg* - Any set of args you wish to give it (including the empty set), they're ignored." - }, - returns="true" - ) - public static class TrueFunc implements StellarFunction { - - @Override - public Object apply(List<Object> args, Context context) throws ParseException { - return true; - } - - @Override - public void initialize(Context context) { - - } - - @Override - public boolean isInitialized() { - return true; - } - } - - @Test - public void ensureDocumentation() { - ClassLoader classLoader = getClass().getClassLoader(); - int numFound = 0; - for (Class<?> clazz : new ClasspathFunctionResolver().resolvables()) { - if (clazz.isAnnotationPresent(Stellar.class)) { - numFound++; - Stellar annotation = clazz.getAnnotation(Stellar.class); - Assert.assertFalse("Must specify a name for " + clazz.getName(),StringUtils.isEmpty(annotation.name())); - Assert.assertFalse("Must specify a description annotation for " + clazz.getName(),StringUtils.isEmpty(annotation.description())); - Assert.assertTrue("Must specify a non-empty params for " + clazz.getName(), annotation.params().length > 0); - Assert.assertTrue("Must specify a non-empty params for " + clazz.getName(), StringUtils.isNoneEmpty(annotation.params())); - Assert.assertFalse("Must specify a returns annotation for " + clazz.getName(), StringUtils.isEmpty(annotation.returns())); - } - } - Assert.assertTrue(numFound > 0); - } - - @Test - public void testEscapedLiterals() { - Assert.assertEquals("'bar'", run("\"'bar'\"", new HashMap<>())); - Assert.assertEquals("'BAR'", run("TO_UPPER('\\'bar\\'')", new HashMap<>())); - Assert.assertEquals("\"bar\"", run("\"\\\"bar\\\"\"", new HashMap<>())); - Assert.assertEquals("\"bar\"", run("'\"bar\"'", new HashMap<>())); - Assert.assertEquals("\"BAR\"", run("TO_UPPER(\"\\\"bar\\\"\")", new HashMap<>())); - Assert.assertEquals("bar \\ foo", run("'bar \\\\ foo'", new HashMap<>())); - Assert.assertEquals("bar \\\\ foo", run("'bar \\\\\\\\ foo'", new HashMap<>())); - Assert.assertEquals("bar\nfoo", run("'bar\\nfoo'", new HashMap<>())); - Assert.assertEquals("bar\n\nfoo", run("'bar\\n\\nfoo'", new HashMap<>())); - Assert.assertEquals("bar\tfoo", run("'bar\\tfoo'", new HashMap<>())); - Assert.assertEquals("bar\t\tfoo", run("'bar\\t\\tfoo'", new HashMap<>())); - Assert.assertEquals("bar\rfoo", run("'bar\\rfoo'", new HashMap<>())); - Assert.assertEquals("'bar'", run("'\\'bar\\''", new HashMap<>())); - } - - @Test - public void testVariableResolution() { - { - String query = "bar:variable"; - Assert.assertEquals("bar", run(query, ImmutableMap.of("bar:variable", "bar"))); - Assert.assertEquals("grok", run(query, ImmutableMap.of("bar:variable", "grok"))); - } - { - String query = "JOIN(['foo', bar:variable], '')"; - Assert.assertEquals("foobar", run(query, ImmutableMap.of("bar:variable", "bar"))); - Assert.assertEquals("foogrok", run(query, ImmutableMap.of("bar:variable", "grok"))); - } - { - String query = "MAP_GET('bar', { 'foo' : 1, 'bar' : bar:variable})"; - Assert.assertEquals("bar", run(query, ImmutableMap.of("bar:variable", "bar"))); - Assert.assertEquals("grok", run(query, ImmutableMap.of("bar:variable", "grok"))); - } - } - - @Test - public void testIfThenElseBug1() { - String query = "50 + (true == true ? 10 : 20)"; - Assert.assertEquals(60, run(query, new HashMap<>())); - } - - @Test - public void testIfThenElseBug2() { - String query = "50 + (true == false ? 10 : 20)"; - Assert.assertEquals(70, run(query, new HashMap<>())); - } - - @Test - public void testIfThenElseBug3() { - String query = "50 * (true == false ? 2 : 10) + 20"; - Assert.assertEquals(520, run(query, new HashMap<>())); - } - - @Test - public void testIfThenElseBug4() { - String query = "TO_INTEGER(true == true ? 10.0 : 20.0 )"; - Assert.assertEquals(10, run(query, new HashMap<>())); - } - - @Test - public void testVariablesUsed() { - StellarProcessor processor = new StellarProcessor(); - { - Assert.assertEquals(new HashSet<>(), processor.variablesUsed("if 1 < 2 then 'one' else 'two'")); - } - { - Assert.assertEquals(ImmutableSet.of("one") - , processor.variablesUsed("if 1 < 2 then one else 'two'")); - } - { - Assert.assertEquals(ImmutableSet.of("one", "two") - , processor.variablesUsed("if 1 < 2 then one else two")); - } - { - Assert.assertEquals(ImmutableSet.of("bar") - , processor.variablesUsed("MAP_GET('foo', { 'foo' : bar})")); - } - } - - - @Test - public void testFunctionEmptyArgs() { - { - String query = "STARTS_WITH(casey, 'case') or MAP_EXISTS()"; - Assert.assertTrue((Boolean)run(query, ImmutableMap.of("casey", "casey"))); - } - { - String query = "true or MAP_EXISTS()"; - Assert.assertTrue((Boolean)run(query, new HashMap<>())); - } - { - String query = "MAP_EXISTS() or true"; - Assert.assertTrue((Boolean)run(query, new HashMap<>())); - } - } - @Test - public void testNull() { - { - String query = "if 1 < 2 then NULL else true"; - Assert.assertNull(run(query, new HashMap<>())); - } - { - String query = "1 < 2 ? NULL : true"; - Assert.assertNull(run(query, new HashMap<>())); - } - { - String query = "null == null ? true : false"; - Assert.assertTrue((Boolean)run(query, new HashMap<>())); - } - } - - @Test - public void testMapConstant() { - { - String query = "MAP_GET('bar', { 'foo' : 1, 'bar' : 'bar'})"; - Assert.assertEquals("bar", run(query, new HashMap<>())); - } - { - String query = "MAP_GET('blah', { 'blah' : 1 < 2 })"; - Assert.assertEquals(true, run(query, new HashMap<>())); - } - { - String query = "MAP_GET('blah', { 'blah' : not(STARTS_WITH(casey, 'case')) })"; - Assert.assertEquals(false, run(query, ImmutableMap.of("casey", "casey"))); - } - { - String query = "MAP_GET('blah', { 'blah' : one })"; - Assert.assertEquals(1, run(query, ImmutableMap.of("one", 1))); - } - { - String query = "MAP_GET('blah', { 'blah' : null })"; - Assert.assertNull(run(query, new HashMap<>())); - } - { - String query = "MAP_GET('BLAH', { TO_UPPER('blah') : null })"; - Assert.assertNull(run(query, new HashMap<>())); - } - { - String query = "MAP_GET('BLAH', { TO_UPPER('blah') : 1 < 2 })"; - Assert.assertEquals(true, run(query, new HashMap<>())); - } - } - - @Test - public void testIfThenElse() { - { - String query = "if STARTS_WITH(casey, 'case') then 'one' else 'two'"; - Assert.assertEquals("one", run(query, ImmutableMap.of("casey", "casey"))); - } - { - String query = "if 1 < 2 then 'one' else 'two'"; - Assert.assertEquals("one", run(query, new HashMap<>())); - } - { - String query = "if 1 + 1 < 2 then 'one' else 'two'"; - Assert.assertEquals("two", run(query, new HashMap<>())); - } - { - String query = "if 1 + 1 <= 2 AND 1 + 2 in [3] then 'one' else 'two'"; - Assert.assertEquals("one", run(query, new HashMap<>())); - } - { - String query = "if 1 + 1 <= 2 AND (1 + 2 in [3]) then 'one' else 'two'"; - Assert.assertEquals("one", run(query, new HashMap<>())); - } - { - String query = "if not(1 < 2) then 'one' else 'two'"; - Assert.assertEquals("two", run(query, new HashMap<>())); - } - { - String query = "if 1 == 1.0000001 then 'one' else 'two'"; - Assert.assertEquals("two", run(query, new HashMap<>())); - } - { - String query = "if one < two then 'one' else 'two'"; - Assert.assertEquals("one", run(query, ImmutableMap.of("one", 1, "two", 2))); - } - { - String query = "if one == very_nearly_one then 'one' else 'two'"; - Assert.assertEquals("two", run(query, ImmutableMap.of("one", 1, "very_nearly_one", 1.0000001))); - } - { - String query = "if one == very_nearly_one OR one == very_nearly_one then 'one' else 'two'"; - Assert.assertEquals("two", run(query, ImmutableMap.of("one", 1, "very_nearly_one", 1.0000001))); - } - { - String query = "if one == very_nearly_one OR one != very_nearly_one then 'one' else 'two'"; - Assert.assertEquals("one", run(query, ImmutableMap.of("one", 1, "very_nearly_one", 1.0000001))); - } - { - String query = "if one != very_nearly_one OR one == very_nearly_one then 'one' else 'two'"; - Assert.assertEquals("one", run(query, ImmutableMap.of("one", 1, "very_nearly_one", 1.0000001))); - } - { - String query = "if 'foo' in ['foo'] OR one == very_nearly_one then 'one' else 'two'"; - Assert.assertEquals("one", run(query, ImmutableMap.of("one", 1, "very_nearly_one", 1.0000001))); - } - { - String query = "if ('foo' in ['foo']) OR one == very_nearly_one then 'one' else 'two'"; - Assert.assertEquals("one", run(query, ImmutableMap.of("one", 1, "very_nearly_one", 1.0000001))); - } - { - String query = "if not('foo' in ['foo']) OR one == very_nearly_one then 'one' else 'two'"; - Assert.assertEquals("two", run(query, ImmutableMap.of("one", 1, "very_nearly_one", 1.0000001))); - } - { - String query = "if not('foo' in ['foo'] OR one == very_nearly_one) then 'one' else 'two'"; - Assert.assertEquals("two", run(query, ImmutableMap.of("one", 1, "very_nearly_one", 1.0000001))); - } - { - String query = "1 < 2 ? 'one' : 'two'"; - Assert.assertEquals("one", run(query, new HashMap<>())); - } - { - String query = "1 < 2 ? TO_UPPER('one') : 'two'"; - Assert.assertEquals("ONE", run(query, new HashMap<>())); - } - { - String query = "1 < 2 ? one : 'two'"; - Assert.assertEquals("one", run(query, ImmutableMap.of("one", "one"))); - } - { - String query = "1 < 2 ? one*3 : 'two'"; - Assert.assertTrue(Math.abs(3 - (int) run(query, ImmutableMap.of("one", 1))) < 1e-6); - } - { - String query = "1 < 2 AND 1 < 2 ? one*3 : 'two'"; - Assert.assertTrue(Math.abs(3 - (int) run(query, ImmutableMap.of("one", 1))) < 1e-6); - } - { - String query = "1 < 2 AND 1 > 2 ? one*3 : 'two'"; - Assert.assertEquals("two", run(query, ImmutableMap.of("one", 1))); - } - { - String query = "1 > 2 AND 1 < 2 ? one*3 : 'two'"; - Assert.assertEquals("two", run(query, ImmutableMap.of("one", 1))); - } - { - String query = "1 < 2 AND 'foo' in ['', 'foo'] ? one*3 : 'two'"; - Assert.assertEquals(3, run(query, ImmutableMap.of("one", 1))); - } - { - String query = "1 < 2 AND ('foo' in ['', 'foo']) ? one*3 : 'two'"; - Assert.assertEquals(3, run(query, ImmutableMap.of("one", 1))); - } - { - String query = "'foo' in ['', 'foo'] ? one*3 : 'two'"; - Assert.assertEquals(3, run(query, ImmutableMap.of("one", 1))); - } - } - - @Test - public void testInNotIN(){ - HashMap variables = new HashMap<>(); - boolean thrown = false; - try{ - Object o = run("in in ['','in']" ,variables ); - }catch(ParseException pe) { - thrown = true; - } - Assert.assertTrue(thrown); - thrown = false; - - try{ - Assert.assertEquals(true,run("'in' in ['','in']" ,variables )); - }catch(ParseException pe) { - thrown = true; - } - Assert.assertFalse(thrown); - } - - @Test - public void testHappyPath() { - String query = "TO_UPPER(TRIM(foo))"; - Assert.assertEquals("CASEY", run(query, ImmutableMap.of("foo", "casey "))); - } - - @Test - public void testLengthString(){ - String query = "LENGTH(foo)"; - Assert.assertEquals(5, run(query,ImmutableMap.of("foo","abcde"))); - } - @Test - public void testLengthCollection(){ - String query = "LENGTH(foo)"; - Collection c = Arrays.asList(1,2,3,4,5); - Assert.assertEquals(5, run(query,ImmutableMap.of("foo",c))); - } - - @Test - public void testEmptyLengthString(){ - String query = "LENGTH(foo)"; - Assert.assertEquals(0,run(query,ImmutableMap.of("foo",""))); - } - @Test - public void testEmptyLengthCollection(){ - String query = "LENGTH(foo)"; - Collection c = new ArrayList(); - Assert.assertEquals(0,run(query,ImmutableMap.of("foo",c))); - } - @Test - public void testNoVarLength(){ - String query = "LENGTH(foo)"; - Assert.assertEquals(0,run(query,ImmutableMap.of())); - } - - @Test - public void testJoin() { - String query = "JOIN( [ TO_UPPER(TRIM(foo)), 'bar' ], ',')"; - Assert.assertEquals("CASEY,bar", run(query, ImmutableMap.of("foo", "casey "))); - } - - @Test - public void testSplit() { - String query = "JOIN( SPLIT(foo, ':'), ',')"; - Assert.assertEquals("casey,bar", run(query, ImmutableMap.of("foo", "casey:bar"))); - } - - @Test - public void testMapGet() { - String query = "MAP_GET(dc, dc2tz, 'UTC')"; - Assert.assertEquals("UTC" - , run(query, ImmutableMap.of("dc", "nyc" - ,"dc2tz", ImmutableMap.of("la", "PST") - ) - ) - ); - Assert.assertEquals("EST" - , run(query, ImmutableMap.of("dc", "nyc" - ,"dc2tz", ImmutableMap.of("nyc", "EST") - ) - ) - ); - } - - @Test - public void testTLDExtraction() { - String query = "DOMAIN_TO_TLD(foo)"; - Assert.assertEquals("co.uk", run(query, ImmutableMap.of("foo", "www.google.co.uk"))); - } - - @Test - public void testTLDRemoval() { - String query = "DOMAIN_REMOVE_TLD(foo)"; - Assert.assertEquals("www.google", run(query, ImmutableMap.of("foo", "www.google.co.uk"))); - } - - @Test - public void testSubdomainRemoval() { - String query = "DOMAIN_REMOVE_SUBDOMAINS(foo)"; - Assert.assertEquals("google.co.uk", run(query, ImmutableMap.of("foo", "www.google.co.uk"))); - Assert.assertEquals("google.com", run(query, ImmutableMap.of("foo", "www.google.com"))); - } - - @Test - public void testURLToHost() { - String query = "URL_TO_HOST(foo)"; - Assert.assertEquals("www.google.co.uk", run(query, ImmutableMap.of("foo", "http://www.google.co.uk/my/path"))); - } - - @Test - public void testURLToPort() { - String query = "URL_TO_PORT(foo)"; - Assert.assertEquals(80, run(query, ImmutableMap.of("foo", "http://www.google.co.uk/my/path"))); - } - - @Test - public void testURLToProtocol() { - String query = "URL_TO_PROTOCOL(foo)"; - Assert.assertEquals("http", run(query, ImmutableMap.of("foo", "http://www.google.co.uk/my/path"))); - } - - @Test - public void testURLToPath() { - String query = "URL_TO_PATH(foo)"; - Assert.assertEquals("/my/path", run(query, ImmutableMap.of("foo", "http://www.google.co.uk/my/path"))); - } - - @Test - public void testProtocolToName() { - String query = "PROTOCOL_TO_NAME(protocol)"; - Assert.assertEquals("TCP", run(query, ImmutableMap.of("protocol", "6"))); - Assert.assertEquals("TCP", run(query, ImmutableMap.of("protocol", 6))); - Assert.assertEquals(null, run(query, ImmutableMap.of("foo", 6))); - Assert.assertEquals("chicken", run(query, ImmutableMap.of("protocol", "chicken"))); - } - - @Test - public void testDateConversion() { - long expected =1452013350000L; - { - String query = "TO_EPOCH_TIMESTAMP(foo, 'yyyy-MM-dd HH:mm:ss', 'UTC')"; - Assert.assertEquals(expected, run(query, ImmutableMap.of("foo", "2016-01-05 17:02:30"))); - } - { - String query = "TO_EPOCH_TIMESTAMP(foo, 'yyyy-MM-dd HH:mm:ss')"; - Long ts = (Long) run(query, ImmutableMap.of("foo", "2016-01-05 17:02:30")); - //is it within 24 hours of the UTC? - Assert.assertTrue(Math.abs(ts - expected) < 8.64e+7); - } - } - - @Test - public void testToString() { - Assert.assertEquals("5", run("TO_STRING(foo)", ImmutableMap.of("foo", 5))); - } - - @Test - public void testToInteger() { - Assert.assertEquals(5, run("TO_INTEGER(foo)", ImmutableMap.of("foo", "5"))); - Assert.assertEquals(5, run("TO_INTEGER(foo)", ImmutableMap.of("foo", 5))); - } - - @Test - public void testToDouble() { - Assert.assertEquals(5.1d, run("TO_DOUBLE(foo)", ImmutableMap.of("foo", 5.1d))); - Assert.assertEquals(5.1d, run("TO_DOUBLE(foo)", ImmutableMap.of("foo", "5.1"))); - } - - @Test - public void testGet() { - Map<String, Object> variables = ImmutableMap.of("foo", "www.google.co.uk"); - Assert.assertEquals("www", run("GET_FIRST(SPLIT(DOMAIN_REMOVE_TLD(foo), '.'))", variables)); - Assert.assertEquals("www", run("GET(SPLIT(DOMAIN_REMOVE_TLD(foo), '.'), 0)", variables)); - Assert.assertEquals("google", run("GET_LAST(SPLIT(DOMAIN_REMOVE_TLD(foo), '.'))", variables)); - Assert.assertEquals("google", run("GET(SPLIT(DOMAIN_REMOVE_TLD(foo), '.'), 1)", variables)); - } - - @Test - public void testBooleanOps() throws Exception { - final Map<String, String> variableMap = new HashMap<String, String>() {{ - put("foo", "casey"); - 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))); - } - - @Test - public void testInCollection() throws Exception { - final Map<String, String> variableMap = new HashMap<String, String>() {{ - 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))); - } - - @Test - public void testInMap() throws Exception { - final Map<String, String> variableMap = new HashMap<String, String>() {{ - 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))); - } - - @Test - public void testInString() throws Exception { - final Map<String, String> variableMap = new HashMap<String, String>() {{ - 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))); - } - - @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("('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)); - } - - @Test - public void testExists() throws Exception { - final Map<String, String> variableMap = new HashMap<String, String>() {{ - put("foo", "casey"); - 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))); - } - - @Test - public void testMapFunctions_advanced() throws Exception { - final Map<String, Object> variableMap = new HashMap<String, Object>() {{ - put("foo", "casey"); - put("bar", "bar.casey.grok"); - put("ip", "192.168.0.1"); - put("empty", ""); - put("spaced", "metron is great"); - put("myMap", ImmutableMap.of("casey", "apple")); - }}; - Assert.assertTrue(runPredicate("MAP_EXISTS(foo, myMap)", v -> variableMap.get(v))); - } - - @Test - public void testLogicalFunctions() throws Exception { - final Map<String, String> variableMap = new HashMap<String, String>() {{ - put("foo", "casey"); - put("ip", "192.168.0.1"); - put("ip_src_addr", "192.168.0.1"); - put("ip_dst_addr", "10.0.0.1"); - put("other_ip", "10.168.0.1"); - 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))); - } - - @Test - public void testShortCircuit_conditional() throws Exception { - Assert.assertEquals("foo", run("if true then 'foo' else (if false then 'bar' else 'grok')", new HashMap<>())); - Assert.assertEquals("foo", run("if true_var != null && true_var then 'foo' else (if false then 'bar' else 'grok')", ImmutableMap.of("true_var", true))); - Assert.assertEquals("foo", run("if true then 'foo' else THROW('expression')", new HashMap<>())); - Assert.assertEquals("foo", run("true ? 'foo' : THROW('expression')", new HashMap<>())); - Assert.assertEquals("foo", run("if false then THROW('exception') else 'foo'", new HashMap<>())); - Assert.assertEquals("foo", run("false ? THROW('exception') : 'foo'", new HashMap<>())); - Assert.assertEquals(true, run("RET_TRUE(if true then 'foo' else THROW('expression'))", new HashMap<>())); - Assert.assertEquals("foo", run("if true or (true or THROW('if exception')) then 'foo' else THROW('expression')", new HashMap<>())); - Assert.assertEquals("foo", run("if true or (false or THROW('if exception')) then 'foo' else THROW('expression')", new HashMap<>())); - Assert.assertEquals("foo", run("if NOT(true or (false or THROW('if exception'))) then THROW('expression') else 'foo'", new HashMap<>())); - Assert.assertEquals("foo", run("if NOT('metron' in [ 'metron', 'metronicus'] ) then THROW('expression') else 'foo'", new HashMap<>())); - } - - @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)); - } - - @Rule - public ExpectedException thrown = ExpectedException.none(); - - @Test - public void non_boolean_predicate_throws_exception() { - final Map<String, String> variableMap = new HashMap<String, String>() {{ - put("protocol", "http"); - }}; - 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)); - } -} http://git-wip-us.apache.org/repos/asf/metron/blob/a5b13777/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/evaluators/ArithmeticEvaluatorTest.java ---------------------------------------------------------------------- diff --git a/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/evaluators/ArithmeticEvaluatorTest.java b/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/evaluators/ArithmeticEvaluatorTest.java deleted file mode 100644 index de9f722..0000000 --- a/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/evaluators/ArithmeticEvaluatorTest.java +++ /dev/null @@ -1,412 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF 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.apache.metron.common.stellar.evaluators; - -import org.apache.commons.lang3.tuple.Pair; -import org.apache.metron.common.dsl.Token; -import org.junit.Test; - -import java.util.HashMap; -import java.util.Map; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -@SuppressWarnings("unchecked") -public class ArithmeticEvaluatorTest { - ArithmeticEvaluator evaluator = ArithmeticEvaluator.INSTANCE; - - @Test - public void evaluateDoubleShouldReturnDoubleAdd() throws Exception { - Token<Integer> l = mock(Token.class); - when(l.getValue()).thenReturn(1); - - Token<Double> r = mock(Token.class); - when(r.getValue()).thenReturn(2D); - - Pair<Token<? extends Number>, Token<? extends Number>> p = Pair.of(l, r); - - Token<? extends Number> evaluated = evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.addition(null), p); - - assertTrue(evaluated.getValue() instanceof Double); - assertEquals(3.0D, evaluated.getValue()); - } - - @Test - public void evaluateIntegerShouldReturnIntegerAdd() throws Exception { - Token<Integer> l = mock(Token.class); - when(l.getValue()).thenReturn(1); - - Token<Integer> r = mock(Token.class); - when(r.getValue()).thenReturn(2); - - Pair<Token<? extends Number>, Token<? extends Number>> p = Pair.of(l, r); - - Token<? extends Number> evaluated = evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.addition(null), p); - - assertTrue(evaluated.getValue() instanceof Integer); - assertEquals(3, evaluated.getValue()); - } - - @Test - public void evaluateFloatsShouldReturnFloatAdd() throws Exception { - Token<Float> l = mock(Token.class); - when(l.getValue()).thenReturn(1F); - - Token<Integer> r = mock(Token.class); - when(r.getValue()).thenReturn(2); - - Pair<Token<? extends Number>, Token<? extends Number>> p = Pair.of(l, r); - - Token<? extends Number> evaluated = evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.addition(null), p); - - assertTrue(evaluated.getValue() instanceof Float); - assertEquals(3F, evaluated.getValue()); - } - - @Test - public void evaluateLongsShouldReturnLongAdd() throws Exception { - Token<Long> l = mock(Token.class); - when(l.getValue()).thenReturn(1L); - - Token<Integer> r = mock(Token.class); - when(r.getValue()).thenReturn(2); - - Pair<Token<? extends Number>, Token<? extends Number>> p = Pair.of(l, r); - - Token<? extends Number> evaluated = evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.addition(null), p); - - assertTrue(evaluated.getValue() instanceof Long); - assertEquals(3L, evaluated.getValue()); - } - - @Test - public void evaluateIntegerShouldReturnDoubleMul() throws Exception { - Token<Integer> l = mock(Token.class); - when(l.getValue()).thenReturn(1); - - Token<Double> r = mock(Token.class); - when(r.getValue()).thenReturn(2D); - - Pair<Token<? extends Number>, Token<? extends Number>> p = Pair.of(l, r); - - Token<? extends Number> evaluated = evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.multiplication(null), p); - - assertTrue(evaluated.getValue() instanceof Double); - assertEquals(2.0D, evaluated.getValue()); - } - - @Test - public void evaluateIntegerShouldReturnIntegerMul() throws Exception { - Token<Integer> l = mock(Token.class); - when(l.getValue()).thenReturn(1); - - Token<Integer> r = mock(Token.class); - when(r.getValue()).thenReturn(2); - - Pair<Token<? extends Number>, Token<? extends Number>> p = Pair.of(l, r); - - Token<? extends Number> evaluated = evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.multiplication(null), p); - - assertTrue(evaluated.getValue() instanceof Integer); - assertEquals(2, evaluated.getValue()); - } - - @Test - public void evaluateFloatsShouldReturnFloatMul() throws Exception { - Token<Float> l = mock(Token.class); - when(l.getValue()).thenReturn(1F); - - Token<Integer> r = mock(Token.class); - when(r.getValue()).thenReturn(2); - - Pair<Token<? extends Number>, Token<? extends Number>> p = Pair.of(l, r); - - Token<? extends Number> evaluated = evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.multiplication(null), p); - - assertTrue(evaluated.getValue() instanceof Float); - assertEquals(2F, evaluated.getValue()); - } - - @Test - public void evaluateLongsShouldReturnLongMul() throws Exception { - Token<Long> l = mock(Token.class); - when(l.getValue()).thenReturn(1L); - - Token<Integer> r = mock(Token.class); - when(r.getValue()).thenReturn(2); - - Pair<Token<? extends Number>, Token<? extends Number>> p = Pair.of(l, r); - - Token<? extends Number> evaluated = evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.multiplication(null), p); - - assertTrue(evaluated.getValue() instanceof Long); - assertEquals(2L, evaluated.getValue()); - } - - @Test - public void evaluateDoubleShouldReturnDoubleSub() throws Exception { - Token<Integer> l = mock(Token.class); - when(l.getValue()).thenReturn(1); - - Token<Double> r = mock(Token.class); - when(r.getValue()).thenReturn(2D); - - Pair<Token<? extends Number>, Token<? extends Number>> p = Pair.of(l, r); - - Token<? extends Number> evaluated = evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.subtraction(null), p); - - assertTrue(evaluated.getValue() instanceof Double); - assertEquals(-1.0D, evaluated.getValue()); - } - - @Test - public void evaluateIntegerShouldReturnIntegerSub() throws Exception { - Token<Integer> l = mock(Token.class); - when(l.getValue()).thenReturn(1); - - Token<Integer> r = mock(Token.class); - when(r.getValue()).thenReturn(2); - - Pair<Token<? extends Number>, Token<? extends Number>> p = Pair.of(l, r); - - Token<? extends Number> evaluated = evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.subtraction(null), p); - - assertTrue(evaluated.getValue() instanceof Integer); - assertEquals(-1, evaluated.getValue()); - } - - @Test - public void evaluateFloatsShouldReturnFloatSub() throws Exception { - Token<Float> l = mock(Token.class); - when(l.getValue()).thenReturn(1F); - - Token<Integer> r = mock(Token.class); - when(r.getValue()).thenReturn(2); - - Pair<Token<? extends Number>, Token<? extends Number>> p = Pair.of(l, r); - - Token<? extends Number> evaluated = evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.subtraction(null), p); - - assertTrue(evaluated.getValue() instanceof Float); - assertEquals(-1F, evaluated.getValue()); - } - - @Test - public void evaluateLongsShouldReturnLongSub() throws Exception { - Token<Long> l = mock(Token.class); - when(l.getValue()).thenReturn(1L); - - Token<Integer> r = mock(Token.class); - when(r.getValue()).thenReturn(2); - - Pair<Token<? extends Number>, Token<? extends Number>> p = Pair.of(l, r); - - Token<? extends Number> evaluated = evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.subtraction(null), p); - - assertTrue(evaluated.getValue() instanceof Long); - assertEquals(-1L, evaluated.getValue()); - } - - @Test - public void evaluateDoubleShouldReturnDoubleDiv() throws Exception { - Token<Integer> l = mock(Token.class); - when(l.getValue()).thenReturn(1); - - Token<Double> r = mock(Token.class); - when(r.getValue()).thenReturn(2D); - - Pair<Token<? extends Number>, Token<? extends Number>> p = Pair.of(l, r); - - Token<? extends Number> evaluated = evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.division(null), p); - - assertTrue(evaluated.getValue() instanceof Double); - assertEquals(1 / 2D, evaluated.getValue()); - } - - @Test - public void evaluateIntegerShouldReturnIntegerDiv() throws Exception { - Token<Integer> l = mock(Token.class); - when(l.getValue()).thenReturn(1); - - Token<Integer> r = mock(Token.class); - when(r.getValue()).thenReturn(2); - - Pair<Token<? extends Number>, Token<? extends Number>> p = Pair.of(l, r); - - Token<? extends Number> evaluated = evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.division(null), p); - - assertTrue(evaluated.getValue() instanceof Integer); - assertEquals(1 / 2, evaluated.getValue()); - } - - @Test - public void evaluateFloatsShouldReturnFloatDiv() throws Exception { - Token<Float> l = mock(Token.class); - when(l.getValue()).thenReturn(1F); - - Token<Integer> r = mock(Token.class); - when(r.getValue()).thenReturn(2); - - Pair<Token<? extends Number>, Token<? extends Number>> p = Pair.of(l, r); - - Token<? extends Number> evaluated = evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.division(null), p); - - assertTrue(evaluated.getValue() instanceof Float); - assertEquals(0.5F, evaluated.getValue()); - } - - @Test - public void evaluateLongsShouldReturnLongDiv() throws Exception { - Token<Long> l = mock(Token.class); - when(l.getValue()).thenReturn(1L); - - Token<Integer> r = mock(Token.class); - when(r.getValue()).thenReturn(2); - - Pair<Token<? extends Number>, Token<? extends Number>> p = Pair.of(l, r); - - Token<? extends Number> evaluated = evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.division(null), p); - - assertTrue(evaluated.getValue() instanceof Long); - assertEquals(0L, evaluated.getValue()); - } - - @Test(expected = IllegalArgumentException.class) - public void evaluateShouldThroughIllegalArgumentExceptionWhenInputIsNull() throws Exception { - evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.division(null), null); - } - - @Test(expected = IllegalArgumentException.class) - public void evaluateShouldThroughIllegalArgumentExceptionWhenInputsKeyIsNull() throws Exception { - Pair<Token<? extends Number>, Token<? extends Number>> p = Pair.of(null, mock(Token.class)); - evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.division(null), p); - } - - @Test(expected = IllegalArgumentException.class) - public void evaluateShouldThroughIllegalArgumentExceptionWhenInputsValueIsNull() throws Exception { - Pair<Token<? extends Number>, Token<? extends Number>> p = Pair.of(mock(Token.class), null); - evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.division(null), p); - } - - @Test - public void evaluateShouldConvertShortsToIntegersType() throws Exception { - Token<Short> l = mock(Token.class); - when(l.getValue()).thenReturn((short) 2); - - Token<Short> r = mock(Token.class); - when(r.getValue()).thenReturn((short) 3); - - Token<? extends Number> evaluated0 = evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.addition(null), Pair.of(l, r)); - Token<? extends Number> evaluated1 = evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.subtraction(null), Pair.of(l, r)); - Token<? extends Number> evaluated2 = evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.multiplication(null), Pair.of(l, r)); - Token<? extends Number> evaluated3 = evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.division(null), Pair.of(l, r)); - - assertTrue(evaluated0.getValue() instanceof Integer); - assertEquals(5, evaluated0.getValue()); - - assertTrue(evaluated1.getValue() instanceof Integer); - assertEquals(-1, evaluated1.getValue()); - - assertTrue(evaluated2.getValue() instanceof Integer); - assertEquals(6, evaluated2.getValue()); - - assertTrue(evaluated3.getValue() instanceof Integer); - assertEquals(0, evaluated3.getValue()); - } - - @Test - public void evaluateIntegerShouldReturnIntegerWhenLeftsValueIsNull() throws Exception { - Token<Integer> l = mock(Token.class); - when(l.getValue()).thenReturn(null); - - Token<Integer> r = mock(Token.class); - when(r.getValue()).thenReturn(2); - - Pair<Token<? extends Number>, Token<? extends Number>> p = Pair.of(l, r); - - Token<? extends Number> evaluated = evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.addition(null), p); - - assertTrue(evaluated.getValue() instanceof Integer); - assertEquals(2, evaluated.getValue()); - } - - @Test - public void evaluateIntegerShouldReturnIntegerWhenRightsValueIsNull() throws Exception { - Token<Integer> l = mock(Token.class); - when(l.getValue()).thenReturn(1); - - Token<Integer> r = mock(Token.class); - when(r.getValue()).thenReturn(null); - - Pair<Token<? extends Number>, Token<? extends Number>> p = Pair.of(l, r); - - Token<? extends Number> evaluated = evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.addition(null), p); - - assertTrue(evaluated.getValue() instanceof Integer); - assertEquals(1, evaluated.getValue()); - } - - @Test - public void verifyExpectedReturnTypes() throws Exception { - Token<Integer> integer = mock(Token.class); - when(integer.getValue()).thenReturn(1); - - Token<Long> lng = mock(Token.class); - when(lng.getValue()).thenReturn(1L); - - Token<Double> dbl = mock(Token.class); - when(dbl.getValue()).thenReturn(1.0D); - - Token<Float> flt = mock(Token.class); - when(flt.getValue()).thenReturn(1.0F); - - Map<Pair<Token<? extends Number>, Token<? extends Number>>, Class<? extends Number>> expectedReturnTypeMappings = - new HashMap<Pair<Token<? extends Number>, Token<? extends Number>>, Class<? extends Number>>() {{ - put(Pair.of(flt, lng), Float.class); - put(Pair.of(flt, dbl), Double.class); - put(Pair.of(flt, flt), Float.class); - put(Pair.of(flt, integer), Float.class); - - put(Pair.of(lng, lng), Long.class); - put(Pair.of(lng, dbl), Double.class); - put(Pair.of(lng, flt), Float.class); - put(Pair.of(lng, integer), Long.class); - - put(Pair.of(dbl, lng), Double.class); - put(Pair.of(dbl, dbl), Double.class); - put(Pair.of(dbl, flt), Double.class); - put(Pair.of(dbl, integer), Double.class); - - put(Pair.of(integer, lng), Long.class); - put(Pair.of(integer, dbl), Double.class); - put(Pair.of(integer, flt), Float.class); - put(Pair.of(integer, integer), Integer.class); - }}; - - expectedReturnTypeMappings.forEach( (pair, expectedClass) -> { - assertTrue(evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.addition(null), pair).getValue().getClass() == expectedClass); - assertTrue(evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.division(null), pair).getValue().getClass() == expectedClass); - assertTrue(evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.subtraction(null), pair).getValue().getClass() == expectedClass); - assertTrue(evaluator.evaluate(ArithmeticEvaluator.ArithmeticEvaluatorFunctions.multiplication(null), pair).getValue().getClass() == expectedClass); - }); - } -} http://git-wip-us.apache.org/repos/asf/metron/blob/a5b13777/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/evaluators/ComparisonExpressionWithOperatorEvaluatorTest.java ---------------------------------------------------------------------- diff --git a/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/evaluators/ComparisonExpressionWithOperatorEvaluatorTest.java b/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/evaluators/ComparisonExpressionWithOperatorEvaluatorTest.java deleted file mode 100644 index 0c20eb4..0000000 --- a/metron-platform/metron-common/src/test/java/org/apache/metron/common/stellar/evaluators/ComparisonExpressionWithOperatorEvaluatorTest.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF 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.apache.metron.common.stellar.evaluators; - -import org.antlr.v4.runtime.tree.TerminalNode; -import org.apache.metron.common.dsl.ParseException; -import org.apache.metron.common.dsl.Token; -import org.apache.metron.common.stellar.generated.StellarParser; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.runner.RunWith; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.powermock.api.mockito.PowerMockito.mock; -import static org.powermock.api.mockito.PowerMockito.when; - -@SuppressWarnings({"unchecked"}) -@RunWith(PowerMockRunner.class) -@PrepareForTest({ComparisonExpressionWithOperatorEvaluator.class, ComparisonExpressionWithOperatorEvaluator.Strategy.class}) -public class ComparisonExpressionWithOperatorEvaluatorTest { - @Rule - public final ExpectedException exception = ExpectedException.none(); - - final ComparisonExpressionWithOperatorEvaluator evaluator = ComparisonExpressionWithOperatorEvaluator.INSTANCE; - - @Test - public void evaluateEqShouldProperlyCallEqualityOperatorsEvaluator() throws Exception { - Token<Double> left = mock(Token.class); - when(left.getValue()).thenReturn(1D); - - Token<Double> right = mock(Token.class); - when(right.getValue()).thenReturn(1D); - - StellarParser.ComparisonOpContext op = mock(StellarParser.ComparisonOpContext.class); - when(op.EQ()).thenReturn(mock(TerminalNode.class)); - - Token<Boolean> evaluated = evaluator.evaluate(left, right, op, null); - - assertTrue(evaluated.getValue()); - } - - @Test - public void evaluateNotEqShouldProperlyCallEqualityOperatorsEvaluator() throws Exception { - Token<Double> left = mock(Token.class); - when(left.getValue()).thenReturn(1D); - - Token<Double> right = mock(Token.class); - when(right.getValue()).thenReturn(1D); - - StellarParser.ComparisonOpContext op = mock(StellarParser.ComparisonOpContext.class); - when(op.NEQ()).thenReturn(mock(TerminalNode.class)); - - Token<Boolean> evaluated = evaluator.evaluate(left, right, op, null); - - assertFalse(evaluated.getValue()); - } - - @Test - public void evaluateLessThanEqShouldProperlyCallEqualityOperatorsEvaluator() throws Exception { - Token<Double> left = mock(Token.class); - when(left.getValue()).thenReturn(0D); - - Token<Double> right = mock(Token.class); - when(right.getValue()).thenReturn(1D); - - StellarParser.ComparisonOpContext op = mock(StellarParser.ComparisonOpContext.class); - when(op.LTE()).thenReturn(mock(TerminalNode.class)); - - Token<Boolean> evaluated = evaluator.evaluate(left, right, op, null); - - assertTrue(evaluated.getValue()); - } - - @Test - public void unexpectedOperatorShouldThrowException() throws Exception { - exception.expect(ParseException.class); - exception.expectMessage("Unsupported operations. The following expression is invalid: "); - - Token<Double> left = mock(Token.class); - when(left.getValue()).thenReturn(0D); - - Token<Double> right = mock(Token.class); - when(right.getValue()).thenReturn(1D); - - StellarParser.ComparisonOpContext op = mock(StellarParser.ComparisonOpContext.class); - - evaluator.evaluate(left, right, op, null); - } - - @Test - public void nonExpectedOperatorShouldThrowException() throws Exception { - exception.expect(ParseException.class); - exception.expectMessage("Unsupported operations. The following expression is invalid: "); - - Token<String> left = mock(Token.class); - when(left.getValue()).thenReturn("adsf"); - - Token<Double> right = mock(Token.class); - when(right.getValue()).thenReturn(1D); - - StellarParser.ComparisonOpContext op = mock(StellarParser.ComparisonOpContext.class); - when(op.LTE()).thenReturn(mock(TerminalNode.class)); - - evaluator.evaluate(left, right, op, null); - } -} \ No newline at end of file
