qemumonitorjsontest: Refactor chardev hotplug testing

The main objective of this patch is to use a proper instance of
virDomainChrSourceDef allocated with the private data.

To achieve this the test cases are grouped into blocks by how much they
fill in the chardev definition. Some test cases are moved around so
that the resulting sequence doesn't need extra clearing.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Peter Krempa 2022-02-08 16:41:33 +01:00
parent e6f837f611
commit 128f5c3383

View File

@ -679,114 +679,126 @@ static int
qemuMonitorJSONTestAttachChardev(virDomainXMLOption *xmlopt, qemuMonitorJSONTestAttachChardev(virDomainXMLOption *xmlopt,
GHashTable *schema) GHashTable *schema)
{ {
virDomainChrSourceDef chr;
int ret = 0; int ret = 0;
#define CHECK(label, fail, expectargs) \ #define CHECK(label, fail, expectargs) \
if (qemuMonitorJSONTestAttachOneChardev(xmlopt, schema, label, &chr, \ if (qemuMonitorJSONTestAttachOneChardev(xmlopt, schema, label, chr, \
expectargs, NULL, NULL, fail) < 0) \ expectargs, NULL, NULL, fail) < 0) \
ret = -1 ret = -1
chr = (virDomainChrSourceDef) { .type = VIR_DOMAIN_CHR_TYPE_NULL }; {
CHECK("null", false, g_autoptr(virDomainChrSourceDef) chr = virDomainChrSourceDefNew(xmlopt);
"{'id':'alias','backend':{'type':'null','data':{}}}");
chr = (virDomainChrSourceDef) { .type = VIR_DOMAIN_CHR_TYPE_VC }; chr->type = VIR_DOMAIN_CHR_TYPE_NULL;
CHECK("vc", false, CHECK("null", false,
"{'id':'alias','backend':{'type':'vc','data':{}}}"); "{'id':'alias','backend':{'type':'null','data':{}}}");
chr = (virDomainChrSourceDef) { .type = VIR_DOMAIN_CHR_TYPE_PTY }; chr->type = VIR_DOMAIN_CHR_TYPE_VC;
if (qemuMonitorJSONTestAttachOneChardev(xmlopt, schema, "pty", &chr, CHECK("vc", false,
"{'id':'alias'," "{'id':'alias','backend':{'type':'vc','data':{}}}");
"'backend':{'type':'pty',"
"'data':{}}}",
"\"pty\" : \"/dev/pts/0\"",
"/dev/pts/0", false) < 0)
ret = -1;
chr = (virDomainChrSourceDef) { .type = VIR_DOMAIN_CHR_TYPE_PTY }; chr->type = VIR_DOMAIN_CHR_TYPE_SPICEVMC;
CHECK("pty missing path", true, CHECK("spicevmc", false,
"{'id':'alias','backend':{'type':'pty','data':{}}}"); "{'id':'alias','backend':{'type':'spicevmc',"
"'data':{'type':'vdagent'}}}");
memset(&chr, 0, sizeof(chr)); chr->type = VIR_DOMAIN_CHR_TYPE_PIPE;
chr.type = VIR_DOMAIN_CHR_TYPE_FILE; CHECK("pipe", true, NULL);
chr.data.file.path = (char *) "/test/path";
CHECK("file", false,
"{'id':'alias','backend':{'type':'file','data':{'out':'/test/path'}}}");
memset(&chr, 0, sizeof(chr)); chr->type = VIR_DOMAIN_CHR_TYPE_STDIO;
chr.type = VIR_DOMAIN_CHR_TYPE_DEV; CHECK("stdio", true, NULL);
chr.data.file.path = (char *) "/test/path";
CHECK("device", false,
"{'id':'alias','backend':{'type':'serial','data':{'device':'/test/path'}}}");
memset(&chr, 0, sizeof(chr)); chr->type = VIR_DOMAIN_CHR_TYPE_PTY;
chr.type = VIR_DOMAIN_CHR_TYPE_TCP; CHECK("pty missing path", true,
chr.data.tcp.host = (char *) "example.com"; "{'id':'alias','backend':{'type':'pty','data':{}}}");
chr.data.tcp.service = (char *) "1234"; if (qemuMonitorJSONTestAttachOneChardev(xmlopt, schema, "pty", chr,
CHECK("tcp", false, "{'id':'alias',"
"{'id':'alias'," "'backend':{'type':'pty',"
"'backend':{'type':'socket'," "'data':{}}}",
"'data':{'addr':{'type':'inet'," "\"pty\" : \"/dev/pts/0\"",
"'data':{'host':'example.com'," "/dev/pts/0", false) < 0)
"'port':'1234'}}," ret = -1;
"'telnet':false," }
"'server':false}}}");
memset(&chr, 0, sizeof(chr)); {
chr.type = VIR_DOMAIN_CHR_TYPE_UDP; g_autoptr(virDomainChrSourceDef) chr = virDomainChrSourceDefNew(xmlopt);
chr.data.udp.connectHost = (char *) "example.com";
chr.data.udp.connectService = (char *) "1234";
CHECK("udp", false,
"{'id':'alias',"
"'backend':{'type':'udp',"
"'data':{'remote':{'type':'inet',"
"'data':{'host':'example.com',"
"'port':'1234'}}}}}");
chr.data.udp.bindHost = (char *) "localhost"; chr->data.file.path = g_strdup("/test/path");
chr.data.udp.bindService = (char *) "4321";
CHECK("udp", false,
"{'id':'alias',"
"'backend':{'type':'udp',"
"'data':{'remote':{'type':'inet',"
"'data':{'host':'example.com',"
"'port':'1234'}},"
"'local':{'type':'inet',"
"'data':{'host':'localhost',"
"'port':'4321'}}}}}");
chr.data.udp.bindHost = NULL; chr->type = VIR_DOMAIN_CHR_TYPE_FILE;
chr.data.udp.bindService = (char *) "4321"; CHECK("file", false,
CHECK("udp", false, "{'id':'alias','backend':{'type':'file','data':{'out':'/test/path'}}}");
"{'id':'alias',"
"'backend':{'type':'udp',"
"'data':{'remote':{'type':'inet',"
"'data':{'host':'example.com',"
"'port':'1234'}},"
"'local':{'type':'inet',"
"'data':{'host':'',"
"'port':'4321'}}}}}");
memset(&chr, 0, sizeof(chr));
chr.type = VIR_DOMAIN_CHR_TYPE_UNIX;
chr.data.nix.path = (char *) "/path/to/socket";
CHECK("unix", false,
"{'id':'alias',"
"'backend':{'type':'socket',"
"'data':{'addr':{'type':'unix',"
"'data':{'path':'/path/to/socket'}},"
"'server':false}}}");
chr = (virDomainChrSourceDef) { .type = VIR_DOMAIN_CHR_TYPE_SPICEVMC }; chr->type = VIR_DOMAIN_CHR_TYPE_DEV;
CHECK("spicevmc", false, CHECK("device", false,
"{'id':'alias','backend':{'type':'spicevmc','" "{'id':'alias','backend':{'type':'serial','data':{'device':'/test/path'}}}");
"data':{'type':'vdagent'}}}"); }
chr = (virDomainChrSourceDef) { .type = VIR_DOMAIN_CHR_TYPE_PIPE }; {
CHECK("pipe", true, NULL); g_autoptr(virDomainChrSourceDef) chr = virDomainChrSourceDefNew(xmlopt);
chr->type = VIR_DOMAIN_CHR_TYPE_TCP;
chr->data.tcp.host = g_strdup("example.com");
chr->data.tcp.service = g_strdup("1234");
CHECK("tcp", false,
"{'id':'alias',"
"'backend':{'type':'socket',"
"'data':{'addr':{'type':'inet',"
"'data':{'host':'example.com',"
"'port':'1234'}},"
"'telnet':false,"
"'server':false}}}");
}
{
g_autoptr(virDomainChrSourceDef) chr = virDomainChrSourceDefNew(xmlopt);
chr->type = VIR_DOMAIN_CHR_TYPE_UDP;
chr->data.udp.connectHost = g_strdup("example.com");
chr->data.udp.connectService = g_strdup("1234");
CHECK("udp", false,
"{'id':'alias',"
"'backend':{'type':'udp',"
"'data':{'remote':{'type':'inet',"
"'data':{'host':'example.com',"
"'port':'1234'}}}}}");
chr->data.udp.bindService = g_strdup("4321");
CHECK("udp", false,
"{'id':'alias',"
"'backend':{'type':'udp',"
"'data':{'remote':{'type':'inet',"
"'data':{'host':'example.com',"
"'port':'1234'}},"
"'local':{'type':'inet',"
"'data':{'host':'',"
"'port':'4321'}}}}}");
chr->data.udp.bindHost = g_strdup("localhost");
CHECK("udp", false,
"{'id':'alias',"
"'backend':{'type':'udp',"
"'data':{'remote':{'type':'inet',"
"'data':{'host':'example.com',"
"'port':'1234'}},"
"'local':{'type':'inet',"
"'data':{'host':'localhost',"
"'port':'4321'}}}}}");
}
{
g_autoptr(virDomainChrSourceDef) chr = virDomainChrSourceDefNew(xmlopt);
chr->type = VIR_DOMAIN_CHR_TYPE_UNIX;
chr->data.nix.path = g_strdup("/path/to/socket");
CHECK("unix", false,
"{'id':'alias',"
"'backend':{'type':'socket',"
"'data':{'addr':{'type':'unix',"
"'data':{'path':'/path/to/socket'}},"
"'server':false}}}");
}
chr = (virDomainChrSourceDef) { .type = VIR_DOMAIN_CHR_TYPE_STDIO };
CHECK("stdio", true, NULL);
#undef CHECK #undef CHECK
return ret; return ret;