summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorluwenpeng <[email protected]>2023-03-30 17:44:33 +0800
committerluwenpeng <[email protected]>2023-04-07 15:59:52 +0800
commit0f45abedc8576ed603fba15ceb6afe8bc211258f (patch)
treed6f00f732a8d6ed3869f5ca4d9769cc9dedc522c /test
parent0e85d3c9c58c5edca4e3afc46286cfc6fcb3f876 (diff)
TSG-14351 tsg-service-chaining-engine通过Mock Mrzcpd进行单元测试
Diffstat (limited to 'test')
-rw-r--r--test/CMakeLists.txt84
-rw-r--r--test/gtest_ctrl_pkt_active.cpp40
-rw-r--r--test/gtest_ctrl_pkt_opening.cpp36
-rw-r--r--test/gtest_raw_pkt_stee_block.cpp57
-rw-r--r--test/gtest_raw_pkt_stee_bypass.cpp60
-rw-r--r--test/gtest_raw_pkt_stee_forward.cpp65
-rw-r--r--test/gtest_utils.h231
-rw-r--r--test/marsio.cpp453
-rw-r--r--test/marsio.h97
-rw-r--r--test/test_data/conf/sce.conf74
-rw-r--r--test/test_data/conf/zlog.conf12
-rw-r--r--test/test_data/log/test_ctr_pkt_active_ok.fs223
-rw-r--r--test/test_data/log/test_ctr_pkt_opening_ok.fs223
-rw-r--r--test/test_data/log/test_raw_pkt_stee_block_ok.fs223
-rw-r--r--test/test_data/log/test_raw_pkt_stee_bypass_ok.fs223
-rw-r--r--test/test_data/log/test_raw_pkt_stee_forward_ok.fs223
-rw-r--r--test/test_data/resource/raw_pkt_stee_block.json22
-rw-r--r--test/test_data/resource/raw_pkt_stee_bypass.json22
-rw-r--r--test/test_data/resource/raw_pkt_stee_forward.json22
-rw-r--r--test/test_data/resource/sce0.json22
-rw-r--r--test/test_data/resource/table_info.conf3
-rw-r--r--test/test_pcap/sce.pcapngbin0 -> 16164 bytes
-rw-r--r--test/test_pcap/sf.pcapngbin0 -> 9764 bytes
23 files changed, 1415 insertions, 0 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
new file mode 100644
index 0000000..bb7991b
--- /dev/null
+++ b/test/CMakeLists.txt
@@ -0,0 +1,84 @@
+###############################################################################
+# gmock_marsio
+###############################################################################
+
+add_library(gmock_marsio marsio.cpp)
+target_include_directories(gmock_marsio PUBLIC ${CMAKE_CURRENT_LIST_DIR})
+
+###############################################################################
+# temp_platform
+###############################################################################
+
+add_library(temp_platform
+ ${CMAKE_SOURCE_DIR}/platform/src/policy.cpp
+ ${CMAKE_SOURCE_DIR}/platform/src/health_check.cpp
+ ${CMAKE_SOURCE_DIR}/platform/src/sce.cpp
+ ${CMAKE_SOURCE_DIR}/platform/src/packet_io.cpp
+ ${CMAKE_SOURCE_DIR}/platform/src/global_metrics.cpp
+ ${CMAKE_SOURCE_DIR}/platform/src/sf_metrics.cpp
+ ${CMAKE_SOURCE_DIR}/platform/src/sf_status.cpp)
+target_include_directories(temp_platform PUBLIC ${CMAKE_SOURCE_DIR}/common/include)
+target_include_directories(temp_platform PUBLIC ${CMAKE_SOURCE_DIR}/platform/include)
+target_link_libraries(temp_platform PUBLIC common pthread cjson maatframe MESA_prof_load MESA_field_stat gmock_marsio)
+
+###############################################################################
+# gtest_ctrl_pkt_opening
+###############################################################################
+
+add_executable(gtest_ctrl_pkt_opening gtest_ctrl_pkt_opening.cpp)
+target_include_directories(gtest_ctrl_pkt_opening PUBLIC ${CMAKE_SOURCE_DIR}/common/include)
+target_include_directories(gtest_ctrl_pkt_opening PUBLIC ${CMAKE_SOURCE_DIR}/platform/include)
+target_link_libraries(gtest_ctrl_pkt_opening temp_platform gtest)
+
+###############################################################################
+# gtest_ctrl_pkt_active
+###############################################################################
+
+add_executable(gtest_ctrl_pkt_active gtest_ctrl_pkt_active.cpp)
+target_include_directories(gtest_ctrl_pkt_active PUBLIC ${CMAKE_SOURCE_DIR}/common/include)
+target_include_directories(gtest_ctrl_pkt_active PUBLIC ${CMAKE_SOURCE_DIR}/platform/include)
+target_link_libraries(gtest_ctrl_pkt_active temp_platform gtest)
+
+###############################################################################
+# gtest_raw_pkt_stee_bypass
+###############################################################################
+
+add_executable(gtest_raw_pkt_stee_bypass gtest_raw_pkt_stee_bypass.cpp)
+target_include_directories(gtest_raw_pkt_stee_bypass PUBLIC ${CMAKE_SOURCE_DIR}/common/include)
+target_include_directories(gtest_raw_pkt_stee_bypass PUBLIC ${CMAKE_SOURCE_DIR}/platform/include)
+target_link_libraries(gtest_raw_pkt_stee_bypass temp_platform gtest)
+
+###############################################################################
+# gtest_raw_pkt_stee_block
+###############################################################################
+
+add_executable(gtest_raw_pkt_stee_block gtest_raw_pkt_stee_block.cpp)
+target_include_directories(gtest_raw_pkt_stee_block PUBLIC ${CMAKE_SOURCE_DIR}/common/include)
+target_include_directories(gtest_raw_pkt_stee_block PUBLIC ${CMAKE_SOURCE_DIR}/platform/include)
+target_link_libraries(gtest_raw_pkt_stee_block temp_platform gtest)
+
+###############################################################################
+# gtest_raw_pkt_stee_forward
+###############################################################################
+
+add_executable(gtest_raw_pkt_stee_forward gtest_raw_pkt_stee_forward.cpp)
+target_include_directories(gtest_raw_pkt_stee_forward PUBLIC ${CMAKE_SOURCE_DIR}/common/include)
+target_include_directories(gtest_raw_pkt_stee_forward PUBLIC ${CMAKE_SOURCE_DIR}/platform/include)
+target_link_libraries(gtest_raw_pkt_stee_forward temp_platform gtest)
+
+###############################################################################
+# gtest_discover_tests
+###############################################################################
+
+include(GoogleTest)
+
+gtest_discover_tests(gtest_ctrl_pkt_opening)
+gtest_discover_tests(gtest_ctrl_pkt_active)
+
+gtest_discover_tests(gtest_raw_pkt_stee_bypass)
+gtest_discover_tests(gtest_raw_pkt_stee_block)
+gtest_discover_tests(gtest_raw_pkt_stee_forward)
+
+file(COPY ./test_data/log/ DESTINATION ./log/)
+file(COPY ./test_data/conf/ DESTINATION ./conf/)
+file(COPY ./test_data/resource/ DESTINATION ./resource/) \ No newline at end of file
diff --git a/test/gtest_ctrl_pkt_active.cpp b/test/gtest_ctrl_pkt_active.cpp
new file mode 100644
index 0000000..9a8aa97
--- /dev/null
+++ b/test/gtest_ctrl_pkt_active.cpp
@@ -0,0 +1,40 @@
+#include "gtest_utils.h"
+
+// 185 bytes
+static u_char ctrl_pkt_active[] = {
+ 0x48, 0x73, 0x97, 0x96, 0x38, 0x10, 0x0c, 0xa7, 0x5c, 0x64, 0x00, 0x01, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0xab, 0x76, 0x23, 0x40, 0x00, 0x7d, 0x06, 0x67, 0x66, 0xc0, 0xa8, 0x29, 0x40, 0x5d, 0xb8,
+ 0xd8, 0x22, 0xce, 0xec, 0x00, 0x50, 0xf8, 0x77, 0x0e, 0x1e, 0x47, 0x34, 0x32, 0xb9, 0x50, 0x18,
+ 0x04, 0x88, 0x7a, 0xe8, 0x00, 0x00, 0x7b, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x22,
+ 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2c, 0x22, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22,
+ 0x3a, 0x22, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22,
+ 0x2c, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x73, 0x65, 0x72, 0x76,
+ 0x69, 0x63, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x3a, 0x5b, 0x39,
+ 0x39, 0x35, 0x31, 0x39, 0x39, 0x5d, 0x7d, 0x2c, 0x22, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+ 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x22, 0x32, 0x39, 0x30, 0x34, 0x38, 0x34, 0x34, 0x39, 0x32, 0x37,
+ 0x30, 0x32, 0x35, 0x38, 0x31, 0x37, 0x33, 0x37, 0x22, 0x2c, 0x22, 0x74, 0x73, 0x79, 0x6e, 0x63,
+ 0x22, 0x3a, 0x22, 0x31, 0x2e, 0x30, 0x22, 0x7d, 0x00};
+
+TEST(PACKET_IO, CTRL_PKT_ACTIVE)
+{
+ marsio_buff_t *tx_mbuf = NULL;
+ marsio_buff_t *dup_mbuf = NULL;
+ struct gtest_frame *gtest_frame = NULL;
+
+ build_mbuf_for_ctrl_pkt(tx_mbuf, ctrl_pkt_active, sizeof(ctrl_pkt_active), 290484492702581737, 54);
+ dup_mbuf = marsio_mbuff_dup(tx_mbuf);
+
+ gtest_frame = gtest_frame_new("sce0.json", "ctr_pkt_active");
+ gtest_frame_run(gtest_frame, tx_mbuf, dup_mbuf, 1);
+
+ gtest_frame_log(gtest_frame);
+ marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &tx_mbuf, 1, 0, 0);
+ marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &dup_mbuf, 1, 0, 0);
+ gtest_frame_free(gtest_frame);
+}
+
+int main(int argc, char **argv)
+{
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+} \ No newline at end of file
diff --git a/test/gtest_ctrl_pkt_opening.cpp b/test/gtest_ctrl_pkt_opening.cpp
new file mode 100644
index 0000000..d8b1df8
--- /dev/null
+++ b/test/gtest_ctrl_pkt_opening.cpp
@@ -0,0 +1,36 @@
+#include "gtest_utils.h"
+
+// 122 bytes
+static u_char ctrl_pkt_opening[] = {
+ 0x48, 0x73, 0x97, 0x96, 0x38, 0x10, 0x0c, 0xa7, 0x5c, 0x64, 0x00, 0x01, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0x6c, 0xff, 0xde, 0x40, 0x00, 0x33, 0x06, 0x27, 0xea, 0xc0, 0xa8, 0x29, 0x40, 0x5d, 0xb8,
+ 0xd8, 0x22, 0xce, 0xec, 0x00, 0x50, 0xf8, 0x77, 0x0d, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x50, 0x18,
+ 0x03, 0xec, 0x08, 0xa7, 0x00, 0x00, 0x7b, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x22,
+ 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x22, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f,
+ 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x22, 0x32, 0x39, 0x30, 0x34, 0x38, 0x34, 0x34, 0x39, 0x32,
+ 0x37, 0x30, 0x32, 0x35, 0x38, 0x31, 0x37, 0x33, 0x37, 0x22, 0x2c, 0x22, 0x74, 0x73, 0x79, 0x6e,
+ 0x63, 0x22, 0x3a, 0x22, 0x31, 0x2e, 0x30, 0x22, 0x7d, 0x00};
+
+TEST(PACKET_IO, CTRL_PKT_OPENING)
+{
+ marsio_buff_t *tx_mbuf = NULL;
+ marsio_buff_t *dup_mbuf = NULL;
+ struct gtest_frame *gtest_frame = NULL;
+
+ build_mbuf_for_ctrl_pkt(tx_mbuf, ctrl_pkt_opening, sizeof(ctrl_pkt_opening), 290484492702581737, 54);
+ dup_mbuf = marsio_mbuff_dup(tx_mbuf);
+
+ gtest_frame = gtest_frame_new("sce0.json", "ctr_pkt_opening");
+ gtest_frame_run(gtest_frame, tx_mbuf, dup_mbuf, 1);
+
+ gtest_frame_log(gtest_frame);
+ marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &tx_mbuf, 1, 0, 0);
+ marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &dup_mbuf, 1, 0, 0);
+ gtest_frame_free(gtest_frame);
+}
+
+int main(int argc, char **argv)
+{
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+} \ No newline at end of file
diff --git a/test/gtest_raw_pkt_stee_block.cpp b/test/gtest_raw_pkt_stee_block.cpp
new file mode 100644
index 0000000..f444704
--- /dev/null
+++ b/test/gtest_raw_pkt_stee_block.cpp
@@ -0,0 +1,57 @@
+#include "gtest_utils.h"
+
+// 185 bytes
+static u_char ctrl_pkt_active[] = {
+ 0x48, 0x73, 0x97, 0x96, 0x38, 0x10, 0x0c, 0xa7, 0x5c, 0x64, 0x00, 0x01, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0xab, 0x76, 0x23, 0x40, 0x00, 0x7d, 0x06, 0x67, 0x66, 0xc0, 0xa8, 0x29, 0x40, 0x5d, 0xb8,
+ 0xd8, 0x22, 0xce, 0xec, 0x00, 0x50, 0xf8, 0x77, 0x0e, 0x1e, 0x47, 0x34, 0x32, 0xb9, 0x50, 0x18,
+ 0x04, 0x88, 0x7a, 0xe8, 0x00, 0x00, 0x7b, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x22,
+ 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2c, 0x22, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22,
+ 0x3a, 0x22, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22,
+ 0x2c, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x73, 0x65, 0x72, 0x76,
+ 0x69, 0x63, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x3a, 0x5b, 0x39,
+ 0x39, 0x35, 0x31, 0x39, 0x39, 0x5d, 0x7d, 0x2c, 0x22, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+ 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x22, 0x32, 0x39, 0x30, 0x34, 0x38, 0x34, 0x34, 0x39, 0x32, 0x37,
+ 0x30, 0x32, 0x35, 0x38, 0x31, 0x37, 0x33, 0x37, 0x22, 0x2c, 0x22, 0x74, 0x73, 0x79, 0x6e, 0x63,
+ 0x22, 0x3a, 0x22, 0x31, 0x2e, 0x30, 0x22, 0x7d, 0x00};
+
+// 145 bytes
+static u_char raw_pkt[] = {
+ 0x48, 0x73, 0x97, 0x96, 0x38, 0x10, 0x0c, 0xa7, 0x5c, 0x64, 0x00, 0x01, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0x83, 0x46, 0x1f, 0x40, 0x00, 0x40, 0x06, 0xd4, 0x92, 0xc0, 0xa8, 0x29, 0x40, 0x5d, 0xb8,
+ 0xd8, 0x22, 0xce, 0xec, 0x00, 0x50, 0xf8, 0x77, 0x0d, 0xcf, 0x47, 0x34, 0x32, 0xb9, 0x80, 0x18,
+ 0xfa, 0xf0, 0xad, 0xf4, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x45, 0xfc, 0x39, 0x3d, 0xc1, 0x1f,
+ 0x8d, 0x76, 0x47, 0x45, 0x54, 0x20, 0x2f, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31,
+ 0x0d, 0x0a, 0x48, 0x6f, 0x73, 0x74, 0x3a, 0x20, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x78, 0x61, 0x6d,
+ 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x0d, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x2d, 0x41, 0x67,
+ 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x63, 0x75, 0x72, 0x6c, 0x2f, 0x37, 0x2e, 0x36, 0x31, 0x2e, 0x31,
+ 0x0d, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x3a, 0x20, 0x2a, 0x2f, 0x2a, 0x0d, 0x0a, 0x0d,
+ 0x0a};
+
+TEST(PACKET_IO, RAW_PKT_STEE_BLOCK)
+{
+ marsio_buff_t *tx_mbuf1 = NULL;
+ marsio_buff_t *tx_mbuf2 = NULL;
+ marsio_buff_t *dup_mbuf1 = NULL;
+ struct gtest_frame *gtest_frame = NULL;
+
+ build_mbuf_for_ctrl_pkt(tx_mbuf1, ctrl_pkt_active, sizeof(ctrl_pkt_active), 290484492702581737, 54);
+ build_mbuf_for_raw_pkt(tx_mbuf2, raw_pkt, sizeof(raw_pkt), 290484492702581737, 0);
+ dup_mbuf1 = marsio_mbuff_dup(tx_mbuf1);
+
+ gtest_frame = gtest_frame_new("raw_pkt_stee_block.json", "raw_pkt_stee_block");
+ gtest_frame_run(gtest_frame, tx_mbuf1, dup_mbuf1, 1);
+ gtest_frame_run(gtest_frame, tx_mbuf2, NULL, 1);
+
+ gtest_frame_log(gtest_frame);
+ marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &tx_mbuf1, 1, 0, 0);
+ // marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &tx_mbuf2, 1, 0, 0); /* tx_mbuf2 free by stee_block */
+ marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &dup_mbuf1, 1, 0, 0);
+ gtest_frame_free(gtest_frame);
+}
+
+int main(int argc, char **argv)
+{
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+} \ No newline at end of file
diff --git a/test/gtest_raw_pkt_stee_bypass.cpp b/test/gtest_raw_pkt_stee_bypass.cpp
new file mode 100644
index 0000000..f0c2dc9
--- /dev/null
+++ b/test/gtest_raw_pkt_stee_bypass.cpp
@@ -0,0 +1,60 @@
+#include "gtest_utils.h"
+
+// 185 bytes
+static u_char ctrl_pkt_active[] = {
+ 0x48, 0x73, 0x97, 0x96, 0x38, 0x10, 0x0c, 0xa7, 0x5c, 0x64, 0x00, 0x01, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0xab, 0x76, 0x23, 0x40, 0x00, 0x7d, 0x06, 0x67, 0x66, 0xc0, 0xa8, 0x29, 0x40, 0x5d, 0xb8,
+ 0xd8, 0x22, 0xce, 0xec, 0x00, 0x50, 0xf8, 0x77, 0x0e, 0x1e, 0x47, 0x34, 0x32, 0xb9, 0x50, 0x18,
+ 0x04, 0x88, 0x7a, 0xe8, 0x00, 0x00, 0x7b, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x22,
+ 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2c, 0x22, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22,
+ 0x3a, 0x22, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22,
+ 0x2c, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x73, 0x65, 0x72, 0x76,
+ 0x69, 0x63, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x3a, 0x5b, 0x39,
+ 0x39, 0x35, 0x31, 0x39, 0x39, 0x5d, 0x7d, 0x2c, 0x22, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+ 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x22, 0x32, 0x39, 0x30, 0x34, 0x38, 0x34, 0x34, 0x39, 0x32, 0x37,
+ 0x30, 0x32, 0x35, 0x38, 0x31, 0x37, 0x33, 0x37, 0x22, 0x2c, 0x22, 0x74, 0x73, 0x79, 0x6e, 0x63,
+ 0x22, 0x3a, 0x22, 0x31, 0x2e, 0x30, 0x22, 0x7d, 0x00};
+
+// 145 bytes
+static u_char raw_pkt[] = {
+ 0x48, 0x73, 0x97, 0x96, 0x38, 0x10, 0x0c, 0xa7, 0x5c, 0x64, 0x00, 0x01, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0x83, 0x46, 0x1f, 0x40, 0x00, 0x40, 0x06, 0xd4, 0x92, 0xc0, 0xa8, 0x29, 0x40, 0x5d, 0xb8,
+ 0xd8, 0x22, 0xce, 0xec, 0x00, 0x50, 0xf8, 0x77, 0x0d, 0xcf, 0x47, 0x34, 0x32, 0xb9, 0x80, 0x18,
+ 0xfa, 0xf0, 0xad, 0xf4, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x45, 0xfc, 0x39, 0x3d, 0xc1, 0x1f,
+ 0x8d, 0x76, 0x47, 0x45, 0x54, 0x20, 0x2f, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31,
+ 0x0d, 0x0a, 0x48, 0x6f, 0x73, 0x74, 0x3a, 0x20, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x78, 0x61, 0x6d,
+ 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x0d, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x2d, 0x41, 0x67,
+ 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x63, 0x75, 0x72, 0x6c, 0x2f, 0x37, 0x2e, 0x36, 0x31, 0x2e, 0x31,
+ 0x0d, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x3a, 0x20, 0x2a, 0x2f, 0x2a, 0x0d, 0x0a, 0x0d,
+ 0x0a};
+
+TEST(PACKET_IO, RAW_PKT_STEE_BYPASS)
+{
+ marsio_buff_t *tx_mbuf1 = NULL;
+ marsio_buff_t *tx_mbuf2 = NULL;
+ marsio_buff_t *dup_mbuf1 = NULL;
+ marsio_buff_t *dup_mbuf2 = NULL;
+ struct gtest_frame *gtest_frame = NULL;
+
+ build_mbuf_for_ctrl_pkt(tx_mbuf1, ctrl_pkt_active, sizeof(ctrl_pkt_active), 290484492702581737, 54);
+ build_mbuf_for_raw_pkt(tx_mbuf2, raw_pkt, sizeof(raw_pkt), 290484492702581737, 0);
+ dup_mbuf1 = marsio_mbuff_dup(tx_mbuf1);
+ dup_mbuf2 = marsio_mbuff_dup(tx_mbuf2);
+
+ gtest_frame = gtest_frame_new("raw_pkt_stee_bypass.json", "raw_pkt_stee_bypass");
+ gtest_frame_run(gtest_frame, tx_mbuf1, dup_mbuf1, 1);
+ gtest_frame_run(gtest_frame, tx_mbuf2, dup_mbuf2, 1);
+
+ gtest_frame_log(gtest_frame);
+ marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &tx_mbuf1, 1, 0, 0);
+ marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &tx_mbuf2, 1, 0, 0);
+ marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &dup_mbuf1, 1, 0, 0);
+ marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &dup_mbuf2, 1, 0, 0);
+ gtest_frame_free(gtest_frame);
+}
+
+int main(int argc, char **argv)
+{
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+} \ No newline at end of file
diff --git a/test/gtest_raw_pkt_stee_forward.cpp b/test/gtest_raw_pkt_stee_forward.cpp
new file mode 100644
index 0000000..a7b151b
--- /dev/null
+++ b/test/gtest_raw_pkt_stee_forward.cpp
@@ -0,0 +1,65 @@
+#include "gtest_utils.h"
+
+// 185 bytes
+static u_char ctrl_pkt_active[] = {
+ 0x48, 0x73, 0x97, 0x96, 0x38, 0x10, 0x0c, 0xa7, 0x5c, 0x64, 0x00, 0x01, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0xab, 0x76, 0x23, 0x40, 0x00, 0x7d, 0x06, 0x67, 0x66, 0xc0, 0xa8, 0x29, 0x40, 0x5d, 0xb8,
+ 0xd8, 0x22, 0xce, 0xec, 0x00, 0x50, 0xf8, 0x77, 0x0e, 0x1e, 0x47, 0x34, 0x32, 0xb9, 0x50, 0x18,
+ 0x04, 0x88, 0x7a, 0xe8, 0x00, 0x00, 0x7b, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x22,
+ 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x2c, 0x22, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22,
+ 0x3a, 0x22, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22,
+ 0x2c, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x7b, 0x22, 0x73, 0x65, 0x72, 0x76,
+ 0x69, 0x63, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x3a, 0x5b, 0x39,
+ 0x39, 0x35, 0x31, 0x39, 0x39, 0x5d, 0x7d, 0x2c, 0x22, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+ 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x22, 0x32, 0x39, 0x30, 0x34, 0x38, 0x34, 0x34, 0x39, 0x32, 0x37,
+ 0x30, 0x32, 0x35, 0x38, 0x31, 0x37, 0x33, 0x37, 0x22, 0x2c, 0x22, 0x74, 0x73, 0x79, 0x6e, 0x63,
+ 0x22, 0x3a, 0x22, 0x31, 0x2e, 0x30, 0x22, 0x7d, 0x00};
+
+// 145 bytes
+static u_char raw_pkt[] = {
+ 0x48, 0x73, 0x97, 0x96, 0x38, 0x10, 0x0c, 0xa7, 0x5c, 0x64, 0x00, 0x01, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0x83, 0x46, 0x1f, 0x40, 0x00, 0x40, 0x06, 0xd4, 0x92, 0xc0, 0xa8, 0x29, 0x40, 0x5d, 0xb8,
+ 0xd8, 0x22, 0xce, 0xec, 0x00, 0x50, 0xf8, 0x77, 0x0d, 0xcf, 0x47, 0x34, 0x32, 0xb9, 0x80, 0x18,
+ 0xfa, 0xf0, 0xad, 0xf4, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x45, 0xfc, 0x39, 0x3d, 0xc1, 0x1f,
+ 0x8d, 0x76, 0x47, 0x45, 0x54, 0x20, 0x2f, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31,
+ 0x0d, 0x0a, 0x48, 0x6f, 0x73, 0x74, 0x3a, 0x20, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x78, 0x61, 0x6d,
+ 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x0d, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x2d, 0x41, 0x67,
+ 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x63, 0x75, 0x72, 0x6c, 0x2f, 0x37, 0x2e, 0x36, 0x31, 0x2e, 0x31,
+ 0x0d, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x3a, 0x20, 0x2a, 0x2f, 0x2a, 0x0d, 0x0a, 0x0d,
+ 0x0a};
+
+TEST(PACKET_IO, RAW_PKT_STEE_FORWARD)
+{
+ marsio_buff_t *tx_mbuf1 = NULL;
+ marsio_buff_t *tx_mbuf2 = NULL;
+ marsio_buff_t *dup_mbuf1 = NULL;
+ marsio_buff_t *dup_mbuf2 = NULL;
+ struct gtest_frame *gtest_frame = NULL;
+ struct mr_instance *mr_instance = NULL;
+
+ build_mbuf_for_ctrl_pkt(tx_mbuf1, ctrl_pkt_active, sizeof(ctrl_pkt_active), 290484492702581737, 54);
+ build_mbuf_for_raw_pkt(tx_mbuf2, raw_pkt, sizeof(raw_pkt), 290484492702581737, 0);
+ dup_mbuf1 = marsio_mbuff_dup(tx_mbuf1);
+ dup_mbuf2 = marsio_mbuff_dup(tx_mbuf2);
+
+ gtest_frame = gtest_frame_new("raw_pkt_stee_forward.json", "raw_pkt_stee_forward");
+ mr_instance = packet_io_get_mr_instance(gtest_frame->sce_ctx->io);
+ gtest_frame_run(gtest_frame, tx_mbuf1, dup_mbuf1, 1);
+ marsio_set_recv_mbuff(mr_instance, tx_mbuf2);
+ marsio_set_send_mbuff(mr_instance, NULL);
+ EXPECT_TRUE(packet_io_thread_polling_nf(gtest_frame->sce_ctx->io, &gtest_frame->sce_ctx->work_threads[0]) == 1);
+ EXPECT_TRUE(mbuff_cmp_payload(dup_mbuf2, marsio_get_send_mbuff(mr_instance)) == 0);
+
+ gtest_frame_log(gtest_frame);
+ marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &tx_mbuf1, 1, 0, 0);
+ marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &tx_mbuf2, 1, 0, 0);
+ marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &dup_mbuf1, 1, 0, 0);
+ marsio_buff_free(packet_io_get_mr_instance(gtest_frame->sce_ctx->io), &dup_mbuf2, 1, 0, 0);
+ gtest_frame_free(gtest_frame);
+}
+
+int main(int argc, char **argv)
+{
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+} \ No newline at end of file
diff --git a/test/gtest_utils.h b/test/gtest_utils.h
new file mode 100644
index 0000000..6b6f148
--- /dev/null
+++ b/test/gtest_utils.h
@@ -0,0 +1,231 @@
+#ifndef _GTEST_UTILS_H
+#define _GTEST_UTILS_H
+
+#ifdef __cpluscplus
+extern "C"
+{
+#endif
+
+#include <sys/stat.h>
+#include <gtest/gtest.h>
+
+#include "sce.h"
+#include "log.h"
+#include "marsio.h"
+#include "g_vxlan.h"
+#include "packet_io.h"
+#include "sf_metrics.h"
+#include "health_check.h"
+#include "global_metrics.h"
+
+#define set_metadata(meta, id, offset, is_ctrl, is_decrypt) \
+ { \
+ memset(&meta, 0, sizeof(meta)); \
+ meta.write_ref = 0; \
+ meta.session_id = id; \
+ meta.raw_data = NULL; \
+ meta.raw_len = 0; \
+ meta.l7offset = offset; \
+ meta.is_e2i_dir = 0; \
+ meta.is_ctrl_pkt = is_ctrl; \
+ meta.is_decrypted = is_decrypt; \
+ memset(&meta.sids.elems, 1, sizeof(meta.sids.elems)); \
+ meta.sids.num = 8; \
+ memset(&meta.route_ctx.data, 1, 64); \
+ meta.route_ctx.len = 64; \
+ }
+
+#define build_mbuf_for_inject_pkt(mbuf, data, len) \
+ { \
+ marsio_buff_malloc_global(NULL, &mbuf, 1, 0, 0); \
+ char *ptr = marsio_buff_append(mbuf, len); \
+ EXPECT_TRUE(ptr != nullptr); \
+ memcpy(ptr, data, len); \
+ }
+
+#define build_mbuf_for_raw_pkt(mbuf, data, len, id, is_decrypt) \
+ { \
+ struct metadata meta; \
+ set_metadata(meta, id, 0, 0, is_decrypt); \
+ marsio_buff_malloc_global(NULL, &mbuf, 1, 0, 0); \
+ EXPECT_TRUE(mbuff_set_metadata(mbuf, &meta) == 0); \
+ char *ptr = marsio_buff_append(mbuf, len); \
+ EXPECT_TRUE(ptr != nullptr); \
+ memcpy(ptr, data, len); \
+ }
+
+#define build_mbuf_for_ctrl_pkt(mbuf, data, len, id, offset) \
+ { \
+ struct metadata meta; \
+ set_metadata(meta, id, offset, 1, 0); \
+ marsio_buff_malloc_global(NULL, &mbuf, 1, 0, 0); \
+ EXPECT_TRUE(mbuff_set_metadata(mbuf, &meta) == 0); \
+ char *ptr = marsio_buff_append(mbuf, len); \
+ EXPECT_TRUE(ptr != nullptr); \
+ memcpy(ptr, data, len); \
+ }
+
+struct gtest_frame
+{
+ struct sce_ctx *sce_ctx;
+ char *json_file;
+ char *desc;
+};
+
+inline struct gtest_frame *gtest_frame_new(const char *json_file, const char *desc)
+{
+ char cmdline[1024] = {0};
+ const char *profile = "./conf/sce.conf";
+ struct sce_ctx *sce_ctx = NULL;
+ struct thread_ctx *thread_ctx = NULL;
+ struct gtest_frame *instance = (struct gtest_frame *)calloc(1, sizeof(struct gtest_frame));
+
+ system("rm -rf `ls log/* | egrep -v '(*_ok.fs2)'`");
+
+ memset(&cmdline, 0, sizeof(cmdline));
+ snprintf(cmdline, sizeof(cmdline), "sed -i \"s/json_cfg_file=.*/json_cfg_file=resource\\/%s/\" ./conf/sce.conf", json_file);
+ system(cmdline);
+
+ EXPECT_TRUE(LOG_INIT("./conf/zlog.conf") == 0);
+ health_check_session_init(profile);
+ sce_ctx = sce_ctx_create(profile);
+ EXPECT_TRUE(sce_ctx != nullptr);
+
+ thread_ctx = &sce_ctx->work_threads[0];
+ thread_ctx->tid = 0;
+ thread_ctx->thread_index = 0;
+ thread_ctx->session_table = session_table_create();
+ thread_ctx->sf_metrics = sf_metrics_create(profile);
+ thread_ctx->ref_io = sce_ctx->io;
+ thread_ctx->ref_metrics = sce_ctx->metrics;
+ thread_ctx->ref_enforcer = sce_ctx->enforcer;
+ thread_ctx->ref_sce_ctx = sce_ctx;
+ thread_ctx->session_table_need_reset = 0;
+
+ EXPECT_TRUE(packet_io_thread_init(sce_ctx->io, thread_ctx) == 0);
+
+ instance->sce_ctx = sce_ctx;
+ instance->json_file = strdup(json_file);
+ instance->desc = strdup(desc);
+
+ return instance;
+}
+
+inline void gtest_frame_free(struct gtest_frame *instance)
+{
+ if (instance)
+ {
+ struct sce_ctx *sce_ctx = instance->sce_ctx;
+ struct thread_ctx *thread_ctx = &sce_ctx->work_threads[0];
+
+ session_table_destory(thread_ctx->session_table);
+ sf_metrics_destory(thread_ctx->sf_metrics);
+
+ sce_ctx_destory(sce_ctx);
+ LOG_CLOSE();
+
+ if (instance->json_file)
+ {
+ free(instance->json_file);
+ instance->json_file = NULL;
+ }
+
+ if (instance->desc)
+ {
+ free(instance->desc);
+ instance->desc = NULL;
+ }
+
+ free(instance);
+ instance = NULL;
+ }
+}
+
+inline void gtest_frame_run(struct gtest_frame *instance, marsio_buff_t *tx_mbuf, marsio_buff_t *expect_rx_mbuf, int is_poll_nf)
+{
+ marsio_buff_t *rx_mbuf;
+ struct sce_ctx *sce_ctx = instance->sce_ctx;
+ struct thread_ctx *thread_ctx = &sce_ctx->work_threads[0];
+ struct mr_instance *mr_instance = packet_io_get_mr_instance(sce_ctx->io);
+
+ marsio_set_recv_mbuff(mr_instance, tx_mbuf);
+ marsio_set_send_mbuff(mr_instance, NULL);
+
+ if (is_poll_nf)
+ {
+ EXPECT_TRUE(packet_io_thread_polling_nf(sce_ctx->io, thread_ctx) == 1);
+ }
+ else
+ {
+ EXPECT_TRUE(packet_io_thread_polling_endpoint(sce_ctx->io, thread_ctx) == 1);
+ }
+
+ rx_mbuf = marsio_get_send_mbuff(mr_instance);
+ EXPECT_TRUE(marsio_mbuff_cmp(rx_mbuf, expect_rx_mbuf) == 0);
+}
+
+inline void gtest_frame_log(struct gtest_frame *instance)
+{
+ struct stat temp_stat;
+ char diffile[1024] = {0};
+ char cmdline[1024] = {0};
+ struct sce_ctx *sce_ctx = instance->sce_ctx;
+
+ for (int i = 0; i < 10; i++)
+ {
+ global_metrics_dump(sce_ctx->metrics);
+ usleep(1);
+ }
+ memset(&cmdline, 0, sizeof(cmdline));
+ snprintf(cmdline, sizeof(cmdline), "cp log/sce.fs2 log/test_%s.fs2", instance->desc);
+ system(cmdline);
+
+ memset(&cmdline, 0, sizeof(cmdline));
+ snprintf(cmdline, sizeof(cmdline), "diff -I '===' log/test_%s.fs2 log/test_%s_ok.fs2 > log/test_%s.diff", instance->desc, instance->desc, instance->desc);
+ int ret = system(cmdline);
+ printf("exec %s, return: %d\n", cmdline, ret);
+
+ memset(&diffile, 0, sizeof(diffile));
+ snprintf(diffile, sizeof(diffile), "log/test_%s.diff", instance->desc);
+ stat(diffile, &temp_stat);
+ EXPECT_TRUE(temp_stat.st_size == 0);
+
+ memset(&cmdline, 0, sizeof(cmdline));
+ snprintf(cmdline, sizeof(cmdline), "cp log/sce.log* log/test_%s.log", instance->desc);
+ system(cmdline);
+}
+
+inline int mbuff_cmp_payload(marsio_buff_t *raw_pkt, marsio_buff_t *vxlan_pkt)
+{
+ struct g_vxlan *g_vxlan_hdr = NULL;
+ int raw_pkt_len = marsio_buff_datalen(raw_pkt);
+ char *raw_pkt_data = marsio_buff_mtod(raw_pkt);
+
+ int vxlan_pkt_len = marsio_buff_datalen(vxlan_pkt);
+ char *vxlan_pkt_data = marsio_buff_mtod(vxlan_pkt);
+
+ if (raw_pkt_len + 50 != vxlan_pkt_len)
+ {
+ goto error_out;
+ }
+
+ if (g_vxlan_decode(&g_vxlan_hdr, vxlan_pkt_data, vxlan_pkt_len) != 0)
+ {
+ goto error_out;
+ }
+
+ if (memcmp(raw_pkt_data, vxlan_pkt_data + 50, raw_pkt_len) != 0)
+ {
+ goto error_out;
+ }
+ return 0;
+
+error_out:
+ return 1;
+}
+
+#ifdef __cpluscplus
+}
+#endif
+
+#endif
diff --git a/test/marsio.cpp b/test/marsio.cpp
new file mode 100644
index 0000000..b3e28ba
--- /dev/null
+++ b/test/marsio.cpp
@@ -0,0 +1,453 @@
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+#include "marsio.h"
+
+struct mr_instance
+{
+ marsio_buff_t *current_recv_mbuff_ptr;
+ marsio_buff_t *current_send_mbuff_ptr;
+};
+
+struct mr_vdev
+{
+ struct mr_instance *mr_instance;
+};
+
+struct mr_sendpath
+{
+ struct mr_instance *mr_instance;
+};
+
+struct mrb_metadata_route_ctx
+{
+ uint8_t dir;
+ uint8_t link_id;
+ uint16_t port_ingress;
+ uint16_t port_egress;
+ uint16_t link_db_index;
+ uint32_t hash_usr;
+};
+
+struct mrb_metadata
+{
+ uint8_t dir : 1;
+ uint8_t packet_create_from_nf : 1;
+ uint8_t link_id : 6;
+
+ uint8_t is_ctrlbuf : 1;
+ uint8_t un_used : 7;
+
+ uint16_t payload_offset;
+
+ uint64_t session_id;
+
+ uint8_t start_sid;
+ uint8_t nr_sid;
+ uint16_t cur_sid;
+ uint16_t sids[8];
+
+ uint16_t port_ingress;
+ uint16_t port_egress;
+
+ uint16_t link_db_index;
+};
+
+struct mock_marsio_buff_t
+{
+ struct mrb_metadata metadata;
+
+ char *raw_data;
+ int raw_len;
+
+ int buff_size;
+ char *buff_start;
+} __attribute__((__packed__));
+
+struct mr_instance *marsio_create()
+{
+ struct mr_instance *instance = (struct mr_instance *)calloc(1, sizeof(struct mr_instance));
+ instance->current_recv_mbuff_ptr = NULL;
+ instance->current_send_mbuff_ptr = NULL;
+
+ return instance;
+}
+
+int marsio_destory(struct mr_instance *instance)
+{
+ if (instance)
+ {
+ free(instance);
+ instance = NULL;
+ }
+
+ return 0;
+}
+
+struct mr_vdev *marsio_open_device(struct mr_instance *instance, const char *devsym, unsigned int nr_rxstream, unsigned int nr_txstream)
+{
+ struct mr_vdev *vdev = (struct mr_vdev *)calloc(1, sizeof(struct mr_vdev));
+ vdev->mr_instance = instance;
+
+ return vdev;
+}
+
+void marsio_close_device(struct mr_vdev *vdev)
+{
+ if (vdev)
+ {
+ free(vdev);
+ vdev = NULL;
+ }
+}
+
+void marsio_get_device_ether_addr(struct mr_vdev *vdev, void *str_ether_addr, uint8_t size)
+{
+}
+
+struct mr_sendpath *marsio_sendpath_create_by_vdev(struct mr_vdev *dest_device)
+{
+ struct mr_sendpath *sendpath = (struct mr_sendpath *)calloc(1, sizeof(struct mr_sendpath));
+ sendpath->mr_instance = dest_device->mr_instance;
+
+ return sendpath;
+}
+
+void marsio_sendpath_destory(struct mr_sendpath *sendpath)
+{
+ if (sendpath)
+ {
+ free(sendpath);
+ sendpath = NULL;
+ }
+}
+
+int marsio_init(struct mr_instance *instance, const char *appsym)
+{
+ return 0;
+}
+
+int marsio_option_set(struct mr_instance *instance, marsio_opt_type_t opt_type, void *opt, size_t sz_opt)
+{
+ return 0;
+}
+
+int marsio_thread_init(struct mr_instance *instance)
+{
+ return 0;
+}
+
+int marsio_poll_wait(struct mr_instance *instance, struct mr_vdev *vdevs[], unsigned int nr_vdevs, unsigned int tid, int timeout)
+{
+ return 0;
+}
+
+int marsio_buff_set_metadata(marsio_buff_t *m, enum mr_buff_metadata_type type, void *data, unsigned int sz_data)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+ struct mrb_metadata *mrb_metadata = &mbuf->metadata;
+ struct mrb_metadata_route_ctx *route_ctx = NULL;
+
+ switch (type)
+ {
+ case MR_BUFF_ROUTE_CTX:
+ route_ctx = (struct mrb_metadata_route_ctx *)data;
+ assert(route_ctx != NULL);
+
+ mrb_metadata->packet_create_from_nf = 1;
+ mrb_metadata->dir = route_ctx->dir;
+ mrb_metadata->port_ingress = route_ctx->port_ingress;
+ mrb_metadata->port_egress = route_ctx->port_egress;
+ mrb_metadata->link_db_index = route_ctx->link_db_index;
+ mrb_metadata->link_id = route_ctx->link_id;
+ return 0;
+ case MR_BUFF_SESSION_ID:
+ mrb_metadata->session_id = *(uint64_t *)data;
+ return 0;
+ case MR_BUFF_PAYLOAD_OFFSET:
+ mrb_metadata->payload_offset = *(uint16_t *)data;
+ return 0;
+ default:
+ return -1;
+ }
+
+ return 0;
+}
+
+int marsio_buff_get_metadata(marsio_buff_t *m, enum mr_buff_metadata_type type, void *data, unsigned int sz_data)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+ struct mrb_metadata *mrb_metadata = &mbuf->metadata;
+ struct mrb_metadata_route_ctx *route_ctx = NULL;
+
+ switch (type)
+ {
+ case MR_BUFF_ROUTE_CTX:
+ if (sz_data < sizeof(struct mrb_metadata_route_ctx))
+ {
+ return -1;
+ }
+
+ route_ctx = (struct mrb_metadata_route_ctx *)data;
+ if (route_ctx != NULL)
+ {
+ route_ctx->dir = mrb_metadata->dir;
+ route_ctx->port_ingress = mrb_metadata->port_ingress;
+ route_ctx->port_egress = mrb_metadata->port_egress;
+ route_ctx->link_db_index = mrb_metadata->link_db_index;
+ route_ctx->link_id = mrb_metadata->link_id;
+ route_ctx->hash_usr = 0;
+ }
+ return sizeof(struct mrb_metadata_route_ctx);
+ case MR_BUFF_DIR:
+ if (sz_data < sizeof(unsigned int))
+ {
+ return -1;
+ }
+ *(unsigned int *)(data) = (unsigned int)mrb_metadata->dir;
+ return sizeof(unsigned int);
+ case MR_BUFF_SESSION_ID:
+ if (sz_data < sizeof(uint64_t))
+ {
+ return -1;
+ }
+ *(uint64_t *)(data) = (uint64_t)mrb_metadata->session_id;
+ return sizeof(uint64_t);
+ case MR_BUFF_PAYLOAD_OFFSET:
+ if (sz_data < sizeof(uint16_t))
+ {
+ return -1;
+ }
+ *(uint16_t *)(data) = (uint16_t)mrb_metadata->payload_offset;
+ return sizeof(uint16_t);
+ default:
+ return -1;
+ }
+
+ return 0;
+}
+
+int marsio_buff_set_sid_list(marsio_buff_t *m, sid_t *slist, uint8_t sz_slist)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+ struct mrb_metadata *mrb_metadata = &mbuf->metadata;
+
+ if (sz_slist > sizeof(mrb_metadata->sids) / sizeof(mrb_metadata->sids[0]))
+ {
+ return -1;
+ }
+
+ for (uint8_t i = 0; i < sz_slist; i++)
+ {
+ mrb_metadata->sids[i] = slist[i];
+ }
+
+ mrb_metadata->start_sid = 0;
+ mrb_metadata->nr_sid = sz_slist;
+ return 0;
+}
+
+int marsio_buff_get_sid_list(marsio_buff_t *m, sid_t *out_slist, uint8_t sz_out_slist)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+ struct mrb_metadata *mrb_metadata = &mbuf->metadata;
+
+ uint8_t out_i = 0;
+ for (uint8_t i = mrb_metadata->start_sid; i < mrb_metadata->start_sid + mrb_metadata->nr_sid && out_i < sz_out_slist; i++, out_i++)
+ {
+ out_slist[out_i] = mrb_metadata->sids[i];
+ }
+
+ return out_i;
+}
+
+int marsio_buff_malloc_global(struct mr_instance *instance, marsio_buff_t *marsio_buff[], unsigned int nr_mbufs, int socket_id, int thread_id)
+{
+ for (unsigned int i = 0; i < nr_mbufs; i++)
+ {
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)calloc(1, sizeof(struct mock_marsio_buff_t) + 4096);
+
+ mbuf->buff_size = 4096;
+ mbuf->buff_start = (char *)mbuf + sizeof(struct mock_marsio_buff_t);
+ mbuf->raw_data = mbuf->buff_start + 50;
+
+ marsio_buff[i] = mbuf;
+ }
+ return nr_mbufs;
+}
+
+void marsio_buff_free(struct mr_instance *instance, marsio_buff_t *marsio_buff[], unsigned int nr_mbufs, int socket_id, int thread_id)
+{
+ for (unsigned int i = 0; i < nr_mbufs; i++)
+ {
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)marsio_buff[i];
+ if (mbuf == instance->current_recv_mbuff_ptr)
+ {
+ instance->current_recv_mbuff_ptr = NULL;
+ }
+ if (mbuf == instance->current_send_mbuff_ptr)
+ {
+ instance->current_send_mbuff_ptr = NULL;
+ }
+ if (mbuf)
+ {
+ memset(mbuf, 0, sizeof(struct mock_marsio_buff_t));
+
+ free(mbuf);
+ mbuf = NULL;
+ }
+ }
+}
+
+char *marsio_buff_mtod(marsio_buff_t *m)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+
+ return mbuf->raw_data;
+}
+
+uint32_t marsio_buff_datalen(marsio_buff_t *m)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+
+ return mbuf->raw_len;
+}
+
+char *marsio_buff_adj(marsio_buff_t *m, uint16_t len)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+
+ mbuf->raw_data += len;
+ return mbuf->raw_data;
+}
+
+char *marsio_buff_append(marsio_buff_t *m, uint16_t len)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+
+ mbuf->raw_len += len;
+ return mbuf->raw_data;
+}
+
+char *marsio_buff_prepend(marsio_buff_t *m, uint16_t len)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+
+ mbuf->raw_len += len;
+ mbuf->raw_data -= len;
+ return mbuf->raw_data;
+}
+
+void marsio_buff_ctrlzone_reset(marsio_buff_t *m)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+ struct mrb_metadata *mrb_metadata = &mbuf->metadata;
+
+ memset(mrb_metadata, 0, sizeof(struct mrb_metadata));
+}
+
+int marsio_buff_is_ctrlbuf(marsio_buff_t *m)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+ struct mrb_metadata *mrb_metadata = &mbuf->metadata;
+
+ return mrb_metadata->is_ctrlbuf;
+}
+
+void marsio_buff_set_ctrlbuf(marsio_buff_t *m)
+{
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)m;
+ struct mrb_metadata *mrb_metadata = &mbuf->metadata;
+
+ mrb_metadata->is_ctrlbuf = 1;
+}
+
+int marsio_recv_burst(struct mr_vdev *vdev, queue_id_t qid, marsio_buff_t *mbufs[], int nr_mbufs)
+{
+ mbufs[0] = vdev->mr_instance->current_recv_mbuff_ptr;
+
+ return 1;
+}
+
+int marsio_send_burst(struct mr_sendpath *sendpath, queue_id_t qid, marsio_buff_t *mbufs[], int nr_mbufs)
+{
+ assert(nr_mbufs == 1);
+ sendpath->mr_instance->current_send_mbuff_ptr = mbufs[0];
+
+ return marsio_buff_datalen(mbufs[0]);
+}
+
+// new add, only for gtest
+void marsio_set_recv_mbuff(struct mr_instance *instance, marsio_buff_t *mbuff)
+{
+ instance->current_recv_mbuff_ptr = mbuff;
+}
+
+void marsio_set_send_mbuff(struct mr_instance *instance, marsio_buff_t *mbuff)
+{
+ instance->current_send_mbuff_ptr = mbuff;
+}
+
+marsio_buff_t *marsio_get_recv_mbuff(struct mr_instance *instance)
+{
+ return instance->current_recv_mbuff_ptr;
+}
+
+marsio_buff_t *marsio_get_send_mbuff(struct mr_instance *instance)
+{
+ return instance->current_send_mbuff_ptr;
+}
+
+int marsio_mbuff_cmp(marsio_buff_t *mbuff1, marsio_buff_t *mbuff2)
+{
+ struct mock_marsio_buff_t *mbuf1 = (struct mock_marsio_buff_t *)mbuff1;
+ struct mock_marsio_buff_t *mbuf2 = (struct mock_marsio_buff_t *)mbuff2;
+
+ if (mbuf1 == mbuf2)
+ {
+ return 0;
+ }
+
+ if (mbuf1 && mbuf2)
+ {
+ if (memcmp(&mbuf1->metadata, &mbuf2->metadata, sizeof(struct mrb_metadata)) != 0)
+ {
+ return 1;
+ }
+
+ if (mbuf1->raw_len != mbuf2->raw_len)
+ {
+ return 1;
+ }
+ if (memcmp(mbuf1->raw_data, mbuf2->raw_data, mbuf2->raw_len) != 0)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+ else
+ {
+ return 1;
+ }
+}
+
+marsio_buff_t *marsio_mbuff_dup(marsio_buff_t *m)
+{
+ struct mock_marsio_buff_t *orig = (struct mock_marsio_buff_t *)m;
+ struct mock_marsio_buff_t *mbuf = (struct mock_marsio_buff_t *)calloc(1, sizeof(struct mock_marsio_buff_t) + 4096);
+
+ mbuf->buff_size = 4096;
+ mbuf->buff_start = (char *)mbuf + sizeof(struct mock_marsio_buff_t);
+ mbuf->raw_data = mbuf->buff_start + 50;
+
+ memcpy(&mbuf->metadata, &orig->metadata, sizeof(struct mrb_metadata));
+ memcpy(mbuf->raw_data, orig->raw_data, orig->raw_len);
+ mbuf->raw_len = orig->raw_len;
+
+ return mbuf;
+} \ No newline at end of file
diff --git a/test/marsio.h b/test/marsio.h
new file mode 100644
index 0000000..3ea0dc2
--- /dev/null
+++ b/test/marsio.h
@@ -0,0 +1,97 @@
+#ifndef _MARSIO_H
+#define _MARSIO_H
+
+#ifdef __cpluscplus
+extern "C"
+{
+#endif
+
+#include <stdint.h>
+
+#ifndef MARSIO_SOCKET_ID_ANY
+#define MARSIO_SOCKET_ID_ANY -1
+#endif
+
+#ifndef MARSIO_LCORE_ID_ANY
+#define MARSIO_LCORE_ID_ANY -1
+#endif
+
+#define MR_SID_LIST_MAXLEN 8
+
+typedef uint16_t sid_t;
+typedef uint32_t queue_id_t;
+typedef void marsio_buff_t;
+
+typedef enum
+{
+ MARSIO_OPT_THREAD_NUM,
+ MARSIO_OPT_THREAD_MASK,
+ MARSIO_OPT_THREAD_AFFINITY_MODE,
+ MARSIO_OPT_EXIT_WHEN_ERR,
+ MARSIO_OPT_THREAD_MASK_IN_CPUSET,
+} marsio_opt_type_t;
+
+enum mr_buff_metadata_type
+{
+ MR_BUFF_REHASH_INDEX = 0,
+ MR_BUFF_METADATA_VLAN_TCI = 1,
+ MR_BUFF_ROUTE_CTX = 2,
+ MR_BUFF_SESSION_ID = 3,
+ MR_BUFF_DIR = 4,
+ MR_BUFF_PAYLOAD_OFFSET = 5
+};
+
+struct mr_instance *marsio_create();
+int marsio_destory(struct mr_instance *instance);
+
+struct mr_vdev *marsio_open_device(struct mr_instance *instance, const char *devsym, unsigned int nr_rxstream, unsigned int nr_txstream);
+void marsio_close_device(struct mr_vdev *vdev);
+
+void marsio_get_device_ether_addr(struct mr_vdev *vdev, void *str_ether_addr, uint8_t size);
+
+struct mr_sendpath *marsio_sendpath_create_by_vdev(struct mr_vdev *dest_device);
+void marsio_sendpath_destory(struct mr_sendpath *sendpath);
+
+int marsio_init(struct mr_instance *instance, const char *appsym);
+int marsio_option_set(struct mr_instance *instance, marsio_opt_type_t opt_type, void *opt, size_t sz_opt);
+int marsio_thread_init(struct mr_instance *instance);
+int marsio_poll_wait(struct mr_instance *instance, struct mr_vdev *vdevs[], unsigned int nr_vdevs, unsigned int tid, int timeout);
+
+int marsio_buff_set_metadata(marsio_buff_t *m, enum mr_buff_metadata_type type, void *data, unsigned int sz_data);
+int marsio_buff_get_metadata(marsio_buff_t *m, enum mr_buff_metadata_type type, void *data, unsigned int sz_data);
+
+int marsio_buff_set_sid_list(marsio_buff_t *m, sid_t *slist, uint8_t sz_slist);
+int marsio_buff_get_sid_list(marsio_buff_t *m, sid_t *out_slist, uint8_t sz_out_slist);
+
+int marsio_buff_malloc_global(struct mr_instance *instance, marsio_buff_t *marsio_buff[], unsigned int nr_mbufs, int socket_id, int thread_id);
+void marsio_buff_free(struct mr_instance *instance, marsio_buff_t *marsio_buff[], unsigned int nr_mbufs, int socket_id, int thread_id);
+
+char *marsio_buff_mtod(marsio_buff_t *m);
+uint32_t marsio_buff_datalen(marsio_buff_t *m);
+
+char *marsio_buff_adj(marsio_buff_t *m, uint16_t len);
+char *marsio_buff_append(marsio_buff_t *m, uint16_t len);
+char *marsio_buff_prepend(marsio_buff_t *m, uint16_t len);
+
+void marsio_buff_ctrlzone_reset(marsio_buff_t *m);
+
+int marsio_buff_is_ctrlbuf(marsio_buff_t *m);
+void marsio_buff_set_ctrlbuf(marsio_buff_t *m);
+
+int marsio_recv_burst(struct mr_vdev *vdev, queue_id_t qid, marsio_buff_t *mbufs[], int nr_mbufs);
+int marsio_send_burst(struct mr_sendpath *sendpath, queue_id_t qid, marsio_buff_t *mbufs[], int nr_mbufs);
+
+// new add, only for gtest
+void marsio_set_recv_mbuff(struct mr_instance *instance, marsio_buff_t *mbuff);
+void marsio_set_send_mbuff(struct mr_instance *instance, marsio_buff_t *mbuff);
+marsio_buff_t *marsio_get_recv_mbuff(struct mr_instance *instance);
+marsio_buff_t *marsio_get_send_mbuff(struct mr_instance *instance);
+
+int marsio_mbuff_cmp(marsio_buff_t *mbuff1, marsio_buff_t *mbuff2);
+marsio_buff_t *marsio_mbuff_dup(marsio_buff_t *m);
+
+#ifdef __cpluscplus
+}
+#endif
+
+#endif
diff --git a/test/test_data/conf/sce.conf b/test/test_data/conf/sce.conf
new file mode 100644
index 0000000..68cfe53
--- /dev/null
+++ b/test/test_data/conf/sce.conf
@@ -0,0 +1,74 @@
+[system]
+nr_worker_threads=1
+cpu_affinity_mask=2
+firewall_sids=1001
+enable_debug=0
+enable_send_log=0
+ts_update_interval_ms=1
+
+# Only when (disable_coredump == 1 || (enable_breakpad == 1 && enable_breakpad_upload == 1)) is satisfied, the core will not be generated locally
+disable_coredump=0
+enable_breakpad=0
+enable_breakpad_upload=0
+breakpad_upload_url=http://sentry.mesalab.cn:9000/api/3/minidump/?sentry_key=e8e446bb3bd8435c97f4c01770ca7025
+# must be /run/sce/crashreport,due to tmpfile limit
+breakpad_minidump_dir=/run/sce/crashreport
+breakpad_upload_tools=/opt/tsg/framework/bin/minidump_upload
+
+[maat]
+# 0:json 1:redis 2:iris
+input_mode=0
+stat_switch=1
+perf_switch=1
+scan_detail=0
+deferred_load=0
+effect_interval_ms=1000
+stat_file=log/maat.fs2
+table_info=resource/table_info.conf
+accept_path=/opt/tsg/etc/tsg_device_tag.json
+inc_cfg_dir=resource/inc/
+ful_cfg_dir=resource/ful/
+json_cfg_file=resource/sce.json
+foreign_cont_dir=resource/foreign_files
+redis_db_idx=0
+redis_server=127.0.0.1
+redis_port_range=6379
+max_chaining_size=32
+
+[packet_io]
+# bypass_all_traffic:1 NF2NF and SF2SF
+bypass_all_traffic=0
+rx_burst_max=128
+app_symbol=sce
+dev_endpoint=eth_sf_endpoint
+dev_nf_interface=eth_nf_interface
+dev_endpoint_src_ip=192.168.100.1
+
+# If the configuration file does not set src mac, get src mac through marsio_get_device_ether_addr();
+# If the configuration file has src mac set, use the src mac in the file
+# dev_endpoint_src_mac=aa:aa:aa:aa:aa:aa
+
+[stat]
+output_file=log/sce.fs2
+statsd_server=127.0.0.1
+statsd_port=8100
+# 1 : FS_OUTPUT_STATSD
+# 2 : FS_OUTPUT_INFLUX_LINE
+statsd_format=1
+statsd_cycle=2
+prometheus_listen_port=9001
+prometheus_listen_url=/sce_prometheus
+
+[metrics]
+# Kafka Topic: SERVICE-CHAINING-METRICS
+enable=0
+interval_s=1
+telegraf_bind_address=127.0.0.1
+telegraf_listen_port=8300
+
+[bfdd]
+enable=0
+path=/run/run/frr/bfdd.vty
+device=eth0
+local_address=127.0.0.1
+gateway=127.0.0.1
diff --git a/test/test_data/conf/zlog.conf b/test/test_data/conf/zlog.conf
new file mode 100644
index 0000000..12e7558
--- /dev/null
+++ b/test/test_data/conf/zlog.conf
@@ -0,0 +1,12 @@
+# kill -s SIGHUP "pid"
+
+[global]
+default format = "%d(%c), %V, %F, %U, %m%n"
+
+[levels]
+DEBUG=10
+INFO=20
+FATAL=30
+
+[rules]
+sce.debug "./log/sce.log.%d(%F)";
diff --git a/test/test_data/log/test_ctr_pkt_active_ok.fs2 b/test/test_data/log/test_ctr_pkt_active_ok.fs2
new file mode 100644
index 0000000..95a1d90
--- /dev/null
+++ b/test/test_data/log/test_ctr_pkt_active_ok.fs2
@@ -0,0 +1,23 @@
+============================================================Thu Mar 30 09:36:37 2023============================================================
+ nf_rx_pkt nf_rx_B nf_tx_pkt nf_tx_B endp_rx_pkt endp_rx_B endp_tx_pkt endp_tx_B
+sum 1 185 1 185 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ kee_d_rx_pkt kee_d_rx_B kee_d_tx_pkt kee_d_tx_B kee_u_rx_pkt kee_u_rx_B kee_u_rxdop_pkt kee_u_rxdop_B
+sum 0 0 0 0 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ mirr_bypass_pkt mirr_bypass_B mirr_block_pkt mirr_block_B mirr_rxdop_pkt mirr_rxdop_B mirro_tx_pkt mirro_tx_B
+sum 0 0 0 0 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ stee_bypass_pkt stee_bypass_B stee_block_pkt stee_block_B stee_rx_pkt stee_rx_B stee_tx_pkt stee_tx_B
+sum 0 0 0 0 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ miss_sess_pkt miss_sess_B err_bypass_pkt err_bypass_B err_block_pkt err_block_B endp_drop_pkt endp_drop_B
+sum 0 0 0 0 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ ctrl_rx_pkt ctrl_rx_B ctrl_tx_pkt ctrl_tx_B ctrl_opening ctrl_active ctrl_closing ctrl_resetall
+sum 1 185 1 185 0 1 0 0
+speed/s 0 0 0 0 0 0 0 0
+ ctrl_error session_num session_logs sf_active sf_inactive
+sum 0 1 0 1 0
+speed/s 0 0 0 0 0
+________________________________________________________________________________________________________________________________________________
diff --git a/test/test_data/log/test_ctr_pkt_opening_ok.fs2 b/test/test_data/log/test_ctr_pkt_opening_ok.fs2
new file mode 100644
index 0000000..cd5f85a
--- /dev/null
+++ b/test/test_data/log/test_ctr_pkt_opening_ok.fs2
@@ -0,0 +1,23 @@
+============================================================Thu Apr 6 02:12:33 2023============================================================
+ nf_rx_pkt nf_rx_B nf_tx_pkt nf_tx_B endp_rx_pkt endp_rx_B endp_tx_pkt endp_tx_B
+sum 1 122 1 122 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ kee_d_rx_pkt kee_d_rx_B kee_d_tx_pkt kee_d_tx_B kee_u_rx_pkt kee_u_rx_B kee_u_rxdop_pkt kee_u_rxdop_B
+sum 0 0 0 0 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ mirr_bypass_pkt mirr_bypass_B mirr_block_pkt mirr_block_B mirr_rxdop_pkt mirr_rxdop_B mirro_tx_pkt mirro_tx_B
+sum 0 0 0 0 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ stee_bypass_pkt stee_bypass_B stee_block_pkt stee_block_B stee_rx_pkt stee_rx_B stee_tx_pkt stee_tx_B
+sum 0 0 0 0 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ miss_sess_pkt miss_sess_B err_bypass_pkt err_bypass_B err_block_pkt err_block_B endp_drop_pkt endp_drop_B
+sum 0 0 0 0 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ ctrl_rx_pkt ctrl_rx_B ctrl_tx_pkt ctrl_tx_B ctrl_opening ctrl_active ctrl_closing ctrl_resetall
+sum 1 122 1 122 1 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ ctrl_error session_num session_logs sf_active sf_inactive
+sum 0 0 0 0 0
+speed/s 0 0 0 0 0
+________________________________________________________________________________________________________________________________________________
diff --git a/test/test_data/log/test_raw_pkt_stee_block_ok.fs2 b/test/test_data/log/test_raw_pkt_stee_block_ok.fs2
new file mode 100644
index 0000000..318506d
--- /dev/null
+++ b/test/test_data/log/test_raw_pkt_stee_block_ok.fs2
@@ -0,0 +1,23 @@
+============================================================Thu Apr 6 03:13:22 2023============================================================
+ nf_rx_pkt nf_rx_B nf_tx_pkt nf_tx_B endp_rx_pkt endp_rx_B endp_tx_pkt endp_tx_B
+sum 2 330 1 185 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ kee_d_rx_pkt kee_d_rx_B kee_d_tx_pkt kee_d_tx_B kee_u_rx_pkt kee_u_rx_B kee_u_rxdop_pkt kee_u_rxdop_B
+sum 0 0 0 0 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ mirr_bypass_pkt mirr_bypass_B mirr_block_pkt mirr_block_B mirr_rxdop_pkt mirr_rxdop_B mirro_tx_pkt mirro_tx_B
+sum 0 0 0 0 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ stee_bypass_pkt stee_bypass_B stee_block_pkt stee_block_B stee_rx_pkt stee_rx_B stee_tx_pkt stee_tx_B
+sum 0 0 1 145 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ miss_sess_pkt miss_sess_B err_bypass_pkt err_bypass_B err_block_pkt err_block_B endp_drop_pkt endp_drop_B
+sum 0 0 0 0 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ ctrl_rx_pkt ctrl_rx_B ctrl_tx_pkt ctrl_tx_B ctrl_opening ctrl_active ctrl_closing ctrl_resetall
+sum 1 185 1 185 0 1 0 0
+speed/s 0 0 0 0 0 0 0 0
+ ctrl_error session_num session_logs sf_active sf_inactive
+sum 0 1 0 0 0
+speed/s 0 0 0 0 0
+________________________________________________________________________________________________________________________________________________
diff --git a/test/test_data/log/test_raw_pkt_stee_bypass_ok.fs2 b/test/test_data/log/test_raw_pkt_stee_bypass_ok.fs2
new file mode 100644
index 0000000..71422c8
--- /dev/null
+++ b/test/test_data/log/test_raw_pkt_stee_bypass_ok.fs2
@@ -0,0 +1,23 @@
+============================================================Thu Apr 6 02:56:08 2023============================================================
+ nf_rx_pkt nf_rx_B nf_tx_pkt nf_tx_B endp_rx_pkt endp_rx_B endp_tx_pkt endp_tx_B
+sum 2 330 2 330 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ kee_d_rx_pkt kee_d_rx_B kee_d_tx_pkt kee_d_tx_B kee_u_rx_pkt kee_u_rx_B kee_u_rxdop_pkt kee_u_rxdop_B
+sum 0 0 0 0 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ mirr_bypass_pkt mirr_bypass_B mirr_block_pkt mirr_block_B mirr_rxdop_pkt mirr_rxdop_B mirro_tx_pkt mirro_tx_B
+sum 0 0 0 0 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ stee_bypass_pkt stee_bypass_B stee_block_pkt stee_block_B stee_rx_pkt stee_rx_B stee_tx_pkt stee_tx_B
+sum 1 145 0 0 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ miss_sess_pkt miss_sess_B err_bypass_pkt err_bypass_B err_block_pkt err_block_B endp_drop_pkt endp_drop_B
+sum 0 0 0 0 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ ctrl_rx_pkt ctrl_rx_B ctrl_tx_pkt ctrl_tx_B ctrl_opening ctrl_active ctrl_closing ctrl_resetall
+sum 1 185 1 185 0 1 0 0
+speed/s 0 0 0 0 0 0 0 0
+ ctrl_error session_num session_logs sf_active sf_inactive
+sum 0 1 0 0 0
+speed/s 0 0 0 0 0
+________________________________________________________________________________________________________________________________________________
diff --git a/test/test_data/log/test_raw_pkt_stee_forward_ok.fs2 b/test/test_data/log/test_raw_pkt_stee_forward_ok.fs2
new file mode 100644
index 0000000..98cdd84
--- /dev/null
+++ b/test/test_data/log/test_raw_pkt_stee_forward_ok.fs2
@@ -0,0 +1,23 @@
+============================================================Thu Apr 6 09:56:11 2023============================================================
+ nf_rx_pkt nf_rx_B nf_tx_pkt nf_tx_B endp_rx_pkt endp_rx_B endp_tx_pkt endp_tx_B
+sum 2 330 1 185 0 0 1 195
+speed/s 0 0 0 0 0 0 0 0
+ kee_d_rx_pkt kee_d_rx_B kee_d_tx_pkt kee_d_tx_B kee_u_rx_pkt kee_u_rx_B kee_u_rxdop_pkt kee_u_rxdop_B
+sum 0 0 0 0 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ mirr_bypass_pkt mirr_bypass_B mirr_block_pkt mirr_block_B mirr_rxdop_pkt mirr_rxdop_B mirro_tx_pkt mirro_tx_B
+sum 0 0 0 0 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ stee_bypass_pkt stee_bypass_B stee_block_pkt stee_block_B stee_rx_pkt stee_rx_B stee_tx_pkt stee_tx_B
+sum 0 0 0 0 0 0 1 145
+speed/s 0 0 0 0 0 0 0 0
+ miss_sess_pkt miss_sess_B err_bypass_pkt err_bypass_B err_block_pkt err_block_B endp_drop_pkt endp_drop_B
+sum 0 0 0 0 0 0 0 0
+speed/s 0 0 0 0 0 0 0 0
+ ctrl_rx_pkt ctrl_rx_B ctrl_tx_pkt ctrl_tx_B ctrl_opening ctrl_active ctrl_closing ctrl_resetall
+sum 1 185 1 185 0 1 0 0
+speed/s 0 0 0 0 0 0 0 0
+ ctrl_error session_num session_logs sf_active sf_inactive
+sum 0 1 0 1 0
+speed/s 0 0 0 0 0
+________________________________________________________________________________________________________________________________________________
diff --git a/test/test_data/resource/raw_pkt_stee_block.json b/test/test_data/resource/raw_pkt_stee_block.json
new file mode 100644
index 0000000..d285c38
--- /dev/null
+++ b/test/test_data/resource/raw_pkt_stee_block.json
@@ -0,0 +1,22 @@
+{
+ "plugin_table": [
+ {
+ "table_name": "SERVICE_FUNCTION_PROFILE",
+ "table_content": [
+ "1\tdevice_group_a\t1\t{\"method\":\"vxlan_g\",\"dest_ip\":\"1.1.1.1\"}\t{\"method\":\"none\"}\t1"
+ ]
+ },
+ {
+ "table_name": "SERVICE_FUNCTION_FORWARDER_PROFILE",
+ "table_content": [
+ "1\t1\thash-int-ip\tnearby\tblock\tnull\t[1]\t1"
+ ]
+ },
+ {
+ "table_name": "SERVICE_CHAINING_COMPILE",
+ "table_content": [
+ "995199\t0\t2\t1\t1\t{}\t{\"targeted_traffic\":\"raw\",\"sff_profiles\":[1]}\t1\t2"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/test/test_data/resource/raw_pkt_stee_bypass.json b/test/test_data/resource/raw_pkt_stee_bypass.json
new file mode 100644
index 0000000..e02cc97
--- /dev/null
+++ b/test/test_data/resource/raw_pkt_stee_bypass.json
@@ -0,0 +1,22 @@
+{
+ "plugin_table": [
+ {
+ "table_name": "SERVICE_FUNCTION_PROFILE",
+ "table_content": [
+ "1\tdevice_group_a\t1\t{\"method\":\"vxlan_g\",\"dest_ip\":\"1.1.1.1\"}\t{\"method\":\"none\"}\t1"
+ ]
+ },
+ {
+ "table_name": "SERVICE_FUNCTION_FORWARDER_PROFILE",
+ "table_content": [
+ "1\t1\thash-int-ip\tnearby\tbypass\tnull\t[1]\t1"
+ ]
+ },
+ {
+ "table_name": "SERVICE_CHAINING_COMPILE",
+ "table_content": [
+ "995199\t0\t2\t1\t1\t{}\t{\"targeted_traffic\":\"raw\",\"sff_profiles\":[1]}\t1\t2"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/test/test_data/resource/raw_pkt_stee_forward.json b/test/test_data/resource/raw_pkt_stee_forward.json
new file mode 100644
index 0000000..b705bf1
--- /dev/null
+++ b/test/test_data/resource/raw_pkt_stee_forward.json
@@ -0,0 +1,22 @@
+{
+ "plugin_table": [
+ {
+ "table_name": "SERVICE_FUNCTION_PROFILE",
+ "table_content": [
+ "1\tdevice_group_a\t1\t{\"method\":\"vxlan_g\",\"dest_ip\":\"1.1.1.1\"}\t{\"method\":\"none\"}\t1"
+ ]
+ },
+ {
+ "table_name": "SERVICE_FUNCTION_FORWARDER_PROFILE",
+ "table_content": [
+ "1\t1\thash-int-ip\tglobal\tbypass\tnull\t[1]\t1"
+ ]
+ },
+ {
+ "table_name": "SERVICE_CHAINING_COMPILE",
+ "table_content": [
+ "995199\t0\t2\t1\t1\t{}\t{\"targeted_traffic\":\"raw\",\"sff_profiles\":[1]}\t1\t2"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/test/test_data/resource/sce0.json b/test/test_data/resource/sce0.json
new file mode 100644
index 0000000..b705bf1
--- /dev/null
+++ b/test/test_data/resource/sce0.json
@@ -0,0 +1,22 @@
+{
+ "plugin_table": [
+ {
+ "table_name": "SERVICE_FUNCTION_PROFILE",
+ "table_content": [
+ "1\tdevice_group_a\t1\t{\"method\":\"vxlan_g\",\"dest_ip\":\"1.1.1.1\"}\t{\"method\":\"none\"}\t1"
+ ]
+ },
+ {
+ "table_name": "SERVICE_FUNCTION_FORWARDER_PROFILE",
+ "table_content": [
+ "1\t1\thash-int-ip\tglobal\tbypass\tnull\t[1]\t1"
+ ]
+ },
+ {
+ "table_name": "SERVICE_CHAINING_COMPILE",
+ "table_content": [
+ "995199\t0\t2\t1\t1\t{}\t{\"targeted_traffic\":\"raw\",\"sff_profiles\":[1]}\t1\t2"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/test/test_data/resource/table_info.conf b/test/test_data/resource/table_info.conf
new file mode 100644
index 0000000..ed7798c
--- /dev/null
+++ b/test/test_data/resource/table_info.conf
@@ -0,0 +1,3 @@
+0 SERVICE_CHAINING_COMPILE plugin {"key":1,"valid":8}
+1 SERVICE_FUNCTION_FORWARDER_PROFILE plugin {"key":1,"valid":8}
+2 SERVICE_FUNCTION_PROFILE plugin {"key":1,"valid":6} \ No newline at end of file
diff --git a/test/test_pcap/sce.pcapng b/test/test_pcap/sce.pcapng
new file mode 100644
index 0000000..cf14214
--- /dev/null
+++ b/test/test_pcap/sce.pcapng
Binary files differ
diff --git a/test/test_pcap/sf.pcapng b/test/test_pcap/sf.pcapng
new file mode 100644
index 0000000..e095e81
--- /dev/null
+++ b/test/test_pcap/sf.pcapng
Binary files differ