mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
conf: test for more scenarios
Part of the upcoming refactoring will change how broken chains are detected; it makes sense to test that this works. In particular, test the just-fixed infinite loop detection bug. Also, make sure that detection of directories is sane. * tests/virstoragetest.c (testStorageChain): Enhance test. (mymain): Add more tests. (testCleanupImages, testPrepImages): Populate a directory. Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
af095bfa0d
commit
fcc7d0ed3a
@ -57,6 +57,7 @@ static char *absqcow2;
|
|||||||
static char *canonqcow2;
|
static char *canonqcow2;
|
||||||
static char *abswrap;
|
static char *abswrap;
|
||||||
static char *absqed;
|
static char *absqed;
|
||||||
|
static char *absdir;
|
||||||
static char *abslink2;
|
static char *abslink2;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -69,6 +70,7 @@ testCleanupImages(void)
|
|||||||
VIR_FREE(canonqcow2);
|
VIR_FREE(canonqcow2);
|
||||||
VIR_FREE(abswrap);
|
VIR_FREE(abswrap);
|
||||||
VIR_FREE(absqed);
|
VIR_FREE(absqed);
|
||||||
|
VIR_FREE(absdir);
|
||||||
VIR_FREE(abslink2);
|
VIR_FREE(abslink2);
|
||||||
|
|
||||||
if (chdir(abs_builddir) < 0) {
|
if (chdir(abs_builddir) < 0) {
|
||||||
@ -110,6 +112,7 @@ testPrepImages(void)
|
|||||||
virAsprintf(&absqcow2, "%s/qcow2", datadir) < 0 ||
|
virAsprintf(&absqcow2, "%s/qcow2", datadir) < 0 ||
|
||||||
virAsprintf(&abswrap, "%s/wrap", datadir) < 0 ||
|
virAsprintf(&abswrap, "%s/wrap", datadir) < 0 ||
|
||||||
virAsprintf(&absqed, "%s/qed", datadir) < 0 ||
|
virAsprintf(&absqed, "%s/qed", datadir) < 0 ||
|
||||||
|
virAsprintf(&absdir, "%s/dir", datadir) < 0 ||
|
||||||
virAsprintf(&abslink2, "%s/sub/link2", datadir) < 0)
|
virAsprintf(&abslink2, "%s/sub/link2", datadir) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -117,6 +120,10 @@ testPrepImages(void)
|
|||||||
fprintf(stderr, "unable to create directory %s\n", datadir "/sub");
|
fprintf(stderr, "unable to create directory %s\n", datadir "/sub");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
if (virFileMakePath(datadir "/dir") < 0) {
|
||||||
|
fprintf(stderr, "unable to create directory %s\n", datadir "/dir");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
if (chdir(datadir) < 0) {
|
if (chdir(datadir) < 0) {
|
||||||
fprintf(stderr, "unable to test relative backing chains\n");
|
fprintf(stderr, "unable to test relative backing chains\n");
|
||||||
@ -231,6 +238,7 @@ testStorageChain(const void *args)
|
|||||||
virStorageFileMetadataPtr meta;
|
virStorageFileMetadataPtr meta;
|
||||||
virStorageFileMetadataPtr elt;
|
virStorageFileMetadataPtr elt;
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
char *broken = NULL;
|
||||||
|
|
||||||
meta = virStorageFileGetMetadata(data->start, data->format, -1, -1,
|
meta = virStorageFileGetMetadata(data->start, data->format, -1, -1,
|
||||||
(data->flags & ALLOW_PROBE) != 0);
|
(data->flags & ALLOW_PROBE) != 0);
|
||||||
@ -250,9 +258,19 @@ testStorageChain(const void *args)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
virResetLastError();
|
virResetLastError();
|
||||||
} else if (virGetLastError()) {
|
if (virStorageFileChainGetBroken(meta, &broken) || !broken) {
|
||||||
fprintf(stderr, "call should not have warned\n");
|
fprintf(stderr, "call should identify broken part of chain\n");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (virGetLastError()) {
|
||||||
|
fprintf(stderr, "call should not have warned\n");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
if (virStorageFileChainGetBroken(meta, &broken) || broken) {
|
||||||
|
fprintf(stderr, "chain should not be identified as broken\n");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
elt = meta;
|
elt = meta;
|
||||||
@ -303,6 +321,7 @@ testStorageChain(const void *args)
|
|||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
cleanup:
|
cleanup:
|
||||||
|
VIR_FREE(broken);
|
||||||
virStorageFileFreeMetadata(meta);
|
virStorageFileFreeMetadata(meta);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -429,6 +448,40 @@ mymain(void)
|
|||||||
.expIsFile = true,
|
.expIsFile = true,
|
||||||
.expCapacity = 1024,
|
.expCapacity = 1024,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const testFileData dir = {
|
||||||
|
.expIsFile = false,
|
||||||
|
};
|
||||||
|
|
||||||
|
const testFileData qcow2_loop1_rel = {
|
||||||
|
.expBackingStoreRaw = "qcow2",
|
||||||
|
.expDirectory = ".",
|
||||||
|
.expFormat = VIR_STORAGE_FILE_NONE,
|
||||||
|
.expIsFile = true,
|
||||||
|
.expCapacity = 1024,
|
||||||
|
};
|
||||||
|
const testFileData qcow2_loop1_abs = {
|
||||||
|
.expBackingStoreRaw = "qcow2",
|
||||||
|
.expDirectory = datadir,
|
||||||
|
.expFormat = VIR_STORAGE_FILE_NONE,
|
||||||
|
.expIsFile = true,
|
||||||
|
.expCapacity = 1024,
|
||||||
|
};
|
||||||
|
const testFileData qcow2_loop2_rel = {
|
||||||
|
.expBackingStoreRaw = "wrap",
|
||||||
|
.expDirectory = datadir,
|
||||||
|
.expFormat = VIR_STORAGE_FILE_NONE,
|
||||||
|
.expIsFile = true,
|
||||||
|
.expCapacity = 1024,
|
||||||
|
};
|
||||||
|
const testFileData qcow2_loop2_abs = {
|
||||||
|
.expBackingStoreRaw = "wrap",
|
||||||
|
.expDirectory = datadir,
|
||||||
|
.expFormat = VIR_STORAGE_FILE_NONE,
|
||||||
|
.expIsFile = true,
|
||||||
|
.expCapacity = 1024,
|
||||||
|
};
|
||||||
|
|
||||||
#if HAVE_SYMLINK
|
#if HAVE_SYMLINK
|
||||||
const testFileData link1_rel = {
|
const testFileData link1_rel = {
|
||||||
.expBackingStore = canonraw,
|
.expBackingStore = canonraw,
|
||||||
@ -590,6 +643,18 @@ mymain(void)
|
|||||||
(&raw), EXP_PASS,
|
(&raw), EXP_PASS,
|
||||||
(&qed, &raw), ALLOW_PROBE | EXP_PASS);
|
(&qed, &raw), ALLOW_PROBE | EXP_PASS);
|
||||||
|
|
||||||
|
/* directory */
|
||||||
|
TEST_CHAIN(13, "dir", absdir, VIR_STORAGE_FILE_AUTO,
|
||||||
|
(&dir), EXP_PASS,
|
||||||
|
(&dir), ALLOW_PROBE | EXP_PASS,
|
||||||
|
(&dir), EXP_PASS,
|
||||||
|
(&dir), ALLOW_PROBE | EXP_PASS);
|
||||||
|
TEST_CHAIN(14, "dir", absdir, VIR_STORAGE_FILE_DIR,
|
||||||
|
(&dir), EXP_PASS,
|
||||||
|
(&dir), ALLOW_PROBE | EXP_PASS,
|
||||||
|
(&dir), EXP_PASS,
|
||||||
|
(&dir), ALLOW_PROBE | EXP_PASS);
|
||||||
|
|
||||||
#ifdef HAVE_SYMLINK
|
#ifdef HAVE_SYMLINK
|
||||||
/* Rewrite qcow2 and wrap file to use backing names relative to a
|
/* Rewrite qcow2 and wrap file to use backing names relative to a
|
||||||
* symlink from a different directory */
|
* symlink from a different directory */
|
||||||
@ -607,12 +672,47 @@ mymain(void)
|
|||||||
ret = -1;
|
ret = -1;
|
||||||
|
|
||||||
/* Behavior of symlinks to qcow2 with relative backing files */
|
/* Behavior of symlinks to qcow2 with relative backing files */
|
||||||
TEST_CHAIN(13, "sub/link2", abslink2, VIR_STORAGE_FILE_QCOW2,
|
TEST_CHAIN(15, "sub/link2", abslink2, VIR_STORAGE_FILE_QCOW2,
|
||||||
(&link2_rel, &link1_rel, &raw), EXP_PASS,
|
(&link2_rel, &link1_rel, &raw), EXP_PASS,
|
||||||
(&link2_rel, &link1_rel, &raw), ALLOW_PROBE | EXP_PASS,
|
(&link2_rel, &link1_rel, &raw), ALLOW_PROBE | EXP_PASS,
|
||||||
(&link2_abs, &link1_abs, &raw), EXP_PASS,
|
(&link2_abs, &link1_abs, &raw), EXP_PASS,
|
||||||
(&link2_abs, &link1_abs, &raw), ALLOW_PROBE | EXP_PASS);
|
(&link2_abs, &link1_abs, &raw), ALLOW_PROBE | EXP_PASS);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Rewrite qcow2 to be a self-referential loop */
|
||||||
|
virCommandFree(cmd);
|
||||||
|
cmd = virCommandNewArgList(qemuimg, "rebase", "-u", "-f", "qcow2",
|
||||||
|
"-F", "qcow2", "-b", "qcow2", "qcow2", NULL);
|
||||||
|
if (virCommandRun(cmd, NULL) < 0)
|
||||||
|
ret = -1;
|
||||||
|
|
||||||
|
/* Behavior of an infinite loop chain */
|
||||||
|
TEST_CHAIN(16, "qcow2", absqcow2, VIR_STORAGE_FILE_QCOW2,
|
||||||
|
(&qcow2_loop1_rel), EXP_WARN,
|
||||||
|
(&qcow2_loop1_rel), ALLOW_PROBE | EXP_WARN,
|
||||||
|
(&qcow2_loop1_abs), EXP_WARN,
|
||||||
|
(&qcow2_loop1_abs), ALLOW_PROBE | EXP_WARN);
|
||||||
|
|
||||||
|
/* Rewrite wrap and qcow2 to be mutually-referential loop */
|
||||||
|
virCommandFree(cmd);
|
||||||
|
cmd = virCommandNewArgList(qemuimg, "rebase", "-u", "-f", "qcow2",
|
||||||
|
"-F", "qcow2", "-b", "wrap", "qcow2", NULL);
|
||||||
|
if (virCommandRun(cmd, NULL) < 0)
|
||||||
|
ret = -1;
|
||||||
|
|
||||||
|
virCommandFree(cmd);
|
||||||
|
cmd = virCommandNewArgList(qemuimg, "rebase", "-u", "-f", "qcow2",
|
||||||
|
"-F", "qcow2", "-b", absqcow2, "wrap", NULL);
|
||||||
|
if (virCommandRun(cmd, NULL) < 0)
|
||||||
|
ret = -1;
|
||||||
|
|
||||||
|
/* Behavior of an infinite loop chain */
|
||||||
|
TEST_CHAIN(17, "wrap", abswrap, VIR_STORAGE_FILE_QCOW2,
|
||||||
|
(&wrap, &qcow2_loop2_rel), EXP_WARN,
|
||||||
|
(&wrap, &qcow2_loop2_rel), ALLOW_PROBE | EXP_WARN,
|
||||||
|
(&wrap, &qcow2_loop2_abs), EXP_WARN,
|
||||||
|
(&wrap, &qcow2_loop2_abs), ALLOW_PROBE | EXP_WARN);
|
||||||
|
|
||||||
/* Final cleanup */
|
/* Final cleanup */
|
||||||
testCleanupImages();
|
testCleanupImages();
|
||||||
virCommandFree(cmd);
|
virCommandFree(cmd);
|
||||||
|
Loading…
Reference in New Issue
Block a user