提交 b10a0e91 编写于 作者: E Eric Blake

storage: better tests of lookup

Add some more tests of what happens when we restrict a lookup
to begin at a point in the middle of a chain.  In particular,
we want to ensure that a parent is not found when starting at
the child.  This commit also demonstrates that we have a slight
difference in behavior on what parent we report when filtering
is in effect; as the determination of the parent affects the
code in block commit, exposing this in the testsuite will help
justify changes in future patches that tweak the semantics of
what lookups are allowed.

* tests/virstoragetest.c (testStorageLookup): Test user input.
(TEST_LOOKUP_TARGET): Add parameter.
(mymain): Add lookup tests.
Signed-off-by: NEric Blake <eblake@redhat.com>
上级 54597c56
...@@ -438,6 +438,7 @@ struct testLookupData ...@@ -438,6 +438,7 @@ struct testLookupData
{ {
virStorageSourcePtr chain; virStorageSourcePtr chain;
const char *target; const char *target;
virStorageSourcePtr from;
const char *name; const char *name;
unsigned int expIndex; unsigned int expIndex;
const char *expResult; const char *expResult;
...@@ -465,7 +466,7 @@ testStorageLookup(const void *args) ...@@ -465,7 +466,7 @@ testStorageLookup(const void *args)
} }
/* Test twice to ensure optional parameter doesn't cause NULL deref. */ /* Test twice to ensure optional parameter doesn't cause NULL deref. */
result = virStorageFileChainLookup(data->chain, NULL, result = virStorageFileChainLookup(data->chain, data->from,
idx ? NULL : data->name, idx ? NULL : data->name,
idx, NULL); idx, NULL);
...@@ -494,7 +495,7 @@ testStorageLookup(const void *args) ...@@ -494,7 +495,7 @@ testStorageLookup(const void *args)
ret = -1; ret = -1;
} }
result = virStorageFileChainLookup(data->chain, data->chain, result = virStorageFileChainLookup(data->chain, data->from,
data->name, idx, &actualParent); data->name, idx, &actualParent);
if (!data->expResult) if (!data->expResult)
virResetLastError(); virResetLastError();
...@@ -530,6 +531,7 @@ mymain(void) ...@@ -530,6 +531,7 @@ mymain(void)
int ret; int ret;
virCommandPtr cmd = NULL; virCommandPtr cmd = NULL;
struct testChainData data; struct testChainData data;
struct testLookupData data2;
virStorageSourcePtr chain = NULL; virStorageSourcePtr chain = NULL;
virStorageSourcePtr chain2; /* short for chain->backingStore */ virStorageSourcePtr chain2; /* short for chain->backingStore */
virStorageSourcePtr chain3; /* short for chain2->backingStore */ virStorageSourcePtr chain3; /* short for chain2->backingStore */
...@@ -924,26 +926,47 @@ mymain(void) ...@@ -924,26 +926,47 @@ mymain(void)
chain2 = chain->backingStore; chain2 = chain->backingStore;
chain3 = chain2->backingStore; chain3 = chain2->backingStore;
#define TEST_LOOKUP_TARGET(id, target, ignored, name, index, result, \ #define TEST_LOOKUP_TARGET(id, target, from, name, index, result, \
meta, parent) \ meta, parent) \
do { \ do { \
struct testLookupData data2 = { chain, target, name, index, \ data2 = (struct testLookupData){ \
result, meta, parent, }; \ chain, target, from, name, index, \
if (virtTestRun("Chain lookup " #id, \ result, meta, parent, }; \
testStorageLookup, &data2) < 0) \ if (virtTestRun("Chain lookup " #id, \
ret = -1; \ testStorageLookup, &data2) < 0) \
ret = -1; \
} while (0) } while (0)
#define TEST_LOOKUP(id, from, name, result, meta, parent) \ #define TEST_LOOKUP(id, from, name, result, meta, parent) \
TEST_LOOKUP_TARGET(id, NULL, from, name, 0, result, meta, parent) TEST_LOOKUP_TARGET(id, NULL, from, name, 0, result, meta, parent)
TEST_LOOKUP(0, NULL, "bogus", NULL, NULL, NULL); TEST_LOOKUP(0, NULL, "bogus", NULL, NULL, NULL);
TEST_LOOKUP(1, chain, "bogus", NULL, NULL, NULL);
TEST_LOOKUP(2, NULL, "wrap", chain->path, chain, NULL); TEST_LOOKUP(2, NULL, "wrap", chain->path, chain, NULL);
TEST_LOOKUP(3, chain, "wrap", chain->path, chain, NULL);
TEST_LOOKUP(4, chain2, "wrap", NULL, NULL, NULL);
TEST_LOOKUP(5, NULL, abswrap, chain->path, chain, NULL); TEST_LOOKUP(5, NULL, abswrap, chain->path, chain, NULL);
TEST_LOOKUP(6, chain, abswrap, chain->path, chain, NULL);
TEST_LOOKUP(7, chain2, abswrap, NULL, NULL, NULL);
TEST_LOOKUP(8, NULL, "qcow2", chain2->path, chain2, chain->path); TEST_LOOKUP(8, NULL, "qcow2", chain2->path, chain2, chain->path);
TEST_LOOKUP(9, chain, "qcow2", chain2->path, chain2, chain->path);
TEST_LOOKUP(10, chain2, "qcow2", chain2->path, chain2, NULL);
TEST_LOOKUP(11, chain3, "qcow2", NULL, NULL, NULL);
TEST_LOOKUP(12, NULL, absqcow2, chain2->path, chain2, chain->path); TEST_LOOKUP(12, NULL, absqcow2, chain2->path, chain2, chain->path);
TEST_LOOKUP(13, chain, absqcow2, chain2->path, chain2, chain->path);
TEST_LOOKUP(14, chain2, absqcow2, chain2->path, chain2, NULL);
TEST_LOOKUP(15, chain3, absqcow2, NULL, NULL, NULL);
TEST_LOOKUP(16, NULL, "raw", chain3->path, chain3, chain2->path); TEST_LOOKUP(16, NULL, "raw", chain3->path, chain3, chain2->path);
TEST_LOOKUP(17, chain, "raw", chain3->path, chain3, chain2->path);
TEST_LOOKUP(18, chain2, "raw", chain3->path, chain3, chain2->path);
TEST_LOOKUP(19, chain3, "raw", chain3->path, chain3, NULL);
TEST_LOOKUP(20, NULL, absraw, chain3->path, chain3, chain2->path); TEST_LOOKUP(20, NULL, absraw, chain3->path, chain3, chain2->path);
TEST_LOOKUP(21, chain, absraw, chain3->path, chain3, chain2->path);
TEST_LOOKUP(22, chain2, absraw, chain3->path, chain3, chain2->path);
TEST_LOOKUP(23, chain3, absraw, chain3->path, chain3, NULL);
TEST_LOOKUP(24, NULL, NULL, chain3->path, chain3, chain2->path); TEST_LOOKUP(24, NULL, NULL, chain3->path, chain3, chain2->path);
TEST_LOOKUP(25, chain, NULL, chain3->path, chain3, chain2->path);
TEST_LOOKUP(26, chain2, NULL, chain3->path, chain3, chain2->path);
TEST_LOOKUP(27, chain3, NULL, chain3->path, chain3, NULL);
/* Rewrite wrap and qcow2 back to 3-deep chain, relative backing */ /* Rewrite wrap and qcow2 back to 3-deep chain, relative backing */
virCommandFree(cmd); virCommandFree(cmd);
...@@ -970,13 +993,33 @@ mymain(void) ...@@ -970,13 +993,33 @@ mymain(void)
chain3 = chain2->backingStore; chain3 = chain2->backingStore;
TEST_LOOKUP(28, NULL, "bogus", NULL, NULL, NULL); TEST_LOOKUP(28, NULL, "bogus", NULL, NULL, NULL);
TEST_LOOKUP(29, chain, "bogus", NULL, NULL, NULL);
TEST_LOOKUP(30, NULL, "wrap", chain->path, chain, NULL); TEST_LOOKUP(30, NULL, "wrap", chain->path, chain, NULL);
TEST_LOOKUP(31, chain, "wrap", chain->path, chain, NULL);
TEST_LOOKUP(32, chain2, "wrap", NULL, NULL, NULL);
TEST_LOOKUP(33, NULL, abswrap, chain->path, chain, NULL); TEST_LOOKUP(33, NULL, abswrap, chain->path, chain, NULL);
TEST_LOOKUP(34, chain, abswrap, chain->path, chain, NULL);
TEST_LOOKUP(35, chain2, abswrap, NULL, NULL, NULL);
TEST_LOOKUP(36, NULL, "qcow2", chain2->path, chain2, chain->path); TEST_LOOKUP(36, NULL, "qcow2", chain2->path, chain2, chain->path);
TEST_LOOKUP(37, chain, "qcow2", chain2->path, chain2, chain->path);
TEST_LOOKUP(38, chain2, "qcow2", chain2->path, chain2, NULL);
TEST_LOOKUP(39, chain3, "qcow2", NULL, NULL, NULL);
TEST_LOOKUP(40, NULL, absqcow2, chain2->path, chain2, chain->path); TEST_LOOKUP(40, NULL, absqcow2, chain2->path, chain2, chain->path);
TEST_LOOKUP(41, chain, absqcow2, chain2->path, chain2, chain->path);
TEST_LOOKUP(42, chain2, absqcow2, chain2->path, chain2, NULL);
TEST_LOOKUP(43, chain3, absqcow2, NULL, NULL, NULL);
TEST_LOOKUP(44, NULL, "raw", chain3->path, chain3, chain2->path); TEST_LOOKUP(44, NULL, "raw", chain3->path, chain3, chain2->path);
TEST_LOOKUP(45, chain, "raw", chain3->path, chain3, chain2->path);
TEST_LOOKUP(46, chain2, "raw", chain3->path, chain3, chain2->path);
TEST_LOOKUP(47, chain3, "raw", chain3->path, chain3, NULL);
TEST_LOOKUP(48, NULL, absraw, chain3->path, chain3, chain2->path); TEST_LOOKUP(48, NULL, absraw, chain3->path, chain3, chain2->path);
TEST_LOOKUP(49, chain, absraw, chain3->path, chain3, chain2->path);
TEST_LOOKUP(50, chain2, absraw, chain3->path, chain3, chain2->path);
TEST_LOOKUP(51, chain3, absraw, chain3->path, chain3, NULL);
TEST_LOOKUP(52, NULL, NULL, chain3->path, chain3, chain2->path); TEST_LOOKUP(52, NULL, NULL, chain3->path, chain3, chain2->path);
TEST_LOOKUP(53, chain, NULL, chain3->path, chain3, chain2->path);
TEST_LOOKUP(54, chain2, NULL, chain3->path, chain3, chain2->path);
TEST_LOOKUP(55, chain3, NULL, chain3->path, chain3, NULL);
/* Use link to wrap with cross-directory relative backing */ /* Use link to wrap with cross-directory relative backing */
virCommandFree(cmd); virCommandFree(cmd);
...@@ -1011,11 +1054,24 @@ mymain(void) ...@@ -1011,11 +1054,24 @@ mymain(void)
TEST_LOOKUP_TARGET(67, "vda", NULL, "vda[-1]", 0, NULL, NULL, NULL); TEST_LOOKUP_TARGET(67, "vda", NULL, "vda[-1]", 0, NULL, NULL, NULL);
TEST_LOOKUP_TARGET(68, "vda", NULL, "vda[1][1]", 0, NULL, NULL, NULL); TEST_LOOKUP_TARGET(68, "vda", NULL, "vda[1][1]", 0, NULL, NULL, NULL);
TEST_LOOKUP_TARGET(69, "vda", NULL, "wrap", 0, chain->path, chain, NULL); TEST_LOOKUP_TARGET(69, "vda", NULL, "wrap", 0, chain->path, chain, NULL);
TEST_LOOKUP_TARGET(70, "vda", chain, "wrap", 0, chain->path, chain, NULL);
TEST_LOOKUP_TARGET(71, "vda", chain2, "wrap", 0, NULL, NULL, NULL);
TEST_LOOKUP_TARGET(72, "vda", NULL, "vda[0]", 0, NULL, NULL, NULL); TEST_LOOKUP_TARGET(72, "vda", NULL, "vda[0]", 0, NULL, NULL, NULL);
TEST_LOOKUP_TARGET(73, "vda", NULL, "vda[1]", 1, chain2->path, chain2, TEST_LOOKUP_TARGET(73, "vda", NULL, "vda[1]", 1, chain2->path, chain2,
chain->path); chain->path);
TEST_LOOKUP_TARGET(74, "vda", chain, "vda[1]", 1, chain2->path, chain2,
chain->path);
TEST_LOOKUP_TARGET(75, "vda", chain2, "vda[1]", 1, chain2->path, chain2,
NULL);
TEST_LOOKUP_TARGET(76, "vda", chain3, "vda[1]", 1, NULL, NULL, NULL);
TEST_LOOKUP_TARGET(77, "vda", NULL, "vda[2]", 2, chain3->path, chain3, TEST_LOOKUP_TARGET(77, "vda", NULL, "vda[2]", 2, chain3->path, chain3,
chain2->path); chain2->path);
TEST_LOOKUP_TARGET(78, "vda", chain, "vda[2]", 2, chain3->path, chain3,
chain2->path);
TEST_LOOKUP_TARGET(79, "vda", chain2, "vda[2]", 2, chain3->path, chain3,
chain2->path);
TEST_LOOKUP_TARGET(80, "vda", chain3, "vda[2]", 2, chain3->path, chain3,
NULL);
TEST_LOOKUP_TARGET(81, "vda", NULL, "vda[3]", 3, NULL, NULL, NULL); TEST_LOOKUP_TARGET(81, "vda", NULL, "vda[3]", 3, NULL, NULL, NULL);
cleanup: cleanup:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册