Motr  M0
conn.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2012-2020 Seagate Technology LLC and/or its Affiliates
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * For any questions about this software or licensing,
18  * please email opensource@seagate.com or cortx-questions@seagate.com.
19  *
20  */
21 
22 
23 #include "ut/ut.h"
24 #include "lib/mutex.h"
25 #include "lib/finject.h"
26 #include "fop/fop.h"
27 #include "motr/magic.h"
28 #include "rpc/rpc_internal.h"
29 
30 enum {
31  SENDER_ID = 1001,
32 };
33 
34 static struct m0_rpc_machine machine;
35 static struct m0_rpc_conn conn;
36 static struct m0_fop est_fop;
37 static struct m0_fop term_fop;
38 static struct m0_fop est_fop_rep;
39 static struct m0_fop term_fop_rep;
40 
43 
44 static struct m0_net_end_point ep;
45 
46 M0_TL_DESCR_DEFINE(rpc_conn_ut, "rpc-conn", static, struct m0_rpc_conn,
47  c_link, c_magic, M0_RPC_CONN_MAGIC, M0_RPC_CONN_HEAD_MAGIC);
48 M0_TL_DEFINE(rpc_conn_ut, static, struct m0_rpc_conn);
49 
50 static int conn_ut_init(void)
51 {
52  ep.nep_addr = "dummy ep";
53 
56 
57  rpc_conn_ut_tlist_init(&machine.rm_incoming_conns);
58  rpc_conn_ut_tlist_init(&machine.rm_outgoing_conns);
59  rmach_watch_tlist_init(&machine.rm_watch);
61 
62  m0_fi_enable("rpc_chan_get", "do_nothing");
63  m0_fi_enable("rpc_chan_put", "do_nothing");
64  m0_fi_enable("m0_rpc_frm_run_formation", "do_nothing");
65  m0_fi_enable("m0_rpc__fop_post", "do_nothing");
66  return 0;
67 }
68 
69 static int conn_ut_fini(void)
70 {
71  rmach_watch_tlist_fini(&machine.rm_watch);
72  rpc_conn_ut_tlist_fini(&machine.rm_incoming_conns);
73  rpc_conn_ut_tlist_fini(&machine.rm_outgoing_conns);
75  m0_fi_disable("rpc_chan_get", "do_nothing");
76  m0_fi_disable("rpc_chan_put", "do_nothing");
77  m0_fi_disable("m0_rpc_frm_run_formation", "do_nothing");
78  m0_fi_disable("m0_rpc__fop_post", "do_nothing");
79 
80  m0_fi_disable("rpc_chan_get", "fake_error");
81  m0_fi_disable("m0_alloc", "fail_allocation");
82  m0_fi_disable("m0_rpc__fop_post", "fake_error");
83  return 0;
84 }
85 
86 static void conn_init(void)
87 {
88  int rc;
89  rc = m0_rpc_conn_init(&conn, NULL, &ep, &machine, 1);
90  M0_UT_ASSERT(rc == 0);
93 }
94 
95 static void fop_set_session(struct m0_fop *fop)
96 {
98 }
99 
100 static void conn_init_fini_test(void)
101 {
102  struct m0_uint128 uuid;
103  int rc;
104 
105  /* Checks for RPC connection initialisation and finalisation. */
106  conn_init();
107 
108  uuid = conn.c_uuid;
109 
111 
112  /* Check for Receive side conn init and fini */
116  M0_UT_ASSERT(rc == 0);
120 
122 }
123 
124 static void conn_init_and_establish(void)
125 {
126  int rc;
127  /* Checks for Conn M0_RPC_CONN_INITIALISED => M0_RPC_CONN_CONNECTING */
128  conn_init();
129 
131  M0_UT_ASSERT(rc == 0);
133 
136 
137  est_fop.f_item.ri_error = 0;
138  est_reply.rcer_sender_id = SENDER_ID; /* sender_id_allocate() */
139  est_reply.rcer_rc = 0;
141 
142 }
143 
144 static void conn_establish_reply(void)
145 {
146  /* Checks for Conn M0_RPC_CONN_CONNECTING => M0_RPC_CONN_ACTIVE */
151 }
152 
153 static void conn_terminate(void)
154 {
155  int rc;
156  /* Checks for Conn M0_RPC_CONN_ACTIVE => M0_RPC_CONN_TERMINATING */
158  M0_UT_ASSERT(rc == 0);
160 
163 
166  term_reply.ctr_rc = 0;
168 
169 }
170 
172 {
173  /* Checks for Conn M0_RPC_CONN_TERMINATING => M0_RPC_CONN_TERMINATED */
174 
179 
180  /* Checks for Conn M0_RPC_CONN_TERMINATED => M0_RPC_CONN_FINALISED */
182 }
183 
184 static void conn_check(void)
185 {
188  conn_terminate();
190 }
191 
192 static void conn_init_fail_test(void)
193 {
194  int rc;
195  /* Checks for m0_rpc_conn_init() failure due to allocation failure */
196  m0_fi_enable_once("m0_alloc", "fail_allocation");
197  rc = m0_rpc_conn_init(&conn, NULL, &ep, &machine, 1);
198  M0_UT_ASSERT(rc == -ENOMEM);
199 
200  /* Checks for failure due to error in rpc_chan_get() */
201  m0_fi_enable_once("rpc_chan_get", "fake_error");
202  rc = m0_rpc_conn_init(&conn, NULL, &ep, &machine, 1);
203  M0_UT_ASSERT(rc == -ENOMEM);
204 }
205 
206 static void conn_establish_fail_test(void)
207 {
208  int rc;
209  /* Checks for Conn M0_RPC_CONN_INITIALISED => M0_RPC_CONN_FAILED */
210  conn_init();
211 
212  m0_fi_enable_once("m0_rpc__fop_post", "fake_error");
214  M0_UT_ASSERT(rc == -EINVAL);
216 
218 
219  /* Allocation failure */
220  conn_init();
221 
222  m0_fi_enable_once("m0_alloc", "fail_allocation");
224  M0_UT_ASSERT(rc == -ENOMEM);
226 
228 }
229 
231 {
232  /* Checks for Conn M0_RPC_CONN_CONNECTING => M0_RPC_CONN_FAILED */
234 
235  est_fop.f_item.ri_error = -EINVAL;
238  M0_UT_ASSERT(conn.c_sm.sm_rc == -EINVAL);
241 
243  est_fop.f_item.ri_error = 0;
244 
245  /* Due to invalid sender id. */
247 
251  M0_UT_ASSERT(conn.c_sm.sm_rc == -EPROTO);
254 
256  est_reply.rcer_sender_id = SENDER_ID; /* restore */
257 
258 }
259 
260 static void conn_terminate_fail_test(void)
261 {
262  int rc;
263  /* Checks for Conn M0_RPC_CONN_ACTIVE => M0_RPC_CONN_FAILED */
266 
267  m0_fi_enable_once("m0_alloc", "fail_allocation");
269  M0_UT_ASSERT(rc == -ENOMEM);
271 
273 
274  /* Due to m0_rpc__fop_post() failure. */
277 
278  m0_fi_enable_once("m0_rpc__fop_post", "fake_error");
280  M0_UT_ASSERT(rc == -EINVAL);
282 
284 }
285 
287 {
288  /* Checks for Conn M0_RPC_CONN_TERMINATING => M0_RPC_CONN_FAILED */
291  conn_terminate();
292 
293  term_fop.f_item.ri_error = -EINVAL;
297  M0_UT_ASSERT(conn.c_sm.sm_rc == -EINVAL);
299 
302 
303  /* Due to non-matching sender id. */
306  conn_terminate();
307 
312  M0_UT_ASSERT(conn.c_sm.sm_rc == -EPROTO);
314 
316 }
317 
319  .ts_name = "rpc-connection-ut",
320  .ts_init = conn_ut_init,
321  .ts_fini = conn_ut_fini,
322  .ts_tests = {
323  { "conn-init-fini", conn_init_fini_test },
324  { "conn-check", conn_check },
325  { "conn-init-fail", conn_init_fail_test },
326  { "conn-establish-fail", conn_establish_fail_test },
327  { "conn-terminate-fail", conn_terminate_fail_test },
328  { "conn-establish-reply-fail", conn_establish_reply_fail_test},
329  { "conn-terminate_reply-fail", conn_terminate_reply_fail_test},
330  { NULL, NULL}
331  }
332 };
333 M0_EXPORTED(conn_ut);
M0_INTERNAL int m0_uint128_cmp(const struct m0_uint128 *u0, const struct m0_uint128 *u1)
Definition: misc.c:45
void * fd_data
Definition: fop.h:75
static void conn_init_fail_test(void)
Definition: conn.c:192
static struct m0_rpc_fop_conn_establish_rep est_reply
Definition: conn.c:41
static struct m0_rpc_machine machine
Definition: conn.c:34
struct m0_uint128 uuid[1000]
Definition: uuid.c:73
static int conn_ut_init(void)
Definition: conn.c:50
#define NULL
Definition: misc.h:38
static void conn_terminate_reply_fail_test(void)
Definition: conn.c:286
struct m0_tl rm_outgoing_conns
Definition: rpc_machine.h:95
static struct m0_fop term_fop
Definition: conn.c:37
int32_t ri_error
Definition: item.h:161
Definition: ut.h:77
M0_INTERNAL void m0_rpc_conn_establish_reply_received(struct m0_rpc_item *item)
Definition: conn.c:926
M0_INTERNAL void m0_sm_group_fini(struct m0_sm_group *grp)
Definition: sm.c:65
M0_INTERNAL int m0_rpc_conn_terminate(struct m0_rpc_conn *conn, m0_time_t abs_timeout)
Definition: conn.c:1009
static void fop_set_session(struct m0_fop *fop)
Definition: conn.c:95
struct m0_sm_group rm_sm_grp
Definition: rpc_machine.h:82
struct m0_sm c_sm
Definition: conn.h:322
Definition: sock.c:754
static struct m0_rpc_fop_conn_terminate_rep term_reply
Definition: conn.c:42
static void conn_check(void)
Definition: conn.c:184
struct m0_rpc_machine * c_rpc_machine
Definition: conn.h:278
static struct m0_fop term_fop_rep
Definition: conn.c:39
static int conn_ut_fini(void)
Definition: conn.c:69
M0_INTERNAL void m0_rpc_machine_unlock(struct m0_rpc_machine *machine)
Definition: rpc_machine.c:558
static void conn_establish_reply_fail_test(void)
Definition: conn.c:230
M0_INTERNAL void m0_fi_disable(const char *fp_func, const char *fp_tag)
Definition: finject.c:485
static void m0_fi_enable(const char *func, const char *tag)
Definition: finject.h:276
M0_INTERNAL void m0_sm_group_init(struct m0_sm_group *grp)
Definition: sm.c:53
static struct m0_fop est_fop
Definition: conn.c:36
struct m0_tl rm_watch
Definition: rpc_machine.h:124
M0_TL_DEFINE(rpc_conn_ut, static, struct m0_rpc_conn)
M0_INTERNAL int m0_rpc_rcv_conn_init(struct m0_rpc_conn *conn, struct m0_net_end_point *ep, struct m0_rpc_machine *machine, const struct m0_uint128 *uuid)
Definition: conn.c:525
struct m0_rpc_item * ri_reply
Definition: item.h:163
int32_t sm_rc
Definition: sm.h:336
struct m0_tl rm_incoming_conns
Definition: rpc_machine.h:94
struct m0_uint128 c_uuid
Definition: conn.h:272
Definition: conn.c:31
static void conn_terminate_reply_and_fini(void)
Definition: conn.c:171
const char * ts_name
Definition: ut.h:99
struct m0_fop_data f_data
Definition: fop.h:82
static void conn_init(void)
Definition: conn.c:86
struct m0_ut_suite conn_ut
Definition: conn.c:318
static struct m0_fop est_fop_rep
Definition: conn.c:38
M0_INTERNAL void m0_rpc_machine_lock(struct m0_rpc_machine *machine)
Definition: rpc_machine.c:551
m0_time_t m0_time_from_now(uint64_t secs, long ns)
Definition: time.c:96
struct m0_rpc_session * ri_session
Definition: item.h:147
static void conn_establish_fail_test(void)
Definition: conn.c:206
M0_INTERNAL void m0_rpc_conn_terminate_reply_received(struct m0_rpc_item *item)
Definition: conn.c:1126
M0_INTERNAL int m0_rpc_conn_establish(struct m0_rpc_conn *conn, m0_time_t abs_timeout)
Definition: conn.c:857
static struct m0_fop * fop
Definition: item.c:57
M0_INTERNAL struct m0_rpc_session * m0_rpc_conn_session0(const struct m0_rpc_conn *conn)
Definition: conn.c:749
static struct m0_rpc_conn conn
Definition: conn.c:35
static void m0_fi_enable_once(const char *func, const char *tag)
Definition: finject.h:301
M0_INTERNAL int m0_rpc_conn_init(struct m0_rpc_conn *conn, struct m0_fid *svc_fid, struct m0_net_end_point *ep, struct m0_rpc_machine *machine, uint64_t max_rpcs_in_flight)
Definition: conn.c:293
static void conn_terminate(void)
Definition: conn.c:153
M0_TL_DESCR_DEFINE(rpc_conn_ut, "rpc-conn", static, struct m0_rpc_conn, c_link, c_magic, M0_RPC_CONN_MAGIC, M0_RPC_CONN_HEAD_MAGIC)
static void conn_init_fini_test(void)
Definition: conn.c:100
static void conn_establish_reply(void)
Definition: conn.c:144
static void conn_init_and_establish(void)
Definition: conn.c:124
struct m0_rpc_item f_item
Definition: fop.h:83
int32_t rc
Definition: trigger_fop.h:47
M0_INTERNAL void m0_rpc_conn_fini(struct m0_rpc_conn *conn)
Definition: conn.c:558
#define M0_UT_ASSERT(a)
Definition: ut.h:46
Definition: fop.h:79
static void conn_terminate_fail_test(void)
Definition: conn.c:260
static int conn_state(const struct m0_rpc_conn *conn)
Definition: conn_internal.h:66