tests: qemumonitorjson: Add test case for node name detection code

The code is rather magic so a test case will help making sure that
everything works well. The first case is a simple backing chain.
This commit is contained in:
Peter Krempa 2017-03-13 12:47:46 +01:00
parent dbad8f8aee
commit 217484bdbd
3 changed files with 399 additions and 0 deletions

View File

@ -0,0 +1,268 @@
[
{
"iops_rd": 0,
"detect_zeroes": "off",
"image": {
"virtual-size": 9663676416,
"filename": "/var/lib/libvirt/images/rhel7.3.qcow2",
"cluster-size": 65536,
"format": "qcow2",
"actual-size": 9665384448,
"format-specific": {
"type": "qcow2",
"data": {
"compat": "1.1",
"lazy-refcounts": true,
"refcount-bits": 16,
"corrupt": false
}
},
"dirty-flag": false
},
"iops_wr": 0,
"ro": true,
"node-name": "#block567",
"backing_file_depth": 0,
"drv": "qcow2",
"iops": 0,
"bps_wr": 0,
"write_threshold": 0,
"encrypted": false,
"bps": 0,
"bps_rd": 0,
"cache": {
"no-flush": false,
"direct": false,
"writeback": true
},
"file": "/var/lib/libvirt/images/rhel7.3.qcow2",
"encryption_key_missing": false
},
{
"iops_rd": 0,
"detect_zeroes": "off",
"image": {
"virtual-size": 9665380352,
"filename": "/var/lib/libvirt/images/rhel7.3.qcow2",
"format": "file",
"actual-size": 9665384448,
"dirty-flag": false
},
"iops_wr": 0,
"ro": true,
"node-name": "#block424",
"backing_file_depth": 0,
"drv": "file",
"iops": 0,
"bps_wr": 0,
"write_threshold": 0,
"encrypted": false,
"bps": 0,
"bps_rd": 0,
"cache": {
"no-flush": false,
"direct": false,
"writeback": true
},
"file": "/var/lib/libvirt/images/rhel7.3.qcow2",
"encryption_key_missing": false
},
{
"iops_rd": 0,
"detect_zeroes": "off",
"image": {
"backing-image": {
"virtual-size": 9663676416,
"filename": "/var/lib/libvirt/images/rhel7.3.qcow2",
"cluster-size": 65536,
"format": "qcow2",
"actual-size": 9665384448,
"format-specific": {
"type": "qcow2",
"data": {
"compat": "1.1",
"lazy-refcounts": true,
"refcount-bits": 16,
"corrupt": false
}
},
"dirty-flag": false
},
"backing-filename-format": "qcow2",
"virtual-size": 9663676416,
"filename": "/var/lib/libvirt/images/rhel7.3.1483536402",
"cluster-size": 65536,
"format": "qcow2",
"actual-size": 200704,
"format-specific": {
"type": "qcow2",
"data": {
"compat": "1.1",
"lazy-refcounts": false,
"refcount-bits": 16,
"corrupt": false
}
},
"full-backing-filename": "/var/lib/libvirt/images/rhel7.3.qcow2",
"backing-filename": "/var/lib/libvirt/images/rhel7.3.qcow2",
"dirty-flag": false
},
"iops_wr": 0,
"ro": true,
"node-name": "#block331",
"backing_file_depth": 1,
"drv": "qcow2",
"iops": 0,
"bps_wr": 0,
"write_threshold": 0,
"backing_file": "/var/lib/libvirt/images/rhel7.3.qcow2",
"encrypted": false,
"bps": 0,
"bps_rd": 0,
"cache": {
"no-flush": false,
"direct": false,
"writeback": true
},
"file": "/var/lib/libvirt/images/rhel7.3.1483536402",
"encryption_key_missing": false
},
{
"iops_rd": 0,
"detect_zeroes": "off",
"image": {
"virtual-size": 197120,
"filename": "/var/lib/libvirt/images/rhel7.3.1483536402",
"format": "file",
"actual-size": 200704,
"dirty-flag": false
},
"iops_wr": 0,
"ro": true,
"node-name": "#block281",
"backing_file_depth": 0,
"drv": "file",
"iops": 0,
"bps_wr": 0,
"write_threshold": 0,
"encrypted": false,
"bps": 0,
"bps_rd": 0,
"cache": {
"no-flush": false,
"direct": false,
"writeback": true
},
"file": "/var/lib/libvirt/images/rhel7.3.1483536402",
"encryption_key_missing": false
},
{
"iops_rd": 0,
"detect_zeroes": "off",
"image": {
"backing-image": {
"backing-image": {
"virtual-size": 9663676416,
"filename": "/var/lib/libvirt/images/rhel7.3.qcow2",
"cluster-size": 65536,
"format": "qcow2",
"actual-size": 9665384448,
"format-specific": {
"type": "qcow2",
"data": {
"compat": "1.1",
"lazy-refcounts": true,
"refcount-bits": 16,
"corrupt": false
}
},
"dirty-flag": false
},
"backing-filename-format": "qcow2",
"virtual-size": 9663676416,
"filename": "/var/lib/libvirt/images/rhel7.3.1483536402",
"cluster-size": 65536,
"format": "qcow2",
"actual-size": 200704,
"format-specific": {
"type": "qcow2",
"data": {
"compat": "1.1",
"lazy-refcounts": false,
"refcount-bits": 16,
"corrupt": false
}
},
"full-backing-filename": "/var/lib/libvirt/images/rhel7.3.qcow2",
"backing-filename": "/var/lib/libvirt/images/rhel7.3.qcow2",
"dirty-flag": false
},
"backing-filename-format": "qcow2",
"virtual-size": 9663676416,
"filename": "/var/lib/libvirt/images/rhel7.3.1483545313",
"cluster-size": 65536,
"format": "qcow2",
"actual-size": 32968704,
"format-specific": {
"type": "qcow2",
"data": {
"compat": "1.1",
"lazy-refcounts": false,
"refcount-bits": 16,
"corrupt": false
}
},
"full-backing-filename": "/var/lib/libvirt/images/rhel7.3.1483536402",
"backing-filename": "/var/lib/libvirt/images/rhel7.3.1483536402",
"dirty-flag": false
},
"iops_wr": 0,
"ro": false,
"node-name": "#block118",
"backing_file_depth": 2,
"drv": "qcow2",
"iops": 0,
"bps_wr": 0,
"write_threshold": 0,
"backing_file": "/var/lib/libvirt/images/rhel7.3.1483536402",
"encrypted": false,
"bps": 0,
"bps_rd": 0,
"cache": {
"no-flush": false,
"direct": false,
"writeback": true
},
"file": "/var/lib/libvirt/images/rhel7.3.1483545313",
"encryption_key_missing": false
},
{
"iops_rd": 0,
"detect_zeroes": "off",
"image": {
"virtual-size": 33030144,
"filename": "/var/lib/libvirt/images/rhel7.3.1483545313",
"format": "file",
"actual-size": 32968704,
"dirty-flag": false
},
"iops_wr": 0,
"ro": false,
"node-name": "#block078",
"backing_file_depth": 0,
"drv": "file",
"iops": 0,
"bps_wr": 0,
"write_threshold": 0,
"encrypted": false,
"bps": 0,
"bps_rd": 0,
"cache": {
"no-flush": false,
"direct": false,
"writeback": true
},
"file": "/var/lib/libvirt/images/rhel7.3.1483545313",
"encryption_key_missing": false
}
]

