mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 17:34:18 +03:00
tests: Add test infrastructure for qemuMonitorGetCPUInfo
As the combination algorithm is rather complex and ugly it's necessary to make sure it works properly. Add test suite infrastructure for testing it along with a basic test based on x86_64 platform.
This commit is contained in:
parent
9bbbc88a8f
commit
f8638471d7
@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
"return": [
|
||||||
|
{
|
||||||
|
"arch": "x86",
|
||||||
|
"current": true,
|
||||||
|
"CPU": 0,
|
||||||
|
"qom_path": "/machine/unattached/device[0]",
|
||||||
|
"pc": -2130415978,
|
||||||
|
"halted": true,
|
||||||
|
"thread_id": 518291
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86",
|
||||||
|
"current": false,
|
||||||
|
"CPU": 1,
|
||||||
|
"qom_path": "/machine/unattached/device[2]",
|
||||||
|
"pc": -2130415978,
|
||||||
|
"halted": true,
|
||||||
|
"thread_id": 518292
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86",
|
||||||
|
"current": false,
|
||||||
|
"CPU": 2,
|
||||||
|
"qom_path": "/machine/unattached/device[3]",
|
||||||
|
"pc": -2130415978,
|
||||||
|
"halted": true,
|
||||||
|
"thread_id": 518294
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86",
|
||||||
|
"current": false,
|
||||||
|
"CPU": 3,
|
||||||
|
"qom_path": "/machine/unattached/device[4]",
|
||||||
|
"pc": -2130415978,
|
||||||
|
"halted": true,
|
||||||
|
"thread_id": 518295
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86",
|
||||||
|
"current": false,
|
||||||
|
"CPU": 4,
|
||||||
|
"qom_path": "/machine/unattached/device[5]",
|
||||||
|
"pc": -2130415978,
|
||||||
|
"halted": true,
|
||||||
|
"thread_id": 518296
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"id": "libvirt-22"
|
||||||
|
}
|
@ -0,0 +1,82 @@
|
|||||||
|
{
|
||||||
|
"return": [
|
||||||
|
{
|
||||||
|
"props": {
|
||||||
|
"core-id": 1,
|
||||||
|
"thread-id": 1,
|
||||||
|
"socket-id": 1
|
||||||
|
},
|
||||||
|
"vcpus-count": 1,
|
||||||
|
"type": "qemu64-x86_64-cpu"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"props": {
|
||||||
|
"core-id": 1,
|
||||||
|
"thread-id": 0,
|
||||||
|
"socket-id": 1
|
||||||
|
},
|
||||||
|
"vcpus-count": 1,
|
||||||
|
"type": "qemu64-x86_64-cpu"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"props": {
|
||||||
|
"core-id": 0,
|
||||||
|
"thread-id": 1,
|
||||||
|
"socket-id": 1
|
||||||
|
},
|
||||||
|
"vcpus-count": 1,
|
||||||
|
"type": "qemu64-x86_64-cpu"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"props": {
|
||||||
|
"core-id": 0,
|
||||||
|
"thread-id": 0,
|
||||||
|
"socket-id": 1
|
||||||
|
},
|
||||||
|
"vcpus-count": 1,
|
||||||
|
"qom-path": "/machine/unattached/device[5]",
|
||||||
|
"type": "qemu64-x86_64-cpu"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"props": {
|
||||||
|
"core-id": 1,
|
||||||
|
"thread-id": 1,
|
||||||
|
"socket-id": 0
|
||||||
|
},
|
||||||
|
"vcpus-count": 1,
|
||||||
|
"qom-path": "/machine/unattached/device[4]",
|
||||||
|
"type": "qemu64-x86_64-cpu"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"props": {
|
||||||
|
"core-id": 1,
|
||||||
|
"thread-id": 0,
|
||||||
|
"socket-id": 0
|
||||||
|
},
|
||||||
|
"vcpus-count": 1,
|
||||||
|
"qom-path": "/machine/unattached/device[3]",
|
||||||
|
"type": "qemu64-x86_64-cpu"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"props": {
|
||||||
|
"core-id": 0,
|
||||||
|
"thread-id": 1,
|
||||||
|
"socket-id": 0
|
||||||
|
},
|
||||||
|
"vcpus-count": 1,
|
||||||
|
"qom-path": "/machine/unattached/device[2]",
|
||||||
|
"type": "qemu64-x86_64-cpu"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"props": {
|
||||||
|
"core-id": 0,
|
||||||
|
"thread-id": 0,
|
||||||
|
"socket-id": 0
|
||||||
|
},
|
||||||
|
"vcpus-count": 1,
|
||||||
|
"qom-path": "/machine/unattached/device[0]",
|
||||||
|
"type": "qemu64-x86_64-cpu"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"id": "libvirt-23"
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
[vcpu libvirt-id='0']
|
||||||
|
thread-id='518291'
|
||||||
|
qemu-id='1'
|
||||||
|
type='qemu64-x86_64-cpu'
|
||||||
|
qom_path='/machine/unattached/device[0]'
|
||||||
|
topology: socket='0' core='0' thread='0' vcpus='1'
|
||||||
|
[vcpu libvirt-id='1']
|
||||||
|
thread-id='518292'
|
||||||
|
qemu-id='2'
|
||||||
|
type='qemu64-x86_64-cpu'
|
||||||
|
qom_path='/machine/unattached/device[2]'
|
||||||
|
topology: socket='0' core='0' thread='1' vcpus='1'
|
||||||
|
[vcpu libvirt-id='2']
|
||||||
|
thread-id='518294'
|
||||||
|
qemu-id='3'
|
||||||
|
type='qemu64-x86_64-cpu'
|
||||||
|
qom_path='/machine/unattached/device[3]'
|
||||||
|
topology: socket='0' core='1' thread='0' vcpus='1'
|
||||||
|
[vcpu libvirt-id='3']
|
||||||
|
thread-id='518295'
|
||||||
|
qemu-id='4'
|
||||||
|
type='qemu64-x86_64-cpu'
|
||||||
|
qom_path='/machine/unattached/device[4]'
|
||||||
|
topology: socket='0' core='1' thread='1' vcpus='1'
|
||||||
|
[vcpu libvirt-id='4']
|
||||||
|
thread-id='518296'
|
||||||
|
qemu-id='5'
|
||||||
|
type='qemu64-x86_64-cpu'
|
||||||
|
qom_path='/machine/unattached/device[5]'
|
||||||
|
topology: socket='1' core='0' thread='0' vcpus='1'
|
||||||
|
[vcpu libvirt-id='5']
|
||||||
|
type='qemu64-x86_64-cpu'
|
||||||
|
topology: socket='1' core='0' thread='1' vcpus='1'
|
||||||
|
[vcpu libvirt-id='6']
|
||||||
|
type='qemu64-x86_64-cpu'
|
||||||
|
topology: socket='1' core='1' thread='0' vcpus='1'
|
||||||
|
[vcpu libvirt-id='7']
|
||||||
|
type='qemu64-x86_64-cpu'
|
||||||
|
topology: socket='1' core='1' thread='1' vcpus='1'
|
@ -2336,6 +2336,130 @@ testQemuMonitorJSONGetIOThreads(const void *data)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct testCPUInfoData {
|
||||||
|
const char *name;
|
||||||
|
size_t maxvcpus;
|
||||||
|
virDomainXMLOptionPtr xmlopt;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
testQemuMonitorCPUInfoFormat(qemuMonitorCPUInfoPtr vcpus,
|
||||||
|
size_t nvcpus)
|
||||||
|
{
|
||||||
|
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||||
|
qemuMonitorCPUInfoPtr vcpu;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < nvcpus; i++) {
|
||||||
|
vcpu = vcpus + i;
|
||||||
|
|
||||||
|
virBufferAsprintf(&buf, "[vcpu libvirt-id='%zu']\n", i);
|
||||||
|
virBufferAdjustIndent(&buf, 4);
|
||||||
|
|
||||||
|
if (vcpu->tid)
|
||||||
|
virBufferAsprintf(&buf, "thread-id='%llu'\n",
|
||||||
|
(unsigned long long) vcpu->tid);
|
||||||
|
|
||||||
|
if (vcpu->id != 0)
|
||||||
|
virBufferAsprintf(&buf, "qemu-id='%d'\n", vcpu->id);
|
||||||
|
|
||||||
|
if (vcpu->type)
|
||||||
|
virBufferAsprintf(&buf, "type='%s'\n", vcpu->type);
|
||||||
|
|
||||||
|
if (vcpu->alias)
|
||||||
|
virBufferAsprintf(&buf, "alias='%s'\n", vcpu->alias);
|
||||||
|
if (vcpu->qom_path)
|
||||||
|
virBufferAsprintf(&buf, "qom_path='%s'\n", vcpu->qom_path);
|
||||||
|
|
||||||
|
if (vcpu->socket_id != -1 || vcpu->core_id != -1 ||
|
||||||
|
vcpu->thread_id != -1 || vcpu->vcpus != 0) {
|
||||||
|
virBufferAddLit(&buf, "topology:");
|
||||||
|
if (vcpu->socket_id != -1)
|
||||||
|
virBufferAsprintf(&buf, " socket='%d'", vcpu->socket_id);
|
||||||
|
if (vcpu->core_id != -1)
|
||||||
|
virBufferAsprintf(&buf, " core='%d'", vcpu->core_id);
|
||||||
|
if (vcpu->thread_id != -1)
|
||||||
|
virBufferAsprintf(&buf, " thread='%d'", vcpu->thread_id);
|
||||||
|
if (vcpu->vcpus != 0)
|
||||||
|
virBufferAsprintf(&buf, " vcpus='%u'", vcpu->vcpus);
|
||||||
|
virBufferAddLit(&buf, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
virBufferAdjustIndent(&buf, -4);
|
||||||
|
}
|
||||||
|
|
||||||
|
return virBufferContentAndReset(&buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
testQemuMonitorCPUInfo(const void *opaque)
|
||||||
|
{
|
||||||
|
const struct testCPUInfoData *data = opaque;
|
||||||
|
qemuMonitorTestPtr test = qemuMonitorTestNewSimple(true, data->xmlopt);
|
||||||
|
char *queryCpusFile = NULL;
|
||||||
|
char *queryHotpluggableFile = NULL;
|
||||||
|
char *dataFile = NULL;
|
||||||
|
char *queryCpusStr = NULL;
|
||||||
|
char *queryHotpluggableStr = NULL;
|
||||||
|
char *actual = NULL;
|
||||||
|
qemuMonitorCPUInfoPtr vcpus = NULL;
|
||||||
|
int rc;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
if (!test)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (virAsprintf(&queryCpusFile,
|
||||||
|
"%s/qemumonitorjsondata/qemumonitorjson-cpuinfo-%s-cpus.json",
|
||||||
|
abs_srcdir, data->name) < 0 ||
|
||||||
|
virAsprintf(&queryHotpluggableFile,
|
||||||
|
"%s/qemumonitorjsondata/qemumonitorjson-cpuinfo-%s-hotplug.json",
|
||||||
|
abs_srcdir, data->name) < 0 ||
|
||||||
|
virAsprintf(&dataFile,
|
||||||
|
"%s/qemumonitorjsondata/qemumonitorjson-cpuinfo-%s.data",
|
||||||
|
abs_srcdir, data->name) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (virTestLoadFile(queryCpusFile, &queryCpusStr) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (virTestLoadFile(queryHotpluggableFile, &queryHotpluggableStr) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (qemuMonitorTestAddItem(test, "query-hotpluggable-cpus",
|
||||||
|
queryHotpluggableStr) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (qemuMonitorTestAddItem(test, "query-cpus", queryCpusStr) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
rc = qemuMonitorGetCPUInfo(qemuMonitorTestGetMonitor(test),
|
||||||
|
&vcpus, data->maxvcpus, true);
|
||||||
|
|
||||||
|
if (rc < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
actual = testQemuMonitorCPUInfoFormat(vcpus, data->maxvcpus);
|
||||||
|
|
||||||
|
if (virTestCompareToFile(actual, dataFile) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
cleanup:
|
||||||
|
VIR_FREE(queryCpusFile);
|
||||||
|
VIR_FREE(queryHotpluggableFile);
|
||||||
|
VIR_FREE(dataFile);
|
||||||
|
VIR_FREE(queryCpusStr);
|
||||||
|
VIR_FREE(queryHotpluggableStr);
|
||||||
|
VIR_FREE(actual);
|
||||||
|
qemuMonitorCPUInfoFree(vcpus, data->maxvcpus);
|
||||||
|
qemuMonitorTestFree(test);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
mymain(void)
|
mymain(void)
|
||||||
{
|
{
|
||||||
@ -2378,6 +2502,14 @@ mymain(void)
|
|||||||
ret = -1; \
|
ret = -1; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define DO_TEST_CPU_INFO(name, maxvcpus) \
|
||||||
|
do { \
|
||||||
|
struct testCPUInfoData data = {name, maxvcpus, driver.xmlopt}; \
|
||||||
|
if (virTestRun("GetCPUInfo(" name ")", testQemuMonitorCPUInfo, \
|
||||||
|
&data) < 0) \
|
||||||
|
ret = -1; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
DO_TEST(GetStatus);
|
DO_TEST(GetStatus);
|
||||||
DO_TEST(GetVersion);
|
DO_TEST(GetVersion);
|
||||||
DO_TEST(GetMachines);
|
DO_TEST(GetMachines);
|
||||||
@ -2452,6 +2584,8 @@ mymain(void)
|
|||||||
DO_TEST_CPU_DATA("full");
|
DO_TEST_CPU_DATA("full");
|
||||||
DO_TEST_CPU_DATA("ecx");
|
DO_TEST_CPU_DATA("ecx");
|
||||||
|
|
||||||
|
DO_TEST_CPU_INFO("x86-basic-pluggable", 8);
|
||||||
|
|
||||||
qemuTestDriverFree(&driver);
|
qemuTestDriverFree(&driver);
|
||||||
|
|
||||||
return (ret == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
|
return (ret == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||||
|
Loading…
Reference in New Issue
Block a user