2 * Copyright (c) 2018 SUSE Linux GmbH
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
30 /* Stringify helpers */
32 #define str(x) _str_(x)
37 #define DM_NAME "spam"
40 static int setup_uev(void **state)
42 static char test_uid_attrs[] =
43 "dasd:ID_SPAM sd:ID_BOGUS nvme:ID_EGGS ";
45 struct uevent *uev = alloc_uevent();
53 uev->envp[0] = "MAJOR=" str(MAJOR);
54 uev->envp[1] = "ID_SPAM=nonsense";
55 uev->envp[1] = "ID_BOGUS=" WWID;
56 uev->envp[2] = "MINOR=" str(MINOR);
57 uev->envp[3] = "DM_NAME=" DM_NAME;
58 uev->envp[4] = "DISK_RO=" str(DISK_RO);
61 conf = get_multipath_config();
62 parse_uid_attrs(test_uid_attrs, conf);
63 put_multipath_config(conf);
67 static int teardown(void **state)
73 static void test_major_good(void **state)
75 struct uevent *uev = *state;
77 assert_int_equal(uevent_get_major(uev), MAJOR);
80 static void test_minor_good(void **state)
82 struct uevent *uev = *state;
84 assert_int_equal(uevent_get_minor(uev), MINOR);
87 static void test_ro_good(void **state)
89 struct uevent *uev = *state;
91 assert_int_equal(uevent_get_disk_ro(uev), DISK_RO);
94 static void test_uid_attrs(void **state)
96 /* see test_uid_attrs above */
97 struct config *conf = get_multipath_config();
98 vector attrs = &conf->uid_attrs;
100 assert_int_equal(VECTOR_SIZE(attrs), 3);
101 assert_null(get_uid_attribute_by_attrs(conf, "hda"));
102 assert_string_equal("ID_BOGUS",
103 get_uid_attribute_by_attrs(conf, "sdaw"));
104 assert_string_equal("ID_SPAM",
105 get_uid_attribute_by_attrs(conf, "dasdu"));
106 assert_string_equal("ID_EGGS",
107 get_uid_attribute_by_attrs(conf, "nvme2n4"));
108 put_multipath_config(conf);
111 static void test_wwid(void **state)
113 struct uevent *uev = *state;
114 uevent_get_wwid(uev, &conf);
116 assert_string_equal(uev->wwid, WWID);
119 static void test_major_bad_0(void **state)
121 struct uevent *uev = *state;
123 uev->envp[0] = "MAJOR" str(MAJOR);
124 assert_int_equal(uevent_get_major(uev), -1);
127 static void test_major_bad_1(void **state)
129 struct uevent *uev = *state;
131 uev->envp[0] = "MAJOr=" str(MAJOR);
132 assert_int_equal(uevent_get_major(uev), -1);
135 static void test_major_bad_2(void **state)
137 struct uevent *uev = *state;
139 uev->envp[0] = "MAJORIE=" str(MAJOR);
140 assert_int_equal(uevent_get_major(uev), -1);
143 static void test_major_bad_3(void **state)
145 struct uevent *uev = *state;
147 uev->envp[0] = "MAJOR=max";
148 assert_int_equal(uevent_get_major(uev), -1);
151 static void test_major_bad_4(void **state)
153 struct uevent *uev = *state;
155 uev->envp[0] = "MAJOR=0x10";
156 assert_int_equal(uevent_get_major(uev), -1);
159 static void test_major_bad_5(void **state)
161 struct uevent *uev = *state;
163 uev->envp[0] = "MAJO=" str(MAJOR);
164 assert_int_equal(uevent_get_major(uev), -1);
167 static void test_major_bad_6(void **state)
169 struct uevent *uev = *state;
171 uev->envp[0] = "MAJOR=" str(-MAJOR);
172 assert_int_equal(uevent_get_major(uev), -1);
175 static void test_major_bad_7(void **state)
177 struct uevent *uev = *state;
179 uev->envp[0] = "MAJOR=";
180 assert_int_equal(uevent_get_major(uev), -1);
183 static void test_major_bad_8(void **state)
185 struct uevent *uev = *state;
187 uev->envp[0] = "MAJOR";
188 assert_int_equal(uevent_get_major(uev), -1);
191 static void test_dm_name_good(void **state)
193 struct uevent *uev = *state;
194 char *name = uevent_get_dm_name(uev);
196 assert_string_equal(name, DM_NAME);
200 static void test_dm_name_bad_0(void **state)
202 struct uevent *uev = *state;
205 uev->envp[3] = "DM_NAME" DM_NAME;
206 name = uevent_get_dm_name(uev);
207 assert_ptr_equal(name, NULL);
211 static void test_dm_name_bad_1(void **state)
213 struct uevent *uev = *state;
216 uev->envp[3] = "DM_NAMES=" DM_NAME;
217 name = uevent_get_dm_name(uev);
218 assert_ptr_equal(name, NULL);
222 static void test_dm_name_good_1(void **state)
224 struct uevent *uev = *state;
227 /* Note we change index 2 here */
228 uev->envp[2] = "DM_NAME=" DM_NAME;
229 name = uevent_get_dm_name(uev);
230 assert_string_equal(name, DM_NAME);
234 static void test_dm_uuid_false_0(void **state)
236 struct uevent *uev = *state;
238 assert_false(uevent_is_mpath(uev));
241 static void test_dm_uuid_true_0(void **state)
243 struct uevent *uev = *state;
245 uev->envp[3] = "DM_UUID=mpath-foo";
246 assert_true(uevent_is_mpath(uev));
249 static void test_dm_uuid_false_1(void **state)
251 struct uevent *uev = *state;
253 uev->envp[3] = "DM_UUID.mpath-foo";
254 assert_false(uevent_is_mpath(uev));
257 static void test_dm_uuid_false_2(void **state)
259 struct uevent *uev = *state;
261 uev->envp[3] = "DM_UUID=mpath-";
262 assert_false(uevent_is_mpath(uev));
265 static void test_dm_uuid_false_3(void **state)
267 struct uevent *uev = *state;
269 uev->envp[3] = "DM_UU=mpath-foo";
270 assert_false(uevent_is_mpath(uev));
273 static void test_dm_uuid_false_4(void **state)
275 struct uevent *uev = *state;
277 uev->envp[3] = "DM_UUID=mpathfoo";
278 assert_false(uevent_is_mpath(uev));
281 static void test_dm_uuid_false_5(void **state)
283 struct uevent *uev = *state;
285 uev->envp[3] = "DM_UUID=";
286 assert_false(uevent_is_mpath(uev));
289 int test_uevent_get_XXX(void)
291 const struct CMUnitTest tests[] = {
292 cmocka_unit_test(test_major_good),
293 cmocka_unit_test(test_minor_good),
294 cmocka_unit_test(test_ro_good),
295 cmocka_unit_test(test_dm_name_good),
296 cmocka_unit_test(test_uid_attrs),
297 cmocka_unit_test(test_wwid),
298 cmocka_unit_test(test_major_bad_0),
299 cmocka_unit_test(test_major_bad_1),
300 cmocka_unit_test(test_major_bad_2),
301 cmocka_unit_test(test_major_bad_3),
302 cmocka_unit_test(test_major_bad_4),
303 cmocka_unit_test(test_major_bad_5),
304 cmocka_unit_test(test_major_bad_6),
305 cmocka_unit_test(test_major_bad_7),
306 cmocka_unit_test(test_major_bad_8),
307 cmocka_unit_test(test_dm_name_bad_0),
308 cmocka_unit_test(test_dm_name_bad_1),
309 cmocka_unit_test(test_dm_name_good_1),
310 cmocka_unit_test(test_dm_uuid_false_0),
311 cmocka_unit_test(test_dm_uuid_true_0),
312 cmocka_unit_test(test_dm_uuid_false_1),
313 cmocka_unit_test(test_dm_uuid_false_2),
314 cmocka_unit_test(test_dm_uuid_false_3),
315 cmocka_unit_test(test_dm_uuid_false_4),
316 cmocka_unit_test(test_dm_uuid_false_5),
318 return cmocka_run_group_tests(tests, setup_uev, teardown);
325 init_test_verbosity(-1);
326 ret += test_uevent_get_XXX();