Add missing libxml2-tools dependency
[archive/platform/upstream/libvirt.git] / tests / utiltest.c
1 #include <config.h>
2
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <unistd.h>
7
8 #include "internal.h"
9 #include "viralloc.h"
10 #include "testutils.h"
11 #include "virutil.h"
12
13 static const char* diskNames[] = {
14     "sda",  "sdb",  "sdc",  "sdd",  "sde",  "sdf",  "sdg",  "sdh",  "sdi",  "sdj",  "sdk",  "sdl",  "sdm",  "sdn",  "sdo",  "sdp",  "sdq",  "sdr",  "sds",  "sdt",  "sdu",  "sdv",  "sdw",  "sdx",  "sdy",  "sdz",
15     "sdaa", "sdab", "sdac", "sdad", "sdae", "sdaf", "sdag", "sdah", "sdai", "sdaj", "sdak", "sdal", "sdam", "sdan", "sdao", "sdap", "sdaq", "sdar", "sdas", "sdat", "sdau", "sdav", "sdaw", "sdax", "sday", "sdaz",
16     "sdba", "sdbb", "sdbc", "sdbd", "sdbe", "sdbf", "sdbg", "sdbh", "sdbi", "sdbj", "sdbk", "sdbl", "sdbm", "sdbn", "sdbo", "sdbp", "sdbq", "sdbr", "sdbs", "sdbt", "sdbu", "sdbv", "sdbw", "sdbx", "sdby", "sdbz",
17     "sdca", "sdcb", "sdcc", "sdcd", "sdce", "sdcf", "sdcg", "sdch", "sdci", "sdcj", "sdck", "sdcl", "sdcm", "sdcn", "sdco", "sdcp", "sdcq", "sdcr", "sdcs", "sdct", "sdcu", "sdcv", "sdcw", "sdcx", "sdcy", "sdcz",
18     "sdda", "sddb", "sddc", "sddd", "sdde", "sddf", "sddg", "sddh", "sddi", "sddj", "sddk", "sddl", "sddm", "sddn", "sddo", "sddp", "sddq", "sddr", "sdds", "sddt", "sddu", "sddv", "sddw", "sddx", "sddy", "sddz",
19     "sdea", "sdeb", "sdec", "sded", "sdee", "sdef", "sdeg", "sdeh", "sdei", "sdej", "sdek", "sdel", "sdem", "sden", "sdeo", "sdep", "sdeq", "sder", "sdes", "sdet", "sdeu", "sdev", "sdew", "sdex", "sdey", "sdez",
20     "sdfa", "sdfb", "sdfc", "sdfd", "sdfe", "sdff", "sdfg", "sdfh", "sdfi", "sdfj", "sdfk", "sdfl", "sdfm", "sdfn", "sdfo", "sdfp", "sdfq", "sdfr", "sdfs", "sdft", "sdfu", "sdfv", "sdfw", "sdfx", "sdfy", "sdfz",
21     "sdga", "sdgb", "sdgc", "sdgd", "sdge", "sdgf", "sdgg", "sdgh", "sdgi", "sdgj", "sdgk", "sdgl", "sdgm", "sdgn", "sdgo", "sdgp", "sdgq", "sdgr", "sdgs", "sdgt", "sdgu", "sdgv", "sdgw", "sdgx", "sdgy", "sdgz",
22     "sdha", "sdhb", "sdhc", "sdhd", "sdhe", "sdhf", "sdhg", "sdhh", "sdhi", "sdhj", "sdhk", "sdhl", "sdhm", "sdhn", "sdho", "sdhp", "sdhq", "sdhr", "sdhs", "sdht", "sdhu", "sdhv", "sdhw", "sdhx", "sdhy", "sdhz",
23     "sdia", "sdib", "sdic", "sdid", "sdie", "sdif", "sdig", "sdih", "sdii", "sdij", "sdik", "sdil", "sdim", "sdin", "sdio", "sdip", "sdiq", "sdir", "sdis", "sdit", "sdiu", "sdiv", "sdiw", "sdix", "sdiy", "sdiz"
24 };
25
26 static int
27 testIndexToDiskName(const void *data ATTRIBUTE_UNUSED)
28 {
29     size_t i;
30     char *diskName = NULL;
31
32     for (i = 0; i < ARRAY_CARDINALITY(diskNames); ++i) {
33         VIR_FREE(diskName);
34
35         diskName = virIndexToDiskName(i, "sd");
36
37         if (STRNEQ(diskNames[i], diskName)) {
38             virtTestDifference(stderr, diskNames[i], diskName);
39             VIR_FREE(diskName);
40
41             return -1;
42         }
43     }
44
45     VIR_FREE(diskName);
46
47     return 0;
48 }
49
50
51
52 static int
53 testDiskNameToIndex(const void *data ATTRIBUTE_UNUSED)
54 {
55     size_t i;
56     int idx;
57     char *diskName = NULL;
58
59     for (i = 0; i < 100000; ++i) {
60         VIR_FREE(diskName);
61
62         diskName = virIndexToDiskName(i, "sd");
63         idx = virDiskNameToIndex(diskName);
64
65         if (idx < 0 || idx != i) {
66             if (virTestGetDebug() > 0) {
67                 fprintf(stderr, "\nExpect [%zu]\n", i);
68                 fprintf(stderr, "Actual [%d]\n", idx);
69             }
70
71             VIR_FREE(diskName);
72
73             return -1;
74         }
75     }
76
77     VIR_FREE(diskName);
78
79     return 0;
80 }
81
82
83
84 struct testVersionString
85 {
86     const char *string;
87     bool allowMissing;
88     int result;
89     unsigned long version;
90 };
91
92 static struct testVersionString versions[] = {
93     { "2.6.38-8-generic", false,  0, 1000000 * 2 + 1000 * 6 + 38 },
94     { "3.0-1-virtual",    true,   0, 1000000 * 3 + 1000 * 0 + 0 },
95     { "5",                true,   0, 1000000 * 5 + 1000 * 0 + 0 },
96     { "4.1.0",            false,  0, 1000000 * 4 + 1000 * 1 + 0 },
97     { "12.345.678",       false,  0, 1000000 * 12 + 1000 * 345 + 678 },
98     { "1.234.5678",       false, -1, 0 },
99     { "1.2345.678",       false, -1, 0 },
100     { "12345.6.78",       false, -1, 0 },
101     { "123456789",        true,  -1, 0 },
102     { "3.0-2-virtual",    false, -1, 0 },
103     { "no-number-here",   false, -1, 0 },
104 };
105
106 static int
107 testParseVersionString(const void *data ATTRIBUTE_UNUSED)
108 {
109     int result;
110     size_t i;
111     unsigned long version;
112
113     for (i = 0; i < ARRAY_CARDINALITY(versions); ++i) {
114         result = virParseVersionString(versions[i].string, &version,
115                                        versions[i].allowMissing);
116
117         if (result != versions[i].result) {
118             if (virTestGetDebug() > 0) {
119                 fprintf(stderr, "\nVersion string [%s]\n", versions[i].string);
120                 fprintf(stderr, "Expect result [%d]\n", versions[i].result);
121                 fprintf(stderr, "Actual result [%d]\n", result);
122             }
123
124             return -1;
125         }
126
127         if (result < 0) {
128             continue;
129         }
130
131         if (version != versions[i].version) {
132             if (virTestGetDebug() > 0) {
133                 fprintf(stderr, "\nVersion string [%s]\n", versions[i].string);
134                 fprintf(stderr, "Expect version [%lu]\n", versions[i].version);
135                 fprintf(stderr, "Actual version [%lu]\n", version);
136             }
137
138             return -1;
139         }
140     }
141
142     return 0;
143 }
144
145
146
147
148 static int
149 mymain(void)
150 {
151     int result = 0;
152
153     virtTestQuiesceLibvirtErrors(true);
154
155 #define DO_TEST(_name)                                                        \
156         do {                                                                  \
157             if (virtTestRun("Util "#_name, test##_name,                       \
158                             NULL) < 0) {                                      \
159                 result = -1;                                                  \
160             }                                                                 \
161         } while (0)
162
163     DO_TEST(IndexToDiskName);
164     DO_TEST(DiskNameToIndex);
165     DO_TEST(ParseVersionString);
166
167     return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
168 }
169
170 VIRT_TEST_MAIN(mymain)