Skip to content

Commit 993cce0

Browse files
committed
prov/efa: Add unit tests for efa_msg
Signed-off-by: Jessie Yang <[email protected]>
1 parent f03fe01 commit 993cce0

6 files changed

+149
-1
lines changed

prov/efa/Makefile.include

+2-1
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,8 @@ nodist_prov_efa_test_efa_unit_test_SOURCES = \
148148
prov/efa/test/efa_unit_test_runt.c \
149149
prov/efa/test/efa_unit_test_mr.c \
150150
prov/efa/test/efa_unit_test_rdm_peer.c \
151-
prov/efa/test/efa_unit_test_pke.c
151+
prov/efa/test/efa_unit_test_pke.c \
152+
prov/efa/test/efa_unit_test_msg.c
152153

153154

154155
efa_CPPFLAGS += -I$(top_srcdir)/include -I$(top_srcdir)/prov/efa/test $(cmocka_CPPFLAGS)

prov/efa/test/efa_unit_test_mocks.c

+12
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,12 @@ void efa_mock_ibv_wr_send_verify_handshake_pkt_local_host_id_and_save_wr(struct
8888
return efa_mock_ibv_wr_send_save_wr(qp);
8989
}
9090

91+
void efa_mock_ibv_wr_send_imm_save_wr(struct ibv_qp_ex *qp, __be32 imm_data)
92+
{
93+
g_ibv_submitted_wr_id_vec[g_ibv_submitted_wr_id_cnt] = (void *)qp->wr_id;
94+
g_ibv_submitted_wr_id_cnt++;
95+
}
96+
9197
void efa_mock_ibv_wr_set_inline_data_list_no_op(struct ibv_qp_ex *qp,
9298
size_t num_buf,
9399
const struct ibv_data_buf *buf_list)
@@ -207,6 +213,12 @@ bool efa_mock_efa_device_support_unsolicited_write_recv()
207213
return mock();
208214
}
209215

