Motr  M0
sd_apply_filter.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2017-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 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_FDMI
24 #include "lib/trace.h"
25 
26 #include "lib/memory.h"
27 #include "ut/ut.h"
28 #include "fdmi/fdmi.h"
29 #include "fdmi/service.h" /* m0_reqh_fdmi_service */
31 
32 #include "fdmi/ut/sd_common.h"
33 
34 static struct m0_semaphore g_sem;
35 static struct m0_semaphore g_sem2;
36 static char g_fdmi_data[] = "hello, FDMI";
37 static struct m0_fdmi_src_rec g_src_rec;
38 static int g_refcount;
39 
40 /*********** FilterC stub ***********/
41 
43 static char *g_var_str;
44 
45 static int filterc_apply_flt_start(struct m0_filterc_ctx *ctx,
46  struct m0_reqh *reqh);
47 
48 static void filterc_apply_flt_stop(struct m0_filterc_ctx *ctx);
49 
50 static int filterc_apply_flt_open(struct m0_filterc_ctx *ctx,
51  enum m0_fdmi_rec_type_id rec_type_id,
52  struct m0_filterc_iter *iter);
53 
54 static int filterc_apply_flt_get_next(struct m0_filterc_iter *iter,
55  struct m0_conf_fdmi_filter **out);
56 
57 static void filterc_apply_flt_close(struct m0_filterc_iter *iter);
58 
61  .fco_stop = filterc_apply_flt_stop,
62  .fco_open = filterc_apply_flt_open,
63  .fco_get_next = filterc_apply_flt_get_next,
64  .fco_close = filterc_apply_flt_close
65 };
66 
68  struct m0_reqh *reqh)
69 {
70  return 0;
71 }
72 
74 {
75 }
76 
78  enum m0_fdmi_rec_type_id rec_type_id,
79  struct m0_filterc_iter *iter)
80 {
81  return 0;
82 }
83 
85  struct m0_conf_fdmi_filter **out)
86 {
87  int rc;
88  static bool first_filter = true;
89  struct m0_fdmi_filter *flt = &g_conf_filter.ff_filter;
90  struct m0_fdmi_flt_node *root;
91  struct m0_buf var = M0_BUF_INITS(g_var_str);
92 
93  if (first_filter) {
95  M0_FFO_OR,
98 
100 
102 
103  *out = &g_conf_filter;
104  rc = 1;
105  first_filter = false;
106  } else {
107  *out = NULL;
108  rc = 0;
109  }
110  return rc;
111 }
112 
113 static void filterc_apply_flt_close(struct m0_filterc_iter *iter)
114 {
116 }
117 
118 /*********** Source definition ***********/
119 static int test_fs_node_eval(
120  struct m0_fdmi_src_rec *src_rec,
121  struct m0_fdmi_flt_var_node *value_desc,
122  struct m0_fdmi_flt_operand *value)
123 {
124  M0_UT_ASSERT(src_rec == &g_src_rec);
125  M0_UT_ASSERT(src_rec->fsr_data == &g_fdmi_data);
126  M0_UT_ASSERT(value_desc->ffvn_data.b_nob == strlen(g_var_str));
127  M0_UT_ASSERT(value_desc->ffvn_data.b_addr == g_var_str);
128 
130  return 0;
131 }
132 
133 static int test_fs_encode(struct m0_fdmi_src_rec *src_rec,
134  struct m0_buf *buf)
135 {
136  M0_UT_ASSERT(false);
137  return 0;
138 }
139 
140 
141 static void test_fs_get(struct m0_fdmi_src_rec *src_rec)
142 {
143  ++g_refcount;
144 }
145 
146 static void test_fs_put(struct m0_fdmi_src_rec *src_rec)
147 {
148  M0_UT_ASSERT(src_rec != NULL);
149  M0_UT_ASSERT(src_rec == &g_src_rec);
150 
151  --g_refcount;
152  if (g_refcount == 0)
154 }
155 
156 static void test_fs_end(struct m0_fdmi_src_rec *src_rec)
157 {
158  M0_UT_ASSERT(src_rec != NULL);
159  M0_UT_ASSERT(src_rec == &g_src_rec);
160  /* Calling of this function is a sign for fdmi_sd_post_record UT
161  * that FDMI finished record processing */
163 }
164 
165 static struct m0_fdmi_src *src_alloc()
166 {
167  struct m0_fdmi_src *src;
168  int rc;
169 
171  M0_UT_ASSERT(rc == 0);
172 
173  src->fs_node_eval = test_fs_node_eval;
174  src->fs_get = test_fs_get;
175  src->fs_put = test_fs_put;
176  src->fs_end = test_fs_end;
177  src->fs_encode = test_fs_encode;
178  return src;
179 }
180 
182 {
183  struct m0_fdmi_src *src = src_alloc();
184  int rc;
185 
186  M0_ENTRY();
187 
188  g_var_str = strdup("test");
190 
195  M0_UT_ASSERT(rc == 0);
196  g_src_rec = (struct m0_fdmi_src_rec) {
197  .fsr_src = src,
198  .fsr_data = g_fdmi_data,
199  };
201  /* Wait until record is processed and released */
209  M0_LEAVE();
210 }
211 
213 {
214  M0_ENTRY();
216  M0_LEAVE();
217 }
218 
219 #undef M0_TRACE_SUBSYSTEM
220 
221 /*
222  * Local variables:
223  * c-indentation-style: "K&R"
224  * c-basic-offset: 8
225  * tab-width: 8
226  * fill-column: 80
227  * scroll-step: 1
228  * End:
229  */
230 /*
231  * vim: tabstop=8 shiftwidth=8 noexpandtab textwidth=80 nowrap
232  */
static struct m0_fdmi_src_rec g_src_rec
static char * g_var_str
#define NULL
Definition: misc.h:38
static struct m0_semaphore g_sem2
M0_INTERNAL void m0_fdmi_filter_init(struct m0_fdmi_filter *flt)
Definition: filter.c:39
void * b_addr
Definition: buf.h:39
M0_INTERNAL void m0_fdmi_flt_bool_opnd_fill(struct m0_fdmi_flt_operand *opnd, bool value)
Definition: filter.c:125
M0_LEAVE()
static int test_fs_node_eval(struct m0_fdmi_src_rec *src_rec, struct m0_fdmi_flt_var_node *value_desc, struct m0_fdmi_flt_operand *value)
int const char const void * value
Definition: dir.c:325
M0_INTERNAL void m0_fdmi_source_free(struct m0_fdmi_src *src)
Definition: source_dock.c:301
struct m0_fdmi_filter ff_filter
Definition: obj.h:731
#define M0_SET0(obj)
Definition: misc.h:64
const struct m0_filterc_ops filterc_apply_flt_ops
static void filterc_apply_flt_close(struct m0_filterc_iter *iter)
Definition: sock.c:887
struct m0_fdmi_src * fsr_src
Definition: src_rec.h:72
void fdmi_serv_start_ut(const struct m0_filterc_ops *filterc_ops)
Definition: sd_common.c:66
struct m0_fdmi_flt_node * m0_fdmi_flt_bool_node_create(bool value)
Definition: filter.c:136
#define M0_ENTRY(...)
Definition: trace.h:170
Definition: buf.h:37
M0_INTERNAL int m0_fdmi_source_alloc(enum m0_fdmi_rec_type_id type_id, struct m0_fdmi_src **src)
Definition: source_dock.c:285
struct m0_conf_root * root
Definition: note.c:50
struct m0_fdmi_flt_node * m0_fdmi_flt_op_node_create(enum m0_fdmi_flt_op_code op_code, struct m0_fdmi_flt_node *left, struct m0_fdmi_flt_node *right)
Definition: filter.c:227
m0_bcount_t b_nob
Definition: buf.h:38
struct m0_fdmi_flt_node * m0_fdmi_flt_var_node_create(struct m0_buf *data)
Definition: filter.c:209
M0_INTERNAL void m0_fdmi_source_deregister(struct m0_fdmi_src *src)
Definition: source_dock.c:337
static void test_fs_get(struct m0_fdmi_src_rec *src_rec)
void * fsr_data
Definition: src_rec.h:75
M0_INTERNAL int m0_fdmi_source_register(struct m0_fdmi_src *src)
Definition: source_dock.c:311
M0_INTERNAL int m0_semaphore_init(struct m0_semaphore *semaphore, unsigned value)
Definition: semaphore.c:38
struct m0_buf ffvn_data
Definition: filter.h:193
#define M0_BUF_INITS(str)
Definition: buf.h:70
Definition: reqh.h:94
static char g_fdmi_data[]
static void test_fs_end(struct m0_fdmi_src_rec *src_rec)
static int filterc_apply_flt_start(struct m0_filterc_ctx *ctx, struct m0_reqh *reqh)
static struct m0_fdmi_src * src_alloc()
M0_INTERNAL void m0_fdmi_filter_fini(struct m0_fdmi_filter *flt)
Definition: filter.c:113
m0_fdmi_rec_type_id
Definition: fdmi.h:234
static void filterc_apply_flt_stop(struct m0_filterc_ctx *ctx)
void fdmi_serv_stop_ut(void)
Definition: sd_common.c:121
static struct m0_semaphore g_sem
M0_INTERNAL void m0_fdmi_filter_root_set(struct m0_fdmi_filter *flt, struct m0_fdmi_flt_node *root)
Definition: filter.c:49
void fdmi_sd_apply_filter(void)
static bool first_filter
Definition: sd_send_not.c:49
struct m0_reqh reqh
Definition: rm_foms.c:48
M0_INTERNAL void m0_semaphore_fini(struct m0_semaphore *semaphore)
Definition: semaphore.c:45
#define M0_FDMI_SOURCE_POST_RECORD(_src_rec_ptr)
Definition: source_dock.h:148
static void test_fs_put(struct m0_fdmi_src_rec *src_rec)
static int test_fs_encode(struct m0_fdmi_src_rec *src_rec, struct m0_buf *buf)
int(* fco_start)(struct m0_filterc_ctx *ctx, struct m0_reqh *reqh)
Definition: filterc.h:56
static int filterc_apply_flt_open(struct m0_filterc_ctx *ctx, enum m0_fdmi_rec_type_id rec_type_id, struct m0_filterc_iter *iter)
M0_INTERNAL void m0_semaphore_down(struct m0_semaphore *semaphore)
Definition: semaphore.c:49
Definition: nucleus.c:42
#define out(...)
Definition: gen.c:41
M0_INTERNAL void m0_semaphore_up(struct m0_semaphore *semaphore)
Definition: semaphore.c:65
struct m0_fom_ops ops
Definition: io_foms.c:623
static int filterc_apply_flt_get_next(struct m0_filterc_iter *iter, struct m0_conf_fdmi_filter **out)
static struct m0_conf_fdmi_filter g_conf_filter
static int g_refcount
static void fdmi_sd_apply_filter_internal(const struct m0_filterc_ops *ops)
struct m0_pdclust_src_addr src
Definition: fd.c:108
int32_t rc
Definition: trigger_fop.h:47
#define M0_UT_ASSERT(a)
Definition: ut.h:46