summaryrefslogtreecommitdiff
path: root/groot-tests
diff options
context:
space:
mode:
authorwangkuan <[email protected]>2023-12-01 16:39:45 +0800
committerwangkuan <[email protected]>2023-12-01 16:39:45 +0800
commit7c455cec890f0bb65b16e93794658e4e4d0bea37 (patch)
tree6f275de628b5bb5b85198664e87430d3837a1401 /groot-tests
parenta62a6f5c5fb58ee3942e87975fc7a5258383c625 (diff)
[improve][core]GAL-443优化所有udf函数(定位库函数,路径合并函数待持续优化)
Diffstat (limited to 'groot-tests')
-rw-r--r--groot-tests/src/test/java/com/geedgenetworks/core/udf/expressions/EvalExpressionResolverTest.java81
-rw-r--r--groot-tests/src/test/java/com/geedgenetworks/core/udf/expressions/codegen/CalcCodeConvertorTest.java94
-rw-r--r--groot-tests/src/test/java/com/geedgenetworks/core/udf/expressions/codegen/EvalCodeGeneratorTest.java34
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:"));
+ }
+
+}