1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
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;
}
|