Motr  M0
session.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 "rpc/rpc_internal.h"
28 
29 enum {
30  SENDER_ID = 1001,
31  SESSION_ID = 101,
32 };
33 
34 static struct m0_rpc_machine machine;
35 static struct m0_rpc_conn conn;
36 static struct m0_rpc_session session;
37 static struct m0_rpc_session session0;
38 
39 /* This structure defination is copied from rpc/session.c. */
40 static struct fop_session_establish_ctx {
42  struct m0_fop sec_fop;
45 } est_ctx;
46 
47 static struct m0_fop est_fop_rep;
48 static struct m0_fop term_fop;
49 static struct m0_fop term_fop_rep;
50 
55 
56 static void fop_set_session0(struct m0_fop *fop)
57 {
59 }
60 
61 static int session_ut_init(void)
62 {
63  int rc;
64 
67  rpc_session_tlist_init(&conn.c_sessions);
68  rmach_watch_tlist_init(&machine.rm_watch);
69 
72  M0_ASSERT(rc == 0);
74 
77 
82 
83  m0_fi_enable("m0_rpc__fop_post", "do_nothing");
84  return 0;
85 }
86 
87 static int session_ut_fini(void)
88 {
91  rmach_watch_tlist_fini(&machine.rm_watch);
92  rpc_session_tlist_fini(&conn.c_sessions);
94  m0_fi_disable("m0_rpc__fop_post", "do_nothing");
95  m0_fi_disable("m0_rpc__fop_post", "fake_error");
96  m0_fi_disable("m0_alloc", "fail_allocation");
97  return 0;
98 }
99 
100 static void session_init(void)
101 {
102  int rc;
103 
105  M0_UT_ASSERT(rc == 0);
107 }
108 
109 static void session_init_fini_test(void)
110 {
111  session_init();
112 
114 }
115 
116 static void prepare_fake_est_reply(void)
117 {
121 
122  est_reply.rser_session_id = SESSION_ID; /* session_id_allocate() */
123  est_reply.rser_sender_id = SENDER_ID; /* sender_id_allocate() */
124  est_reply.rser_rc = 0;
125 
127 }
128 
129 static void session_init_and_establish(void)
130 {
131  int rc;
132 
133  /* Session transition from INITIALISED => ESTABLISHING */
134  session_init();
135 
138  M0_UT_ASSERT(rc == 0);
140 
142 }
143 
144 static void session_establish_reply(int err)
145 {
146  /* Session transition from ESTABLISHING => IDLE | FAILED */
151 }
152 
153 static void prepare_fake_term_reply(void)
154 {
159 
162  term_reply.rstr_rc = 0;
163 
165 }
166 
167 static void session_terminate(void)
168 {
169  int rc;
170 
171  /* Session transition from IDLE => TERMINATING */
173  M0_UT_ASSERT(rc == 0);
175 
177  M0_UT_ASSERT(rc == 0);
179 
181 }
182 
184 {
185  /* Session transition from TERMINATING => TERMINATED | FAILED */
186  term_fop.f_item.ri_error = err;
190  M0_UT_ASSERT(err == 0 ?
193 
195 }
196 
197 static void session_hold_release(void)
198 {
199  /* Session transition from IDLE => BUSY => IDLE */
206 }
207 
208 static void session_check(void)
209 {
210  /* Checks for session states transitions,
211  INITIALISED => ESTABLISHING => IDLE => BUSY => IDLE =>
212  TERMINATING => FINALISED.
213  */
220 }
221 
223 {
224  int rc;
225 
227 
228  /* Checks for Session state transition,
229  M0_RPC_SESSION_INITIALISED => M0_RPC_SESSION_FAILED
230  */
231  session_init();
232 
233  m0_fi_enable_once("m0_rpc__fop_post", "fake_error");
235  M0_UT_ASSERT(rc == -EINVAL);
237 
239 
240  /* Allocation failure */
241  session_init();
242 
243  m0_fi_enable_once("m0_alloc", "fail_allocation");
245  M0_UT_ASSERT(rc == -ENOMEM);
247 
249 }
250 
252 {
253  /* Checks for Session state transition,
254  M0_RPC_SESSION_ESTABLISHING => M0_RPC_SESSION_FAILED
255  */
257 
258  session_establish_reply(-EINVAL);
259  M0_UT_ASSERT(session.s_sm.sm_rc == -EINVAL);
261 
263 
264  /* Due to invalid sender id. */
266 
269  M0_UT_ASSERT(session.s_sm.sm_rc == -EPROTO);
271 
273 
274  /* Due to error in establish reply fop. */
276 
277  est_reply.rser_rc = -EINVAL;
279  M0_UT_ASSERT(session.s_sm.sm_rc == -EINVAL);
281 
283 }
284 
286 {
287  int rc;
288 
289  /* Checks for session M0_RPC_SESSION_IDLE => M0_RPC_SESSION_FAILED */
292 
293  m0_fi_enable_once("m0_rpc_session_terminate", "fail_allocation");
295  M0_UT_ASSERT(rc == -ENOMEM);
297 
299 
300  /* Due to m0_rpc__fop_post() failure. */
303 
304  m0_fi_enable_once("m0_rpc__fop_post", "fake_error");
306  M0_UT_ASSERT(rc == -EINVAL);
308 
310 }
311 
313 {
314  /* Checks for M0_RPC_SESSION_TERMINATING => M0_RPC_SESSION_FAILED */
318 
320 }
321 
323  .ts_name = "rpc-session-ut",
324  .ts_init = session_ut_init,
325  .ts_fini = session_ut_fini,
326  .ts_tests = {
327  { "session-init-fini", session_init_fini_test},
328  { "session-check", session_check},
329  { "session-establish-fail", session_establish_fail_test},
330  { "session-terminate-fail", session_terminate_fail_test},
331  { "session-establish-reply-fail", session_establish_reply_fail_test},
332  { "session-terminate_reply-fail", session_terminate_reply_fail_test},
333  { NULL, NULL}
334  }
335 };
336 M0_EXPORTED(session_ut);
static struct m0_rpc_session session0
Definition: session.c:37
void * fd_data
Definition: fop.h:75
#define NULL
Definition: misc.h:38
static void session_terminate_fail_test(void)
Definition: session.c:285
static void session_hold_release(void)
Definition: session.c:197
M0_EXTERN struct m0_rpc_session * m0_rpc_conn_session0(const struct m0_rpc_conn *conn)
Definition: conn.c:749
static void session_check(void)
Definition: session.c:208
int32_t ri_error
Definition: item.h:161
static void session_establish_reply(int err)
Definition: session.c:144
static void session_establish_reply_fail_test(void)
Definition: session.c:251
M0_INTERNAL void m0_rpc_session_fini(struct m0_rpc_session *session)
Definition: session.c:292
static struct m0_rpc_session session
Definition: session.c:36
Definition: ut.h:77
static void session_init_fini_test(void)
Definition: session.c:109
M0_INTERNAL void m0_sm_group_fini(struct m0_sm_group *grp)
Definition: sm.c:65
struct m0_sm_group rm_sm_grp
Definition: rpc_machine.h:82
struct m0_sm c_sm
Definition: conn.h:322
static int session_ut_fini(void)
Definition: session.c:87
struct m0_fop sec_fop
Definition: session.c:57
struct m0_rpc_machine * c_rpc_machine
Definition: conn.h:278
struct m0_rpc_fop_session_establish est
Definition: session.c:51
M0_INTERNAL void m0_rpc_machine_unlock(struct m0_rpc_machine *machine)
Definition: rpc_machine.c:558
static void session_terminate(void)
Definition: session.c:167
uint64_t c_sender_id
Definition: conn.h:269
M0_INTERNAL int m0_rpc_session_init(struct m0_rpc_session *session, struct m0_rpc_conn *conn)
Definition: session.c:204
static struct fop_session_establish_ctx est_ctx
static void prepare_fake_est_reply(void)
Definition: session.c:116
M0_INTERNAL void m0_fi_disable(const char *fp_func, const char *fp_tag)
Definition: finject.c:485
M0_INTERNAL void m0_rpc_session_hold_busy(struct m0_rpc_session *session)
Definition: session.c:782
static void m0_fi_enable(const char *func, const char *tag)
Definition: finject.h:276
M0_INTERNAL int m0_rpc_session_terminate(struct m0_rpc_session *session, m0_time_t abs_timeout)
Definition: session.c:622
#define M0_ASSERT(cond)
static struct m0_rpc_conn conn
Definition: session.c:35
static struct m0_fop est_fop_rep
Definition: session.c:47
M0_INTERNAL void m0_sm_group_init(struct m0_sm_group *grp)
Definition: sm.c:53
static struct m0_rpc_machine machine
Definition: session.c:34
struct m0_tl rm_watch
Definition: rpc_machine.h:124
struct m0_ut_suite session_ut
Definition: session.c:322
M0_INTERNAL int session_state(const struct m0_rpc_session *session)
Definition: session.c:141
static struct m0_fop term_fop_rep
Definition: session.c:49
struct m0_rpc_item * ri_reply
Definition: item.h:163
static void session_establish_fail_test(void)
Definition: session.c:222
static void session_init_and_establish(void)
Definition: session.c:129
int32_t sm_rc
Definition: sm.h:336
struct m0_rpc_fop_session_establish_rep est_reply
Definition: session.c:52
struct m0_rpc_session * sec_session
Definition: session.c:60
static int session_ut_init(void)
Definition: session.c:61
struct m0_sm s_sm
Definition: session.h:325
static void fop_set_session0(struct m0_fop *fop)
Definition: session.c:56
struct m0_tl c_sessions
Definition: conn.h:308
const char * ts_name
Definition: ut.h:99
struct m0_fop_data f_data
Definition: fop.h:82
static void session_init(void)
Definition: session.c:100
M0_INTERNAL void m0_rpc_session_establish_reply_received(struct m0_rpc_item *item)
Definition: session.c:487
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
static void session_terminate_reply_fail_test(void)
Definition: session.c:312
struct m0_rpc_session * ri_session
Definition: item.h:147
static struct m0_fop * fop
Definition: item.c:57
M0_INTERNAL int m0_rpc_session_establish(struct m0_rpc_session *session, m0_time_t abs_timeout)
Definition: session.c:390
static void m0_fi_enable_once(const char *func, const char *tag)
Definition: finject.h:301
struct m0_rpc_fop_session_terminate_rep term_reply
Definition: session.c:54
struct m0_rpc_fop_session_terminate term
Definition: session.c:53
static void prepare_fake_term_reply(void)
Definition: session.c:153
M0_INTERNAL void m0_rpc_session_terminate_reply_received(struct m0_rpc_item *item)
Definition: session.c:715
uint64_t s_session_id
Definition: session.h:309
static void session_terminate_reply_and_fini(int err)
Definition: session.c:183
struct m0_rpc_item f_item
Definition: fop.h:83
uint32_t sm_state
Definition: sm.h:307
M0_INTERNAL void m0_rpc_session_release(struct m0_rpc_session *session)
Definition: session.c:791
int32_t rc
Definition: trigger_fop.h:47
#define M0_UT_ASSERT(a)
Definition: ut.h:46
static struct m0_fop term_fop
Definition: session.c:48
Definition: fop.h:79