e5eddaae1a
Update to the head of the upstream staging branch Rename redhat patches * Previous patches 0001-0012 are now patches 0041-0052 Add 0053-RH-Add-mpathcleanup.patch * add mpathcleanup program
276 lines
10 KiB
Diff
276 lines
10 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Martin Wilck <mwilck@suse.com>
|
|
Date: Fri, 8 Sep 2023 21:39:44 +0200
|
|
Subject: [PATCH] multipath-tools tests: add test for ordering of bindings
|
|
|
|
As the assignment of free aliases now relies on the bindings being
|
|
properly sorted, add some unit tests to make sure the sorting algorithm
|
|
works.
|
|
|
|
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
|
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
---
|
|
tests/alias.c | 212 +++++++++++++++++++++++++++++++++++++++++++++++++-
|
|
1 file changed, 209 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/tests/alias.c b/tests/alias.c
|
|
index dff5f93b..7f3ff38a 100644
|
|
--- a/tests/alias.c
|
|
+++ b/tests/alias.c
|
|
@@ -13,6 +13,9 @@
|
|
#include "globals.c"
|
|
#include "../libmultipath/alias.c"
|
|
|
|
+/* For verbose printing of all aliases in the ordering tests */
|
|
+#define ALIAS_DEBUG 0
|
|
+
|
|
#if INT_MAX == 0x7fffffff
|
|
/* user_friendly_name for map #INT_MAX */
|
|
#define MPATH_ID_INT_MAX "fxshrxw"
|
|
@@ -439,11 +442,12 @@ static void mock_self_alias(const char *alias, const char *wwid)
|
|
expect_condlog(3, USED_STR(alias, wwid)); \
|
|
} while(0)
|
|
|
|
-static void __mock_bindings_file(const char *content)
|
|
+static void __mock_bindings_file(const char *content, bool conflict_ok)
|
|
{
|
|
char *cnt __attribute__((cleanup(cleanup_charp))) = NULL;
|
|
char *token, *savep = NULL;
|
|
int i;
|
|
+ uintmax_t values[] = { BINDING_ADDED, BINDING_CONFLICT };
|
|
|
|
cnt = strdup(content);
|
|
assert_ptr_not_equal(cnt, NULL);
|
|
@@ -459,12 +463,12 @@ static void __mock_bindings_file(const char *content)
|
|
continue;
|
|
|
|
rc = add_binding(&global_bindings, alias, wwid);
|
|
- assert_int_equal(rc, BINDING_ADDED);
|
|
+ assert_in_set(rc, values, conflict_ok ? 2 : 1);
|
|
}
|
|
}
|
|
|
|
static void mock_bindings_file(const char *content) {
|
|
- return __mock_bindings_file(content);
|
|
+ return __mock_bindings_file(content, false);
|
|
}
|
|
|
|
static int teardown_bindings(void **state)
|
|
@@ -1744,6 +1748,207 @@ static int test_get_user_friendly_alias()
|
|
return cmocka_run_group_tests(tests, NULL, NULL);
|
|
}
|
|
|
|
+/* Numbers 1-1000, randomly shuffled */
|
|
+static const int random_numbers[1000] = {
|
|
+ 694, 977, 224, 178, 841, 818, 914, 549, 831, 942, 263, 834, 919, 800,
|
|
+ 111, 517, 719, 297, 988, 98, 332, 516, 754, 772, 495, 488, 331, 529,
|
|
+ 142, 747, 848, 618, 375, 624, 74, 753, 782, 944, 623, 468, 862, 997,
|
|
+ 417, 258, 298, 774, 673, 904, 883, 766, 867, 400, 11, 950, 14, 784,
|
|
+ 655, 155, 396, 9, 743, 93, 651, 245, 968, 306, 785, 581, 880, 486,
|
|
+ 168, 631, 203, 4, 663, 294, 702, 762, 619, 684, 48, 181, 21, 443, 643,
|
|
+ 863, 1000, 327, 26, 126, 382, 765, 586, 76, 49, 925, 319, 865, 797,
|
|
+ 876, 693, 334, 433, 243, 419, 901, 854, 326, 985, 347, 874, 527, 282,
|
|
+ 290, 380, 167, 95, 3, 257, 936, 60, 426, 227, 345, 577, 492, 467, 580,
|
|
+ 967, 422, 823, 718, 610, 64, 700, 412, 163, 288, 506, 828, 432, 51,
|
|
+ 356, 348, 539, 478, 17, 945, 602, 123, 450, 660, 429, 113, 310, 358,
|
|
+ 512, 758, 508, 19, 542, 304, 286, 446, 918, 723, 333, 603, 731, 978,
|
|
+ 230, 697, 109, 872, 175, 853, 947, 965, 121, 222, 101, 811, 117, 601,
|
|
+ 191, 752, 384, 415, 938, 278, 915, 715, 240, 552, 912, 838, 150, 840,
|
|
+ 627, 29, 636, 464, 861, 481, 992, 249, 934, 82, 368, 724, 807, 593,
|
|
+ 157, 147, 199, 637, 41, 62, 902, 505, 621, 342, 174, 260, 729, 961,
|
|
+ 219, 311, 629, 789, 81, 739, 860, 712, 223, 165, 741, 981, 485, 363,
|
|
+ 346, 709, 125, 369, 279, 634, 399, 162, 193, 769, 149, 314, 868, 612,
|
|
+ 524, 675, 341, 343, 476, 606, 388, 613, 850, 264, 903, 451, 908, 779,
|
|
+ 453, 148, 497, 46, 132, 43, 885, 955, 269, 395, 72, 128, 767, 989,
|
|
+ 929, 423, 742, 55, 13, 79, 924, 182, 295, 563, 668, 169, 974, 154,
|
|
+ 970, 54, 674, 52, 437, 570, 550, 531, 554, 793, 678, 218, 367, 105,
|
|
+ 197, 315, 958, 892, 86, 47, 284, 37, 561, 522, 198, 689, 817, 573,
|
|
+ 877, 201, 803, 501, 881, 546, 530, 523, 780, 579, 953, 135, 23, 620,
|
|
+ 84, 698, 303, 656, 357, 323, 494, 58, 131, 913, 995, 120, 70, 1, 195,
|
|
+ 365, 210, 25, 898, 173, 307, 239, 77, 418, 952, 963, 92, 455, 425, 12,
|
|
+ 536, 161, 328, 933, 401, 251, 735, 725, 362, 322, 557, 681, 302, 53,
|
|
+ 786, 801, 391, 946, 748, 133, 717, 851, 7, 372, 993, 387, 906, 373,
|
|
+ 667, 33, 670, 389, 209, 611, 896, 652, 69, 999, 344, 845, 633, 36,
|
|
+ 487, 192, 180, 45, 640, 427, 707, 805, 188, 152, 905, 217, 30, 252,
|
|
+ 386, 665, 299, 541, 410, 787, 5, 857, 751, 392, 44, 595, 146, 745,
|
|
+ 641, 957, 866, 773, 806, 815, 659, 102, 704, 430, 106, 296, 129, 847,
|
|
+ 130, 990, 669, 236, 225, 680, 159, 213, 438, 189, 447, 600, 232, 594,
|
|
+ 32, 56, 390, 647, 855, 428, 330, 714, 738, 706, 666, 461, 469, 482,
|
|
+ 558, 814, 559, 177, 575, 538, 309, 383, 261, 156, 420, 761, 630, 893,
|
|
+ 10, 116, 940, 844, 71, 377, 662, 312, 520, 244, 143, 759, 119, 186,
|
|
+ 592, 909, 864, 376, 768, 254, 265, 394, 511, 760, 574, 6, 436, 514,
|
|
+ 59, 226, 644, 956, 578, 825, 548, 145, 736, 597, 378, 821, 987, 897,
|
|
+ 354, 144, 722, 895, 589, 503, 826, 498, 543, 617, 763, 231, 808, 528,
|
|
+ 89, 479, 607, 737, 170, 404, 371, 65, 103, 340, 283, 141, 313, 858,
|
|
+ 289, 124, 971, 687, 954, 732, 39, 926, 176, 100, 267, 519, 890, 535,
|
|
+ 276, 448, 27, 457, 899, 385, 184, 275, 770, 544, 614, 449, 160, 658,
|
|
+ 259, 973, 108, 604, 24, 207, 562, 757, 744, 324, 444, 962, 591, 480,
|
|
+ 398, 409, 998, 253, 325, 445, 979, 8, 35, 118, 73, 683, 208, 85, 190,
|
|
+ 791, 408, 871, 657, 179, 18, 556, 496, 475, 20, 894, 484, 775, 889,
|
|
+ 463, 241, 730, 57, 907, 551, 859, 943, 185, 416, 870, 590, 435, 471,
|
|
+ 932, 268, 381, 626, 502, 565, 273, 534, 672, 778, 292, 473, 566, 104,
|
|
+ 172, 285, 832, 411, 329, 628, 397, 472, 271, 910, 711, 690, 969, 585,
|
|
+ 809, 941, 923, 555, 228, 685, 242, 94, 96, 211, 140, 61, 922, 795,
|
|
+ 869, 34, 255, 38, 984, 676, 15, 560, 632, 434, 921, 355, 582, 351,
|
|
+ 212, 200, 819, 960, 649, 852, 75, 771, 361, 996, 238, 316, 720, 671,
|
|
+ 462, 112, 569, 171, 664, 625, 588, 405, 553, 270, 533, 353, 842, 114,
|
|
+ 972, 83, 937, 63, 194, 237, 537, 980, 802, 916, 959, 688, 839, 350,
|
|
+ 917, 650, 545, 615, 151, 352, 686, 726, 266, 509, 439, 491, 935, 608,
|
|
+ 518, 653, 339, 609, 277, 635, 836, 88, 407, 440, 642, 927, 229, 727,
|
|
+ 360, 477, 846, 413, 454, 616, 28, 598, 567, 540, 790, 424, 247, 317,
|
|
+ 746, 911, 798, 321, 547, 248, 734, 829, 220, 138, 756, 500, 691, 196,
|
|
+ 740, 930, 843, 733, 221, 827, 50, 813, 949, 525, 349, 474, 134, 875,
|
|
+ 695, 513, 414, 515, 638, 99, 366, 490, 975, 246, 465, 206, 281, 583,
|
|
+ 256, 587, 749, 2, 951, 679, 215, 364, 458, 402, 646, 991, 335, 982,
|
|
+ 835, 300, 900, 703, 994, 983, 234, 888, 532, 804, 584, 305, 792, 442,
|
|
+ 291, 964, 158, 370, 452, 250, 521, 166, 948, 812, 794, 272, 699, 205,
|
|
+ 183, 507, 301, 920, 781, 233, 824, 137, 489, 833, 887, 966, 856, 78,
|
|
+ 830, 153, 359, 696, 526, 216, 66, 701, 403, 891, 849, 571, 308, 483,
|
|
+ 164, 293, 928, 677, 320, 837, 441, 639, 564, 510, 648, 274, 336, 661,
|
|
+ 878, 777, 816, 976, 493, 810, 67, 87, 91, 187, 882, 986, 80, 22, 499,
|
|
+ 90, 705, 139, 136, 122, 708, 716, 886, 572, 127, 40, 721, 764, 16,
|
|
+ 379, 692, 645, 456, 710, 460, 783, 97, 776, 713, 884, 115, 466, 596,
|
|
+ 374, 406, 110, 568, 68, 214, 622, 470, 107, 504, 682, 31, 421, 576,
|
|
+ 654, 605, 788, 799, 280, 338, 931, 873, 204, 287, 459, 755, 939, 599,
|
|
+ 431, 796, 235, 42, 750, 262, 318, 393, 202, 822, 879, 820, 728, 337,
|
|
+};
|
|
+
|
|
+static void fill_bindings_random(struct strbuf *buf, int start, int end,
|
|
+ const char *prefix)
|
|
+{
|
|
+ int i;
|
|
+
|
|
+ for (i = start; i < end; i++) {
|
|
+ print_strbuf(buf, "%s", prefix);
|
|
+ format_devname(buf, random_numbers[i]);
|
|
+ print_strbuf(buf, " WWID%d\n", random_numbers[i]);
|
|
+ }
|
|
+}
|
|
+
|
|
+struct random_aliases {
|
|
+ int start;
|
|
+ int end;
|
|
+ const char *prefix;
|
|
+};
|
|
+
|
|
+static void order_test(int n, const struct random_aliases ra[], bool conflict_ok)
|
|
+{
|
|
+ STRBUF_ON_STACK(buf);
|
|
+ int i, j, prev, curr, tmp;
|
|
+ struct binding *bdg;
|
|
+ Bindings *bindings = &global_bindings;
|
|
+
|
|
+ for (j = 0; j < n; j++)
|
|
+ fill_bindings_random(&buf, ra[j].start, ra[j].end, ra[j].prefix);
|
|
+ __mock_bindings_file(get_strbuf_str(&buf), conflict_ok);
|
|
+
|
|
+ for (j = 0; j < n; j++) {
|
|
+ bdg = VECTOR_SLOT(bindings, 0);
|
|
+ if (ALIAS_DEBUG && j == 0)
|
|
+ printf("%d: %s\n", 0, bdg->alias);
|
|
+ prev = scan_devname(bdg->alias, ra[j].prefix);
|
|
+ i = 1;
|
|
+ vector_foreach_slot_after(bindings, bdg, i) {
|
|
+ if (ALIAS_DEBUG && j == 0)
|
|
+ printf("%d: %s\n", i, bdg->alias);
|
|
+ tmp = scan_devname(bdg->alias, ra[j].prefix);
|
|
+ if (tmp == -1)
|
|
+ continue;
|
|
+ curr = tmp;
|
|
+ if (prev > 0) {
|
|
+ if (curr <= prev)
|
|
+ printf("ERROR: %d (%s) %d >= %d\n",
|
|
+ i, bdg->alias, prev, curr);
|
|
+ assert_true(curr > prev);
|
|
+ }
|
|
+ prev = curr;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+static void order_01(void **state)
|
|
+{
|
|
+ const struct random_aliases ra[] = {
|
|
+ { 0, 1000, "MPATH" },
|
|
+ };
|
|
+
|
|
+ order_test(ARRAY_SIZE(ra), ra, false);
|
|
+}
|
|
+
|
|
+static void order_02(void **state)
|
|
+{
|
|
+ const struct random_aliases ra[] = {
|
|
+ { 0, 500, "MPATH" },
|
|
+ { 200, 700, "mpath" },
|
|
+ };
|
|
+ order_test(ARRAY_SIZE(ra), ra, false);
|
|
+}
|
|
+
|
|
+static void order_03(void **state)
|
|
+{
|
|
+ const struct random_aliases ra[] = {
|
|
+ { 500, 1000, "MPTH" },
|
|
+ { 0, 500, "MPATH" },
|
|
+ };
|
|
+ order_test(ARRAY_SIZE(ra), ra, false);
|
|
+}
|
|
+
|
|
+static void order_04(void **state)
|
|
+{
|
|
+ const struct random_aliases ra[] = {
|
|
+ { 0, 500, "mpa" },
|
|
+ { 250, 750, "mp" },
|
|
+ };
|
|
+ order_test(ARRAY_SIZE(ra), ra, true);
|
|
+}
|
|
+
|
|
+static void order_05(void **state)
|
|
+{
|
|
+ const struct random_aliases ra[] = {
|
|
+ { 0, 100, "A" },
|
|
+ { 0, 100, "B" },
|
|
+ { 0, 100, "C" },
|
|
+ { 0, 100, "D" },
|
|
+ };
|
|
+ order_test(ARRAY_SIZE(ra), ra, false);
|
|
+}
|
|
+
|
|
+static void order_06(void **state)
|
|
+{
|
|
+ const struct random_aliases ra[] = {
|
|
+ { 0, 100, "" },
|
|
+ { 0, 100, "a" },
|
|
+ { 0, 100, "aa" },
|
|
+ { 0, 100, "ab" },
|
|
+ { 0, 100, "aaa" },
|
|
+ };
|
|
+ order_test(ARRAY_SIZE(ra), ra, true);
|
|
+}
|
|
+
|
|
+static int test_bindings_order()
|
|
+{
|
|
+ const struct CMUnitTest tests[] = {
|
|
+ cmocka_unit_test_teardown(order_01, teardown_bindings),
|
|
+ cmocka_unit_test_teardown(order_02, teardown_bindings),
|
|
+ cmocka_unit_test_teardown(order_03, teardown_bindings),
|
|
+ cmocka_unit_test_teardown(order_04, teardown_bindings),
|
|
+ cmocka_unit_test_teardown(order_05, teardown_bindings),
|
|
+ cmocka_unit_test_teardown(order_06, teardown_bindings),
|
|
+ };
|
|
+
|
|
+ return cmocka_run_group_tests(tests, NULL, NULL);
|
|
+}
|
|
+
|
|
int main(void)
|
|
{
|
|
int ret = 0;
|
|
@@ -1755,6 +1960,7 @@ int main(void)
|
|
ret += test_rlookup_binding();
|
|
ret += test_allocate_binding();
|
|
ret += test_get_user_friendly_alias();
|
|
+ ret += test_bindings_order();
|
|
|
|
return ret;
|
|
}
|