View File

@ -0,0 +1,15 @@
filename : '/var/lib/libvirt/images/rhel7.3.1483545313'
format node : '#block118'
storage node: '#block078'
backingfile : '/var/lib/libvirt/images/rhel7.3.1483536402'
backing ptr : '#block331'
filename : '/var/lib/libvirt/images/rhel7.3.1483536402'
format node : '#block331'
storage node: '#block281'
backingfile : '/var/lib/libvirt/images/rhel7.3.qcow2'
backing ptr : '#block567'
filename : '/var/lib/libvirt/images/rhel7.3.qcow2'
format node : '#block567'
storage node: '#block424'
backingfile : '<null>'
backing ptr : '<null>'

View File

@ -23,6 +23,7 @@
#include "testutilsqemu.h"
#include "qemumonitortestutils.h"
#include "qemu/qemu_domain.h"
#include "qemu/qemu_block.h"
#include "qemu/qemu_monitor_json.h"
#include "virthread.h"
#include "virerror.h"
@ -2682,6 +2683,109 @@ testQemuMonitorCPUInfo(const void *opaque)
}
struct testBlockNodeNameDetectData {
const char *name;
const char *nodenames;
};
static void
testBlockNodeNameDetectFormat(virBufferPtr buf,
const char *basenode,
virHashTablePtr nodedata)
{
qemuBlockNodeNameBackingChainDataPtr entry = NULL;
const char *node = basenode;
virBufferSetIndent(buf, 0);
while (node) {
if (!(entry = virHashLookup(nodedata, node)))
break;
virBufferAsprintf(buf, "filename : '%s'\n", entry->qemufilename);
virBufferAsprintf(buf, "format node : '%s'\n",
NULLSTR(entry->nodeformat));
virBufferAsprintf(buf, "storage node: '%s'\n",
NULLSTR(entry->nodestorage));
virBufferAsprintf(buf, "backingfile : '%s'\n",
NULLSTR(entry->backingstore));
virBufferAsprintf(buf, "backing ptr : '%s'\n",
NULLSTR(entry->nodebacking));
virBufferAdjustIndent(buf, 2);
node = entry->nodebacking;
}
virBufferSetIndent(buf, 0);
virBufferAddLit(buf, "\n");
}
static int
testBlockNodeNameDetect(const void *opaque)
{
const struct testBlockNodeNameDetectData *data = opaque;
char *jsonFile = NULL;
char *jsonStr = NULL;
char *resultFile = NULL;
char *actual = NULL;
char **nodenames = NULL;
char **next;
virJSONValuePtr json = NULL;
virHashTablePtr nodedata = NULL;
virBuffer buf = VIR_BUFFER_INITIALIZER;
int ret = -1;
if (virAsprintf(&jsonFile,
"%s/qemumonitorjsondata/qemumonitorjson-nodename-%s.json",
abs_srcdir, data->name) < 0 ||
virAsprintf(&resultFile,
"%s/qemumonitorjsondata/qemumonitorjson-nodename-%s.result",
abs_srcdir, data->name) < 0)
goto cleanup;
if (!(nodenames = virStringSplit(data->nodenames, ",", 0)))
goto cleanup;
if (virTestLoadFile(jsonFile, &jsonStr) < 0)
goto cleanup;
if (!(json = virJSONValueFromString(jsonStr)))
goto cleanup;
if (!(nodedata = qemuBlockNodeNameGetBackingChain(json)))
goto cleanup;
for (next = nodenames; *next; next++)
testBlockNodeNameDetectFormat(&buf, *next, nodedata);
virBufferTrim(&buf, "\n", -1);
if (virBufferCheckError(&buf) < 0)
goto cleanup;
actual = virBufferContentAndReset(&buf);
if (virTestCompareToFile(actual, resultFile) < 0)
goto cleanup;
ret = 0;
cleanup:
VIR_FREE(jsonFile);
VIR_FREE(resultFile);
VIR_FREE(jsonStr);
VIR_FREE(actual);
virHashFree(nodedata);
virStringListFree(nodenames);
virJSONValueFree(json);
return ret;
}
static int
mymain(void)
{
@ -2816,6 +2920,18 @@ mymain(void)
DO_TEST_CPU_INFO("ppc64-hotplug-4", 24);
DO_TEST_CPU_INFO("ppc64-no-threads", 16);
#define DO_TEST_BLOCK_NODE_DETECT(testname, testnodes) \
do { \
struct testBlockNodeNameDetectData testdata = {testname, testnodes}; \
if (virTestRun("node-name-detect(" testname ")", \
testBlockNodeNameDetect, &testdata) < 0) \
ret = -1; \
} while (0)
DO_TEST_BLOCK_NODE_DETECT("1", "#block118");
#undef DO_TEST_BLOCK_NODE_DETECT
qemuTestDriverFree(&driver);
return (ret == 0) ? EXIT_SUCCESS : EXIT_FAILURE;