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 /* Private prototypes missing in uevent.h */
31 struct uevent * alloc_uevent(void);
32 void uevent_get_wwid(struct uevent *uev);
34 /* Stringify helpers */
36 #define str(x) _str_(x)
41 #define DM_NAME "spam"
44 static int setup_uev(void **state)
46 static char test_uid_attrs[] =
47 "dasd:ID_SPAM sd:ID_BOGUS nvme:ID_EGGS ";
49 struct uevent *uev = alloc_uevent();
57 uev->envp[0] = "MAJOR=" str(MAJOR);
58 uev->envp[1] = "ID_SPAM=nonsense";
59 uev->envp[1] = "ID_BOGUS=" WWID;
60 uev->envp[2] = "MINOR=" str(MINOR);
61 uev->envp[3] = "DM_NAME=" DM_NAME;
62 uev->envp[4] = "DISK_RO=" str(DISK_RO);
65 conf = get_multipath_config();
66 parse_uid_attrs(test_uid_attrs, conf);
67 put_multipath_config(conf);
71 static int teardown(void **state)
77 static void test_major_good(void **state)
79 struct uevent *uev = *state;
81 assert_int_equal(uevent_get_major(uev), MAJOR);
84 static void test_minor_good(void **state)
86 struct uevent *uev = *state;
88 assert_int_equal(uevent_get_minor(uev), MINOR);
91 static void test_ro_good(void **state)
93 struct uevent *uev = *state;
95 assert_int_equal(uevent_get_disk_ro(uev), DISK_RO);
98 static void test_uid_attrs(void **state)
100 /* see test_uid_attrs above */
101 struct config *conf = get_multipath_config();
102 vector attrs = &conf->uid_attrs;
104 assert_int_equal(VECTOR_SIZE(attrs), 3);
105 assert_null(get_uid_attribute_by_attrs(conf, "hda"));
106 assert_string_equal("ID_BOGUS",
107 get_uid_attribute_by_attrs(conf, "sdaw"));
108 assert_string_equal("ID_SPAM",
109 get_uid_attribute_by_attrs(conf, "dasdu"));
110 assert_string_equal("ID_EGGS",
111 get_uid_attribute_by_attrs(conf, "nvme2n4"));
112 put_multipath_config(conf);
115 static void test_wwid(void **state)
117 struct uevent *uev = *state;
118 uevent_get_wwid(uev);
120 assert_string_equal(uev->wwid, WWID);
123 static void test_major_bad_0(void **state)
125 struct uevent *uev = *state;
127 uev->envp[0] = "MAJOR" str(MAJOR);
128 assert_int_equal(uevent_get_major(uev), -1);
131 static void test_major_bad_1(void **state)
133 struct uevent *uev = *state;
135 uev->envp[0] = "MAJOr=" str(MAJOR);
136 assert_int_equal(uevent_get_major(uev), -1);
139 static void test_major_bad_2(void **state)
141 struct uevent *uev = *state;
143 uev->envp[0] = "MAJORIE=" str(MAJOR);
144 assert_int_equal(uevent_get_major(uev), -1);
147 static void test_major_bad_3(void **state)
149 struct uevent *uev = *state;
151 uev->envp[0] = "MAJOR=max";
152 assert_int_equal(uevent_get_major(uev), -1);
155 static void test_major_bad_4(void **state)
157 struct uevent *uev = *state;
159 uev->envp[0] = "MAJOR=0x10";
160 assert_int_equal(uevent_get_major(uev), -1);
163 static void test_major_bad_5(void **state)
165 struct uevent *uev = *state;
167 uev->envp[0] = "MAJO=" str(MAJOR);
168 assert_int_equal(uevent_get_major(uev), -1);
171 static void test_major_bad_6(void **state)
173 struct uevent *uev = *state;
175 uev->envp[0] = "MAJOR=" str(-MAJOR);
176 assert_int_equal(uevent_get_major(uev), -1);
179 static void test_major_bad_7(void **state)
181 struct uevent *uev = *state;
183 uev->envp[0] = "MAJOR=";
184 assert_int_equal(uevent_get_major(uev), -1);
187 static void test_major_bad_8(void **state)
189 struct uevent *uev = *state;
191 uev->envp[0] = "MAJOR";
192 assert_int_equal(uevent_get_major(uev), -1);
195 static void test_dm_name_good(void **state)
197 struct uevent *uev = *state;
198 char *name = uevent_get_dm_name(uev);
200 assert_string_equal(name, DM_NAME);
204 static void test_dm_name_bad_0(void **state)
206 struct uevent *uev = *state;
209 uev->envp[3] = "DM_NAME" DM_NAME;
210 name = uevent_get_dm_name(uev);
211 assert_ptr_equal(name, NULL);
215 static void test_dm_name_bad_1(void **state)
217 struct uevent *uev = *state;
220 uev->envp[3] = "DM_NAMES=" DM_NAME;
221 name = uevent_get_dm_name(uev);
222 assert_ptr_equal(name, NULL);
226 static void test_dm_name_good_1(void **state)
228 struct uevent *uev = *state;
231 /* Note we change index 2 here */
232 uev->envp[2] = "DM_NAME=" DM_NAME;
233 name = uevent_get_dm_name(uev);
234 assert_string_equal(name, DM_NAME);
238 static void test_dm_uuid_false_0(void **state)
240 struct uevent *uev = *state;
242 assert_false(uevent_is_mpath(uev));
245 static void test_dm_uuid_true_0(void **state)
247 struct uevent *uev = *state;
249 uev->envp[3] = "DM_UUID=mpath-foo";
250 assert_true(uevent_is_mpath(uev));
253 static void test_dm_uuid_false_1(void **state)
255 struct uevent *uev = *state;
257 uev->envp[3] = "DM_UUID.mpath-foo";
258 assert_false(uevent_is_mpath(uev));
261 static void test_dm_uuid_false_2(void **state)
263 struct uevent *uev = *state;
265 uev->envp[3] = "DM_UUID=mpath-";
266 assert_false(uevent_is_mpath(uev));
269 static void test_dm_uuid_false_3(void **state)
271 struct uevent *uev = *state;
273 uev->envp[3] = "DM_UU=mpath-foo";
274 assert_false(uevent_is_mpath(uev));
277 static void test_dm_uuid_false_4(void **state)
279 struct uevent *uev = *state;
281 uev->envp[3] = "DM_UUID=mpathfoo";
282 assert_false(uevent_is_mpath(uev));
285 static void test_dm_uuid_false_5(void **state)
287 struct uevent *uev = *state;
289 uev->envp[3] = "DM_UUID=";
290 assert_false(uevent_is_mpath(uev));
293 int test_uevent_get_XXX(void)
295 const struct CMUnitTest tests[] = {
296 cmocka_unit_test(test_major_good),
297 cmocka_unit_test(test_minor_good),
298 cmocka_unit_test(test_ro_good),
299 cmocka_unit_test(test_dm_name_good),
300 cmocka_unit_test(test_uid_attrs),
301 cmocka_unit_test(test_wwid),
302 cmocka_unit_test(test_major_bad_0),
303 cmocka_unit_test(test_major_bad_1),
304 cmocka_unit_test(test_major_bad_2),
305 cmocka_unit_test(test_major_bad_3),
306 cmocka_unit_test(test_major_bad_4),
307 cmocka_unit_test(test_major_bad_5),
308 cmocka_unit_test(test_major_bad_6),
309 cmocka_unit_test(test_major_bad_7),
310 cmocka_unit_test(test_major_bad_8),
311 cmocka_unit_test(test_dm_name_bad_0),
312 cmocka_unit_test(test_dm_name_bad_1),
313 cmocka_unit_test(test_dm_name_good_1),
314 cmocka_unit_test(test_dm_uuid_false_0),
315 cmocka_unit_test(test_dm_uuid_true_0),
316 cmocka_unit_test(test_dm_uuid_false_1),
317 cmocka_unit_test(test_dm_uuid_false_2),
318 cmocka_unit_test(test_dm_uuid_false_3),
319 cmocka_unit_test(test_dm_uuid_false_4),
320 cmocka_unit_test(test_dm_uuid_false_5),
322 return cmocka_run_group_tests(tests, setup_uev, teardown);
329 ret += test_uevent_get_XXX();