Add missing libxml2-tools dependency
[archive/platform/upstream/libvirt.git] / tests / virlockspacetest.c
1 /*
2  * Copyright (C) 2011, 2013, 2014 Red Hat, Inc.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library 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 GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library;  If not, see
16  * <http://www.gnu.org/licenses/>.
17  *
18  * Author: Daniel P. Berrange <berrange@redhat.com>
19  */
20
21 #include <config.h>
22
23 #include <stdlib.h>
24 #include <signal.h>
25 #include <sys/stat.h>
26
27 #include "testutils.h"
28 #include "virutil.h"
29 #include "virerror.h"
30 #include "viralloc.h"
31 #include "virfile.h"
32 #include "virlog.h"
33
34 #include "virlockspace.h"
35
36 #define VIR_FROM_THIS VIR_FROM_RPC
37
38 VIR_LOG_INIT("tests.lockspacetest");
39
40 #define LOCKSPACE_DIR abs_builddir "/virlockspacedata"
41
42 static int testLockSpaceCreate(const void *args ATTRIBUTE_UNUSED)
43 {
44     virLockSpacePtr lockspace;
45     int ret = -1;
46
47     rmdir(LOCKSPACE_DIR);
48
49     if (!(lockspace = virLockSpaceNew(LOCKSPACE_DIR)))
50         goto cleanup;
51
52     if (!virFileIsDir(LOCKSPACE_DIR))
53         goto cleanup;
54
55     ret = 0;
56
57  cleanup:
58     virLockSpaceFree(lockspace);
59     rmdir(LOCKSPACE_DIR);
60     return ret;
61 }
62
63
64 static int testLockSpaceResourceLifecycle(const void *args ATTRIBUTE_UNUSED)
65 {
66     virLockSpacePtr lockspace;
67     int ret = -1;
68
69     rmdir(LOCKSPACE_DIR);
70
71     if (!(lockspace = virLockSpaceNew(LOCKSPACE_DIR)))
72         goto cleanup;
73
74     if (!virFileIsDir(LOCKSPACE_DIR))
75         goto cleanup;
76
77     if (virLockSpaceCreateResource(lockspace, "foo") < 0)
78         goto cleanup;
79
80     if (!virFileExists(LOCKSPACE_DIR "/foo"))
81         goto cleanup;
82
83     if (virLockSpaceDeleteResource(lockspace, "foo") < 0)
84         goto cleanup;
85
86     if (virFileExists(LOCKSPACE_DIR "/foo"))
87         goto cleanup;
88
89     ret = 0;
90
91  cleanup:
92     virLockSpaceFree(lockspace);
93     rmdir(LOCKSPACE_DIR);
94     return ret;
95 }
96
97
98 static int testLockSpaceResourceLockExcl(const void *args ATTRIBUTE_UNUSED)
99 {
100     virLockSpacePtr lockspace;
101     int ret = -1;
102
103     rmdir(LOCKSPACE_DIR);
104
105     if (!(lockspace = virLockSpaceNew(LOCKSPACE_DIR)))
106         goto cleanup;
107
108     if (!virFileIsDir(LOCKSPACE_DIR))
109         goto cleanup;
110
111     if (virLockSpaceCreateResource(lockspace, "foo") < 0)
112         goto cleanup;
113
114     if (virLockSpaceAcquireResource(lockspace, "foo", geteuid(), 0) < 0)
115         goto cleanup;
116
117     if (!virFileExists(LOCKSPACE_DIR "/foo"))
118         goto cleanup;
119
120     if (virLockSpaceAcquireResource(lockspace, "foo", geteuid(), 0) == 0)
121         goto cleanup;
122
123     if (virLockSpaceDeleteResource(lockspace, "foo") == 0)
124         goto cleanup;
125
126     if (virLockSpaceReleaseResource(lockspace, "foo", geteuid()) < 0)
127         goto cleanup;
128
129     if (virLockSpaceDeleteResource(lockspace, "foo") < 0)
130         goto cleanup;
131
132     if (virFileExists(LOCKSPACE_DIR "/foo"))
133         goto cleanup;
134
135     ret = 0;
136
137  cleanup:
138     virLockSpaceFree(lockspace);
139     rmdir(LOCKSPACE_DIR);
140     return ret;
141 }
142
143
144 static int testLockSpaceResourceLockExclAuto(const void *args ATTRIBUTE_UNUSED)
145 {
146     virLockSpacePtr lockspace;
147     int ret = -1;
148
149     rmdir(LOCKSPACE_DIR);
150
151     if (!(lockspace = virLockSpaceNew(LOCKSPACE_DIR)))
152         goto cleanup;
153
154     if (!virFileIsDir(LOCKSPACE_DIR))
155         goto cleanup;
156
157     if (virLockSpaceCreateResource(lockspace, "foo") < 0)
158         goto cleanup;
159
160     if (virLockSpaceAcquireResource(lockspace, "foo", geteuid(),
161                                     VIR_LOCK_SPACE_ACQUIRE_AUTOCREATE) < 0)
162         goto cleanup;
163
164     if (!virFileExists(LOCKSPACE_DIR "/foo"))
165         goto cleanup;
166
167     if (virLockSpaceReleaseResource(lockspace, "foo", geteuid()) < 0)
168         goto cleanup;
169
170     if (virFileExists(LOCKSPACE_DIR "/foo"))
171         goto cleanup;
172
173     ret = 0;
174
175  cleanup:
176     virLockSpaceFree(lockspace);
177     rmdir(LOCKSPACE_DIR);
178     return ret;
179 }
180
181
182 static int testLockSpaceResourceLockShr(const void *args ATTRIBUTE_UNUSED)
183 {
184     virLockSpacePtr lockspace;
185     int ret = -1;
186
187     rmdir(LOCKSPACE_DIR);
188
189     if (!(lockspace = virLockSpaceNew(LOCKSPACE_DIR)))
190         goto cleanup;
191
192     if (!virFileIsDir(LOCKSPACE_DIR))
193         goto cleanup;
194
195     if (virLockSpaceCreateResource(lockspace, "foo") < 0)
196         goto cleanup;
197
198     if (virLockSpaceAcquireResource(lockspace, "foo", geteuid(),
199                                     VIR_LOCK_SPACE_ACQUIRE_SHARED) < 0)
200         goto cleanup;
201
202     if (virLockSpaceAcquireResource(lockspace, "foo", geteuid(), 0) == 0)
203         goto cleanup;
204
205     if (virLockSpaceAcquireResource(lockspace, "foo", geteuid(),
206                                     VIR_LOCK_SPACE_ACQUIRE_SHARED) < 0)
207         goto cleanup;
208
209     if (virLockSpaceDeleteResource(lockspace, "foo") == 0)
210         goto cleanup;
211
212     if (virLockSpaceReleaseResource(lockspace, "foo", geteuid()) < 0)
213         goto cleanup;
214
215     if (virLockSpaceDeleteResource(lockspace, "foo") == 0)
216         goto cleanup;
217
218     if (virLockSpaceReleaseResource(lockspace, "foo", geteuid()) < 0)
219         goto cleanup;
220
221     if (virLockSpaceDeleteResource(lockspace, "foo") < 0)
222         goto cleanup;
223
224     if (virFileExists(LOCKSPACE_DIR "/foo"))
225         goto cleanup;
226
227     ret = 0;
228
229  cleanup:
230     virLockSpaceFree(lockspace);
231     rmdir(LOCKSPACE_DIR);
232     return ret;
233 }
234
235
236 static int testLockSpaceResourceLockShrAuto(const void *args ATTRIBUTE_UNUSED)
237 {
238     virLockSpacePtr lockspace;
239     int ret = -1;
240
241     rmdir(LOCKSPACE_DIR);
242
243     if (!(lockspace = virLockSpaceNew(LOCKSPACE_DIR)))
244         goto cleanup;
245
246     if (!virFileIsDir(LOCKSPACE_DIR))
247         goto cleanup;
248
249     if (virLockSpaceCreateResource(lockspace, "foo") < 0)
250         goto cleanup;
251
252     if (virLockSpaceAcquireResource(lockspace, "foo", geteuid(),
253                                     VIR_LOCK_SPACE_ACQUIRE_SHARED |
254                                     VIR_LOCK_SPACE_ACQUIRE_AUTOCREATE) < 0)
255         goto cleanup;
256
257     if (!virFileExists(LOCKSPACE_DIR "/foo"))
258         goto cleanup;
259
260     if (virLockSpaceAcquireResource(lockspace, "foo", geteuid(),
261                                     VIR_LOCK_SPACE_ACQUIRE_AUTOCREATE) == 0)
262         goto cleanup;
263
264     if (!virFileExists(LOCKSPACE_DIR "/foo"))
265         goto cleanup;
266
267     if (virLockSpaceAcquireResource(lockspace, "foo", geteuid(),
268                                     VIR_LOCK_SPACE_ACQUIRE_SHARED |
269                                     VIR_LOCK_SPACE_ACQUIRE_AUTOCREATE) < 0)
270         goto cleanup;
271
272     if (!virFileExists(LOCKSPACE_DIR "/foo"))
273         goto cleanup;
274
275     if (virLockSpaceReleaseResource(lockspace, "foo", geteuid()) < 0)
276         goto cleanup;
277
278     if (!virFileExists(LOCKSPACE_DIR "/foo"))
279         goto cleanup;
280
281     if (virLockSpaceReleaseResource(lockspace, "foo", geteuid()) < 0)
282         goto cleanup;
283
284     if (virFileExists(LOCKSPACE_DIR "/foo"))
285         goto cleanup;
286
287     ret = 0;
288
289  cleanup:
290     virLockSpaceFree(lockspace);
291     rmdir(LOCKSPACE_DIR);
292     return ret;
293 }
294
295
296 static int testLockSpaceResourceLockPath(const void *args ATTRIBUTE_UNUSED)
297 {
298     virLockSpacePtr lockspace;
299     int ret = -1;
300
301     rmdir(LOCKSPACE_DIR);
302
303     if (!(lockspace = virLockSpaceNew(NULL)))
304         goto cleanup;
305
306     if (mkdir(LOCKSPACE_DIR, 0700) < 0)
307         goto cleanup;
308
309     if (virLockSpaceCreateResource(lockspace, LOCKSPACE_DIR "/foo") < 0)
310         goto cleanup;
311
312     if (virLockSpaceAcquireResource(lockspace, LOCKSPACE_DIR "/foo", geteuid(), 0) < 0)
313         goto cleanup;
314
315     if (!virFileExists(LOCKSPACE_DIR "/foo"))
316         goto cleanup;
317
318     if (virLockSpaceAcquireResource(lockspace, LOCKSPACE_DIR "/foo", geteuid(), 0) == 0)
319         goto cleanup;
320
321     if (virLockSpaceDeleteResource(lockspace, LOCKSPACE_DIR "/foo") == 0)
322         goto cleanup;
323
324     if (virLockSpaceReleaseResource(lockspace, LOCKSPACE_DIR "/foo", geteuid()) < 0)
325         goto cleanup;
326
327     if (virLockSpaceDeleteResource(lockspace, LOCKSPACE_DIR "/foo") < 0)
328         goto cleanup;
329
330     if (virFileExists(LOCKSPACE_DIR "/foo"))
331         goto cleanup;
332
333     ret = 0;
334
335  cleanup:
336     virLockSpaceFree(lockspace);
337     rmdir(LOCKSPACE_DIR);
338     return ret;
339 }
340
341
342
343 static int
344 mymain(void)
345 {
346     int ret = 0;
347
348     signal(SIGPIPE, SIG_IGN);
349
350     if (virtTestRun("Lockspace creation", testLockSpaceCreate, NULL) < 0)
351         ret = -1;
352
353     if (virtTestRun("Lockspace res lifecycle", testLockSpaceResourceLifecycle, NULL) < 0)
354         ret = -1;
355
356     if (virtTestRun("Lockspace res lock excl", testLockSpaceResourceLockExcl, NULL) < 0)
357         ret = -1;
358
359     if (virtTestRun("Lockspace res lock shr", testLockSpaceResourceLockShr, NULL) < 0)
360         ret = -1;
361
362     if (virtTestRun("Lockspace res lock excl auto", testLockSpaceResourceLockExclAuto, NULL) < 0)
363         ret = -1;
364
365     if (virtTestRun("Lockspace res lock shr auto", testLockSpaceResourceLockShrAuto, NULL) < 0)
366         ret = -1;
367
368     if (virtTestRun("Lockspace res full path", testLockSpaceResourceLockPath, NULL) < 0)
369         ret = -1;
370
371     return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
372 }
373
374 VIRT_TEST_MAIN(mymain)