216+
int efa_mock_ibv_post_recv(struct ibv_qp *qp, struct ibv_recv_wr *wr,
217+
struct ibv_recv_wr **bad_wr)
218+
{
219+
return mock();
220+
}
221+
210222
struct efa_unit_test_mocks g_efa_unit_test_mocks = {
211223
.local_host_id = 0,
212224
.peer_host_id = 0,

prov/efa/test/efa_unit_test_mocks.h

+5
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ uint32_t efa_mock_ibv_read_wc_flags_return_mock(struct ibv_cq_ex *current);
7474

7575
bool efa_mock_efadv_wc_is_unsolicited(struct efadv_cq *efadv_cq);
7676

77+
void efa_mock_ibv_wr_send_imm_save_wr(struct ibv_qp_ex *qp, __be32 imm_data);
78+
7779
ssize_t __real_ofi_copy_from_hmem_iov(void *dest, size_t size,
7880
enum fi_hmem_iface hmem_iface, uint64_t device,
7981
const struct iovec *hmem_iov,
@@ -93,6 +95,9 @@ int efa_mock_efa_rdm_pke_read_return_mock(struct efa_rdm_ope *ope);
9395

9496
bool efa_mock_efa_device_support_unsolicited_write_recv(void);
9597

98+
int efa_mock_ibv_post_recv(struct ibv_qp *qp, struct ibv_recv_wr *wr,
99+
struct ibv_recv_wr **bad_wr);
100+
96101
struct efa_unit_test_mocks
97102
{
98103
uint64_t local_host_id;

prov/efa/test/efa_unit_test_msg.c

+126
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
/* SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0-only */
2+
/* SPDX-FileCopyrightText: Copyright Amazon.com, Inc. or its affiliates. All rights reserved. */
3+
4+
#include "efa_unit_tests.h"
5+
#include "ofi_util.h"
6+
7+
8+
void test_efa_msg_recv(struct efa_resource **state)
9+
{
10+
struct efa_resource *resource = *state;
11+
struct iovec iov;
12+
struct efa_unit_test_buff send_buff;
13+
struct efa_ep_addr raw_addr;
14+
struct efa_base_ep *base_ep;
15+
size_t raw_addr_len = sizeof(raw_addr);
16+
fi_addr_t addr;
17+
int ret;
18+
struct fi_msg msg = {0};
19+
struct ibv_qp ibv_qp;
20+
void *desc;
21+
22+
efa_unit_test_resource_construct(resource, FI_EP_DGRAM);
23+
efa_unit_test_buff_construct(&send_buff, resource, 4096 /* buff_size */);
24+
25+
base_ep = container_of(resource->ep, struct efa_base_ep, util_ep.ep_fid);
26+
ibv_qp = base_ep->qp;
27+
28+
ret = fi_getname(&resource->ep->fid, &raw_addr, &raw_addr_len);
29+
assert_int_equal(ret, 0);
30+
raw_addr.qpn = 1;
31+
raw_addr.qkey = 0x1234;
32+
ret = fi_av_insert(resource->av, &raw_addr, 1, &addr, 0 /* flags */, NULL /* context */);
33+
assert_int_equal(ret, 1);
34+
35+
iov.iov_base = send_buff.buff;
36+
iov.iov_len = send_buff.size;
37+
38+
desc = fi_mr_desc(send_buff.mr);
39+
40+
efa_unit_test_construct_msg(&msg, &iov, 1, addr, NULL, 0, &desc);
41+
42+
qp->context->ops.post_recv = &efa_mock_ibv_post_recv;
43+
will_return(efa_mock_ibv_post_recv, 0);
44+
45+
ret = fi_recv(resource->ep, send_buff.buff, send_buff.size, desc, addr,
46+
NULL /* context */);
47+
assert_int_equal(ret, 0);
48+
49+
ret = fi_recvv(resource->ep, &iov, &desc, 1, addr, NULL /* context */);
50+
assert_int_equal(ret, 0);
51+
52+
ret = fi_recvmsg(resource->ep, &msg, 0);
53+
assert_int_equal(ret, 0);
54+
55+
efa_unit_test_buff_destruct(&send_buff);
56+
}
57+
58+
59+
void test_efa_msg_send(struct efa_resource **state)
60+
{
61+
struct efa_resource *resource = *state;
62+
struct iovec iov;
63+
struct efa_unit_test_buff send_buff;
64+
struct efa_ep_addr raw_addr;
65+
struct efa_base_ep *base_ep;
66+
size_t raw_addr_len = sizeof(raw_addr);
67+
fi_addr_t addr;
68+
int ret;
69+
struct fi_msg msg = {0};
70+
struct ibv_qp_ex *ibv_qpx;
71+
void *desc;
72+
73+
efa_unit_test_resource_construct(resource, FI_EP_DGRAM);
74+
efa_unit_test_buff_construct(&send_buff, resource, 4096 /* buff_size */);
75+
76+
base_ep = container_of(resource->ep, struct efa_base_ep, util_ep.ep_fid);
77+
ibv_qpx = base_ep->qp->ibv_qp_ex;
78+
79+
ret = fi_getname(&resource->ep->fid, &raw_addr, &raw_addr_len);
80+
assert_int_equal(ret, 0);
81+
raw_addr.qpn = 1;
82+
raw_addr.qkey = 0x1234;
83+
ret = fi_av_insert(resource->av, &raw_addr, 1, &addr, 0 /* flags */, NULL /* context */);
84+
assert_int_equal(ret, 1);
85+
86+
iov.iov_base = send_buff.buff;
87+
iov.iov_len = send_buff.size;
88+
89+
desc = fi_mr_desc(send_buff.mr);
90+
91+
efa_unit_test_construct_msg(&msg, &iov, 1, addr, NULL, 0, &desc);
92+
93+
ibv_qpx->wr_start = &efa_mock_ibv_wr_start_no_op;
94+
/* this mock will save the send work request (wr) in a global list */
95+
ibv_qpx->wr_send = &efa_mock_ibv_wr_send_save_wr;
96+
ibv_qpx->wr_send_imm = &efa_mock_ibv_wr_send_imm_save_wr;
97+
ibv_qpx->wr_set_sge_list = &efa_mock_ibv_wr_set_sge_list_no_op;
98+
ibv_qpx->wr_set_ud_addr = &efa_mock_ibv_wr_set_ud_addr_no_op;
99+
ibv_qpx->wr_complete = &efa_mock_ibv_wr_complete_no_op;
100+
assert_int_equal(g_ibv_submitted_wr_id_cnt, 0);
101+
102+
ret = fi_send(resource->ep, send_buff.buff, send_buff.size, desc, addr,
103+
NULL /* context */);
104+
assert_int_equal(ret, 0);
105+
/* fi_send() called efa_mock_ibv_wr_send_save_wr(), which saved one send_wr
106+
* in g_ibv_submitted_wr_id_vec */
107+
assert_int_equal(g_ibv_submitted_wr_id_cnt, 1);
108+
109+
ret = fi_sendv(resource->ep, &iov, &desc, 1, addr, NULL);
110+
assert_int_equal(ret, 0);
111+
112+
ret = fi_senddata(resource->ep, send_buff.buff, send_buff.size, desc, 0, addr, NULL);
113+
assert_int_equal(ret, 0);
114+
115+
ret = fi_sendmsg(resource->ep, &msg, 0);
116+
assert_int_equal(ret, 0);
117+
118+
// ret = fi_inject(resource->ep, send_buff.buff, send_buff.size, addr);
119+
// printf("ret = %d\n", ret);
120+
// assert_int_equal(ret, 0);
121+
122+
// ret = fi_injectdata(resource->ep, send_buff.buff, send_buff.size, 0, addr);
123+
// assert_int_equal(ret, 0);
124+
125+
efa_unit_test_buff_destruct(&send_buff);
126+
}

prov/efa/test/efa_unit_tests.c

+2
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,8 @@ int main(void)
208208
cmocka_unit_test_setup_teardown(test_efa_rdm_peer_keep_pke_in_overflow_list, efa_unit_test_mocks_setup, efa_unit_test_mocks_teardown),
209209
cmocka_unit_test_setup_teardown(test_efa_rdm_peer_append_overflow_pke_to_recvwin, efa_unit_test_mocks_setup, efa_unit_test_mocks_teardown),
210210
cmocka_unit_test_setup_teardown(test_efa_rdm_pke_handle_longcts_rtm_send_completion, efa_unit_test_mocks_setup, efa_unit_test_mocks_teardown),
211+
cmocka_unit_test_setup_teardown(test_efa_msg_recv, efa_unit_test_mocks_setup, efa_unit_test_mocks_teardown),
212+
cmocka_unit_test_setup_teardown(test_efa_msg_send, efa_unit_test_mocks_setup, efa_unit_test_mocks_teardown),
211213
};
212214

213215
cmocka_set_message_output(CM_OUTPUT_XML);

prov/efa/test/efa_unit_tests.h

+2
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,8 @@ void test_efa_rdm_peer_move_overflow_pke_to_recvwin();
222222
void test_efa_rdm_peer_keep_pke_in_overflow_list();
223223
void test_efa_rdm_peer_append_overflow_pke_to_recvwin();
224224
void test_efa_rdm_pke_handle_longcts_rtm_send_completion();
225+
void test_efa_msg_recv();
226+
void test_efa_msg_send();
225227

226228
static inline
227229
int efa_unit_test_get_dlist_length(struct dlist_entry *head)

0 commit comments

Comments
 (0)