Motr  M0
slist.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" /* M0_UT_ASSERT */
24 #include "lib/types.h" /* m0_bcount_t */
25 #include "lib/vec.h" /* m0_bufvec */
26 
27 #include "net/test/slist.h"
28 
29 enum {
32 };
33 
34 static void slist_check(struct m0_net_test_slist *slist, int nr, char *buf)
35 {
36  int i;
37  int rc;
38 
39  /* check number of string in string list */
40  M0_UT_ASSERT(slist->ntsl_nr == nr + 1);
41  M0_UT_ASSERT(slist->ntsl_list != NULL);
42  /* for every string in the list */
43  for (i = 0; i < nr; ++i) {
44  /* check the string content */
45  rc = memcmp(slist->ntsl_list[i], &buf[i * 3], 2);
46  M0_UT_ASSERT(rc == 0);
47  /* check the string size */
48  rc = strlen(slist->ntsl_list[i]);
49  M0_UT_ASSERT(rc == 2);
50  }
51 }
52 
54 {
55  struct m0_net_test_slist slist;
56  static char buf[NET_TEST_SLIST_NR * 3];
57  int i;
58  int rc;
59  bool rc_bool;
60  static char bv_buf[NET_TEST_SLIST_BV_LEN];
61  void *bv_addr = bv_buf;
63  struct m0_bufvec bv = M0_BUFVEC_INIT_BUF(&bv_addr, &bv_len);
64  m0_bcount_t len;
65  m0_bcount_t len2;
66 
67 
68  /* empty string test */
69  rc = m0_net_test_slist_init(&slist, "", ':');
70  M0_UT_ASSERT(rc == 0);
71  M0_UT_ASSERT(slist.ntsl_nr == 0);
72  rc_bool = m0_net_test_slist_unique(&slist);
73  M0_UT_ASSERT(rc_bool);
75  &bv, 0);
76  M0_UT_ASSERT(len > 0);
77  m0_net_test_slist_fini(&slist);
79  &bv, 0);
80  M0_UT_ASSERT(len2 == len);
81  M0_UT_ASSERT(slist.ntsl_nr == 0);
82  m0_net_test_slist_fini(&slist);
83  /* one string test */
84  rc = m0_net_test_slist_init(&slist, "asdf", ',');
85  M0_UT_ASSERT(rc == 0);
86  M0_UT_ASSERT(slist.ntsl_nr == 1);
87  M0_UT_ASSERT(slist.ntsl_list != NULL);
88  M0_UT_ASSERT(slist.ntsl_list[0] != NULL);
89  M0_UT_ASSERT(strncmp(slist.ntsl_list[0], "asdf", 5) == 0);
90  rc_bool = m0_net_test_slist_unique(&slist);
91  M0_UT_ASSERT(rc_bool);
92  m0_net_test_slist_fini(&slist);
93  /* one-of-strings-is-empty test */
94  rc = m0_net_test_slist_init(&slist, "asdf,", ',');
95  M0_UT_ASSERT(rc == 0);
96  M0_UT_ASSERT(slist.ntsl_nr == 2);
97  M0_UT_ASSERT(slist.ntsl_list != NULL);
98  for (i = 0; i < 2; ++i)
99  M0_UT_ASSERT(slist.ntsl_list[i] != NULL);
100  M0_UT_ASSERT(strncmp(slist.ntsl_list[0], "asdf", 5) == 0);
101  M0_UT_ASSERT(strncmp(slist.ntsl_list[1], "", 1) == 0);
102  rc_bool = m0_net_test_slist_unique(&slist);
103  M0_UT_ASSERT(rc_bool);
104  m0_net_test_slist_fini(&slist);
105  /* many strings test */
106  /* fill string with some pattern (for example, "01,12,23,34\0") */
107  for (i = 0; i < NET_TEST_SLIST_NR; ++i) {
108  buf[i * 3] = '0' + i % 10;
109  buf[i * 3 + 1] = '0' + (i + 1) % 10;
110  buf[i * 3 + 2] = ',';
111  }
112  /* run test for every string number in [0, NET_TEST_SLIST_NR) */
113  for (i = 0; i < NET_TEST_SLIST_NR; ++i) {
114  /* cut the line */
115  buf[i * 3 + 2] = '\0';
116  /* alloc slist */
117  rc = m0_net_test_slist_init(&slist, buf, ',');
118  M0_UT_ASSERT(rc == 0);
119  rc_bool = m0_net_test_slist_unique(&slist);
120  M0_UT_ASSERT(!rc_bool ^ (i < 10));
121  slist_check(&slist, i, buf);
122  /* serialize string list to buffer */
124  &bv, 0);
125  M0_UT_ASSERT(len > 0);
126  /* free slist */
127  m0_net_test_slist_fini(&slist);
128  /* deserialize string slist from buffer */
129  /* alloc slist */
131  &slist, &bv, 0);
132  M0_UT_ASSERT(len2 == len);
133  slist_check(&slist, i, buf);
134  /* free slist */
135  m0_net_test_slist_fini(&slist);
136  /* restore line delimiter */
137  buf[i * 3 + 2] = ',';
138  }
139 }
140 
141 /*
142  * Local variables:
143  * c-indentation-style: "K&R"
144  * c-basic-offset: 8
145  * tab-width: 8
146  * fill-column: 79
147  * scroll-step: 1
148  * End:
149  */
#define M0_BUFVEC_INIT_BUF(addr_ptr, count_ptr)
Definition: vec.h:165
static size_t nr
Definition: dump.c:1505
#define NULL
Definition: misc.h:38
void m0_net_test_slist_ut(void)
Definition: slist.c:53
uint64_t m0_bcount_t
Definition: types.h:77
int m0_net_test_slist_init(struct m0_net_test_slist *slist, const char *str, char delim)
Definition: slist.c:57
Definition: sock.c:887
bool m0_net_test_slist_unique(const struct m0_net_test_slist *slist)
Definition: slist.c:129
int i
Definition: dir.c:1033
void m0_net_test_slist_fini(struct m0_net_test_slist *slist)
Definition: slist.c:120
size_t ntsl_nr
Definition: slist.h:49
static void slist_check(struct m0_net_test_slist *slist, int nr, char *buf)
Definition: slist.c:34
m0_bcount_t m0_net_test_slist_serialize(enum m0_net_test_serialize_op op, struct m0_net_test_slist *slist, struct m0_bufvec *bv, m0_bcount_t offset)
Definition: slist.c:235
int32_t rc
Definition: trigger_fop.h:47
#define M0_UT_ASSERT(a)
Definition: ut.h:46
char ** ntsl_list
Definition: slist.h:53
Definition: vec.h:145