1 #include <config.h>
2 
3 #include "internal.h"
4 #include "testutils.h"
5 #include "datatypes.h"
6 #include "storage/storage_util.h"
7 #include "testutilsqemu.h"
8 #include "virstring.h"
9 
10 #define VIR_FROM_THIS VIR_FROM_NONE
11 
12 #ifndef MOUNT
13 # define MOUNT "/usr/bin/mount"
14 #endif
15 
16 #ifndef VGCHANGE
17 # define VGCHANGE "/usr/sbin/vgchange"
18 #endif
19 
20 static int
testCompareXMLToArgvFiles(bool shouldFail,const char * poolxml,const char * cmdline)21 testCompareXMLToArgvFiles(bool shouldFail,
22                           const char *poolxml,
23                           const char *cmdline)
24 {
25     int ret = -1;
26     virStoragePoolDef *def = NULL;
27     virStoragePoolObj *pool = NULL;
28     const char *defTypeStr;
29     g_autofree char *actualCmdline = NULL;
30     g_autofree char *src = NULL;
31     g_autoptr(virCommand) cmd = NULL;
32 
33     if (!(def = virStoragePoolDefParseFile(poolxml)))
34         goto cleanup;
35     defTypeStr = virStoragePoolTypeToString(def->type);
36 
37     switch ((virStoragePoolType)def->type) {
38     case VIR_STORAGE_POOL_FS:
39     case VIR_STORAGE_POOL_NETFS:
40         if (!(pool = virStoragePoolObjNew())) {
41             VIR_TEST_DEBUG("pool type '%s' alloc pool obj fails", defTypeStr);
42             goto cleanup;
43         }
44         virStoragePoolObjSetDef(pool, def);
45 
46         if (!(src = virStorageBackendFileSystemGetPoolSource(pool))) {
47             VIR_TEST_DEBUG("pool type '%s' has no pool source", defTypeStr);
48             def = NULL;
49             goto cleanup;
50         }
51 
52         cmd = virStorageBackendFileSystemMountCmd(MOUNT, def, src);
53         def = NULL;
54         break;
55 
56     case VIR_STORAGE_POOL_LOGICAL:
57         cmd = virStorageBackendLogicalChangeCmd(VGCHANGE, def, true);
58         break;
59 
60     case VIR_STORAGE_POOL_DIR:
61     case VIR_STORAGE_POOL_DISK:
62     case VIR_STORAGE_POOL_ISCSI:
63     case VIR_STORAGE_POOL_ISCSI_DIRECT:
64     case VIR_STORAGE_POOL_SCSI:
65     case VIR_STORAGE_POOL_MPATH:
66     case VIR_STORAGE_POOL_RBD:
67     case VIR_STORAGE_POOL_SHEEPDOG:
68     case VIR_STORAGE_POOL_GLUSTER:
69     case VIR_STORAGE_POOL_ZFS:
70     case VIR_STORAGE_POOL_VSTORAGE:
71     case VIR_STORAGE_POOL_LAST:
72     default:
73         VIR_TEST_DEBUG("pool type '%s' has no xml2argv test", defTypeStr);
74         goto cleanup;
75     };
76 
77     if (!(actualCmdline = virCommandToStringFull(cmd, true, true))) {
78         VIR_TEST_DEBUG("pool type '%s' failed to get commandline", defTypeStr);
79         goto cleanup;
80     }
81 
82     if (virTestCompareToFileFull(actualCmdline, cmdline, false) < 0)
83         goto cleanup;
84 
85     ret = 0;
86 
87  cleanup:
88     virStoragePoolDefFree(def);
89     virStoragePoolObjEndAPI(&pool);
90     if (shouldFail) {
91         virResetLastError();
92         ret = 0;
93     }
94     return ret;
95 }
96 
97 struct testInfo {
98     bool shouldFail;
99     const char *pool;
100     const char *platformSuffix;
101 };
102 
103 static int
testCompareXMLToArgvHelper(const void * data)104 testCompareXMLToArgvHelper(const void *data)
105 {
106     const struct testInfo *info = data;
107     g_autofree char *poolxml = NULL;
108     g_autofree char *cmdline = NULL;
109 
110     poolxml = g_strdup_printf("%s/storagepoolxml2xmlin/%s.xml", abs_srcdir,
111                               info->pool);
112 
113     cmdline = g_strdup_printf("%s/storagepoolxml2argvdata/%s%s.argv",
114                               abs_srcdir, info->pool, info->platformSuffix);
115 
116     return testCompareXMLToArgvFiles(info->shouldFail, poolxml, cmdline);
117 }
118 
119 
120 static int
mymain(void)121 mymain(void)
122 {
123     int ret = 0;
124 #ifdef __linux__
125     const char *platform = "-linux";
126 #elif defined(__FreeBSD__)
127     const char *platform = "-freebsd";
128 #else
129     const char *platform = "";
130 #endif
131 
132 #define DO_TEST_FULL(shouldFail, pool, platformSuffix) \
133     do { \
134         struct testInfo info = { shouldFail, pool, platformSuffix }; \
135         if (virTestRun("Storage Pool XML-2-argv " pool, \
136                        testCompareXMLToArgvHelper, &info) < 0) \
137             ret = -1; \
138        } \
139     while (0);
140 
141 #define DO_TEST(pool, ...) \
142     DO_TEST_FULL(false, pool, "")
143 
144 #define DO_TEST_FAIL(pool, ...) \
145     DO_TEST_FULL(true, pool, "")
146 
147 #define DO_TEST_PLATFORM(pool, ...) \
148     DO_TEST_FULL(false, pool, platform)
149 
150     if (storageRegisterAll() < 0)
151        return EXIT_FAILURE;
152 
153     DO_TEST_FAIL("pool-dir");
154     DO_TEST_FAIL("pool-dir-naming");
155     DO_TEST("pool-logical");
156     DO_TEST("pool-logical-nopath");
157     DO_TEST("pool-logical-create");
158     DO_TEST("pool-logical-noname");
159     DO_TEST_FAIL("pool-disk");
160     DO_TEST_FAIL("pool-disk-device-nopartsep");
161     DO_TEST_FAIL("pool-iscsi");
162     DO_TEST_FAIL("pool-iscsi-auth");
163 
164     DO_TEST_PLATFORM("pool-fs");
165     DO_TEST_PLATFORM("pool-netfs");
166     DO_TEST_PLATFORM("pool-netfs-auto");
167     DO_TEST_PLATFORM("pool-netfs-protocol-ver");
168 #if WITH_STORAGE_FS
169     DO_TEST_PLATFORM("pool-netfs-ns-mountopts");
170 #endif
171     DO_TEST_PLATFORM("pool-netfs-gluster");
172     DO_TEST_PLATFORM("pool-netfs-cifs");
173 
174     DO_TEST_FAIL("pool-scsi");
175     DO_TEST_FAIL("pool-scsi-type-scsi-host");
176     DO_TEST_FAIL("pool-scsi-type-fc-host");
177     DO_TEST_FAIL("pool-scsi-type-fc-host-managed");
178     DO_TEST_FAIL("pool-mpath");
179     DO_TEST_FAIL("pool-iscsi-multiiqn");
180     DO_TEST_FAIL("pool-iscsi-vendor-product");
181     DO_TEST_FAIL("pool-sheepdog");
182     DO_TEST_FAIL("pool-gluster");
183     DO_TEST_FAIL("pool-gluster-sub");
184     DO_TEST_FAIL("pool-scsi-type-scsi-host-stable");
185     DO_TEST_FAIL("pool-zfs");
186     DO_TEST_FAIL("pool-zfs-sourcedev");
187     DO_TEST_FAIL("pool-rbd");
188     DO_TEST_FAIL("pool-vstorage");
189     DO_TEST_FAIL("pool-iscsi-direct-auth");
190     DO_TEST_FAIL("pool-iscsi-direct");
191 
192     return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
193 }
194 
195 VIR_TEST_MAIN(mymain)
196