diff options
| author | wangkuan <[email protected]> | 2023-12-01 16:39:45 +0800 |
|---|---|---|
| committer | wangkuan <[email protected]> | 2023-12-01 16:39:45 +0800 |
| commit | 7c455cec890f0bb65b16e93794658e4e4d0bea37 (patch) | |
| tree | 6f275de628b5bb5b85198664e87430d3837a1401 /groot-tests | |
| parent | a62a6f5c5fb58ee3942e87975fc7a5258383c625 (diff) | |
[improve][core]GAL-443优化所有udf函数(定位库函数,路径合并函数待持续优化)
Diffstat (limited to 'groot-tests')
3 files changed, 209 insertions, 0 deletions
diff --git a/groot-tests/src/test/java/com/geedgenetworks/core/udf/expressions/EvalExpressionResolverTest.java b/groot-tests/src/test/java/com/geedgenetworks/core/udf/expressions/EvalExpressionResolverTest.java new file mode 100644 index 0000000..e6b8ff2 --- /dev/null +++ b/groot-tests/src/test/java/com/geedgenetworks/core/udf/expressions/EvalExpressionResolverTest.java @@ -0,0 +1,81 @@ +package com.geedgenetworks.core.udf.test; + +import com.geedgenetworks.core.expressions.*; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class EvalExpressionResolverTest { + + private static EvalExpressionResolver resolver; + + @BeforeAll + static void setUp() { + resolver = new EvalExpressionResolver(); + } + + @Test + void testValueExpression() { + // constant + assertEquals(resolver.resolve("'name'"), new ValueExpression.StringConstantExpression("name")); + assertEquals(resolver.resolve("5"), new ValueExpression.NumberConstantExpression(5)); + assertEquals(resolver.resolve("5L"), new ValueExpression.NumberConstantExpression(5L)); + assertEquals(resolver.resolve("5D"), new ValueExpression.NumberConstantExpression((double) 5L)); + assertEquals(resolver.resolve("5BD"), new ValueExpression.NumberConstantExpression(BigDecimal.valueOf(5))); + assertEquals(resolver.resolve("TRUE"), new ValueExpression.BooleanConstantExpression(true)); + assertEquals(resolver.resolve("FALSE"), new ValueExpression.BooleanConstantExpression(false)); + + // variable + assertEquals(resolver.resolve("common_client_ip"), + new ValueExpression.FieldRefExpression("common_client_ip")); + assertEquals(resolver.resolve("common_client_port"), + new ValueExpression.FieldRefExpression("common_client_port")); + } + + @Test + void testConditionExpression() { + + assertEquals( + resolver.resolve("common_client_port > common_server_port ? common_c2s_pkt_num : common_s2c_pkt_num"), + new ValueExpression.TernaryExpression( + new BooleanExpression.ComparisonExpression(ComparisonOperator.GT, + new ValueExpression.FieldRefExpression("common_client_port"), + new ValueExpression.FieldRefExpression("common_server_port")), + new ValueExpression.FieldRefExpression("common_c2s_pkt_num"), + new ValueExpression.FieldRefExpression("common_s2c_pkt_num")) + ); + assertEquals( + resolver.resolve("common_client_port > common_server_port " + + "? 'C2S:' + common_c2s_pkt_num : 'S2C:' + common_s2c_pkt_num"), + new ValueExpression.TernaryExpression( + new BooleanExpression.ComparisonExpression(ComparisonOperator.GT, + new ValueExpression.FieldRefExpression("common_client_port"), + new ValueExpression.FieldRefExpression("common_server_port")), + new ValueExpression.ArithmeticExpression(ArithmeticOperator.PLUS, + new ValueExpression.StringConstantExpression("C2S:"), + new ValueExpression.FieldRefExpression("common_c2s_pkt_num")), + new ValueExpression.ArithmeticExpression(ArithmeticOperator.PLUS, + new ValueExpression.StringConstantExpression("S2C:"), + new ValueExpression.FieldRefExpression("common_s2c_pkt_num"))) + ); + assertEquals( + resolver.resolve("common_c2s_pkt_num > common_s2c_pkt_num " + + "& common_c2s_byte_num > common_s2c_byte_num ? common_client_port : common_server_port"), + new ValueExpression.TernaryExpression( + new BooleanExpression.PredicateExpression(PredicateOperator.AND, + new BooleanExpression.ComparisonExpression(ComparisonOperator.GT, + new ValueExpression.FieldRefExpression("common_c2s_pkt_num"), + new ValueExpression.FieldRefExpression("common_s2c_pkt_num")), + new BooleanExpression.ComparisonExpression(ComparisonOperator.GT, + new ValueExpression.FieldRefExpression("common_c2s_byte_num"), + new ValueExpression.FieldRefExpression("common_s2c_byte_num"))), + new ValueExpression.FieldRefExpression("common_client_port"), + new ValueExpression.FieldRefExpression("common_server_port")) + ); + } + + +}
\ No newline at end of file diff --git a/groot-tests/src/test/java/com/geedgenetworks/core/udf/expressions/codegen/CalcCodeConvertorTest.java b/groot-tests/src/test/java/com/geedgenetworks/core/udf/expressions/codegen/CalcCodeConvertorTest.java new file mode 100644 index 0000000..fc842e7 --- /dev/null +++ b/groot-tests/src/test/java/com/geedgenetworks/core/udf/expressions/codegen/CalcCodeConvertorTest.java @@ -0,0 +1,94 @@ +package com.geedgenetworks.core.udf.test.codegen; + + +import com.geedgenetworks.core.expressions.InvalidProgramException; +import com.geedgenetworks.core.expressions.SyntaxErrorException; +import com.geedgenetworks.core.expressions.codegen.CalcCodeConvertor; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class CalcCodeConvertorTest { + + private static Map<String, Object> origin; + + @BeforeAll + static void setUp() { + origin = new HashMap<>(); + origin.put("common_schema_type", "RTP"); + origin.put("common_sessions", 1); + origin.put("common_stream_dir", 3); + origin.put("common_vsys_id", 24); + + origin.put("common_server_ip", "172.17.200.50"); + origin.put("common_server_port", 36682); + origin.put("common_s2c_byte_num", 7570); + origin.put("common_s2c_pkt_num", 5); + + origin.put("common_client_ip", "172.17.201.16"); + origin.put("common_client_port", 42924); + origin.put("common_c2s_byte_num", 1834); + origin.put("common_c2s_pkt_num", 6); + + origin.put("common_out_dest_mac", "02:fc:08:dc:92:d7"); + origin.put("common_out_src_mac", "02:fc:08:dc:91:c3"); + } + + @Test + void testValueExpression() throws Exception { + // constant + assertEquals(CalcCodeConvertor.convert("'name'").eval(origin), "name"); + assertEquals(CalcCodeConvertor.convert("5").eval(origin), 5); + assertEquals(CalcCodeConvertor.convert("5L").eval(origin), 5L); + assertEquals(CalcCodeConvertor.convert("5D").eval(origin), (double) 5L); + assertEquals(CalcCodeConvertor.convert("5BD").eval(origin), BigDecimal.valueOf(5)); + assertEquals(CalcCodeConvertor.convert("TRUE").eval(origin), true); + assertEquals(CalcCodeConvertor.convert("FALSE").eval(origin), false); + + // variable + assertEquals(CalcCodeConvertor.convert("common_client_ip").eval(origin), + origin.get("common_client_ip")); + assertEquals(CalcCodeConvertor.convert("common_client_port").eval(origin), + origin.get("common_client_port")); + } + + @Test + void testConditionExpression() throws Exception { + int commonClientPort = (int) origin.get("common_client_port"); + int commonServerPort = (int) origin.get("common_server_port"); + int commonC2sPktNum = (int) origin.get("common_c2s_pkt_num"); + int commonS2cPktNum = (int) origin.get("common_s2c_pkt_num"); + int commonC2sByteNum = (int) origin.get("common_c2s_byte_num"); + int commonS2cByteNum = (int) origin.get("common_s2c_byte_num"); + assertEquals( + CalcCodeConvertor.convert("common_client_port > common_server_port " + + "? common_c2s_pkt_num : common_s2c_pkt_num").eval(origin), + commonClientPort > commonServerPort ? commonC2sPktNum : commonS2cPktNum); + assertEquals( + CalcCodeConvertor.convert("common_client_port > common_server_port " + + "? 'C2S:' + common_c2s_pkt_num : 'S2C:' + common_s2c_pkt_num").eval(origin), + commonClientPort > commonServerPort ? "C2S:" + commonC2sPktNum : "S2C:" + commonS2cPktNum); + assertEquals( + CalcCodeConvertor.convert("common_c2s_pkt_num > common_s2c_pkt_num " + + "& common_c2s_byte_num > common_s2c_byte_num ? common_client_port : common_server_port").eval(origin), + commonC2sPktNum > commonS2cPktNum + && commonC2sByteNum > commonS2cByteNum ? commonClientPort : commonServerPort + ); + } + + @Test + void testError() { + assertThrows(SyntaxErrorException.class, + () -> CalcCodeConvertor.convert("common_c2s_pkt_num > common_s2c_pkt_num")); + assertThrows(SyntaxErrorException.class, + () -> CalcCodeConvertor.convert("2 = 3")); + assertThrows(InvalidProgramException.class, + () -> CalcCodeConvertor.convert("common_client_ip - 10")); + } +}
\ No newline at end of file diff --git a/groot-tests/src/test/java/com/geedgenetworks/core/udf/expressions/codegen/EvalCodeGeneratorTest.java b/groot-tests/src/test/java/com/geedgenetworks/core/udf/expressions/codegen/EvalCodeGeneratorTest.java new file mode 100644 index 0000000..6a0d4d2 --- /dev/null +++ b/groot-tests/src/test/java/com/geedgenetworks/core/udf/expressions/codegen/EvalCodeGeneratorTest.java @@ -0,0 +1,34 @@ +package com.geedgenetworks.core.udf.test.codegen; + + +import com.geedgenetworks.core.expressions.EvalExpressionResolver; +import com.geedgenetworks.core.expressions.Expression; +import com.geedgenetworks.core.expressions.codegen.CodeGeneratorContext; +import com.geedgenetworks.core.expressions.codegen.EvalCodeGenerator; +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +class EvalCodeGeneratorTest { + + private static EvalExpressionResolver resolver; + + @BeforeAll + static void setUp() { + resolver = new EvalExpressionResolver(); + } + + @Test + void testCodeGen() { + Expression expression = resolver.resolve("common_client_port > common_server_port " + + " ? 'C2S:' + common_c2s_pkt_num : 'S2C:' + common_s2c_pkt_num"); + CodeGeneratorContext context = new CodeGeneratorContext(); + expression.accept(new EvalCodeGenerator(context)); + String memberCode = context.reuseMemberCode(); + assertTrue(StringUtils.contains(memberCode, "C2S:")); + assertTrue(StringUtils.contains(memberCode, "S2C:")); + } + +} |
