diff options
| author | tongzongzhen <[email protected]> | 2024-08-07 17:09:41 +0800 |
|---|---|---|
| committer | tongzongzhen <[email protected]> | 2024-08-07 17:09:41 +0800 |
| commit | e4c866ebc59b72b62b62be13f6517dd189d841bd (patch) | |
| tree | a51a0568a69f5b4f09f785f9ee9ac6f561b68f0a /service/test | |
| parent | 47a6607c8d440e8a567d918d7739432dde6ef888 (diff) | |
add cmocka for trace service
Diffstat (limited to 'service/test')
| -rw-r--r-- | service/test/test_node_vwire.c | 39 | ||||
| -rw-r--r-- | service/test/test_trace_service.c | 157 |
2 files changed, 179 insertions, 17 deletions
diff --git a/service/test/test_node_vwire.c b/service/test/test_node_vwire.c index 260badc..4dd7f03 100644 --- a/service/test/test_node_vwire.c +++ b/service/test/test_node_vwire.c @@ -1,13 +1,16 @@ +#include <setjmp.h> #include <stdarg.h> #include <stddef.h> #include <stdint.h> -#include <setjmp.h> #include <string.h> +#include <unistd.h> + #include <cmocka.h> + #include <rte_eal.h> -#include <rte_mempool.h> #include <rte_graph.h> #include <rte_graph_worker.h> +#include <rte_mempool.h> #include <sc_node.h> #include <sc_node_common.h> @@ -26,7 +29,7 @@ int __wrap_rte_eal_init(int argc, char * argv[]) } static int rte_exit_called = 0; -int __wrap_rte_exit(int status, const char *format, ...) +int __wrap_rte_exit(int status, const char * format, ...) { rte_exit_called = 1; return 0; @@ -44,16 +47,15 @@ void __wrap_forwarder_table_insert(uint16_t sid, uint16_t type) check_expected(type); } -extern int __real_rte_eal_init(int argc, char **argv); -extern int __real_rte_exit(int status, const char *format, ...); +extern int __real_rte_eal_init(int argc, char ** argv); +extern int __real_rte_exit(int status, const char * format, ...); extern int vwire_init(struct sc_main * sc); - /* testcase: 1 * device: vwire_1 <-> vwire_2 * port_id: 1 <-> 2 -*/ + */ static void testcase_vwire_ingress_forward_pkts(void ** state) { @@ -253,7 +255,7 @@ static int testgroup_vwire_egress_teardown(void ** state) return rte_graph_destroy(graph); } -static int testgroup_vwire_ingress_setup(void **state) +static int testgroup_vwire_ingress_setup(void ** state) { /* mock pkt source to generate mock packets */ const char * node_patterns[] = { @@ -291,7 +293,7 @@ static int testgroup_vwire_ingress_setup(void **state) return 0; } -static int testgroup_vwire_ingress_teardown(void **state) +static int testgroup_vwire_ingress_teardown(void ** state) { /* destroy the graph */ rte_graph_t graph = (uintptr_t)*state; @@ -299,7 +301,7 @@ static int testgroup_vwire_ingress_teardown(void **state) } /* ----------------------------------------------------------------------------------------------------------------- */ -static void testcase_vwire_init_success(void **state) +static void testcase_vwire_init_success(void ** state) { struct sc_main * mock_sc = *state; @@ -332,7 +334,7 @@ static void testcase_vwire_init_success(void **state) rte_free(mock_dev_desc_2); } -static void testcase_vwire_device_not_exist(void **state) +static void testcase_vwire_device_not_exist(void ** state) { struct sc_main * mock_sc = *state; @@ -345,7 +347,7 @@ static void testcase_vwire_device_not_exist(void **state) assert_int_equal(ret, RT_ERR); } -static int testgroup_vwire_init_setup(void **state) +static int testgroup_vwire_init_setup(void ** state) { struct sc_main * mock_sc = rte_zmalloc(NULL, sizeof(struct sc_main), 0); assert_non_null(mock_sc); @@ -367,14 +369,15 @@ static int testgroup_vwire_init_setup(void **state) return 0; } -static int testgroup_vwire_init_teardown(void **state) +static int testgroup_vwire_init_teardown(void ** state) { struct sc_main * mock_sc = *state; rte_free(mock_sc); + unlink(mock_sc->local_cfgfile); return 0; } -int main(int argc, char *argv[]) +int main(int argc, char * argv[]) { /* generate the eal args */ static char * eal_args[] = { @@ -407,8 +410,10 @@ int main(int argc, char *argv[]) cmocka_unit_test(testcase_vwire_egress_forward_pkts), }; - cmocka_run_group_tests(group_vwire_init, testgroup_vwire_init_setup, testgroup_vwire_init_teardown); - cmocka_run_group_tests(group_vwire_ingress, testgroup_vwire_ingress_setup, testgroup_vwire_ingress_teardown); - cmocka_run_group_tests(group_vwire_egress, testgroup_vwire_egress_setup, testgroup_vwire_egress_teardown); + ret = cmocka_run_group_tests(group_vwire_init, testgroup_vwire_init_setup, testgroup_vwire_init_teardown); + ret += cmocka_run_group_tests(group_vwire_ingress, testgroup_vwire_ingress_setup, testgroup_vwire_ingress_teardown); + ret += cmocka_run_group_tests(group_vwire_egress, testgroup_vwire_egress_setup, testgroup_vwire_egress_teardown); rte_eal_cleanup(); + + return ret; }
\ No newline at end of file diff --git a/service/test/test_trace_service.c b/service/test/test_trace_service.c new file mode 100644 index 0000000..a6c3e4c --- /dev/null +++ b/service/test/test_trace_service.c @@ -0,0 +1,157 @@ +#include <setjmp.h> +#include <stdarg.h> +#include <stddef.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <cmocka.h> + +#include <rte_common.h> +#include <rte_eal.h> +#include <rte_errno.h> +#include <rte_malloc.h> + +#include <sc_common.h> +#include <sc_trace.h> + +static struct sc_main * mock_sc; + +extern int __dp_trace_path_handler(const struct rte_mp_msg * msg, const void * peer); + +struct sc_main * __wrap_sc_main_get() +{ + return mock_sc; +} + +struct app * __wrap_app_lookup_by_symbol(struct sc_main * sc, const char * appsym) +{ + return rte_malloc("cmocka_trace", sizeof(struct app), 0); +} + +void __wrap_app_event_handler_register(struct app_main * app_main, enum app_event_type event_type, + app_event_handler_t fn_handler, void * arg) +{ + return; +} + +int __wrap_rte_mp_reply(struct rte_mp_msg * msg, const char * peer) +{ + struct dp_trace_resp * dp_trace_resp = (struct dp_trace_resp *)msg->param; + assert_true(dp_trace_resp->errcode == DP_TRACE_SUCCESS); + + enum dp_trace_req_action action = mock_type(enum dp_trace_req_action); + + if (action == DP_TRACE_JOB_ID_USED_GET) + { + job_bitmap_t id_uesd = mock_type(job_bitmap_t); + assert_true(dp_trace_resp->jobs_id_used_get == id_uesd); + } + + return 0; +} + +static int group_trace_init_setup(void ** state) +{ + size_t size = 10L * 1024 * 1024 * 1024; // 10GB + void * ptr = malloc(size); + assert_non_null(ptr); + free(ptr); + + mock_sc = rte_zmalloc("cmocka_trace", sizeof(struct sc_main), 0); + assert_non_null(mock_sc); + + mr_dp_trace_init(mock_sc); + assert_non_null(mock_sc->trace); + + *state = mock_sc; + return 0; +} + +static int group_trace_init_teardown(void ** state) +{ + struct sc_main * mock_sc = *state; + rte_free(mock_sc); + return 0; +} + +static void testcase_trace_handle_job_add(void ** state) +{ + struct rte_mp_msg msg; + snprintf(msg.name, sizeof(msg.name), "%s", DP_TRACE_MP_MSG_NAME); + struct dp_trace_req * request = (struct dp_trace_req *)msg.param; + msg.len_param = sizeof(struct dp_trace_req); + + struct dp_trace_job_desc desc; + desc.enable = true; + snprintf(desc.bpf_expr, sizeof(desc.bpf_expr), "%s", "ip host 1.1.1.1"); + desc.rule_index = 0; + desc.measurement_type = DP_TRACE_MEASUREMENT_TYPE_TRACE; + + request->action = DP_TRACE_JOB_ADD; + request->desc = &desc; + + will_return(__wrap_rte_mp_reply, DP_TRACE_JOB_ADD); + __dp_trace_path_handler(&msg, NULL); +} + +static void testcase_trace_handle_job_used_get(void ** state) +{ + struct rte_mp_msg msg; + snprintf(msg.name, sizeof(msg.name), "%s", DP_TRACE_MP_MSG_NAME); + struct dp_trace_req * request = (struct dp_trace_req *)msg.param; + msg.len_param = sizeof(struct dp_trace_req); + + request->action = DP_TRACE_JOB_ID_USED_GET; + + will_return(__wrap_rte_mp_reply, DP_TRACE_JOB_ID_USED_GET); + will_return(__wrap_rte_mp_reply, 1 << 0); + __dp_trace_path_handler(&msg, NULL); +} + +static void testcase_trace_handle_job_del(void ** state) +{ + struct rte_mp_msg msg; + snprintf(msg.name, sizeof(msg.name), "%s", DP_TRACE_MP_MSG_NAME); + struct dp_trace_req * request = (struct dp_trace_req *)msg.param; + msg.len_param = sizeof(struct dp_trace_req); + + request->action = DP_TRACE_JOB_DESTROY; + request->jobs_id_destroy = (1 << 0); + will_return(__wrap_rte_mp_reply, DP_TRACE_JOB_DESTROY); + __dp_trace_path_handler(&msg, NULL); + + // Confirm that the job has been deleted + request->action = DP_TRACE_JOB_ID_USED_GET; + will_return(__wrap_rte_mp_reply, DP_TRACE_JOB_ID_USED_GET); + will_return(__wrap_rte_mp_reply, 0); + __dp_trace_path_handler(&msg, NULL); +} + +int main(int argc, char * argv[]) +{ + char * eal_args[] = { + "test_trace_service", "-c", "0x1", "--no-huge", "-m", "100", "--no-pci", + }; + + int ret = rte_eal_init(RTE_DIM(eal_args), eal_args); + if (ret < 0) + { + rte_exit(EXIT_FAILURE, "Error with EAL initialization: %s\n", rte_strerror(rte_errno)); + } + + const struct CMUnitTest group_trace_service_handle[] = { + cmocka_unit_test(testcase_trace_handle_job_add), + cmocka_unit_test(testcase_trace_handle_job_used_get), + cmocka_unit_test(testcase_trace_handle_job_del), + }; + + // 0 on success, or the number of failed tests. + ret = cmocka_run_group_tests(group_trace_service_handle, group_trace_init_setup, group_trace_init_teardown); + + rte_eal_cleanup(); + + // Pass the return value to ctest. Report an error if it is non-zero + return ret; +}
\ No newline at end of file |
