summaryrefslogtreecommitdiff
path: root/service/test
diff options
context:
space:
mode:
authortongzongzhen <[email protected]>2024-08-07 17:09:41 +0800
committertongzongzhen <[email protected]>2024-08-07 17:09:41 +0800
commite4c866ebc59b72b62b62be13f6517dd189d841bd (patch)
treea51a0568a69f5b4f09f785f9ee9ac6f561b68f0a /service/test
parent47a6607c8d440e8a567d918d7739432dde6ef888 (diff)
add cmocka for trace service
Diffstat (limited to 'service/test')
-rw-r--r--service/test/test_node_vwire.c39
-rw-r--r--service/test/test_trace_service.c157
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